commit 29d7c2ffdc5adeb9cd256f70faba2b00634b7f06 Author: Marcel Date: Tue Oct 16 18:28:42 2018 +0200 Initial commit as of 2018-10-16 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2ccb96c --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# Default ignored files +/.idea/shelf/ +/.idea/workspace.xml + +# Project exclude paths +/vendor/coduo/php-humanizer/ +/vendor/composer/ +/vendor/paquettg/php-html-parser/ +/vendor/paquettg/string-encode/ +/vendor/symfony/config/ +/vendor/symfony/filesystem/ +/vendor/symfony/polyfill-mbstring/ +/vendor/symfony/translation/ +/vendor/symfony/yaml/ + +# Datasource local storage ignored files +/.idea/dataSources/ +dataSources.local.xml + +# Editor-based HTTP Client requests +/.idea/httpRequests/ +rest-client.private.env.json +http-client.private.env.json \ No newline at end of file diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..4bcd956 --- /dev/null +++ b/.htaccess @@ -0,0 +1,7 @@ +RewriteEngine on +RewriteCond $1 !^(index\.php|resources|robots\.txt) +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^(.*)$ index.php/$1 [L,QSA] +RewriteRule ^css/(.*\.css) /combine.php?type=css&files=$1 +RewriteRule ^javascript/(.*\.js) /combine.php?type=javascript&files=$1 \ No newline at end of file diff --git a/CI_phpStorm.php b/CI_phpStorm.php new file mode 100644 index 0000000..5cf2730 --- /dev/null +++ b/CI_phpStorm.php @@ -0,0 +1,121 @@ + Memory consumption can also be displayed. + * @property CI_Calendar $calendar This class enables the creation of calendars + * @property CI_Cart $cart Shopping Cart Class + * @property CI_Config $config This class contains functions that enable config files to be managed + * @property MY_Controller $controller This class object is the super class that every library in.
CodeIgniter will be assigned to. + * @property CI_Email $email Permits email to be sent using Mail, Sendmail, or SMTP. + * @property CI_Encrypt $encrypt Provides two-way keyed encoding using XOR Hashing and Mcrypt + * @property CI_Exceptions $exceptions Exceptions Class + * @property CI_Form_validation $form_validation Form Validation Class + * @property CI_Ftp $ftp FTP Class + * @property CI_Hooks $hooks Provides a mechanism to extend the base system without hacking. + * @property CI_Image_lib $image_lib Image Manipulation class + * @property CI_Input $input Pre-processes global input data for security + * @property CI_Lang $lang Language Class + * @property CI_Loader $load Loads views and files + * @property CI_Log $log Logging Class + * @property CI_Model $model CodeIgniter Model Class + * @property CI_Output $output Responsible for sending final output to browser + * @property CI_Pagination $pagination Pagination Class + * @property CI_Parser $parser Parses pseudo-variables contained in the specified template view,
replacing them with the data in the second param + * @property CI_Profiler $profiler This class enables you to display benchmark, query, and other data
in order to help with debugging and optimization. + * @property CI_Router $router Parses URIs and determines routing + * @property CI_Session $session Session Class + * @property CI_Sha1 $sha1 Provides 160 bit hashing using The Secure Hash Algorithm + * @property CI_Table $table HTML table generation
Lets you create tables manually or from database result objects, or arrays. + * @property CI_Trackback $trackback Trackback Sending/Receiving Class + * @property CI_Typography $typography Typography Class + * @property CI_Unit_test $unit_test Simple testing class + * @property CI_Upload $upload File Uploading Class + * @property CI_URI $uri Parses URIs and determines routing + * @property CI_User_agent $user_agent Identifies the platform, browser, robot, or mobile devise of the browsing agent + * @property CI_Validation $validation //dead + * @property CI_Xmlrpc $xmlrpc XML-RPC request handler class + * @property CI_Xmlrpcs $xmlrpcs XML-RPC server class + * @property CI_Zip $zip Zip Compression Class + * @property CI_Javascript $javascript Javascript Class + * @property CI_Jquery $jquery Jquery Class + * @property CI_Utf8 $utf8 Provides support for UTF-8 environments + * @property CI_Security $security Security Class, xss, csrf, etc... + */ +class CI_Controller{} + +/** + * @property CI_DB_active_record $db This is the platform-independent base Active Record implementation class. + * @property CI_DB_forge $dbforge Database Utility Class + * @property CI_Benchmark $benchmark This class enables you to mark points and calculate the time difference between them.
Memory consumption can also be displayed. + * @property CI_Calendar $calendar This class enables the creation of calendars + * @property CI_Cart $cart Shopping Cart Class + * @property CI_Config $config This class contains functions that enable config files to be managed + * @property CI_Controller $controller This class object is the super class that every library in.
CodeIgniter will be assigned to. + * @property CI_Email $email Permits email to be sent using Mail, Sendmail, or SMTP. + * @property CI_Encrypt $encrypt Provides two-way keyed encoding using XOR Hashing and Mcrypt + * @property CI_Exceptions $exceptions Exceptions Class + * @property CI_Form_validation $form_validation Form Validation Class + * @property CI_Ftp $ftp FTP Class + * @property CI_Hooks $hooks Provides a mechanism to extend the base system without hacking. + * @property CI_Image_lib $image_lib Image Manipulation class + * @property CI_Input $input Pre-processes global input data for security + * @property CI_Lang $lang Language Class + * @property CI_Loader $load Loads views and files + * @property CI_Log $log Logging Class + * @property CI_Model $model CodeIgniter Model Class + * @property CI_Output $output Responsible for sending final output to browser + * @property CI_Pagination $pagination Pagination Class + * @property CI_Parser $parser Parses pseudo-variables contained in the specified template view,
replacing them with the data in the second param + * @property CI_Profiler $profiler This class enables you to display benchmark, query, and other data
in order to help with debugging and optimization. + * @property CI_Router $router Parses URIs and determines routing + * @property CI_Session $session Session Class + * @property CI_Sha1 $sha1 Provides 160 bit hashing using The Secure Hash Algorithm + * @property CI_Table $table HTML table generation
Lets you create tables manually or from database result objects, or arrays. + * @property CI_Trackback $trackback Trackback Sending/Receiving Class + * @property CI_Typography $typography Typography Class + * @property CI_Unit_test $unit_test Simple testing class + * @property CI_Upload $upload File Uploading Class + * @property CI_URI $uri Parses URIs and determines routing + * @property CI_User_agent $user_agent Identifies the platform, browser, robot, or mobile devise of the browsing agent + * @property CI_Validation $validation //dead + * @property CI_Xmlrpc $xmlrpc XML-RPC request handler class + * @property CI_Xmlrpcs $xmlrpcs XML-RPC server class + * @property CI_Zip $zip Zip Compression Class + * @property CI_Javascript $javascript Javascript Class + * @property CI_Jquery $jquery Jquery Class + * @property CI_Utf8 $utf8 Provides support for UTF-8 environments + * @property CI_Security $security Security Class, xss, csrf, etc... + */ +class CI_Model{} \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..e69de29 diff --git a/application/.htaccess b/application/.htaccess new file mode 100644 index 0000000..6c63ed4 --- /dev/null +++ b/application/.htaccess @@ -0,0 +1,6 @@ + + Require all denied + + + Deny from all + \ No newline at end of file diff --git a/application/config/autoload.php b/application/config/autoload.php new file mode 100644 index 0000000..0d80d73 --- /dev/null +++ b/application/config/autoload.php @@ -0,0 +1,135 @@ + 'ua'); +*/ +$autoload['libraries'] = array('session', 'database', 'form_validation'); + +/* +| ------------------------------------------------------------------- +| Auto-load Drivers +| ------------------------------------------------------------------- +| These classes are located in system/libraries/ or in your +| application/libraries/ directory, but are also placed inside their +| own subdirectory and they extend the CI_Driver_Library class. They +| offer multiple interchangeable driver options. +| +| Prototype: +| +| $autoload['drivers'] = array('cache'); +| +| You can also supply an alternative property name to be assigned in +| the controller: +| +| $autoload['drivers'] = array('cache' => 'cch'); +| +*/ +$autoload['drivers'] = array(); + +/* +| ------------------------------------------------------------------- +| Auto-load Helper Files +| ------------------------------------------------------------------- +| Prototype: +| +| $autoload['helper'] = array('url', 'file'); +*/ +$autoload['helper'] = array('url', 'file', 'language'); + +/* +| ------------------------------------------------------------------- +| Auto-load Config files +| ------------------------------------------------------------------- +| Prototype: +| +| $autoload['config'] = array('config1', 'config2'); +| +| NOTE: This item is intended for use ONLY if you have created custom +| config files. Otherwise, leave it blank. +| +*/ +$autoload['config'] = array(); + +/* +| ------------------------------------------------------------------- +| Auto-load Language files +| ------------------------------------------------------------------- +| Prototype: +| +| $autoload['language'] = array('lang1', 'lang2'); +| +| NOTE: Do not include the "_lang" part of your file. For example +| "codeigniter_lang.php" would be referenced as array('codeigniter'); +| +*/ +$autoload['language'] = array("header", "footer", "general"); + +/* +| ------------------------------------------------------------------- +| Auto-load Models +| ------------------------------------------------------------------- +| Prototype: +| +| $autoload['model'] = array('first_model', 'second_model'); +| +| You can also supply an alternative model name to be assigned +| in the controller: +| +| $autoload['model'] = array('first_model' => 'first'); +*/ +$autoload['model'] = array('LoginModel', 'GeneralModel', 'DatabaseModel'); diff --git a/application/config/config.php b/application/config/config.php new file mode 100644 index 0000000..3bd1902 --- /dev/null +++ b/application/config/config.php @@ -0,0 +1,513 @@ +]+$/i +| +| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!! +| +*/ +$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-'; + +/* +|-------------------------------------------------------------------------- +| Enable Query Strings +|-------------------------------------------------------------------------- +| +| By default CodeIgniter uses search-engine friendly segment based URLs: +| example.com/who/what/where/ +| +| By default CodeIgniter enables access to the $_GET array. If for some +| reason you would like to disable it, set 'allow_get_array' to FALSE. +| +| You can optionally enable standard query string based URLs: +| example.com?who=me&what=something&where=here +| +| Options are: TRUE or FALSE (boolean) +| +| The other items let you set the query string 'words' that will +| invoke your controllers and its functions: +| example.com/index.php?c=controller&m=function +| +| Please note that some of the helpers won't work as expected when +| this feature is enabled, since CodeIgniter is designed primarily to +| use segment based URLs. +| +*/ +$config['allow_get_array'] = TRUE; +$config['enable_query_strings'] = FALSE; +$config['controller_trigger'] = 'c'; +$config['function_trigger'] = 'm'; +$config['directory_trigger'] = 'd'; + +/* +|-------------------------------------------------------------------------- +| Error Logging Threshold +|-------------------------------------------------------------------------- +| +| You can enable error logging by setting a threshold over zero. The +| threshold determines what gets logged. Threshold options are: +| +| 0 = Disables logging, Error logging TURNED OFF +| 1 = Error Messages (including PHP errors) +| 2 = Debug Messages +| 3 = Informational Messages +| 4 = All Messages +| +| You can also pass an array with threshold levels to show individual error types +| +| array(2) = Debug Messages, without Error Messages +| +| For a live site you'll usually only enable Errors (1) to be logged otherwise +| your log files will fill up very fast. +| +*/ +$config['log_threshold'] = 0; + +/* +|-------------------------------------------------------------------------- +| Error Logging Directory Path +|-------------------------------------------------------------------------- +| +| Leave this BLANK unless you would like to set something other than the default +| application/logs/ directory. Use a full server path with trailing slash. +| +*/ +$config['log_path'] = ''; + +/* +|-------------------------------------------------------------------------- +| Log File Extension +|-------------------------------------------------------------------------- +| +| The default filename extension for log files. The default 'php' allows for +| protecting the log files via basic scripting, when they are to be stored +| under a publicly accessible directory. +| +| Note: Leaving it blank will default to 'php'. +| +*/ +$config['log_file_extension'] = ''; + +/* +|-------------------------------------------------------------------------- +| Log File Permissions +|-------------------------------------------------------------------------- +| +| The file system permissions to be applied on newly created log files. +| +| IMPORTANT: This MUST be an integer (no quotes) and you MUST use octal +| integer notation (i.e. 0700, 0644, etc.) +*/ +$config['log_file_permissions'] = 0644; + +/* +|-------------------------------------------------------------------------- +| Date Format for Logs +|-------------------------------------------------------------------------- +| +| Each item that is logged has an associated date. You can use PHP date +| codes to set your own date formatting +| +*/ +$config['log_date_format'] = 'Y-m-d H:i:s'; + +/* +|-------------------------------------------------------------------------- +| Error Views Directory Path +|-------------------------------------------------------------------------- +| +| Leave this BLANK unless you would like to set something other than the default +| application/views/errors/ directory. Use a full server path with trailing slash. +| +*/ +$config['error_views_path'] = ''; + +/* +|-------------------------------------------------------------------------- +| Cache Directory Path +|-------------------------------------------------------------------------- +| +| Leave this BLANK unless you would like to set something other than the default +| application/cache/ directory. Use a full server path with trailing slash. +| +*/ +$config['cache_path'] = ''; + +/* +|-------------------------------------------------------------------------- +| Cache Include Query String +|-------------------------------------------------------------------------- +| +| Whether to take the URL query string into consideration when generating +| output cache files. Valid options are: +| +| FALSE = Disabled +| TRUE = Enabled, take all query parameters into account. +| Please be aware that this may result in numerous cache +| files generated for the same page over and over again. +| array('q') = Enabled, but only take into account the specified list +| of query parameters. +| +*/ +$config['cache_query_string'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Encryption Key +|-------------------------------------------------------------------------- +| +| If you use the Encryption class, you must set an encryption key. +| See the user guide for more info. +| +| https://codeigniter.com/user_guide/libraries/encryption.html +| +*/ +$config['encryption_key'] = 'KLIn!Psasaswewqsas3=zu0._BAU9dasdasd#!!@$.xdFJdVNRR'; + +/* +|-------------------------------------------------------------------------- +| Session Variables +|-------------------------------------------------------------------------- +| +| 'sess_driver' +| +| The storage driver to use: files, database, redis, memcached +| +| 'sess_cookie_name' +| +| The session cookie name, must contain only [0-9a-z_-] characters +| +| 'sess_expiration' +| +| The number of SECONDS you want the session to last. +| Setting to 0 (zero) means expire when the browser is closed. +| +| 'sess_save_path' +| +| The location to save sessions to, driver dependent. +| +| For the 'files' driver, it's a path to a writable directory. +| WARNING: Only absolute paths are supported! +| +| For the 'database' driver, it's a table name. +| Please read up the manual for the format with other session drivers. +| +| IMPORTANT: You are REQUIRED to set a valid save path! +| +| 'sess_match_ip' +| +| Whether to match the user's IP address when reading the session data. +| +| WARNING: If you're using the database driver, don't forget to update +| your session table's PRIMARY KEY when changing this setting. +| +| 'sess_time_to_update' +| +| How many seconds between CI regenerating the session ID. +| +| 'sess_regenerate_destroy' +| +| Whether to destroy session data associated with the old session ID +| when auto-regenerating the session ID. When set to FALSE, the data +| will be later deleted by the garbage collector. +| +| Other session cookie settings are shared with the rest of the application, +| except for 'cookie_prefix' and 'cookie_httponly', which are ignored here. +| +*/ +$config['sess_driver'] = 'files'; +$config['sess_cookie_name'] = 'ci_session'; +$config['sess_expiration'] = 7200; +$config['sess_save_path'] = NULL; +$config['sess_match_ip'] = FALSE; +$config['sess_time_to_update'] = 300; +$config['sess_regenerate_destroy'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Cookie Related Variables +|-------------------------------------------------------------------------- +| +| 'cookie_prefix' = Set a cookie name prefix if you need to avoid collisions +| 'cookie_domain' = Set to .your-domain.com for site-wide cookies +| 'cookie_path' = Typically will be a forward slash +| 'cookie_secure' = Cookie will only be set if a secure HTTPS connection exists. +| 'cookie_httponly' = Cookie will only be accessible via HTTP(S) (no javascript) +| +| Note: These settings (with the exception of 'cookie_prefix' and +| 'cookie_httponly') will also affect sessions. +| +*/ +$config['cookie_prefix'] = ''; +$config['cookie_domain'] = ''; +$config['cookie_path'] = '/'; +$config['cookie_secure'] = FALSE; +$config['cookie_httponly'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Standardize newlines +|-------------------------------------------------------------------------- +| +| Determines whether to standardize newline characters in input data, +| meaning to replace \r\n, \r, \n occurrences with the PHP_EOL value. +| +| This is particularly useful for portability between UNIX-based OSes, +| (usually \n) and Windows (\r\n). +| +*/ +$config['standardize_newlines'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Global XSS Filtering +|-------------------------------------------------------------------------- +| +| Determines whether the XSS filter is always active when GET, POST or +| COOKIE data is encountered +| +| WARNING: This feature is DEPRECATED and currently available only +| for backwards compatibility purposes! +| +*/ +$config['global_xss_filtering'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Cross Site Request Forgery +|-------------------------------------------------------------------------- +| Enables a CSRF cookie token to be set. When set to TRUE, token will be +| checked on a submitted form. If you are accepting user data, it is strongly +| recommended CSRF protection be enabled. +| +| 'csrf_token_name' = The token name +| 'csrf_cookie_name' = The cookie name +| 'csrf_expire' = The number in seconds the token should expire. +| 'csrf_regenerate' = Regenerate token on every submission +| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks +*/ +$config['csrf_protection'] = FALSE; +$config['csrf_token_name'] = 'csrf_test_name'; +$config['csrf_cookie_name'] = 'csrf_cookie_name'; +$config['csrf_expire'] = 7200; +$config['csrf_regenerate'] = TRUE; +$config['csrf_exclude_uris'] = array(); + +/* +|-------------------------------------------------------------------------- +| Output Compression +|-------------------------------------------------------------------------- +| +| Enables Gzip output compression for faster page loads. When enabled, +| the output class will test whether your server supports Gzip. +| Even if it does, however, not all browsers support compression +| so enable only if you are reasonably sure your visitors can handle it. +| +| Only used if zlib.output_compression is turned off in your php.ini. +| Please do not use it together with httpd-level output compression. +| +| VERY IMPORTANT: If you are getting a blank page when compression is enabled it +| means you are prematurely outputting something to your browser. It could +| even be a line of whitespace at the end of one of your scripts. For +| compression to work, nothing can be sent before the output buffer is called +| by the output class. Do not 'echo' any values with compression enabled. +| +*/ +$config['compress_output'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Master Time Reference +|-------------------------------------------------------------------------- +| +| Options are 'local' or any PHP supported timezone. This preference tells +| the system whether to use your server's local time as the master 'now' +| reference, or convert it to the configured one timezone. See the 'date +| helper' page of the user guide for information regarding date handling. +| +*/ +$config['time_reference'] = 'local'; + +/* +|-------------------------------------------------------------------------- +| Rewrite PHP Short Tags +|-------------------------------------------------------------------------- +| +| If your PHP installation does not have short tag support enabled CI +| can rewrite the tags on-the-fly, enabling you to utilize that syntax +| in your view files. Options are TRUE or FALSE (boolean) +| +| Note: You need to have eval() enabled for this to work. +| +*/ +$config['rewrite_short_tags'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Reverse Proxy IPs +|-------------------------------------------------------------------------- +| +| If your server is behind a reverse proxy, you must whitelist the proxy +| IP addresses from which CodeIgniter should trust headers such as +| HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify +| the visitor's IP address. +| +| You can use both an array or a comma-separated list of proxy addresses, +| as well as specifying whole subnets. Here are a few examples: +| +| Comma-separated: '10.0.1.200,192.168.5.0/24' +| Array: array('10.0.1.200', '192.168.5.0/24') +*/ +$config['proxy_ips'] = ''; diff --git a/application/config/constants.php b/application/config/constants.php new file mode 100644 index 0000000..18d3b4b --- /dev/null +++ b/application/config/constants.php @@ -0,0 +1,85 @@ +db->last_query() and profiling of DB queries. +| When you run a query, with this setting set to TRUE (default), +| CodeIgniter will store the SQL statement for debugging purposes. +| However, this may cause high memory usage, especially if you run +| a lot of SQL queries ... disable this to avoid that problem. +| +| The $active_group variable lets you choose which connection group to +| make active. By default there is only one group (the 'default' group). +| +| The $query_builder variables lets you determine whether or not to load +| the query builder class. +*/ +$active_group = 'default'; +$query_builder = TRUE; + +$hostname = 'localhost'; + +$db['default'] = array( + 'dsn' => '', + 'hostname' => $hostname, + 'username' => 'kingofdog', + 'password' => '123456', + 'database' => 'kingofdog', + 'dbdriver' => 'mysqli', + 'dbprefix' => '', + 'pconnect' => FALSE, + 'db_debug' => (ENVIRONMENT !== 'production'), + 'cache_on' => TRUE, + 'cachedir' => APPPATH . 'db_cache/', + 'char_set' => 'utf8mb4', + 'dbcollat' => 'utf8mb4_general_ci', + 'swap_pre' => '', + 'encrypt' => FALSE, + 'compress' => FALSE, + 'stricton' => FALSE, + 'failover' => array(), + 'save_queries' => TRUE +); +$db['creator'] = array( + 'dsn' => '', + 'hostname' => $hostname, + 'username' => 'databaseCreator', + 'password' => '123456', + 'database' => '', + 'dbdriver' => 'mysqli', + 'dbprefix' => '', + 'pconnect' => FALSE, + 'db_debug' => (ENVIRONMENT !== 'production'), + 'cache_on' => FALSE, + 'cachedir' => '', + 'char_set' => 'utf8', + 'dbcollat' => 'utf8_general_ci', + 'swap_pre' => '', + 'encrypt' => FALSE, + 'compress' => FALSE, + 'stricton' => FALSE, + 'failover' => array(), + 'save_queries' => TRUE +); diff --git a/application/config/doctypes.php b/application/config/doctypes.php new file mode 100644 index 0000000..59a7991 --- /dev/null +++ b/application/config/doctypes.php @@ -0,0 +1,24 @@ + '', + 'xhtml1-strict' => '', + 'xhtml1-trans' => '', + 'xhtml1-frame' => '', + 'xhtml-basic11' => '', + 'html5' => '', + 'html4-strict' => '', + 'html4-trans' => '', + 'html4-frame' => '', + 'mathml1' => '', + 'mathml2' => '', + 'svg10' => '', + 'svg11' => '', + 'svg11-basic' => '', + 'svg11-tiny' => '', + 'xhtml-math-svg-xh' => '', + 'xhtml-math-svg-sh' => '', + 'xhtml-rdfa-1' => '', + 'xhtml-rdfa-2' => '' +); diff --git a/application/config/foreign_chars.php b/application/config/foreign_chars.php new file mode 100644 index 0000000..ac406e3 --- /dev/null +++ b/application/config/foreign_chars.php @@ -0,0 +1,103 @@ + 'ae', + '/ö|œ/' => 'oe', + '/ü/' => 'ue', + '/Ä/' => 'Ae', + '/Ü/' => 'Ue', + '/Ö/' => 'Oe', + '/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|Α|Ά|Ả|Ạ|Ầ|Ẫ|Ẩ|Ậ|Ằ|Ắ|Ẵ|Ẳ|Ặ|А/' => 'A', + '/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª|α|ά|ả|ạ|ầ|ấ|ẫ|ẩ|ậ|ằ|ắ|ẵ|ẳ|ặ|а/' => 'a', + '/Б/' => 'B', + '/б/' => 'b', + '/Ç|Ć|Ĉ|Ċ|Č/' => 'C', + '/ç|ć|ĉ|ċ|č/' => 'c', + '/Д/' => 'D', + '/д/' => 'd', + '/Ð|Ď|Đ|Δ/' => 'Dj', + '/ð|ď|đ|δ/' => 'dj', + '/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Ε|Έ|Ẽ|Ẻ|Ẹ|Ề|Ế|Ễ|Ể|Ệ|Е|Э/' => 'E', + '/è|é|ê|ë|ē|ĕ|ė|ę|ě|έ|ε|ẽ|ẻ|ẹ|ề|ế|ễ|ể|ệ|е|э/' => 'e', + '/Ф/' => 'F', + '/ф/' => 'f', + '/Ĝ|Ğ|Ġ|Ģ|Γ|Г|Ґ/' => 'G', + '/ĝ|ğ|ġ|ģ|γ|г|ґ/' => 'g', + '/Ĥ|Ħ/' => 'H', + '/ĥ|ħ/' => 'h', + '/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|Η|Ή|Ί|Ι|Ϊ|Ỉ|Ị|И|Ы/' => 'I', + '/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|η|ή|ί|ι|ϊ|ỉ|ị|и|ы|ї/' => 'i', + '/Ĵ/' => 'J', + '/ĵ/' => 'j', + '/Ķ|Κ|К/' => 'K', + '/ķ|κ|к/' => 'k', + '/Ĺ|Ļ|Ľ|Ŀ|Ł|Λ|Л/' => 'L', + '/ĺ|ļ|ľ|ŀ|ł|λ|л/' => 'l', + '/М/' => 'M', + '/м/' => 'm', + '/Ñ|Ń|Ņ|Ň|Ν|Н/' => 'N', + '/ñ|ń|ņ|ň|ʼn|ν|н/' => 'n', + '/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|Ο|Ό|Ω|Ώ|Ỏ|Ọ|Ồ|Ố|Ỗ|Ổ|Ộ|Ờ|Ớ|Ỡ|Ở|Ợ|О/' => 'O', + '/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|ο|ό|ω|ώ|ỏ|ọ|ồ|ố|ỗ|ổ|ộ|ờ|ớ|ỡ|ở|ợ|о/' => 'o', + '/П/' => 'P', + '/п/' => 'p', + '/Ŕ|Ŗ|Ř|Ρ|Р/' => 'R', + '/ŕ|ŗ|ř|ρ|р/' => 'r', + '/Ś|Ŝ|Ş|Ș|Š|Σ|С/' => 'S', + '/ś|ŝ|ş|ș|š|ſ|σ|ς|с/' => 's', + '/Ț|Ţ|Ť|Ŧ|τ|Т/' => 'T', + '/ț|ţ|ť|ŧ|т/' => 't', + '/Þ|þ/' => 'th', + '/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|Ũ|Ủ|Ụ|Ừ|Ứ|Ữ|Ử|Ự|У/' => 'U', + '/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|υ|ύ|ϋ|ủ|ụ|ừ|ứ|ữ|ử|ự|у/' => 'u', + '/Ý|Ÿ|Ŷ|Υ|Ύ|Ϋ|Ỳ|Ỹ|Ỷ|Ỵ|Й/' => 'Y', + '/ý|ÿ|ŷ|ỳ|ỹ|ỷ|ỵ|й/' => 'y', + '/В/' => 'V', + '/в/' => 'v', + '/Ŵ/' => 'W', + '/ŵ/' => 'w', + '/Ź|Ż|Ž|Ζ|З/' => 'Z', + '/ź|ż|ž|ζ|з/' => 'z', + '/Æ|Ǽ/' => 'AE', + '/ß/' => 'ss', + '/IJ/' => 'IJ', + '/ij/' => 'ij', + '/Œ/' => 'OE', + '/ƒ/' => 'f', + '/ξ/' => 'ks', + '/π/' => 'p', + '/β/' => 'v', + '/μ/' => 'm', + '/ψ/' => 'ps', + '/Ё/' => 'Yo', + '/ё/' => 'yo', + '/Є/' => 'Ye', + '/є/' => 'ye', + '/Ї/' => 'Yi', + '/Ж/' => 'Zh', + '/ж/' => 'zh', + '/Х/' => 'Kh', + '/х/' => 'kh', + '/Ц/' => 'Ts', + '/ц/' => 'ts', + '/Ч/' => 'Ch', + '/ч/' => 'ch', + '/Ш/' => 'Sh', + '/ш/' => 'sh', + '/Щ/' => 'Shch', + '/щ/' => 'shch', + '/Ъ|ъ|Ь|ь/' => '', + '/Ю/' => 'Yu', + '/ю/' => 'yu', + '/Я/' => 'Ya', + '/я/' => 'ya' +); diff --git a/application/config/hooks.php b/application/config/hooks.php new file mode 100644 index 0000000..782adf6 --- /dev/null +++ b/application/config/hooks.php @@ -0,0 +1,13 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/config/memcached.php b/application/config/memcached.php new file mode 100644 index 0000000..5c23b39 --- /dev/null +++ b/application/config/memcached.php @@ -0,0 +1,19 @@ + array( + 'hostname' => '127.0.0.1', + 'port' => '11211', + 'weight' => '1', + ), +); diff --git a/application/config/migration.php b/application/config/migration.php new file mode 100644 index 0000000..4b585a6 --- /dev/null +++ b/application/config/migration.php @@ -0,0 +1,84 @@ +migration->current() this is the version that schema will +| be upgraded / downgraded to. +| +*/ +$config['migration_version'] = 0; + +/* +|-------------------------------------------------------------------------- +| Migrations Path +|-------------------------------------------------------------------------- +| +| Path to your migrations folder. +| Typically, it will be within your application path. +| Also, writing permission is required within the migrations path. +| +*/ +$config['migration_path'] = APPPATH.'migrations/'; diff --git a/application/config/mimes.php b/application/config/mimes.php new file mode 100644 index 0000000..8bac872 --- /dev/null +++ b/application/config/mimes.php @@ -0,0 +1,167 @@ + array('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'), + 'cpt' => 'application/mac-compactpro', + 'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain'), + 'bin' => array('application/macbinary', 'application/mac-binary', 'application/octet-stream', 'application/x-binary', 'application/x-macbinary'), + 'dms' => 'application/octet-stream', + 'lha' => 'application/octet-stream', + 'lzh' => 'application/octet-stream', + 'exe' => array('application/octet-stream', 'application/x-msdownload'), + 'class' => 'application/octet-stream', + 'psd' => array('application/x-photoshop', 'image/vnd.adobe.photoshop'), + 'so' => 'application/octet-stream', + 'sea' => 'application/octet-stream', + 'dll' => 'application/octet-stream', + 'oda' => 'application/oda', + 'pdf' => array('application/pdf', 'application/force-download', 'application/x-download', 'binary/octet-stream'), + 'ai' => array('application/pdf', 'application/postscript'), + 'eps' => 'application/postscript', + 'ps' => 'application/postscript', + 'smi' => 'application/smil', + 'smil' => 'application/smil', + 'mif' => 'application/vnd.mif', + 'xls' => array('application/vnd.ms-excel', 'application/msexcel', 'application/x-msexcel', 'application/x-ms-excel', 'application/x-excel', 'application/x-dos_ms_excel', 'application/xls', 'application/x-xls', 'application/excel', 'application/download', 'application/vnd.ms-office', 'application/msword'), + 'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint', 'application/vnd.ms-office', 'application/msword'), + 'pptx' => array('application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/x-zip', 'application/zip'), + 'wbxml' => 'application/wbxml', + 'wmlc' => 'application/wmlc', + 'dcr' => 'application/x-director', + 'dir' => 'application/x-director', + 'dxr' => 'application/x-director', + 'dvi' => 'application/x-dvi', + 'gtar' => 'application/x-gtar', + 'gz' => 'application/x-gzip', + 'gzip' => 'application/x-gzip', + 'php' => array('application/x-httpd-php', 'application/php', 'application/x-php', 'text/php', 'text/x-php', 'application/x-httpd-php-source'), + 'php4' => 'application/x-httpd-php', + 'php3' => 'application/x-httpd-php', + 'phtml' => 'application/x-httpd-php', + 'phps' => 'application/x-httpd-php-source', + 'js' => array('application/x-javascript', 'text/plain'), + 'swf' => 'application/x-shockwave-flash', + 'sit' => 'application/x-stuffit', + 'tar' => 'application/x-tar', + 'tgz' => array('application/x-tar', 'application/x-gzip-compressed'), + 'z' => 'application/x-compress', + 'xhtml' => 'application/xhtml+xml', + 'xht' => 'application/xhtml+xml', + 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/s-compressed', 'multipart/x-zip'), + 'rar' => array('application/x-rar', 'application/rar', 'application/x-rar-compressed'), + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mpga' => 'audio/mpeg', + 'mp2' => 'audio/mpeg', + 'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'), + 'aif' => array('audio/x-aiff', 'audio/aiff'), + 'aiff' => array('audio/x-aiff', 'audio/aiff'), + 'aifc' => 'audio/x-aiff', + 'ram' => 'audio/x-pn-realaudio', + 'rm' => 'audio/x-pn-realaudio', + 'rpm' => 'audio/x-pn-realaudio-plugin', + 'ra' => 'audio/x-realaudio', + 'rv' => 'video/vnd.rn-realvideo', + 'wav' => array('audio/x-wav', 'audio/wave', 'audio/wav'), + 'bmp' => array('image/bmp', 'image/x-bmp', 'image/x-bitmap', 'image/x-xbitmap', 'image/x-win-bitmap', 'image/x-windows-bmp', 'image/ms-bmp', 'image/x-ms-bmp', 'application/bmp', 'application/x-bmp', 'application/x-win-bitmap'), + 'gif' => 'image/gif', + 'jpeg' => array('image/jpeg', 'image/pjpeg'), + 'jpg' => array('image/jpeg', 'image/pjpeg'), + 'jpe' => array('image/jpeg', 'image/pjpeg'), + 'jp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'j2k' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpf' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpg2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpx' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpm' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'mj2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'mjp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'png' => array('image/png', 'image/x-png'), + 'tiff' => 'image/tiff', + 'tif' => 'image/tiff', + 'css' => array('text/css', 'text/plain'), + 'html' => array('text/html', 'text/plain'), + 'htm' => array('text/html', 'text/plain'), + 'shtml' => array('text/html', 'text/plain'), + 'txt' => 'text/plain', + 'text' => 'text/plain', + 'log' => array('text/plain', 'text/x-log'), + 'rtx' => 'text/richtext', + 'rtf' => 'text/rtf', + 'xml' => array('application/xml', 'text/xml', 'text/plain'), + 'xsl' => array('application/xml', 'text/xsl', 'text/xml'), + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpe' => 'video/mpeg', + 'qt' => 'video/quicktime', + 'mov' => 'video/quicktime', + 'avi' => array('video/x-msvideo', 'video/msvideo', 'video/avi', 'application/x-troff-msvideo'), + 'movie' => 'video/x-sgi-movie', + 'doc' => array('application/msword', 'application/vnd.ms-office'), + 'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword', 'application/x-zip'), + 'dot' => array('application/msword', 'application/vnd.ms-office'), + 'dotx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword'), + 'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel', 'application/msword', 'application/x-zip'), + 'word' => array('application/msword', 'application/octet-stream'), + 'xl' => 'application/excel', + 'eml' => 'message/rfc822', + 'json' => array('application/json', 'text/json'), + 'pem' => array('application/x-x509-user-cert', 'application/x-pem-file', 'application/octet-stream'), + 'p10' => array('application/x-pkcs10', 'application/pkcs10'), + 'p12' => 'application/x-pkcs12', + 'p7a' => 'application/x-pkcs7-signature', + 'p7c' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'), + 'p7m' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'), + 'p7r' => 'application/x-pkcs7-certreqresp', + 'p7s' => 'application/pkcs7-signature', + 'crt' => array('application/x-x509-ca-cert', 'application/x-x509-user-cert', 'application/pkix-cert'), + 'crl' => array('application/pkix-crl', 'application/pkcs-crl'), + 'der' => 'application/x-x509-ca-cert', + 'kdb' => 'application/octet-stream', + 'pgp' => 'application/pgp', + 'gpg' => 'application/gpg-keys', + 'sst' => 'application/octet-stream', + 'csr' => 'application/octet-stream', + 'rsa' => 'application/x-pkcs7', + 'cer' => array('application/pkix-cert', 'application/x-x509-ca-cert'), + '3g2' => 'video/3gpp2', + '3gp' => array('video/3gp', 'video/3gpp'), + 'mp4' => 'video/mp4', + 'm4a' => 'audio/x-m4a', + 'f4v' => array('video/mp4', 'video/x-f4v'), + 'flv' => 'video/x-flv', + 'webm' => 'video/webm', + 'aac' => 'audio/x-acc', + 'm4u' => 'application/vnd.mpegurl', + 'm3u' => 'text/plain', + 'xspf' => 'application/xspf+xml', + 'vlc' => 'application/videolan', + 'wmv' => array('video/x-ms-wmv', 'video/x-ms-asf'), + 'au' => 'audio/x-au', + 'ac3' => 'audio/ac3', + 'flac' => 'audio/x-flac', + 'ogg' => array('audio/ogg', 'video/ogg', 'application/ogg'), + 'kmz' => array('application/vnd.google-earth.kmz', 'application/zip', 'application/x-zip'), + 'kml' => array('application/vnd.google-earth.kml+xml', 'application/xml', 'text/xml'), + 'ics' => 'text/calendar', + 'ical' => 'text/calendar', + 'zsh' => 'text/x-scriptzsh', + '7zip' => array('application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'), + 'cdr' => array('application/cdr', 'application/coreldraw', 'application/x-cdr', 'application/x-coreldraw', 'image/cdr', 'image/x-cdr', 'zz-application/zz-winassoc-cdr'), + 'wma' => array('audio/x-ms-wma', 'video/x-ms-asf'), + 'jar' => array('application/java-archive', 'application/x-java-application', 'application/x-jar', 'application/x-compressed'), + 'svg' => array('image/svg+xml', 'application/xml', 'text/xml'), + 'vcf' => 'text/x-vcard', + 'srt' => array('text/srt', 'text/plain'), + 'vtt' => array('text/vtt', 'text/plain'), + 'ico' => array('image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon') +); diff --git a/application/config/profiler.php b/application/config/profiler.php new file mode 100644 index 0000000..3db22e3 --- /dev/null +++ b/application/config/profiler.php @@ -0,0 +1,14 @@ + my_controller/index + | my-controller/my-method -> my_controller/my_method + */ + $route['default_controller'] = 'main'; + $route['404_override'] = 'error404'; + $route['translate_uri_dashes'] = FALSE; + $route['r/(:any)'] = 'redirect/p/$1'; + $route['admin/(:any)'] = 'admin/$1'; + $route['admin'] = 'admin/dashboard/index'; + $route['tools/csgo/(:any)'] = 'tools/csgo/index/$1'; + $route['tools'] = 'tools/tools/index'; + $route['watch/(:any)/(:any)'] = 'watch/index/$1/$2'; + $route['tools/generator/(:any)'] = 'tools/generators/$1'; + $route['user/getPosts'] = 'user/getPosts'; + $route['user/getComments'] = 'user/getComments'; + $route['user/getBlogPosts'] = 'user/getBlogPosts'; + $route['user/publishPost'] = 'user/publishPost'; + $route['user/switchFollowing'] = 'user/switchFollowing'; + $route['user/getReportModal'] = 'user/getReportModal'; + $route['user/(:any)'] = 'user/index/$1'; + $route['user/(:any)/(:any)'] = 'user/$2/$1'; + $route['user/(:any)/post/(:any)'] = 'user/single_post/$1/$2'; + $route['en'] = 'lang/change/en'; + $route['de'] = 'lang/change/de'; + $route['fr'] = 'lang/change/fr'; + $route['f/(:any)'] = '/file/open/$1'; + $route['f/(:any)/(:any)'] = '/file/open/$1/$2'; + $route['logout'] = 'login/logout'; + $route['activate'] = 'login/activate'; + $route['register'] = 'login'; + $route['reset/(:any)/(:any)'] = 'login/reset/$1/$2'; + $route['tools/twitch/(:any)'] = 'tools/twitch?twich-channel=$1'; + $route['projects/(:any)'] = 'projects/index/$1'; + $route['tools/encrypter/(:any)'] = 'tools/encrypter/index/$1'; \ No newline at end of file diff --git a/application/config/smileys.php b/application/config/smileys.php new file mode 100644 index 0000000..abf9a89 --- /dev/null +++ b/application/config/smileys.php @@ -0,0 +1,64 @@ + array('grin.gif', '19', '19', 'grin'), + ':lol:' => array('lol.gif', '19', '19', 'LOL'), + ':cheese:' => array('cheese.gif', '19', '19', 'cheese'), + ':)' => array('smile.gif', '19', '19', 'smile'), + ';-)' => array('wink.gif', '19', '19', 'wink'), + ';)' => array('wink.gif', '19', '19', 'wink'), + ':smirk:' => array('smirk.gif', '19', '19', 'smirk'), + ':roll:' => array('rolleyes.gif', '19', '19', 'rolleyes'), + ':-S' => array('confused.gif', '19', '19', 'confused'), + ':wow:' => array('surprise.gif', '19', '19', 'surprised'), + ':bug:' => array('bigsurprise.gif', '19', '19', 'big surprise'), + ':-P' => array('tongue_laugh.gif', '19', '19', 'tongue laugh'), + '%-P' => array('tongue_rolleye.gif', '19', '19', 'tongue rolleye'), + ';-P' => array('tongue_wink.gif', '19', '19', 'tongue wink'), + ':P' => array('raspberry.gif', '19', '19', 'raspberry'), + ':blank:' => array('blank.gif', '19', '19', 'blank stare'), + ':long:' => array('longface.gif', '19', '19', 'long face'), + ':ohh:' => array('ohh.gif', '19', '19', 'ohh'), + ':grrr:' => array('grrr.gif', '19', '19', 'grrr'), + ':gulp:' => array('gulp.gif', '19', '19', 'gulp'), + '8-/' => array('ohoh.gif', '19', '19', 'oh oh'), + ':down:' => array('downer.gif', '19', '19', 'downer'), + ':red:' => array('embarrassed.gif', '19', '19', 'red face'), + ':sick:' => array('sick.gif', '19', '19', 'sick'), + ':shut:' => array('shuteye.gif', '19', '19', 'shut eye'), + ':-/' => array('hmm.gif', '19', '19', 'hmmm'), + '>:(' => array('mad.gif', '19', '19', 'mad'), + ':mad:' => array('mad.gif', '19', '19', 'mad'), + '>:-(' => array('angry.gif', '19', '19', 'angry'), + ':angry:' => array('angry.gif', '19', '19', 'angry'), + ':zip:' => array('zip.gif', '19', '19', 'zipper'), + ':kiss:' => array('kiss.gif', '19', '19', 'kiss'), + ':ahhh:' => array('shock.gif', '19', '19', 'shock'), + ':coolsmile:' => array('shade_smile.gif', '19', '19', 'cool smile'), + ':coolsmirk:' => array('shade_smirk.gif', '19', '19', 'cool smirk'), + ':coolgrin:' => array('shade_grin.gif', '19', '19', 'cool grin'), + ':coolhmm:' => array('shade_hmm.gif', '19', '19', 'cool hmm'), + ':coolmad:' => array('shade_mad.gif', '19', '19', 'cool mad'), + ':coolcheese:' => array('shade_cheese.gif', '19', '19', 'cool cheese'), + ':vampire:' => array('vampire.gif', '19', '19', 'vampire'), + ':snake:' => array('snake.gif', '19', '19', 'snake'), + ':exclaim:' => array('exclaim.gif', '19', '19', 'exclaim'), + ':question:' => array('question.gif', '19', '19', 'question') + +); diff --git a/application/config/uploader_settings.php b/application/config/uploader_settings.php new file mode 100644 index 0000000..d033806 --- /dev/null +++ b/application/config/uploader_settings.php @@ -0,0 +1,149 @@ + diff --git a/application/config/user_agents.php b/application/config/user_agents.php new file mode 100644 index 0000000..00a69ff --- /dev/null +++ b/application/config/user_agents.php @@ -0,0 +1,211 @@ + 'Windows 10', + 'windows nt 6.3' => 'Windows 8.1', + 'windows nt 6.2' => 'Windows 8', + 'windows nt 6.1' => 'Windows 7', + 'windows nt 6.0' => 'Windows Vista', + 'windows nt 5.2' => 'Windows 2003', + 'windows nt 5.1' => 'Windows XP', + 'windows nt 5.0' => 'Windows 2000', + 'windows nt 4.0' => 'Windows NT 4.0', + 'winnt4.0' => 'Windows NT 4.0', + 'winnt 4.0' => 'Windows NT', + 'winnt' => 'Windows NT', + 'windows 98' => 'Windows 98', + 'win98' => 'Windows 98', + 'windows 95' => 'Windows 95', + 'win95' => 'Windows 95', + 'windows phone' => 'Windows Phone', + 'windows' => 'Unknown Windows OS', + 'android' => 'Android', + 'blackberry' => 'BlackBerry', + 'iphone' => 'iOS', + 'ipad' => 'iOS', + 'ipod' => 'iOS', + 'os x' => 'Mac OS X', + 'ppc mac' => 'Power PC Mac', + 'freebsd' => 'FreeBSD', + 'ppc' => 'Macintosh', + 'linux' => 'Linux', + 'debian' => 'Debian', + 'sunos' => 'Sun Solaris', + 'beos' => 'BeOS', + 'apachebench' => 'ApacheBench', + 'aix' => 'AIX', + 'irix' => 'Irix', + 'osf' => 'DEC OSF', + 'hp-ux' => 'HP-UX', + 'netbsd' => 'NetBSD', + 'bsdi' => 'BSDi', + 'openbsd' => 'OpenBSD', + 'gnu' => 'GNU/Linux', + 'unix' => 'Unknown Unix OS', + 'symbian' => 'Symbian OS' +); + + +// The order of this array should NOT be changed. Many browsers return +// multiple browser types so we want to identify the sub-type first. +$browsers = array( + 'OPR' => 'Opera', + 'Flock' => 'Flock', + 'Edge' => 'Spartan', + 'Chrome' => 'Chrome', + // Opera 10+ always reports Opera/9.80 and appends Version/ to the user agent string + 'Opera.*?Version' => 'Opera', + 'Opera' => 'Opera', + 'MSIE' => 'Internet Explorer', + 'Internet Explorer' => 'Internet Explorer', + 'Trident.* rv' => 'Internet Explorer', + 'Shiira' => 'Shiira', + 'Firefox' => 'Firefox', + 'Chimera' => 'Chimera', + 'Phoenix' => 'Phoenix', + 'Firebird' => 'Firebird', + 'Camino' => 'Camino', + 'Netscape' => 'Netscape', + 'OmniWeb' => 'OmniWeb', + 'Safari' => 'Safari', + 'Mozilla' => 'Mozilla', + 'Konqueror' => 'Konqueror', + 'icab' => 'iCab', + 'Lynx' => 'Lynx', + 'Links' => 'Links', + 'hotjava' => 'HotJava', + 'amaya' => 'Amaya', + 'IBrowse' => 'IBrowse', + 'Maxthon' => 'Maxthon', + 'Ubuntu' => 'Ubuntu Web Browser' +); + +$mobiles = array( + // legacy array, old values commented out + 'mobileexplorer' => 'Mobile Explorer', +// 'openwave' => 'Open Wave', +// 'opera mini' => 'Opera Mini', +// 'operamini' => 'Opera Mini', +// 'elaine' => 'Palm', + 'palmsource' => 'Palm', +// 'digital paths' => 'Palm', +// 'avantgo' => 'Avantgo', +// 'xiino' => 'Xiino', + 'palmscape' => 'Palmscape', +// 'nokia' => 'Nokia', +// 'ericsson' => 'Ericsson', +// 'blackberry' => 'BlackBerry', +// 'motorola' => 'Motorola' + + // Phones and Manufacturers + 'motorola' => 'Motorola', + 'nokia' => 'Nokia', + 'palm' => 'Palm', + 'iphone' => 'Apple iPhone', + 'ipad' => 'iPad', + 'ipod' => 'Apple iPod Touch', + 'sony' => 'Sony Ericsson', + 'ericsson' => 'Sony Ericsson', + 'blackberry' => 'BlackBerry', + 'cocoon' => 'O2 Cocoon', + 'blazer' => 'Treo', + 'lg' => 'LG', + 'amoi' => 'Amoi', + 'xda' => 'XDA', + 'mda' => 'MDA', + 'vario' => 'Vario', + 'htc' => 'HTC', + 'samsung' => 'Samsung', + 'sharp' => 'Sharp', + 'sie-' => 'Siemens', + 'alcatel' => 'Alcatel', + 'benq' => 'BenQ', + 'ipaq' => 'HP iPaq', + 'mot-' => 'Motorola', + 'playstation portable' => 'PlayStation Portable', + 'playstation 3' => 'PlayStation 3', + 'playstation vita' => 'PlayStation Vita', + 'hiptop' => 'Danger Hiptop', + 'nec-' => 'NEC', + 'panasonic' => 'Panasonic', + 'philips' => 'Philips', + 'sagem' => 'Sagem', + 'sanyo' => 'Sanyo', + 'spv' => 'SPV', + 'zte' => 'ZTE', + 'sendo' => 'Sendo', + 'nintendo dsi' => 'Nintendo DSi', + 'nintendo ds' => 'Nintendo DS', + 'nintendo 3ds' => 'Nintendo 3DS', + 'wii' => 'Nintendo Wii', + 'open web' => 'Open Web', + 'openweb' => 'OpenWeb', + + // Operating Systems + 'android' => 'Android', + 'symbian' => 'Symbian', + 'SymbianOS' => 'SymbianOS', + 'elaine' => 'Palm', + 'series60' => 'Symbian S60', + 'windows ce' => 'Windows CE', + + // Browsers + 'obigo' => 'Obigo', + 'netfront' => 'Netfront Browser', + 'openwave' => 'Openwave Browser', + 'mobilexplorer' => 'Mobile Explorer', + 'operamini' => 'Opera Mini', + 'opera mini' => 'Opera Mini', + 'opera mobi' => 'Opera Mobile', + 'fennec' => 'Firefox Mobile', + + // Other + 'digital paths' => 'Digital Paths', + 'avantgo' => 'AvantGo', + 'xiino' => 'Xiino', + 'novarra' => 'Novarra Transcoder', + 'vodafone' => 'Vodafone', + 'docomo' => 'NTT DoCoMo', + 'o2' => 'O2', + + // Fallback + 'mobile' => 'Generic Mobile', + 'wireless' => 'Generic Mobile', + 'j2me' => 'Generic Mobile', + 'midp' => 'Generic Mobile', + 'cldc' => 'Generic Mobile', + 'up.link' => 'Generic Mobile', + 'up.browser' => 'Generic Mobile', + 'smartphone' => 'Generic Mobile', + 'cellphone' => 'Generic Mobile' +); + +// There are hundreds of bots but these are the most common. +$robots = array( + 'googlebot' => 'Googlebot', + 'msnbot' => 'MSNBot', + 'baiduspider' => 'Baiduspider', + 'bingbot' => 'Bing', + 'slurp' => 'Inktomi Slurp', + 'yahoo' => 'Yahoo', + 'ask jeeves' => 'Ask Jeeves', + 'fastcrawler' => 'FastCrawler', + 'infoseek' => 'InfoSeek Robot 1.0', + 'lycos' => 'Lycos', + 'yandex' => 'YandexBot', + 'mediapartners-google' => 'MediaPartners Google', + 'CRAZYWEBCRAWLER' => 'Crazy Webcrawler', + 'adsbot-google' => 'AdsBot Google', + 'feedfetcher-google' => 'Feedfetcher Google', + 'curious george' => 'Curious George' +); diff --git a/application/controllers/About.php b/application/controllers/About.php new file mode 100644 index 0000000..c633af0 --- /dev/null +++ b/application/controllers/About.php @@ -0,0 +1,22 @@ +load->view('header', ['active' => 'about', 'title' => lang('about_sitetitle')]); + $this->load->view('about'); + $this->load->view('footer'); + } + + public function impressum() { + $this->load->view('header', ['active' => '', 'title' => 'Impressum']); + $this->load->view('impressum'); + $this->load->view('footer'); + } +} diff --git a/application/controllers/Blog.php b/application/controllers/Blog.php new file mode 100644 index 0000000..6670504 --- /dev/null +++ b/application/controllers/Blog.php @@ -0,0 +1,188 @@ +load->model('BlogModel', '', TRUE); + $this->load->helper('url'); + } + + function index() { + $offset = isset($_GET['page']) ? intval($_GET['page']) - 1 : 0; + $data = $this->BlogModel->getAllPosts('', 5, $offset); + + $this->load->view('header', ['active' => 'blog', 'title' => 'Blog', 'additionalStyles' => ['blog.css']]); + $this->load->view('blog/first', ['categories' => $this->BlogModel->getCategories()]); + + if(!empty($data)) { + $pageCount = $this->BlogModel->getPostPageCount('', 5); + $this->load->view('blog/postList', ['pageContent' => $data]); + } else { + $pageCount = 1; + $this->load->view('blog/postListError', ['search' => '']); + } + + $this->load->view('footer', ['additionalScripts' => ['lib/jquery.twbsPagination.min.js']]); + $this->load->view('blog/pagination', ['pageCount' => $pageCount]); + } + + function search($query = null) { + if(isset($_GET['q'])) { + redirect(base_url('blog/search/' . urlencode($this->input->get('q')))); + } elseif($query == null) { + redirect(base_url('blog')); + } else { + $query = $this->security->xss_clean(urldecode($query)); + $offset = isset($_GET['page']) ? intval($_GET['page']) - 1 : 0; + $data = $this->BlogModel->getAllPosts($query, 5, $offset); + + $this->load->view('header', ['active' => 'blog', 'title' => 'Blog', 'additionalStyles' => ['blog.css']]); + $this->load->view('blog/first', ['categories' => $this->BlogModel->getCategories()]); + + if(!empty($data)) { + $pageCount = $this->BlogModel->getPostPageCount($query, 5); + $this->load->view('blog/postList', ['pageContent' => $data]); + } else { + $pageCount = 1; + $this->load->view('blog/postListError', ['search' => $query]); + } + + $this->load->view('footer'); + $this->load->view('blog/pagination', ['pageCount' => $pageCount]); + } + } + + function category($category = null) { + if($category == null) { + redirect(base_url('blog')); + } else { + $category = urldecode($category); + $offset = isset($_GET['page']) ? intval($_GET['page']) - 1 : 0; + $data = $this->BlogModel->getCategoryPosts($category, 5, $offset); + + $this->load->view('header', ['active' => 'blog', 'title' => 'Blog', 'additionalStyles' => ['blog.css']]); + $this->load->view('blog/first', ['categories' => $this->BlogModel->getCategories()]); + + if(!empty($data)) { + $pageCount = $this->BlogModel->getPostPageCount('', 5); + $this->load->view('blog/postList', ['pageContent' => $data]); + } else { + $pageCount = 1; + $this->load->view('blog/postListError', ['search' => $category]); + } + + $this->load->view('footer'); + $this->load->view('blog/pagination', ['pageCount' => $pageCount]); + } + } + + public function tag($tag = null) { + if($tag == null) { + redirect(base_url('blog')); + } + $tag = urldecode($tag); + $offset = isset($_GET['page']) ? intval($_GET['page']) -1 : 0; + $data = $this->BlogModel->getTagPosts($tag, 5, $offset); + + $this->load->view('header', ['active' => 'blog', 'title' => 'Blog', 'additionalStyles' => ['blog.css']]); + $this->load->view('blog/first', ['categories' => $this->BlogModel->getCategories()]); + + if(!empty($data)) { + $pageCount = $this->BlogModel->getPostPageCount('', 5); + $this->load->view('blog/postList', ['pageContent' => $data]); + } else { + $pageCount = 1; + $this->load->view('blog/postListError', ['search' => $tag]); + } + + $this->load->view('footer'); + $this->load->view('blog/pagination', ['pageCount' => $pageCount]); + } + + function add() { + if(isset($_SESSION['user']) && $_SESSION['user']['rank'] >= 6) { + redirect('/admin/blog/add'); + } else { + redirect('/blog'); + } + } + + function post($postTitle = null) { + if($postTitle == null) { + redirect("/blog"); + } elseif(isset($_GET['q'])) { + redirect('/blog?q=' . $_GET['q']); + } else { + $post = $this->BlogModel->getPost($postTitle); + if(empty($post)) { + redirect('/blog'); + } else { + $post['randomPosts'] = $this->BlogModel->getRandomPosts($post['postID']); + $post['comments'] = $this->BlogModel->getComments($post['postID']); + $post['tags'] = $this->BlogModel->getTags($post['postID']); + $post['hasLiked'] = isset($_SESSION['user']) && !empty($_SESSION['user']) ? $this->BlogModel->hasAlreadyLiked($post['postID'], $_SESSION['user']['ID']) : false; + $sameCategoryPosts = $this->BlogModel->getCategoryPostsByID($post['postCategoryID'], 3, $post['postID']); + + $post['prevPost'] = $this->BlogModel->getPrevPost($post['postID']); + $post['nextPost'] = $this->BlogModel->getNextPost($post['postID']); + + $this->BlogModel->incrementViews($post['postID']); + + $this->load->view('header', ['active' => 'blog', 'title' => $post['postTitle'], 'additionalStyles' => ['posts_list.css', 'blog.css']]); + $this->load->view('blog/first', ['categoryPosts' => $sameCategoryPosts, 'categories' => $this->BlogModel->getCategories()]); + $this->load->view('blog/post', $post); + $this->load->view('footer', ['additionalScripts' => ['lib/prism.js', 'blog.js']]); + } + } + } + + function like() { + if(!isset($_SESSION['user']) || $_SESSION['user']['username'] == NULL) { + echo "no-user"; + } else { + if(!$this->BlogModel->hasAlreadyLiked($_POST['postID'], $_SESSION['user']['ID'])) { + echo 'true:'; + echo $this->BlogModel->addLike($_POST['postID'], $_SESSION['user']['ID'])['likeCount']; + } else { + echo 'false:'; + echo $this->BlogModel->removeLike($_POST['postID'], $_SESSION['user']['ID'])['likeCount']; + } + } + } + + function comment() { + if(!isset($_SESSION['user']) || $_SESSION['user']['username'] == NULL) { + $result = ['type' => 'error', 'message' => 'Nicht eingeloggt']; + } else { + $url = $this->input->post('url'); + + $url = str_replace('/blog/post/', '', $url); + + $comment = $this->BlogModel->addCommentByUrl($url, $_SESSION['user']['ID'], $this->input->post('comment'), false, NULL); + $result = ['type' => 'success', 'content' => [ + 'username' => $_SESSION['user']['username'], + 'displayname' => $_SESSION['user']['displayname'], + 'profilePic' => $_SESSION['user']['profilePic'], + 'date' => date('d.m.Y H: i \\U\\h\\r', strtotime($comment['date_created'])) + ]]; + } + + header("Content-Type: application/json"); + echo json_encode($result); + } + + function getComments() { + $url = $this->input->get('url'); + + $url = str_replace('/blog/post/', '', $url); + + $comments = $this->BlogModel->getCommentsByUrl($url); + foreach($comments as $comment) { + $comment['author'] = $this->BlogModel->getAuthorData($comment['user_id']); + $this->load->view('blog/comment', $comment); + } + } + +} diff --git a/application/controllers/Donate.php b/application/controllers/Donate.php new file mode 100644 index 0000000..0597890 --- /dev/null +++ b/application/controllers/Donate.php @@ -0,0 +1,16 @@ +load->view('header', ['active' => 'donate', 'title' => lang('donate_title')]); + $this->load->view('donate'); + $this->load->view('footer', ['additionalScripts' => ['donate.js']]); + } +} diff --git a/application/controllers/Error404.php b/application/controllers/Error404.php new file mode 100644 index 0000000..55d45b6 --- /dev/null +++ b/application/controllers/Error404.php @@ -0,0 +1,16 @@ +load->view('header', ['active' => '', 'title' => '404 - Seite nicht gefunden!']); + $this->load->view('404', ['random' => rand(1, 3)]); + $this->load->view('footer'); + } +} diff --git a/application/controllers/Faq.php b/application/controllers/Faq.php new file mode 100644 index 0000000..9993c65 --- /dev/null +++ b/application/controllers/Faq.php @@ -0,0 +1,17 @@ +load->view('header', ['active' => 'faq', 'title' => 'FAQ - Frequently Asked Questions']); + $this->load->view('faq'); + $this->load->view('footer'); + } +} + diff --git a/application/controllers/File.php b/application/controllers/File.php new file mode 100644 index 0000000..f36a846 --- /dev/null +++ b/application/controllers/File.php @@ -0,0 +1,90 @@ +db->query('SELECT name, type, path FROM files WHERE name = ?', [urldecode($title)])->result_array(); + + if (!empty($file)) { + $file = $file[0]; +// TODO: FIX! +// header("Content-length: " . $file['size']); + header("Content-type: " . $file['type']); + if ($download) { + header("Content-Disposition: attachment; filename=" . $file['name'] . '.' . explode('/', $file['type'])[1]); + } + + $imagePath = 'files/' . (isset($_GET['w']) || isset($_GET['h']) ? 'thumbs/' : '') . $file['name'] . (isset($_GET['w']) ? '_w' . $_GET['w'] : '') . (isset($_GET['h']) ? '_h' . $_GET['h'] : '') . '.' . explode('.', $file['path'])[1]; + + if (!file_exists($imagePath)) { + $config['image_library'] = 'gd2'; + $config['source_image'] = $file['path']; + if (isset($_GET['w'])) { + $config['width'] = $_GET['w']; + } + if (isset($_GET['h'])) { + $config['height'] = $_GET['h']; + } + $config['maintain_ratio'] = TRUE; + $config['new_image'] = $imagePath; + + $this->load->library('image_lib', $config); + + if (!$this->image_lib->resize()) { + echo $this->image_lib->display_errors(); + } + } + readfile(base_url($imagePath)); + exit; + } else { + redirect(base_url()); + } + } + } + + public function thumbnail($videoID = null) + { + if ($videoID !== null && strlen($videoID) == 11) { + $thumbnail_url = "http://img.youtube.com/vi/" . $videoID . "/maxresdefault.jpg"; + header("Content-Type: image/jpeg"); + readfile($thumbnail_url); + } else { + redirect(base_url()); + } + } + + public function csgo($category = null, $item = null) + { + if ($category == null || $item == null) { + redirect(base_url()); + } else { + if ($category == 'weapon') { + header("Content-Type: image/png"); + readfile('http://csgo-stats.com/img/weapons/3d/' . $item . '.png'); + } elseif ($category == 'map') { + header("Content-Type: image/jpeg"); + readfile('http://csgo-stats.com/img/maps/' . $item . '.jpg'); + } elseif ($category = 'mapicon') { + header("Content-Type: image/png"); + readfile('http://csgo-stats.com/img/maps/icons/' . $item . '.png'); + } + } + } + + public function weapon() + { + header("Content-Type: image/jpeg"); + readfile('http://csgo-stats.com/img/weapons/bg.jpg'); + } +} diff --git a/application/controllers/Lang.php b/application/controllers/Lang.php new file mode 100644 index 0000000..64a6e46 --- /dev/null +++ b/application/controllers/Lang.php @@ -0,0 +1,29 @@ +load->helper('url'); + $this->load->helper('cookie'); + } + + function change($lang = "en") + { + if (isset($_GET['r']) && !empty($_GET['r'])) { + $url = urldecode(base64_decode($_GET['r'])); + } else { + $url = base_url(); + } + if (in_array($lang, ['de', 'en', 'fr'])) { + $this->session->set_userdata('site_lang', $lang); + setcookie('language', $lang, time() + 7776000, '/'); + } else { + $this->session->set_userdata('site_lang', 'en'); + setcookie('language', 'en', time() + 7776000, '/'); + } + redirect($url); + } +} diff --git a/application/controllers/Login.php b/application/controllers/Login.php new file mode 100644 index 0000000..e82c180 --- /dev/null +++ b/application/controllers/Login.php @@ -0,0 +1,263 @@ +load->model('LoginModel', '', TRUE); + } + + public function index() + { + if (isset($_POST['logout']) && $_POST['logout'] == 'Logout') { + $_POST['logout'] = ''; + redirect("/logout"); + } + + if (isset($_SESSION['user'])) { + redirect(base_url('user/' . $_SESSION['user']['username'])); + } + + if (isset($_POST['loginname']) && !empty($_POST['loginname']) && isset($_POST['loginPassword']) && !empty($_POST['loginPassword'])) { + $_SESSION['loggedOut'] = false; + $rememberMe = isset($_POST['rememberMe']) ? $_POST['rememberMe'] : 'off'; + $this->LoginModel->login($_POST['loginname'], $_POST['loginPassword'], $rememberMe); + isset($_GET['r']) && !empty($_GET['r']) ? redirect(base64_decode($_GET['r'])) : redirect(base_url('login')); + } + + $notice = isset($_SESSION['notice']) ? $_SESSION['notice'] : ''; + $_SESSION['notice'] = ''; + + $this->load->view('header', ['active' => 'login', 'title' => 'Login', 'additionalStyles' => ['login.css']]); + $this->load->view('login', ['notice' => $notice]); + $this->load->view('footer', ['additionalScripts' => ['login.js']]); + } + + public function register() + { + $notice = ['state' => false, + 'errors' => ['username', 'email', 'password', 'passwordRepeat'], + 'messages' => [], + 'endMessage' => lang('register_error_occured')]; + $username = $this->input->post('username'); + $email = $this->input->post('email'); + $password = $this->input->post('password'); + $passwordRepeat = $this->input->post('passwordRepeat'); + + // Username + if (isset($username)) { + if (!preg_match('/[^A-Za-z0-9._]/', $username)) { + if ($this->LoginModel->isAvailable($username) == "") { + if (strlen($username) >= 4) { + unset($notice['errors'][array_search('username', $notice['errors'])]); + } else { + $notice['messages'][] = ['type' => 'danger', + 'headline' => lang('register_error_username_short'), + 'body' => lang('register_error_username_short_body')]; + } + } else { + $notice['messages'][] = ['type' => 'danger', + 'headline' => lang('register_error_username_occupied'), + 'body' => lang('register_error_username_occupied_body')]; + } + } else { + $notice['messages'][] = ['type' => 'danger', + 'headline' => lang('register_error_username_characters'), + 'body' => lang('register_error_username_characters_body')]; + } + } else { + $notice['messages'][] = ['type' => 'danger', + 'headline' => lang('register_error_username_missing'), + 'body' => lang('register_error_username_missing_body')]; + } + + // Email + if (isset($email)) { + $isRegistered = $this->LoginModel->isRegistered($email); + if ($isRegistered == "") { + $trashMail = $this->LoginModel->isTrashMail($email); + if (!$trashMail) { + unset($notice['errors'][array_search('email', $notice['errors'])]); + } else { + $notice['messages'][] = ['type' => 'danger', + 'headline' => lang('register_error_trashmail'), + 'body' => lang('register_error_trashmail')]; + } + } else { + $notice['messages'][] = ['type' => 'danger', + 'headline' => lang('register_error_email_occupied'), + 'body' => lang('register_error_email_occupied')]; + } + } else { + $notice['messages'][] = ['type' => 'danger', + 'headline' => lang('register_error_email_missing'), + 'body' => lang('register_error_email_missing')]; + } + + // Password + if (isset($password)) { + if (isset($passwordRepeat)) { + if ($password == $passwordRepeat) { + if ($this->LoginModel->checkPassword($password)) { + unset($notice['errors'][array_search('password', $notice['errors'])]); + unset($notice['errors'][array_search('passwordRepeat', $notice['errors'])]); + } else { + $notice['messages'][] = ['type' => 'danger', + 'headline' => lang('register_error_pw_unsecure'), + 'body' => lang('register_error_unsecure_body')]; + } + } else { + $notice['messages'][] = ['type' => 'danger', + 'headline' => lang('register_error_pw_different'), + 'body' => lang('register_error_pw_different_body')]; + } + } else { + $notice['messages'][] = ['type' => 'danger', + 'headline' => lang('register_error_pw_second_missing'), + 'body' => lang('register_error_pw_second_missing_body')]; + } + } else { + $notice['messages'][] = ['type' => 'danger', + 'headline' => lang('register_error_pw_missing'), + 'body' => lang('register_error_pw_missing_body')]; + } + + // Register + if (empty($notice['errors'])) { + $this->LoginModel->register($username, $email, $password, 0); // TODO: Implement login method + $notice['messages'][] = ['type' => 'success', + 'headline' => sprintf(lang('register_welcome'), $username), + 'body' => lang('register_welcome_body')]; + $notice['state'] = true; + $notice['endMessage'] = lang('register_end_message_success'); + } + + header("Content-Type: application/json"); + echo json_encode($notice); + } + + public function logout() + { + unset($_SESSION['user']); + $this->load->helper('cookie'); + delete_cookie('rememberMe'); + delete_cookie('token'); + $notice = '
Abgemeldet! Du wurdest erfolgreich abgemeldet! Ich hoffe wir sehen uns bald wieder.
'; + $_SESSION['notice'] = $notice; + $_SESSION['loggedOut'] = true; + $redirect = isset($_GET['redirect']) ? urldecode(base64_decode($_GET['redirect'])) : base_url("login"); + redirect($redirect); + } + + public function activate($emailHash = '', $activationKey = '') + { + if ($emailHash !== '' && $activationKey !== '' && strlen($activationKey) == 256 && strlen($emailHash) == 32) { + $email_id = $this->LoginModel->hashMailExists($emailHash, $activationKey); + if ($email_id !== NULL) { + $this->LoginModel->activateMail($email_id); + $_SESSION['notice'] = '
Dein Account wurde erfolgreich bestätigt! Du kannst dich jetzt mit deinem Passwort einloggen und alle Funktionen dieser Seite ausreizen!
'; + } else { + $_SESSION['notice'] = '
Dein Account konnte nicht aktiviert werden! Möglicherweise ist der Aktivierungs-Schlüssel falsch. Sollte dieser Fehler weiterhin auftreten, kontaktiere bitte das Website-Team!
'; + } + } else { + $_SESSION['notice'] = '
Ein Fehler ist aufgetreten! Der angegebene Aktivierungs-Schlüssel ist ungültig und entspricht nicht den Anforderungen. Der Account kann nicht aktiviert werden!
'; + } + redirect(base_url('login')); + } + + public function forget() + { + if (isset($_SESSION['user'])) + redirect(base_url('login')); + + $username = $this->input->post("username"); + $notice = ["state" => false, "message" => ""]; + if (!isset($username) || $username == "") { + $notice["message"] = 'Bitte gib deinen Nutzernamen oder deine E-Mail-Adresse an! Um dir Zugriff auf deinen Account zu gewähren, musst du entweder deinen Nutzernamen oder deine E-Mail-Adresse angeben.'; + echo json_encode($notice); + header('Content-Type: application/json'); + exit; + } + + $loginData = $this->LoginModel->getLoginData($username); + if (empty($loginData)) { + $notice['message'] = 'Dieser Nutzer existiert nicht! Es konnte kein Nutzer mit dieser E-Mail oder diesem Namen gefunden werden.'; + echo json_encode($notice); + header('Content-Type: application/json'); + exit; + } + + $loginData = $loginData[0]; + $username = strtolower($username); + if ($username == $loginData['username'] || $username == $loginData['email']) { + $resetKey = $this->LoginModel->createForgetPasswordKey($loginData['username']); + + // TODO: E-Mail send + $this->load->library('email'); + $message = ""; + +// $config['mailtype'] = "html"; +// $this->mail->initialize($config); + + $this->email->from('noreply@kingofdog.de', 'KingOfDog.de'); + $this->email->to($loginData['email']); + + $this->email->subject('Passwort zurücksetzen'); + $this->email->message($message); + +// $this->email->send(); + $notice['state'] = true; + $notice['message'] = "Eine E-Mail wurde an dich gesendet! Schau' in dein Postfach und klick auf den Link, um dein Passwort zu ändern!"; + } + echo json_encode($notice); + header('Content-Type: application/json'); + } + + public function reset($userKey = NULL, $resetKey = NULL) + { + if ($resetKey == NULL || $userKey == NULL) + redirect(base_url("login")); + + $username = base64_decode($userKey); + if (!$this->LoginModel->resetKeyIsValid($username, $resetKey)) + redirect(base_url('login')); + + $password = $this->input->post('password'); + $passwordRepeat = $this->input->post('passwordConfirm'); + $notice = ["type" => false, "message" => ""]; + if (isset($password)) { + if (isset($passwordRepeat)) { + $loginData = $this->LoginModel->getLoginData($username); + if (!empty($loginData)) { + $loginData = $loginData[0]; + if ($this->LoginModel->checkPassword($password)) { + if ($password == $passwordRepeat) { + $this->LoginModel->changePassword($password, $loginData['original_name']); + $this->LoginModel->unsetResetKey($loginData['ID']); + $notice['message'] .= ""; + $notice['type'] = true; + } else { + $notice['message'] .= ""; + } + } else { + $notice['message'] .= ""; + } + } else { + $notice['message'] .= ""; + } + } else { + $notice['message'] .= ""; + } + echo json_encode($notice); + header('Content-Type: application/json'); + exit; + } + + $this->load->view('header', ['active' => 'reset_password', 'title' => 'Neues Passwort festlegen', 'additionalStyles' => ['login.css']]); + $this->load->view('network/password_reset', ['notice' => $notice['message']]); + $this->load->view('footer', ['additionalScripts' => ['login.js']]); + } + } diff --git a/application/controllers/Main.php b/application/controllers/Main.php new file mode 100644 index 0000000..e4e8a6a --- /dev/null +++ b/application/controllers/Main.php @@ -0,0 +1,154 @@ +load->model('YoutubePlayerModel', '', TRUE); + $this->load->model('SocialMediaModel', '', TRUE); + $this->load->model('UserModel', '', TRUE); + $this->load->model('NotificationModel', '', TRUE); + $this->load->model('PostsModel', '', TRUE); + } + + public function index() + { + // TODO: Add twitch, instagram and 500px as further services + // TODO: Receive posts async +// $this->SocialMediaModel->getTwitterPosts(); +// $this->SocialMediaModel->getYouTubeVideos(); + +// $this->load->library('email'); +// $config['protocol'] = 'sendmail'; +// $config['mailpath'] = '/sendmail'; +// $config['charset'] = 'iso-8859-1'; +// $config['wordwrap'] = TRUE; +// +// $this->email->initialize($config); +// +// $this->email->from('info@kingofdog.eu', 'KingOfDog.de'); +// $this->email->to('struckatmarcel@gmail.com'); +// +// $this->email->subject('Email Test'); +// $this->email->message('Testing the email class.'); +// +// $this->email->send(); + +// ini_set('SMTP', 'smtp.gmail.com'); +// ini_set('smtp_port', '465'); +// + $video = $this->YoutubePlayerModel->newestVids(1)[0]; + + $currentlyActiveUsers = $this->UserModel->getActiveUsers(5); + $newestUsers = $this->UserModel->getNewestUsers(5); + $newestPosts = $this->PostsModel->getNewestPosts(3, 128); + + $this->load->view('header', ['active' => 'home', 'title' => lang('home_sitetitle'), 'additionalStyles' => ['lib/social-media-font.css', 'sortlist.css', 'home.css']]); + $this->load->view('home', ['video' => $video, 'currentlyActiveUsers' => $currentlyActiveUsers, 'newestUsers' => $newestUsers, 'newestPosts' => $newestPosts]); + $this->load->view('footer', ['additionalScripts' => ['lib/isotope.pkgd.min.js', 'home.js']]); + } + + public function getPosts() + { + $amount = (int)$this->input->get('amount'); + $offset = $this->input->get('offset') * $amount; + $category = $this->input->get('category'); + if ($category == "*") { + $items = $this->SocialMediaModel->getPosts($amount, $offset); + } else { + $items = $this->SocialMediaModel->getPostsOfCategory($amount, $offset, explode(".", $category)[1]); + } + $font_sizes = [27, 27, 24, 24, 24, 20, 16, 16, 14, 14, 12, 11, 10]; + foreach ($items as $item) { + $post_date = $item['post_date']; + $item['post_date'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$post_date"), $_SESSION['site_lang']); + $item['font_sizes'] = $font_sizes; + $this->load->view('post_list_entry', $item); + } + } + + public function addFeedback() + { + $url = $this->input->post('url'); + $message = $this->input->post('message'); + $anonymous = filter_var($this->input->post('anonymous'), FILTER_VALIDATE_BOOLEAN); + var_dump($anonymous); + $email = NULL; + $userID = NULL; + + if (!$anonymous && !empty($_SESSION['user'])) { + $userID = $_SESSION['user']['ID']; + } + + $this->GeneralModel->addFeedback($url, $message, $anonymous, $userID, $email); + } + + public function contactTeam() + { + $message = $this->input->post('message'); + $email = $this->input->post('email'); + $notice = ['type' => false, 'message' => '']; + + if (isset($message) && $message != "") { + if ($email != "" || isset($_SESSION['user'])) { + if (isset($_SESSION['user'])) + $email = $this->UserModel->getUser($_SESSION['user']['username'])[0]['email']; + if (preg_match("/[A-Za-z._]+@[A-Za-z._]+\.[A-Za-z._]+/", $email)) { + // TODO: Send contact mail + $notice['type'] = true; + $notice['message'] = "Deine Nachricht wurde versendet!"; + } else { + $notice['message'] = "Die eingebene E-Mail-Adresse ist ungültig!"; + } + } else { + $notice['message'] = "Bitte gib eine E-Mail-Adresse ein oder melde dich an."; + } + } else { + $notice['message'] = "Bitte gib eine zu versendende Nachricht ein."; + } + + echo json_encode($notice); + header('Content-Type: application/json'); + } + + public function stillAlive() + { + if (isset($_SESSION['user']) && !empty($_SESSION['user'])) { + $this->UserModel->updateOnline(intval($_SESSION['user']['ID'])); + } + redirect(base_url()); + } + + public function getNotifications() + { + header('Content-Type: application/json'); + if (!isset($_SESSION['user']) || empty($_SESSION['user'])) { + echo json_encode(['status' => 'error', 'message' => 'Du musst eingeloggt sein, um Benachrichtigungen zu empfangen.']); + exit; + } + + $returnData = ['status' => 'success', 'notifications' => []]; + + $notifications = $this->NotificationModel->getUserNotifications($_SESSION['user']['ID']); + $returnData['notifications'] = $notifications; + + echo json_encode($returnData); + } + + public function notificationsRead() { + header('Content-Type: application/json'); + if(!isset($_SESSION['user']) || empty($_SESSION['user'])) { + echo json_encode(['success' => false, 'message' => 'Du musst eingeloggt sein, um Benachrichtigungen zu empfangen.']); + exit; + } + + $this->NotificationModel->markUserNotificationsAsRead($_SESSION['user']['ID']); + + echo json_encode(['success' => true]); + } + } diff --git a/application/controllers/Posts.php b/application/controllers/Posts.php new file mode 100644 index 0000000..5082021 --- /dev/null +++ b/application/controllers/Posts.php @@ -0,0 +1,216 @@ +load->model('UserModel', '', TRUE); + $this->load->model('PostsModel', '', TRUE); + } + + public function index() + { + if (isset($_SESSION['user']) && !empty($_SESSION['user'])) + redirect(base_url('posts/feed')); + redirect(base_url('posts/popular')); + } + + public function feed() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user'])) + redirect(base_url('posts')); + + $this->load->view('header', ['active' => 'feed', 'title' => 'Dein Feed', 'additionalStyles' => ['posts_list.css']]); + $this->load->view('network/posts/posts_list', ['active', 'feed']); + $this->load->view('footer', ['additionalScripts' => ['post_feed.js', 'post_search.js']]); + } + + public function getFeedPosts() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user'])) + redirect(base_url('posts')); + + $amount = (int)$this->input->get('amount'); + $offset = (int)$this->input->get('offset') * $amount; + $posts = $this->PostsModel->getFeedPosts($_SESSION['user']['ID'], $amount, $offset); + + foreach ($posts as $post) { + $this->load->view('network/posts/post_item', $post); + } + } + + public function popular() + { + $this->load->view('header', ['active' => 'popular', 'title' => 'Beliebte Posts', 'additionalStyles' => ['posts_list.css']]); + $this->load->view('network/posts/posts_list', ['active' => 'popular']); + $this->load->view('footer', ['additionalScripts' => ['post_feed.js', 'post_search.js']]); + } + + public function getPopularPosts() + { + $amount = (int)$this->input->get('amount'); + $offset = (int)$this->input->get('offset') * $amount; + $posts = $this->PostsModel->getPopularPosts($amount, $offset); + + foreach ($posts as $post) { + $this->load->view('network/posts/post_item', $post); + } + } + + public function addPostLike() + { + header('Content-Type: application/json'); + if (!isset($_SESSION['user']) || empty($_SESSION['user'])) { + echo json_encode([ + 'success' => false, + 'message' => lang('post_like_account_missing') + ]); + exit; + } + + $postUUID = $this->input->post('postUUID'); + + $isLiked = $this->PostsModel->addPostLikeByUUID($postUUID, $_SESSION['user']['ID']); + $likeCount = $this->PostsModel->getPostLikeCountByUUID($postUUID); + + echo json_encode([ + 'success' => true, + 'message' => 'Du hast den Post erfolgreich bewertet.', + 'isLiked' => $isLiked, + 'likeCount' => $likeCount + ]); + } + + public function search() + { + $type = $this->input->get('type'); + $query = $this->input->get('q'); + $rank = $this->input->get('rank'); + + $this->load->view('header', ['active' => 'search', 'title' => 'Suche', 'additionalStyles' => ['posts_list.css']]); + $this->load->view('network/posts/posts_list', ['active' => 'search', 'search' => ['query' => $query, 'type' => $type, 'rank' => $rank]]); + $this->load->view('footer', ['additionalScripts' => ['post_search.js']]); + } + + public function getSearchPosts() + { + $type = $this->input->get('type'); + $query = $this->input->get('query'); + $rank = $type == 'type-users' ? $this->input->get('rank') : ''; + $lang = $type == 'type-users' ? $this->input->get('lang') : ''; + $country = $type == 'type-users' ? $this->input->get('country') : ''; + $amount = (int)$this->input->get('amount'); + $offset = (int)$this->input->get('offset') * $amount; + + if ($type !== 'type-users' && $rank !== '' && $lang !== '' && strlen($query) < 4) { + exit; + } + + if (($type == 'type-all' && $offset == 0) || $type == 'type-users') { + $userAmount = $type == 'type-users' ? $amount : 3; + $userOffset = $type == 'type-users' ? $offset : 0; + $users = $this->UserModel->searchUsers($query, $rank, $country, $lang, $userAmount, $userOffset); + + if (!empty($users)) { + if($offset == 0) { + echo '

Nutzer (' . sizeof($users) . ')

'; + } + + echo '
'; + foreach ($users as $user) { + $user['about'] = strlen($user['about']) > 60 ? substr($user['about'], 0, 60) . '...' : $user['about']; + + echo $this->load->view('network/user/user_overview_card', $user, true); + } + echo '
'; + } + } + + if ($type == 'type-all' || $type == 'type-posts') { + $posts = $this->PostsModel->searchPosts($query, $amount, $offset); + + if (!empty($posts) && $offset == 0) { + echo '

Posts

'; + } + + foreach ($posts as $post) { + $this->load->view('network/posts/post_item', $post); + } + } + } + + public function getAvailableCountries() { + $countries = $this->UserModel->getAvailableCountries(); + + foreach ($countries as $i => $country) { + $countries[$i]['name'] = lang('country_' . $country['country']); + } + + header('Content-Type: application/json'); + echo json_encode(['countries' => $countries]); + } + + public function getAvailableLanguages() { + $languages = $this->UserModel->getAvailableLanguages(); + + foreach ($languages as $i => $language) { + $languages[$i]['name'] = lang('lang_' . strtolower($language['language'])); + } + + header('Content-Type: application/json'); + echo json_encode(['languages' => $languages]); + } + + public function getReportModal() { + $this->load->view('network/posts/report_modal'); + } + + public function reportPost() { + header('Content-Type: application/json'); + $uuid = $this->input->post('uuid'); + $reason = $this->input->post('reason'); + $reasonText = $this->input->post('explanation'); + + if($reason == '') { + echo json_encode(['success' => false, 'message' => 'Bitte wähle einen Grund für deine Meldung aus.']); + exit; + } + + $allowedReasons = ['hatespeech', 'racism', 'terrorism', 'abuse', 'violence', 'copyright', 'spam', 'technical-issue']; + + if(!array_search($reason, $allowedReasons)) { + echo json_encode(['success' => false, 'message' => 'Bitte wähle einen standardmäßig vorhandenen und validen Grund für die Meldung aus.']); + exit; + } + + if(!$this->PostsModel->isUUIDValid($uuid)) { + echo json_encode(['success' => true, 'message' => 'Der ausgewählte Post ist nicht (mehr) vorhanden. Sollte es sich hierbei um ein Irrtum handeln, verfasse bitte über den Button unten rechts ein Feedback.']); + exit; + } + + $this->PostsModel->reportPost($uuid, $reason, $reasonText); + + echo json_encode(['success' => true, 'message' => 'Vielen Dank für das Melden dieses Posts. Wir werden schnellstmöglich angemessene Aktionen unternehmen.']); + } + + public function getDeleteModal() { + header('Content-Type: application/json'); + if(!isset($_SESSION['user'])) { + echo json_encode(['success' => false, 'message' => 'Du musst eingeloggt sein, um die Posts deines Accounts zu löschen']); + exit; + } + + $uuid = $this->input->post('uuid'); + $post = $this->PostsModel->getPostByUUID($uuid); + + if(empty($post)) { + echo json_encode(['success' => false, 'message' => 'Der angegebene Post existiert nicht.']); + exit; + } + + + } + } \ No newline at end of file diff --git a/application/controllers/Projects.php b/application/controllers/Projects.php new file mode 100644 index 0000000..8df33e3 --- /dev/null +++ b/application/controllers/Projects.php @@ -0,0 +1,91 @@ +load->model('ProjectsModel', '', TRUE); + } + + public function index($album = 'all') + { + $collections = $this->ProjectsModel->getCategories($album); + $content = $this->ProjectsModel->getEntries('all'); + + $this->load->view('header', ['active' => 'projects', 'title' => lang('projects_sitetitle'), 'additionalStyles' => ['sortlist.css', 'projects.css']]); + $this->load->view('projects', ['content' => $content, 'album' => $album, 'collections' => $collections]); + $this->load->view('footer', ['additionalScripts' => ['lib/isotope.pkgd.min.js', 'projects.js']]); + } + + public function entry($entry = null) + { + if ($entry == null) { + redirect(base_url('projects')); + } else { + if ($this->ProjectsModel->checkIfNameExists($entry)) { + $data = $this->ProjectsModel->getEntryByName($entry, $_SESSION['site_lang']); + $timecreated = strtotime($data['datetime']); + $data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$timecreated"), $_SESSION['site_lang']); + + $voteCount = $this->ProjectsModel->getVoteCount($data['ID']); + $voteType = 0; + if (isset($_SESSION['user']['ID'])) + $voteType = $this->ProjectsModel->getUserVoteType($data['ID'], $_SESSION['user']['ID']); + $prevProject = $this->ProjectsModel->getPrevProject($data['ID']); + $nextProject = $this->ProjectsModel->getNextProject($data['ID']); + + $this->load->view('header', ['active' => 'projects', 'title' => $data['title'] . ' - ' . lang('projects_sitetitle'), 'additionalStyles' => ['project_entry.css']]); + $this->load->view('projects_entry', ['data' => $data, 'voteCount' => $voteCount, 'voteType' => $voteType, 'prevProject' => $prevProject, 'nextProject' => $nextProject]); + $this->load->view('footer', ['additionalScripts' => ['project-entry.js']]); + } + } + } + + public function getEntries() + { + $items = $this->ProjectsModel->getEntries('all'); + var_dump($items); + foreach ($items as $item) { + var_dump($item); + $this->load->view('projects_list_entry', $item); + } + } + + public function addVote() + { + header('Content-Type: text/json'); + if (!isset($_SESSION['user']) || empty($_SESSION['user'])) { + $result = ['type' => 'error', 'msg' => 'Du musst eingeloggt sein, um dieses Projekt zu bewerten.']; + echo json_encode($result); + exit; + } + + $projectID = $this->input->post('id'); + $voteType = $this->input->post('type'); + + if (!isset($projectID) || !isset($voteType)) { + $result = ['type' => 'error', 'msg' => 'Es ist ein unbekannter Fehler aufgetreten.']; + echo json_encode($result); + exit; + } + + $projectID = intval($projectID); + $voteType = intval($voteType); + + if ($voteType < 0) + $voteType = -1; + else + $voteType = 1; + + $this->ProjectsModel->addVote($projectID, $_SESSION['user']['ID'], $voteType); + $voteCount = $this->ProjectsModel->getVoteCount($projectID); + + $result = ['type' => 'success', 'msg' => 'Vielen Dank für deine Bewertung.', 'voteCount' => $voteCount]; + echo json_encode($result); + } +} diff --git a/application/controllers/Redirect.php b/application/controllers/Redirect.php new file mode 100644 index 0000000..c95f004 --- /dev/null +++ b/application/controllers/Redirect.php @@ -0,0 +1,45 @@ +load->model('RedirectModel', '', TRUE); + } + + public function index($redirect = null) { + if($redirect == null) { + redirect(base_url()); + } else { + redirect("/r/p/" . $redirect); + } + } + + public function p($redirect = null) { + var_dump($redirect); + if($redirect == null) { + if(isset($_SESSION['user']) && $_SESSION['user']['rank'] >= 9) { + $returnMessage = ''; + if(isset($_POST['redirectInput']) && !empty($_POST['redirectInput']) && isset($_POST['redirectUrl']) && !empty($_POST['redirectUrl'])) { + $feedback = $this->redirect->insertRedirect($_POST['redirectUrl'], $_POST['redirectInput']); + if($feedback['feedback'] == 'success') { + $returnMessage = ''; + } else { + $returnMessage = ''; + } + } + + $this->load->view('header', ['title' => 'Redirect-Manager', 'active' => '']); + $this->load->view('redirect', ['message' => $returnMessage, 'allItems' => $this->RedirectModel->getItems()]); + $this->load->view('footer'); + } else { + header("Location: /"); + } + } else { + $url = $this->RedirectModel->getUrl($redirect); + header("Location: " . $url); + } + } + +} diff --git a/application/controllers/Tools/Csgo.php b/application/controllers/Tools/Csgo.php new file mode 100644 index 0000000..dd1d0ef --- /dev/null +++ b/application/controllers/Tools/Csgo.php @@ -0,0 +1,219 @@ +load->view('header', ['active' => 'csgo', 'title' => 'CS:GO Tools', 'additionalStyles' => ['csgo.css']]); + $this->load->view('tools/csgo', ['user' => $user]); + $this->load->view('footer', ['additionalScripts' => ['lib/nanobar.min.js', 'csgo.js']]); + } + + public function data($user) + { + $data = simplexml_load_string(file_get_contents('http://steamcommunity.com/id/' . $user . '/?xml=1')); + $a['player_exists'] = true; + $a['player_owns_game'] = true; + $a['id64'] = (string)$data->steamID64; + $a['id'] = (string)$data->steamID; + $a['name'] = (string)$data->realname; + $a['location'] = (string)$data->location; + $a['onStat'] = (string)$data->onlineState; + $a['statusMes'] = (string)$data->stateMessage; + $a['avatar'] = (string)$data->avatarFull; + $a['vacban'] = (string)$data->vacBanned; + $a['tradeban'] = (string)$data->tradeBanState; + if($a['id'] == "") { + $a['player_exists'] = false; + $a['player_owns_game'] = false; + echo json_encode($a); + exit; + } + $status = ['in-game' => 'In Game', 'online' => 'Online', 'offline' => 'Offline', 'busy' => 'Busy', 'away' => 'Away']; + $a['status'] = $status[$a['onStat']]; + + $successful = file_get_contents('http://api.steampowered.com/ISteamUserStats/GetUserStatsForGame/v0002/?appid=730&key=79E0709F4D4157636A833312C91639FC&steamid=' . $a['id64'], true); + if($successful == false) { + goto go_on; + } + + $data = json_decode($successful, true)['playerstats']; + + $stats = $data['stats']; + $kills = []; + foreach ($stats as $stat) { + $a[$stat['name']] = $stat['value']; + if (strpos($stat['name'], 'total_kills_') !== false && !in_array($stat['name'], ['total_kills_headshot', 'total_kills_enemy_weapon', 'total_kills_enemy_blinded', 'total_kills_knife_fight', 'total_kills_against_zoomed_sniper'])) { + $kills[] = $stat['value'] . '_' . explode('_', $stat['name'])[2]; + } + } + natsort($kills); + $a['kills'] = array_reverse($kills); + if ($a['last_match_wins'] > $a['last_match_rounds'] / 2) { + $a['last_match_end_status'] = 2; + } elseif ($a['last_match_wins'] < $a['last_match_rounds'] / 2) { + $a['last_match_end_status'] = 0; + } else { + $a['last_match_end_status'] = 1; + } + + if(isset($data['achievements'])) { + $ach = $data['achievements']; + foreach ($ach as $entry) { + $a[$entry['name']] = $entry['achieved']; + } + $a['total_time_played'] = round($a['total_time_played'] / 60 / 60); + } else { + $a['player_owns_game'] = false; + } + + go_on: + $data = json_decode(file_get_contents('http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=79E0709F4D4157636A833312C91639FC&steamids=' . $a['id64']), true)['response']; + $data = $data['players']; + $data = $data[0]; + $a['lastseen'] = $data['lastlogoff']; + $a['url'] = $data['profileurl']; + $a['created'] = $data['timecreated']; + $a['country'] = $data['loccountrycode']; + + $a['weapon_list'] = [ + 1 => ["Desert Eagle", "deagle"], + 2 => ["Dual Berettas", "elite"], + 3 => ["Five-SeveN", "fiveseven"], + 4 => ["Glock-18", "glock"], + 7 => ["AK-47", "ak47"], + 8 => ["AUG", "aug"], + 9 => ["AWP", "awp"], + 10 => ["FAMAS", "famas"], + 11 => ["G3SG1", "g3sg1"], + 13 => ["Galil AR", "galilar"], + 14 => ["M249", "m249"], + 16 => ["M4A4", "m4a4"], + 17 => ["MAC-10", "mac10"], + 19 => ["P90", "p90"], + 24 => ["UMP-45", "ump45"], + 25 => ["XM1014", "xm1014"], + 26 => ["PP-Bizon", "bizon"], + 27 => ["MAG-7", "mag7"], + 28 => ["Negev", "negev"], + 29 => ["Sawed-Off", "sawedoff"], + 30 => ["Tec-9", "tec9"], + 31 => ["Zeus x27", "taser"], + 32 => ["P2000", "hkp2000"], + 33 => ["MP7", "m79"], + 34 => ["MP9", "mp9"], + 35 => ["Nova", "nova"], + 36 => ["P250", "p250"], + 38 => ["SCAR-20", "scar20"], + 39 => ["SG 553", "sg556"], + 40 => ["SSG 08", "ssg08"], + 42 => ["Knife", "knife_ct"], + 43 => ["Flashbang", "flashbang"], + 44 => ["High Explosive Grenade", "hegrenade"], + 45 => ["Smoke Grenade", "smokegrenade"], + 46 => ["Molotov", "molotov"], + 47 => ["Decoy Grenade", "decoy"], + 48 => ["Incendiary Grenade", "incgrenade"], + 59 => ["Knife", "knife"], + 60 => ["M4A1-S", "m4a1"], + 61 => ["USP-S", "usp"], + 63 => ["CZ75-Auto", "cz75"], + 64 => ["R8 Revolver", "deagle"], + ]; + + if(isset($a['total_kills_headshot'])) { + $a['total_headshot_rate'] = number_format( + $a['total_kills_headshot'] / $a['total_kills'] * 100, + 1, + lang('csgo_comma'), + lang('csgo_point')) . " %"; + $a['total_kills'] = number_format($a['total_kills'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_time_played'] = number_format($a['total_time_played'], 0, lang('csgo_comma'), lang('csgo_point')) . " h"; + $a['total_accuracy'] = number_format($a['total_shots_hit'] / $a['total_shots_fired'] * 100, 1, lang('csgo_comma'), lang('csgo_point')) . " %"; + $a['total_mvps'] = number_format($a['total_mvps'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_win_rate'] = number_format($a['total_wins'] / $a['total_rounds_played'] * 100, 1, lang('csgo_comma'), lang('csgo_point')) . " %"; + $a['total_planted_bombs'] = number_format($a['total_planted_bombs'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_rescued_hostages'] = number_format($a['total_rescued_hostages'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['last_match_result'] = $a['last_match_end_status'] == 2 ? 'win' : ''; + $a['last_match_outcome'] = lang('csgo_' . $a['last_match_end_status']); + $a['last_match_favweapon_accuracy'] = number_format($a['last_match_favweapon_hits'] / $a['last_match_favweapon_shots'] * 100, 1, lang('csgo_comma'), lang('csgo_point')); + + $a['last_match_kd'] = number_format($a['last_match_kills'] / $a['last_match_deaths'], 2, lang('csgo_comma'), lang('csgo_point')); + $a['last_match_kills'] = number_format($a['last_match_kills'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['last_match_deaths'] = number_format($a['last_match_deaths'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['last_match_mvps'] = number_format($a['last_match_mvps'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['last_match_damage'] = number_format($a['last_match_damage'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['last_match_money_spent'] = number_format($a['last_match_money_spent'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['last_match_dominations'] = number_format($a['last_match_dominations'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['last_match_revenges'] = number_format($a['last_match_revenges'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['last_match_contribution_score'] = number_format($a['last_match_contribution_score'], 0, lang('csgo_comma'), lang('csgo_point')); + + $a['favweapons'] = ''; + for ($i = 0; + $i < 5; + $i++) { + $weapon = $a['kills'][$i]; + $killCount = explode('_', $weapon)[0]; + $weaponName = explode('_', $weapon)[1]; + + $a['favweapons'] .= '
  • ' : 'line">'; + $a['favweapons'] .= '

    ' . ($i + 1); + if ($i > 0) { + $a['favweapons'] .= '. '; + } + $a['favweapons'] .= ' ' . $weaponName . '

    '; + if ($i == 0) { + $a['favweapons'] .= ''; + } else { + $a['favweapons'] .= ' '; + } + $a['favweapons'] .= '

    ' . $killCount . '

  • '; + } + + $a['total_deaths'] = number_format($a['total_deaths'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_kd'] = number_format($a['total_kills'] / $a['total_deaths'], 2, lang('csgo_comma'), lang('csgo_point')); + $a['total_contribution_score'] = number_format($a['total_contribution_score'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_damage_done'] = number_format($a['total_damage_done'], 0, lang('csgo_comma'), lang('csgo_point')) . ' HP'; + $a['total_shots_fired'] = number_format($a['total_shots_fired'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_shots_hit'] = number_format($a['total_shots_hit'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_kills_headshot'] = number_format($a['total_kills_headshot'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_dominations'] = number_format($a['total_dominations'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_revenges'] = number_format($a['total_revenges'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_matches_played'] = number_format($a['total_matches_played'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_matches_won'] = number_format($a['total_matches_won'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_matches_won_percent'] = number_format($a['total_matches_won'] / $a['total_matches_played'] * 100, 2, lang('csgo_comma'), lang('csgo_point')) . ' %'; + $a['total_rounds_played'] = number_format($a['total_rounds_played'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_wins'] = number_format($a['total_wins'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_wins_pistolround'] = number_format($a['total_wins_pistolround'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_defused_bombs'] = number_format($a['total_defused_bombs'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_rescued_hostages'] = number_format($a['total_rescued_hostages'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_kills_enemy_blinded'] = number_format($a['total_kills_enemy_blinded'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_kills_knife_fight'] = number_format($a['total_kills_knife_fight'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_kills_against_zoomed_sniper'] = number_format($a['total_kills_against_zoomed_sniper'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_kills_taser'] = number_format($a['total_kills_taser'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_kills_enemy_weapon'] = number_format($a['total_kills_enemy_weapon'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_money_earned'] = number_format($a['total_money_earned'], 0, lang('csgo_comma'), lang('csgo_point')) . ' $'; + $a['total_weapons_donated'] = number_format($a['total_weapons_donated'], 0, lang('csgo_comma'), lang('csgo_point')); + $a['total_broken_windows'] = number_format($a['total_broken_windows'], 0, lang('csgo_comma'), lang('csgo_point')); + } else { + $a['player_owns_game'] = false; + } + + header('Content-Type: application/json'); + echo json_encode($a); + } + + public function getDefaultPage($user) { + $this->load->view('csgo-tools', ['user' => $user]); + } +} \ No newline at end of file diff --git a/application/controllers/Tools/Encoder.php b/application/controllers/Tools/Encoder.php new file mode 100644 index 0000000..54aad6c --- /dev/null +++ b/application/controllers/Tools/Encoder.php @@ -0,0 +1,25 @@ +load->view('header', ['active' => 'base64-encoder', 'title' => lang('base64_site_title')]); +// $this->load->view('encoder', ['type' => 'base64']); + $this->load->view('tools/encoders/base64'); + $this->load->view('footer'); +// $this->load->view('encoder_end', ['type' => 'base64']); + } + + public function url() { + $this->load->view('header', ['active' => 'url-encoder', 'title' => lang('url_site_title')]); +// $this->load->view('encoder', ['type' => 'url']); + $this->load->view('tools/encoders/url'); + $this->load->view('footer'); +// $this->load->view('encoder_end', ['type' => 'url']); + } +} diff --git a/application/controllers/Tools/Encrypter.php b/application/controllers/Tools/Encrypter.php new file mode 100644 index 0000000..38c868f --- /dev/null +++ b/application/controllers/Tools/Encrypter.php @@ -0,0 +1,15 @@ +load->view('header', ['active' => 'encrypter', 'title' => lang('encrypter_site_title')]); + $this->load->view('tools/encrypter/main', ['active' => $active]); + $this->load->view('footer', ['additionalScripts' => ['encrypters.js']]); + } +} diff --git a/application/controllers/Tools/Generators.php b/application/controllers/Tools/Generators.php new file mode 100644 index 0000000..aa8144e --- /dev/null +++ b/application/controllers/Tools/Generators.php @@ -0,0 +1,30 @@ +load->model('NicknameModel', '', TRUE); + } + + public function nickname() + { + $this->load->view('header', ['active' => 'nickname-generator', 'title' => lang('nick_site_title')]); + $this->load->view('tools/generators/nickname', ["counter" => "unendlich"]); + $this->load->view('footer', ['additionalScripts' => ['nickname.js']]); + } + + public function nickname_functions() + { + $this->NicknameModel->generateName(); + } + + public function password() + { + $this->load->view('header', ['active' => 'password-generator', 'title' => lang('pass_site_title'), 'additionalStyles' => ['tools.css']]); + $this->load->view('tools/generators/password'); + $this->load->view('footer', ['additionalScripts' => ['password.js']]); + } + +} diff --git a/application/controllers/Tools/Minecraft.php b/application/controllers/Tools/Minecraft.php new file mode 100644 index 0000000..9446afa --- /dev/null +++ b/application/controllers/Tools/Minecraft.php @@ -0,0 +1,92 @@ +load->model('minecraftModel', '', TRUE); + } + + public function index() { + $this->load->view('header', ['active' => '', 'title' => 'Error']); + $this->load->view('under_construction'); + $this->load->view('footer'); + } + public function servers() { + $this->load->view('header', ['active' => '', 'title' => 'Error']); + $this->load->view('under_construction'); + $this->load->view('footer'); + } + public function players() { + $this->load->view('header', ['active' => '', 'title' => 'Error']); + $this->load->view('under_construction'); + $this->load->view('footer'); + } + + + + /*public function server() { + $serverip = isset($_GET['serverip']) ? $_GET['serverip'] : 'gommehd.net'; + + $errorIP = $this->MinecraftModel->getServerName($serverip) == lang('servers_error_ip') ? true : false; + + $this->load->view('header', ['active' => 'minecraft-servers', 'title' => lang('servers_site_title')]); + $this->load->view('minecraft', ['type' => 'server', 'serverip' => $serverip, 'error' => $errorIP]); + $this->load->view('footer'); + } + + public function player() + { + $username = !empty($_GET['username']) ? $_GET['username'] : "KingOfDog"; + $username = $this->MinecraftModel->getUUID($username)[1]; + + $cracked = $this->MinecraftModel->getUUID($username)[2] == true ? 'Cracked' : 'Premium'; + $crackedBool = $this->MinecraftModel->getUUID($username)[2]; + if ($crackedBool == false) { + $uuid = $this->MinecraftModel->getUUID($username)[0]; + $uuid_formatted = $this->MinecraftModel->formatUUID($uuid); + } else { + $uuid = null; + $uuid_formatted = null; + } + + if (isset($_GET['download']) && !empty($_GET['download'])) { + if ($_GET['download'] == "skin") { + header('Content-Type: image/png'); + header('Content-Disposition: attachment; filename="skin_' . $username . '.png"'); + readfile('https://crafatar.com/skins/' . $username); + die(); + } + if ($_GET['download'] == "render") { + header('Content-Type: image/png'); + header('Content-Disposition: attachment; filename="render_' . $username . '.png"'); + readfile('https://crafatar.com/renders/body/' . $username . '?overlay&scale=7'); + die(); + } + if ($_GET['download'] == "head") { + header('Content-Type: image/png'); + header('Content-Disposition: attachment; filename="head_' . $username . '.png"'); + readfile('https://crafatar.com/renders/head/' . $username . '?overlay&scale=7'); + die(); + } + if ($_GET['download'] == "avatar") { + if (isset($_GET['size']) && !empty($_GET['size'])) { + $size = $_GET['size']; + } else { + $size = "128"; + } + + header('Content-Type: image/png'); + header('Content-Disposition: attachment; filename="avatar' . $size . '_' . $username . '.png"'); + + readfile('https://crafatar.com/avatar/' . $username . '?overlay&size=' . $size); + die(); + } + } + + $this->load->view('header', ['active' => 'minecraft-players', 'title' => lang('players_site_title')]); + $this->load->view('minecraft', ['type' => 'player', 'username' => $username, 'uuid' => $uuid, 'uuid_formatted' => $uuid_formatted, 'cracked' => $cracked, 'crackedBool' => $crackedBool]); + $this->load->view('footer'); + }*/ +} diff --git a/application/controllers/Tools/Tools.php b/application/controllers/Tools/Tools.php new file mode 100644 index 0000000..d98d990 --- /dev/null +++ b/application/controllers/Tools/Tools.php @@ -0,0 +1,16 @@ +load->view('header', ['active' => 'tools', 'title' => 'Tools']); + $this->load->view('tools/index'); + $this->load->view('footer'); + } +} diff --git a/application/controllers/Tools/Twitch.php b/application/controllers/Tools/Twitch.php new file mode 100644 index 0000000..f3a4415 --- /dev/null +++ b/application/controllers/Tools/Twitch.php @@ -0,0 +1,66 @@ +load->view('header', ['active' => 'twitch-tools', 'title' => lang('twitch_site_title')]); + $this->load->model('TwitchModel'); + +// $data = + + $result = $this->load->view('twitch_result', ['json' => $this->TwitchModel->getTwitchInfos($channel), 'stream' => $this->TwitchModel->getTwitchStream($channel), 'videos' => $this->TwitchModel->getTwitchVideos($channel)], true); + $this->load->view('twitch', ['result' => $result]); + $this->load->view('footer'); + } + + public function sudoku() { + if(isset($_POST['sudoku'])) { + $sudoku = []; + $rows = []; + $cols = []; + $fields = []; + for ($i=0; $i < 9; $i++) { + for ($j=0; $j < 9; $j++) { + if(isset($_POST['field-' . $i . '-' . $j])) { + $sudoku[$i][$j] = $_POST['field-' . $i . '-' . $j]; + } else { + $sudoku[$i][$j] = '_'; + } + } + } + + for ($i=0; $i < 9; $i++) { + for ($j=0; $j < 9; $j++) { + $rows[$i] .= $sudoku[$i][$j] . "|"; + $cols[$i] .= $sudoku[$j][$i] . "|"; + } + } + + for ($i=0; $i < 3; $i++) { + for ($j=0; $j < 3; $j++) { + for ($k=0; $k < 3; $k++) { + for ($l=0; $l < 3; $l++) { + $fields[$i][$j] .= $sudoku[$i * $k][$j * $l] . "|"; + } + } + } + } + + var_dump($fields); + var_dump($rows); + var_dump($cols); + } + + $this->load->view('header', ['active' => 'sudoku', 'title' => 'Sudoku-Löser']); + $this->load->view('sudoku'); + $this->load->view('footer'); + } +} diff --git a/application/controllers/Tools/Youtube.php b/application/controllers/Tools/Youtube.php new file mode 100644 index 0000000..ac41338 --- /dev/null +++ b/application/controllers/Tools/Youtube.php @@ -0,0 +1,287 @@ +load->model('YoutubeDownloadModel', '', TRUE); + $this->load->model('RedirectModel', '', TRUE); + } + + public function index() + { + $this->load->view('header', ['active' => 'youtube-downloader', 'title' => lang('ytdl_site_title')]); + $this->load->view('youtube_downloader'); + $this->load->view('footer'); + } + + public function download() + { + if (empty($_GET['mime']) OR empty($_GET['token'])) { + header("Location: /youtube"); + } + $mime = filter_var($_GET['mime']); + $ext = str_replace(array('/', 'x-'), '', strstr($mime, '/')); + $url = base64_decode(filter_var($_GET['token'])); + $name = urldecode($_GET['title']) . '.' . $ext; + echo $url; + if ($url) { + $size = $this->YoutubeDownloadModel->get_size($url); + // Generate the server headers + if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) { + header('Content-Type: "' . $mime . '"'); + header('Content-Disposition: attachment; filename="' . $name . '"'); + header('Expires: 0'); + header('Content-Length: ' . $size); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header("Content-Transfer-Encoding: binary"); + header('Pragma: public'); + } else { + header('Content-Type: "' . $mime . '"'); + header('Content-Disposition: attachment; filename="' . $name . '"'); + header("Content-Transfer-Encoding: binary"); + header('Expires: 0'); + header('Content-Length: ' . $size); + header('Pragma: no-cache'); + } + + readfile($url); + exit; + } + } + + public function video() + { + echo $this->load->view('header', ['title' => lang('ytdl_site_title'), 'active' => 'youtube-downloader'], true); + if (isset($_REQUEST['videoid'])) { + $my_id = $_REQUEST['videoid']; + if (preg_match('/^https:\/\/w{3}?.youtube.com\//', $my_id)) { + $url = parse_url($my_id); + $my_id = NULL; + if (is_array($url) && count($url) > 0 && isset($url['query']) && !empty($url['query'])) { + $parts = explode('&', $url['query']); + if (is_array($parts) && count($parts) > 0) { + foreach ($parts as $p) { + $pattern = '/^v\=/'; + if (preg_match($pattern, $p)) { + $my_id = preg_replace($pattern, '', $p); + break; + } + } + } + if (!$my_id) { + header("Location: /tools/youtube?error=1"); + exit; + } + } else { + header("Location: /tools/youtube?error=2"); + exit; + } + } elseif (preg_match('/^https?:\/\/youtu.be/', $my_id)) { + $url = parse_url($my_id); + $my_id = NULL; + $my_id = preg_replace('/^\//', '', $url['path']); + } + } else { + header("Location: /tools/youtube?error=1"); + exit; + } + + if (isset($_REQUEST['type'])) { + $my_type = $_REQUEST['type']; + } else { + $my_type = 'redirect'; + } + + if ($my_type == 'Download') { + ?> + +
    +

    +

    +
    + + YoutubeDownloadModel->curlGet($my_video_info); + + /* TODO: Check return from curl for status code */ + if (empty($my_video_info)) { + header("Location: /tools/youtube?error=3"); + } + + $thumbnail_url = $title = $view_count = $author = $length_seconds = $url_encoded_fmt_stream_map = $type = $url = ''; + + parse_str($my_video_info); + $length_seconds = date("i:s", $length_seconds); + $view_count = number_format($view_count, 0, ',', '.'); + if ($status == 'fail') { + header("Location: /tools/youtube?error=3"); + exit(); + } ?> +
    +
    +
    + + + +
    +
    + +

    +
    +

    :

    +

    +

    : + +

    + +
    +
    +
    +
    +
    + YoutubeDownloadModel->clean($title); + + if (isset($url_encoded_fmt_stream_map)) { + /* Now get the url_encoded_fmt_stream_map, and explode on comma */ + $my_formats_array = explode(',', $url_encoded_fmt_stream_map); + } else { + echo '

    No encoded format stream found.

    '; + echo '

    Here is what we got from YouTube:

    '; + echo $my_video_info; + } + if (count($my_formats_array) == 0) { + echo '

    ' . lang('ytdl_error_no_downloads') . '

    '; + exit; + } + + /* create an array of available download formats */ + $avail_formats[] = ''; + $i = 0; + $ipbits = $ip = $itag = $sig = $quality = ''; + $expire = time(); + + foreach ($my_formats_array as $format) { + parse_str($format); + $avail_formats[$i]['itag'] = $itag; + $avail_formats[$i]['quality'] = $quality; + $type = explode(';', $type); + $avail_formats[$i]['type'] = $type[0]; + $avail_formats[$i]['url'] = urldecode($url) . '&signature=' . $sig; + parse_str(urldecode($url)); + $avail_formats[$i]['expires'] = date("d.m.Y G:i:s", $expire); + $avail_formats[$i]['ipbits'] = $ipbits; + $avail_formats[$i]['ip'] = $ip; + $i++; + } + + if ($my_type == 'Download') { + echo '

    ' . lang('ytdl_available_formats') . ':

    +
    '; + + $formats = [ + '22' => '720p', + '18' => '360p', + '43' => '360p', + '5' => '240p', + '36' => '240p', + '17' => '144p' + ]; + /* now that we have the array, print the options */ + for ($i = 0; $i < count($avail_formats); $i++) { + $type = explode('/', $avail_formats[$i]['type'])[1]; + $thisurl = base_url('tools/youtube/download?mime=' . $avail_formats[$i]['type'] . '&title=' . urlencode(htmlspecialchars($my_title)) . '&token=' . base64_encode($avail_formats[$i]['url'])); + $url = base_url('r/' . $this->RedirectModel->addRandomItem($thisurl, true, 6)); + echo ' ' . + ''; + echo ''; + echo ''; + } + echo '
    ' . lang('ytdl_format') . '' . lang('ytdl_quality') . '' . lang('ytdl_size') . '' . lang('ytdl_download_link') . '' . lang('ytdl_available_until') . '
    '; + echo '' . $type . ' '; + echo '' . $formats[$avail_formats[$i]['itag']] . '' . $this->YoutubeDownloadModel->formatBytes($this->YoutubeDownloadModel->get_size($avail_formats[$i]['url'])) . '' . lang('ytdl_download_link') . '' . $avail_formats[$i]['expires'] . '
    ' . lang('ytdl_not_related_youtube') . '
    ' . lang('ytdl_no_haftung') . '
    Der Betreiber nimmt Abstand von jeglichen urheberrechtsverletzenden Handlungen, die mit dem YouTube-Downloader durchgeführt werden könnten und unterstützt diese keinesfalls.'; + ?> +
    +
    + + Target format found, it is '. $avail_formats[$j]['itag'] .'

    '; + $best_format = $j; + break 2; + } + } + } + + //echo '

    Out of loop, best_format is '. $best_format .'

    '; + if ((isset($best_format)) && + (isset($avail_formats[$best_format]['url'])) && + (isset($avail_formats[$best_format]['type'])) + ) { + $redirect_url = $avail_formats[$best_format]['url'] . '&title=' . $cleanedtitle; + $content_type = $avail_formats[$best_format]['type']; + } + if (isset($redirect_url)) { + header("Location: $redirect_url"); + } + + } + $this->load->view('footer'); + } + } diff --git a/application/controllers/Uploader.php b/application/controllers/Uploader.php new file mode 100644 index 0000000..ea8e61f --- /dev/null +++ b/application/controllers/Uploader.php @@ -0,0 +1,134 @@ +load->helper(array('jbimages','language')); + + // is_allowed is a helper function which is supposed to return False if upload operation is forbidden + // [See jbimages/is_alllowed.php] + + if (is_allowed() === FALSE) + { + exit; + } + + // User configured settings + $this->config->load('uploader_settings', TRUE); + } + + /* Language set */ + + private function _lang_set($lang) + { + // We accept any language set as lang_id in **_dlg.js + // Therefore an error will occur if language file doesn't exist + + $this->config->set_item('language', $lang); + $this->lang->load('jbstrings', $lang); + } + + /* Default upload routine */ + + public function upload ($lang='en') + { + // Set language + $this->_lang_set($lang); + + // Get configuartion data (we fill up 2 arrays - $config and $conf) + + $conf['img_path'] = $this->config->item('img_path', 'uploader_settings'); + $conf['allow_resize'] = $this->config->item('allow_resize', 'uploader_settings'); + + $config['allowed_types'] = $this->config->item('allowed_types', 'uploader_settings'); + $config['max_size'] = $this->config->item('max_size', 'uploader_settings'); + $config['encrypt_name'] = $this->config->item('encrypt_name', 'uploader_settings'); + $config['overwrite'] = $this->config->item('overwrite', 'uploader_settings'); + $config['upload_path'] = $this->config->item('upload_path', 'uploader_settings'); + + if (!$conf['allow_resize']) + { + $config['max_width'] = $this->config->item('max_width', 'uploader_settings'); + $config['max_height'] = $this->config->item('max_height', 'uploader_settings'); + } + else + { + $conf['max_width'] = $this->config->item('max_width', 'uploader_settings'); + $conf['max_height'] = $this->config->item('max_height', 'uploader_settings'); + + if ($conf['max_width'] == 0 and $conf['max_height'] == 0) + { + $conf['allow_resize'] = FALSE; + } + } + + // Load uploader + $this->load->library('upload', $config); + + if ($this->upload->do_upload()) // Success + { + // General result data + $result = $this->upload->data(); + + // Shall we resize an image? + if ($conf['allow_resize'] and $conf['max_width'] > 0 and $conf['max_height'] > 0 and (($result['image_width'] > $conf['max_width']) or ($result['image_height'] > $conf['max_height']))) + { + // Resizing parameters + $resizeParams = array + ( + 'source_image' => $result['full_path'], + 'new_image' => $result['full_path'], + 'width' => $conf['max_width'], + 'height' => $conf['max_height'] + ); + + // Load resize library + $this->load->library('image_lib', $resizeParams); + + // Do resize + $this->image_lib->resize(); + } + + // Add our stuff + $result['result'] = "file_uploaded"; + $result['resultcode'] = 'ok'; + $result['file_name'] = $conf['img_path'] . '/' . $result['file_name']; + +// $this->FileModel->addBlogImageToDatabase(); + var_dump($result); + + + // Output to user + $this->load->view('ajax_upload_result', $result); + } + else // Failure + { + // Compile data for output + $result['result'] = $this->upload->display_errors(' ', ' '); + $result['resultcode'] = 'failed'; + + // Output to user + $this->load->view('ajax_upload_result', $result); + } + } + + /* Blank Page (default source for iframe) */ + + public function blank($lang='en') + { + $this->_lang_set($lang); + $this->load->view('blank'); + } + + public function index($lang='en') + { + $this->blank($lang); + } +} + +/* End of file uploader.php */ +/* Location: ./application/controllers/uploader.php */ diff --git a/application/controllers/User.php b/application/controllers/User.php new file mode 100644 index 0000000..f370d5d --- /dev/null +++ b/application/controllers/User.php @@ -0,0 +1,615 @@ +load->model('UserModel', '', TRUE); + $this->load->model('PostsModel', '', TRUE); + $this->load->model('FileModel', '', TRUE); + } + + public function index($user = "") + { + if ($user == "") { + $title = "Error - Profile"; + $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Es wurde kein Nutzername angegeben."]; + } else { + $user_data = $this->UserModel->getUser($user); + $user_exists = !empty($user_data); + if ($user_exists) { + $user_data = $user_data[0]; + $user_stats = $this->UserModel->getUserStats($user_data['ID']); + + $user_posts = $this->PostsModel->getUserPosts($user_data['ID'], 3, 0, 192); + $user_comments = $this->UserModel->getUserComments($user_data['ID'], 3, 0); + $user_blog_posts = $this->UserModel->getUserBlogPosts($user_data['ID'], 3, 0); + + $date_created = strtotime($user_data['date_created']); + $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$date_created"), $_SESSION['site_lang']); + $title = $user_data['displayname'] . " - Profile"; + $isCurrentUserFollowing = false; + if (isset($_SESSION['user']['ID'])) + $isCurrentUserFollowing = $this->UserModel->isFollowing($_SESSION['user']['ID'], $user_data['ID']); + + $_SESSION['currentProfilePage'] = $user_data['ID']; + } else { + $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Der angegebene Nutzername konnte nicht gefunden werden."]; + $title = "Error - Profile"; + } + } + + $this->load->view('header', ['active' => 'profile', 'title' => $title, 'additionalStyles' => ['profile_page.css']]); + if (isset($message)) { + $this->load->view('network/message', $message); + } + if (isset($user_data) && isset($user_stats) && isset($user_posts) && isset($user_comments) && isset($user_blog_posts)) { + $this->load->view('network/user/profile_page', ['data' => $user_data, 'stats' => $user_stats, 'posts' => $user_posts, 'comments' => $user_comments, 'blog_posts' => $user_blog_posts, 'isCurrentUserFollowing' => $isCurrentUserFollowing]); + } + $this->load->view('footer', ['additionalScripts' => ['profile_page.js']]); + } + + public function comments($user = "") + { + if ($user == "") { + $title = "Error - Profile"; + $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Es wurde kein Nutzername angegeben."]; + } + + $user_data = $this->UserModel->getUser($user); + $user_exists = !empty($user_data); + if ($user_exists) { + $user_data = $user_data[0]; + $dateCreated = strtotime($user_data['date_created']); + $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']); + $user_stats = $this->UserModel->getUserStats($user_data['ID']); + $title = $user_data['displayname'] . " - Blog-Kommentare"; + $isCurrentUserFollowing = false; + if (isset($_SESSION['user']['ID'])) + $isCurrentUserFollowing = $this->UserModel->isFollowing($_SESSION['user']['ID'], $user_data['ID']); + + $_SESSION['currentProfilePage'] = $user_data['ID']; + } else { + $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Der angegebene Nutzername konnte nicht gefunden werden."]; + $title = "Error - Profile"; + } + + + $this->load->view('header', ['active' => 'profile', 'title' => $title, 'additionalStyles' => ['profile_page.css']]); + if (isset($message)) { + $this->load->view('network/message', $message); + } + if ($user_exists) { + $this->load->view('network/blog/user_comments', ['data' => $user_data, 'stats' => $user_stats, 'isCurrentUserFollowing' => $isCurrentUserFollowing]); + } + $this->load->view('footer', ['additionalScripts' => ['profile_page.js']]); + $this->load->view('network/blog/user_comments_end', ['data' => $user_data]); + } + + public function getComments() + { + $user = (int)$this->input->get('user'); + $amount = (int)$this->input->get('amount'); + $offset = (int)$this->input->get('offset') * $amount; + $user_comments = $this->UserModel->getUserComments($user, $amount, $offset); + $comment_user = $this->UserModel->getUserByID($user)[0]; + + foreach ($user_comments as $comment) { + $this->load->view('network/blog/comment_item', ['data' => $comment_user, 'c' => $comment]); + } + } + + public function posts($user = "") + { + if ($user == "") { + redirect(base_url('user')); + } + + $user_data = $this->UserModel->getUser($user); + $user_exists = !empty($user_data); + if ($user_exists) { + $user_data = $user_data[0]; + $dateCreated = strtotime($user_data['date_created']); + $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']); + $user_stats = $this->UserModel->getUserStats($user_data['ID']); + $title = $user_data['displayname'] . " - Posts"; + $isCurrentUserFollowing = false; + if (isset($_SESSION['user']['ID'])) + $isCurrentUserFollowing = $this->UserModel->isFollowing($_SESSION['user']['ID'], $user_data['ID']); + + $_SESSION['currentProfilePage'] = $user_data['ID']; + } else { + $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Der angegebene Nutzername konnte nicht gefunden werden."]; + $title = "Error - Profile"; + } + + $this->load->view('header', ['active' => 'profile', 'title' => $title, 'additionalStyles' => ['profile_page.css']]); + if (isset($message)) { + $this->load->view('network/message', $message); + } + if ($user_exists) { + $this->load->view('network/user/user_posts', ['data' => $user_data, 'stats' => $user_stats, 'isCurrentUserFollowing' => $isCurrentUserFollowing]); + } + $this->load->view('footer', ['additionalScripts' => ['profile_page.js']]); + $this->load->view('network/user/user_posts_end', ['data' => $user_data]); + } + + public function getPosts() + { + $user = (int)$this->input->get('user'); + $amount = (int)$this->input->get('amount'); + $offset = (int)$this->input->get('offset') * $amount; + $user_posts = $this->PostsModel->getUserPosts($user, $amount, $offset); + + foreach ($user_posts as $post) { + $this->load->view('network/posts/post_item', $post); + } + } + + public function blogposts($user = "") + { + if ($user == "") { + redirect(base_url('user')); + } + + $user_data = $this->UserModel->getUser($user); + $user_exists = !empty($user_data); + if ($user_exists) { + $user_data = $user_data[0]; + $dateCreated = strtotime($user_data['date_created']); + $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']); + $user_stats = $this->UserModel->getUserStats($user_data['ID']); + $title = $user_data['displayname'] . " - Posts"; + $isCurrentUserFollowing = false; + if (isset($_SESSION['user']['ID'])) + $isCurrentUserFollowing = $this->UserModel->isFollowing($_SESSION['user']['ID'], $user_data['ID']); + + $_SESSION['currentProfilePage'] = $user_data['ID']; + } else { + $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Der angegebene Nutzername konnte nicht gefunden werden."]; + $title = "Error - Profile"; + } + + $this->load->view('header', ['active' => 'profile', 'title' => $title, 'additionalStyles' => ['profile_page.css']]); + if (isset($message)) { + $this->load->view('network/message', $message); + } + if ($user_exists) { + $this->load->view('network/blog/user_blog_posts', ['data' => $user_data, 'stats' => $user_stats, 'isCurrentUserFollowing' => $isCurrentUserFollowing]); + } + $this->load->view('footer', ['additionalScripts' => ['profile_page.js']]); + $this->load->view('network/blog/user_blog_posts_end', ['data' => $user_data]); + } + + public function getBlogPosts() + { + $user = (int)$this->input->get('user'); + $amount = (int)$this->input->get('amount'); + $offset = (int)$this->input->get('offset') * $amount; + $user_posts = $this->UserModel->getUserBlogPosts($user, $amount, $offset); + $post_user = $this->UserModel->getUserByID($user)[0]; + + foreach ($user_posts as $post) { + $this->load->view('network/blog/blog_post_item', ['data' => $post_user, 'post' => $post]); + } + } + + public function publishPost() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user'])) { + ?> + + input->post('postMedia')); + + $content = $this->input->post('content'); + if (strlen($content) >= 10000) { + ?> + + input->post('replyTo'); + if ($replyTo !== "-1" && !$this->PostsModel->isUUIDValid($replyTo)) { + ?> + + PostsModel->addReply($_SESSION['user']['ID'], $content, $replyTo); + } else { + $postID = $this->PostsModel->addPost($_SESSION['user']['ID'], $content); + } + + $media = $this->input->post('postMedia'); + foreach ($media as $entry) { + $image = str_replace(' ', '+', $entry['image']); + $image = substr($image, strpos($image, ',') + 1); + $image = base64_decode($image); + + $fileUrl = $this->FileModel->uploadFileByContent($image, $entry['name'], $entry['type'], $entry['size']); + + $this->PostsModel->addImageToPost($postID, $fileUrl); + } + + ?> + + "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Es wurde kein Nutzername angegeben."]; + } + + $user_data = $this->UserModel->getUser($user); + $user_exists = !empty($user_data); + if ($user_exists) { + $user_data = $user_data[0]; + $dateCreated = strtotime($user_data['date_created']); + $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']); + $user_stats = $this->UserModel->getUserStats($user_data['ID']); + $followers = $this->UserModel->getFollowers($user_data['ID']); + $title = $user_data['displayname'] . " - Follower"; + $isCurrentUserFollowing = false; + if (isset($_SESSION['user']['ID'])) + $isCurrentUserFollowing = $this->UserModel->isFollowing($_SESSION['user']['ID'], $user_data['ID']); + + $_SESSION['currentProfilePage'] = $user_data['ID']; + } else { + $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Der angegebene Nutzername konnte nicht gefunden werden."]; + $title = "Error - Profile"; + } + + $this->load->view('header', ['active' => 'profile', 'title' => $title, 'additionalStyles' => ['profile_page.css']]); + if (isset($message)) { + $this->load->view('network/message', $message); + } + if ($user_exists) { + $this->load->view('network/user/user_followers', ['data' => $user_data, 'active' => 'followers', 'stats' => $user_stats, 'isCurrentUserFollowing' => $isCurrentUserFollowing, 'followers' => $followers]); + } + $this->load->view('footer', ['additionalScripts' => ['profile_page.js']]); + } + + public function following($user = "") + { + if ($user == "") { + $title = "Error - Profile"; + $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Es wurde kein Nutzername angegeben."]; + } + + $user_data = $this->UserModel->getUser($user); + $user_exists = !empty($user_data); + if ($user_exists) { + $user_data = $user_data[0]; + $dateCreated = strtotime($user_data['date_created']); + $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']); + $user_stats = $this->UserModel->getUserStats($user_data['ID']); + $following = $this->UserModel->getFollowing($user_data['ID']); + $title = $user_data['displayname'] . " - Follower"; + $isCurrentUserFollowing = false; + if (isset($_SESSION['user']['ID'])) + $isCurrentUserFollowing = $this->UserModel->isFollowing($_SESSION['user']['ID'], $user_data['ID']); + + $_SESSION['currentProfilePage'] = $user_data['ID']; + } else { + $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Der angegebene Nutzername konnte nicht gefunden werden."]; + $title = "Error - Profile"; + } + + $this->load->view('header', ['active' => 'profile', 'title' => $title, 'additionalStyles' => ['profile_page.css']]); + if (isset($message)) { + $this->load->view('network/message', $message); + } + if ($user_exists) { + $this->load->view('network/user/user_followers', ['data' => $user_data, 'active' => 'following', 'stats' => $user_stats, 'isCurrentUserFollowing' => $isCurrentUserFollowing, 'followers' => $following]); + } + $this->load->view('footer', ['additionalScripts' => ['profile_page.js']]); + } + + public function switchFollowing() + { + header('Content-Type: application/json'); + if(!isset($_SESSION['currentProfilePage'])) { + $response = ['type' => 'error', 'code' => -1]; + echo json_encode($response); + exit; + } + + $followedUser = $_SESSION['currentProfilePage']; + + // code 0: not logged in + // code 1: same user + // code 10: unfollowed + // code 11: now following + + if (!isset($_SESSION['user']['username'])) { + $response = ['type' => 'error', 'code' => 0]; + echo json_encode($response); + exit; + } + + $follower = $_SESSION['user']['ID']; + + if ($follower == $followedUser) { + $response = ['type' => 'error', 'code' => 1]; + echo json_encode($response); + exit; + } + + if ($this->UserModel->isFollowing($follower, $followedUser)) { + $this->UserModel->unfollow($follower, $followedUser); + $response = ['type' => 'success', 'code' => 10]; + echo json_encode($response); + exit; + } + + $this->UserModel->follow($follower, $followedUser); + $response = ['type' => 'success', 'code' => 11]; + echo json_encode($response); + exit; + } + + public function edit($user = "") + { + if ($user == "") { + redirect(base_url('user')); + } + + $user_data = $this->UserModel->getUser($user); + $user_exists = !empty($user_data); + if ($user_exists) { + $user_data = $user_data[0]; + // Update Settings + $newData = []; + // TODO: Error messages + // Username + if (isset($_POST['username'])) { + if (!preg_match('/[^A-Za-z0-9._]/', $_POST['username'])) { + if ($this->LoginModel->isAvailable($_POST['username'])) { + if (strlen($_POST['username']) >= 4) { + $newData['username'] = strtolower($_POST['username']); + $newData['displayname'] = $_POST['username']; + } else { + $_SESSION['profileEditNotification'] .= ""; + } + } else { + $_SESSION['profileEditNotification'] .= ""; + } + } else { + $_SESSION['profileEditNotification'] .= ""; + } + } + // Gender + if (isset($_POST['gender'])) { + if ($_POST['gender'] == "male" || $_POST['gender'] == "female" || $_POST['gender'] == 'other') { + $newData['gender'] = $_POST['gender']; + } + } + // Birth date + if (isset($_POST['birthdate-day']) && isset($_POST['birthdate-month'])) { + $day = intval($_POST['birthdate-day']); + $month = intval($_POST['birthdate-month']); + if ($month > 0 && $month <= 12) { + $monthDayCount = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + if ($day <= $monthDayCount[$month - 1]) { + $newData['birthdate'] = $day . '.' . $month . '.'; + } + } + } + if (isset($_POST['birthdate-year'])) { + + } + // Language + if (isset($_POST['language'])) { + $newData['language'] = $_POST['language']; + } + // Country + if (isset($_POST['country'])) { + $newData['country'] = $_POST['country']; + } + // Biography/About + if (isset($_POST['biography'])) { + $newData['about'] = $_POST['biography']; + } + // Avatar + if (isset($_FILES['avatar'])) { + $image = $this->FileModel->uploadImage('avatar', 4096, $_FILES['avatar']['name'], 200); + if ($image != null) + $newData['profile_picture'] = $image; + unset($_FILES['avatar']); + } + // Header + if (isset($_FILES['header'])) { +// var_dump($_FILES['header']); + $image = $this->FileModel->uploadImage('header', 4096, $_FILES['header']['name'], 1920); +// var_dump($image); + if ($image != null) + $newData['header_image'] = $image; + unset($_FILES['header']); + } + // Social Networks + if (isset($_POST['social-networks'])) { + + } + // Profile color + if (isset($_POST['color'])) { + + } + // E-Mail-Address + if (isset($_POST['email'])) { + if (isset($_POST['email-password']) && !empty($_POST['email-password'])) { + $loginData = $this->LoginModel->getLoginData($_SESSION['user']['username']); + if (empty($loginData)) { + $_SESSION['profileEditNotification'] .= ""; + } else { + $loginData = $loginData[0]; + $encryptedPassword = $this->LoginModel->getPasswordHash($_POST['email-password'], $loginData['original_name']); + if ($loginData['password'] == $encryptedPassword) { + $isRegistered = $this->LoginModel->isRegistered($_POST['email']); + if ($isRegistered == "") { + $trashMail = $this->LoginModel->isTrashMail($_POST['email']); + if ($trashMail == '') { + $this->LoginModel->changeMailAddress($_POST['email'], $loginData['username']); + $_SESSION['profileEditNotification'] .= ""; + } else { + $_SESSION['profileEditNotification'] .= $trashMail; + } + } else { + $_SESSION['profileEditNotification'] .= $isRegistered; + } + } else { + $_SESSION['profileEditNotification'] .= ""; + } + } + } else { + $_SESSION['profileEditNotification'] .= ""; + } + } + // Notifications + if (isset($_POST['email-notifications'])) { + $newData['receiveEmails'] = filter_var($_POST['email-notifications'], FILTER_VALIDATE_BOOLEAN); + } + // Newsletter + if (isset($_POST['newsletter'])) { + $newData['receiveNewsletter'] = filter_var($_POST['newsletter'], FILTER_VALIDATE_BOOLEAN); + } + // Password + if (isset($_POST['passwordNew'])) { + if (isset($_POST['passwordOld'])) { + $loginData = $this->LoginModel->getLoginData($_SESSION['user']['username']); + if (!empty($loginData)) { + $loginData = $loginData[0]; + $encryptedPassword = $this->LoginModel->getPasswordHash($_POST['passwordOld'], $loginData['original_name']); + if ($encryptedPassword == $loginData['password']) { + if ($this->LoginModel->checkPassword($_POST['passwordNew'])) { + if (isset($_POST['passwordNewRepeat']) && $_POST['passwordNew'] == $_POST['passwordNewRepeat']) { + $this->LoginModel->changePassword($_POST['passwordNew'], $loginData['original_name']); + $_SESSION['profileEditNotification'] .= ""; + } else { + $_SESSION['profileEditNotification'] .= ""; + } + } else { + $_SESSION['profileEditNotification'] .= ""; + } + } else { + $_SESSION['profileEditNotification'] .= ""; + } + } else { + $_SESSION['profileEditNotification'] .= ""; + } + } else { + $_SESSION['profileEditNotification'] .= ""; + } + } + if (isset($_POST['showAds'])) { + if (isset($_SESSION['user']) && $_SESSION['user']['rank'] >= 2) { + $newData['showAds'] = filter_var($_POST['email-notifications'], FILTER_VALIDATE_BOOLEAN); + } else { + $_SESSION['profileEditNotification'] .= ""; + } + } + if (!empty($newData)) { + // Add entry to history + $this->UserModel->insertIntoHistory($user_data); + // Update profile + $this->UserModel->updateProfile($newData, $user_data['ID']); +// redirect(base_url(uri_string())); + } + + $user_stats = $this->UserModel->getUserStats($user_data['ID']); + $title = $user_data['displayname'] . ' - Profil bearbeiten'; + } + + $this->load->view('header', ['active' => 'profile', 'title' => $title, 'additionalStyles' => ['lib/selectize.css', 'lib/selectize.bootstrap3.css', 'profile_page.css']]); + $editMessage = isset($_SESSION['profileEditNotification']) ? $_SESSION['profileEditNotification'] : ""; + $_SESSION['profileEditNotification'] = ""; + if (isset($message)) { + $this->load->view('network/message', $message); + } + if ($user_exists) { + $this->load->view('network/user/profile_edit', ['message' => $editMessage, 'data' => $user_data, 'stats' => $user_stats]); + } + $this->load->view('footer', ['additionalScripts' => ['lib/selectize.js', 'profile_page.js', 'profile_edit.js']]); + } + + public function single_post($username = null, $uuid = null, $origin = null) + { + $origin = isset($_GET['o']) ? $_GET['o'] : null; + if ($origin == null) { + $origin = base_url('user/' . $username); + } else { + $origin = base64_decode(urldecode($origin)); + } + + $this->load->view('header', ['active' => 'profile', 'title' => 'Test']); + $this->load->view('network/posts/user_post_page', ['origin' => $origin, 'username' => $username, 'uuid' => $uuid]); + $this->load->view('footer', ['additionalScripts' => ['single-post-page.js']]); + } + + public function single_post_data($username = null, $uuid = null) + { + $message = ""; + $post = []; + $replies = []; + if ($username == null) { + $message .= ''; + goto display; + } + if ($uuid == null) { + $message .= ''; + goto display; + } + + $user = $this->UserModel->getUser($username); + if (empty($user)) { + $message .= ''; + goto display; + } + $user = $user[0]; + + $post = $this->PostsModel->getPostDetails($user['ID'], $uuid); + if (empty($post)) { + $message .= ''; + goto display; + } + $post = $post[0]; + + $replies = $this->PostsModel->getPostReplies($post['ID']); + + display: + $this->load->view('network/posts/user_post_content', ['message' => $message, 'post' => $post, 'replies' => $replies]); + + } + } diff --git a/application/controllers/admin/Blog.php b/application/controllers/admin/Blog.php new file mode 100644 index 0000000..d47b52b --- /dev/null +++ b/application/controllers/admin/Blog.php @@ -0,0 +1,369 @@ +load->model('BlogModel', '', TRUE); + $this->load->model('FileModel', '', TRUE); + } + + public function index() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) redirect(base_url('login')); + $posts = $this->BlogModel->getPostList(false); + $this->load->view('admin/sidebar', ['title' => 'Alle Blog-Posts']); + $this->load->view('admin/blog_posts', ['posts' => $posts]); + $this->load->view('admin/footer'); + } + + public function tags() { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) { + redirect(base_url('login')); + } + + $tags = $this->BlogModel->getAllTags(); + $tags = $this->BlogModel->mergeTagInfo($tags); + + $this->load->view('admin/sidebar', ['title' => 'Alle Blog-Tags']); + $this->load->view('admin/blog_tags', ['tags' => $tags]); + $this->load->view('admin/footer', ['additionalScripts' => 'all-blog-tags.js']); + } + + public function sendEdit() + { + header('Content-Type: application/json'); + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) { + echo json_encode(['success' => false, 'message' => 'Du musst eingeloggt sein, um Blog-Posts zu verfassen']); + exit; + } + + $postID = $this->input->post('postID'); + $postID = is_numeric($postID) && is_int(intval($postID)) ? intval($postID) : -2; + + if ($postID == -2) { + echo json_encode(['success' => false, 'message' => 'Ungültige Post-ID angegeben. Bitte versuche es später erneut']); + exit; + } + + $contentID = $this->input->post('contentID'); + $contentID = is_numeric($contentID) && is_int(intval($contentID)) ? intval($contentID) : -2; + + $translationID = $this->input->post('translationID'); + $translationID = is_numeric($translationID) && is_int(intval($translationID)) ? intval($translationID) : -2; + + $postImage = $this->input->post('postImage'); + $postTitle = $this->input->post('postTitle'); + $postDescription = $this->input->post('postDescription'); + $postContent = $this->input->post('postContent'); + + $postPublishDate = $this->input->post('postPublishDate'); + $postPublishDate = date("Y-m-d H:i:s", strtotime($postPublishDate)); + + $postUrl = $this->input->post('postUrl'); + $postCategory = $this->input->post('postCategory'); + $postTags = $this->input->post('postTags'); + + $postLang = $this->input->post('postLanguage'); + $postLang = $postLang !== NULL ? $postLang : 'de'; + + if(strlen($postUrl) == 0) { + echo json_encode(['success' => false, 'message' => 'Es wurde keine Post-URL angegeben.']); + exit; + } + if(strlen($postUrl) < 4) { + echo json_encode(['success' => false, 'message' => 'Die angegebene Post-URL ist zu kurz. Sie muss mindestens 4 Zeichen umfassen, um eine eindeutige Zuordnung zu ermöglichen.']); + exit; + } + + if ($postID == -1 || $translationID == -1) { // Create new blog post + if ($postID == -1) { + $postID = $this->BlogModel->createNewPostDraft($_SESSION['user']['ID']); + + if($this->BlogModel->postUrlExisting($postUrl)) { + echo json_encode(['success' => false, 'message' => 'Die angegebene Post-URL bereits vorhanden.']); + exit; + } + } + $translationID = $this->BlogModel->createNewTranslation($postID, $postLang); + } + + if ($contentID < 0) { + $contentID = $this->BlogModel->createNewContentDraft($postID); + } + + $this->BlogModel->updatePostDraft($postID, $postUrl, $postCategory, $postPublishDate, $postImage); + $this->BlogModel->updateContentDraft($contentID, $postContent, $postLang); + $this->BlogModel->updateTranslation($translationID, $postTitle, $postDescription); + + if(!empty($postTags)) { + $this->BlogModel->deleteAllPostTags($postID); + foreach ($postTags as $postTag) { + $tagID = $this->BlogModel->createTagIfNotExists($postTag); + $this->BlogModel->addPostTagByID($postID, $tagID); + } + } + + echo json_encode(['success' => true, 'message' => 'Der Entwurf wurde erfolgreich gespeichert.', 'postID' => $postID, 'contentID' => $contentID, 'translationID' => $translationID]); + } + + public function publishPost() + { + header('Content-Type: application/json'); + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) { + echo json_encode(['success' => false, 'message' => 'Du musst eingeloggt sein, um Blog-Posts zu verfassen']); + exit; + } + + $postID = $this->input->post('postID'); + $postID = is_numeric($postID) && is_int(intval($postID)) ? intval($postID) : -2; + + if ($postID < 0) { + echo json_encode(['success' => false, 'message' => 'Ungültige Post-ID angegeben. Bitte versuche es später erneut']); + exit; + } + + $contentIDs = $this->input->post('contentIDs'); + $contentPublished = FALSE; + foreach ($contentIDs as $lang => $contentID) { + $contentID = is_numeric($contentID) && is_int(intval($contentID)) ? intval($contentID) : -2; + + if($contentID < 0) { + continue; + } + + $this->BlogModel->publishContentDraft($_SESSION['user']['ID'], $contentID, $postID, $lang); + $contentPublished = TRUE; + } + + if (!$contentPublished) { + echo json_encode(['success' => false, 'message' => 'Ungültige Content-ID angegeben. Bitte versuche es später erneut']); + exit; + } + + $this->BlogModel->publishPostDraft($postID); + + echo json_encode(['success' => true, 'message' => 'Der Post wurde erfolgreich veröffentlicht.']); + } + + public function getTranslations() + { + header('Content-Type: application/json'); + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) { + echo json_encode(['status' => 'error', 'message' => 'Du musst eingeloggt sein, um Blog-Posts zu verfassen']); + exit; + } + + $postID = $this->input->post('postID'); + $postID = is_numeric($postID) && is_int(intval($postID)) ? intval($postID) : -2; + + if ($postID < 0) { + echo json_encode(['status' => 'error', 'message' => 'Ungültige Post-ID angegeben. Bitte versuche es später erneut']); + exit; + } + + $translations = $this->BlogModel->getPostTranslations($postID); + echo json_encode(['status' => 'success', 'translations' => $translations]); + } + + public function getPost() { + header('Content-Type: application/json'); + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) { + echo json_encode(['status' => 'error', 'message' => 'Du musst eingeloggt sein, um Blog-Posts zu verfassen.']); + exit; + } + + $postID = intval($this->input->post('postID')); + + if(!is_numeric($postID)) { + echo json_encode(['status' => 'error', 'message' => 'Es wurde eine ungültige Post-ID angegeben.']); + exit; + } + + $postData = $this->BlogModel->getPostDataByID($postID); + + if(empty($postData)) { + echo json_encode(['status' => 'error', 'message' => 'Es wurde kein Post mit der angegebenen Post-ID gefunden.']); + exit; + } + + echo json_encode(['status' => 'success', 'postData' => $postData[0]]); + } + + public function getContent() { + header('Content-Type: application/json'); + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) { + echo json_encode(['status' => 'error', 'message' => 'Du musst eingeloggt sein, um Blog-Posts zu verfassen.']); + exit; + } + + $postID = intval($this->input->post('postID')); + $contentID = intval($this->input->post('contentID')); + $language = $this->input->post('lang'); + + if(!is_numeric($postID)) { + echo json_encode(['status' => 'error', 'message' => 'Es wurde eine ungültige Post-ID angegeben.']); + exit; + } + + if(!is_numeric($contentID)) { + echo json_encode(['status' => 'error', 'message' => 'Es wurde kein Content mit der angegebenen Content-ID gefunden.']); + exit; + } + + $contentData = $this->BlogModel->getContentDataByID($postID, $contentID, $language); + + if(empty($contentData)) { + echo json_encode(['status' => 'error', 'message' => 'Es wurde kein Content mit der angegebenen Content-ID gefunden.']); + exit; + } + + echo json_encode(['status' => 'success', 'contentData' => $contentData[0]]); + } + + public function getTranslationData() { + header('Content-Type: application/json'); + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) { + echo json_encode(['status' => 'error', 'message' => 'Du musst eingeloggt sein, um Blog-Posts zu verfassen.']); + exit; + } + + $postID = intval($this->input->post('postID')); + $translationID = intval($this->input->post('translationID')); + $language = $this->input->post('lang'); + + if(!is_numeric($postID)) { + echo json_encode(['status' => 'error', 'message' => 'Es wurde eine ungültige Post-ID angegeben.']); + exit; + } + + if(!is_numeric($translationID)) { + echo json_encode(['status' => 'error', 'message' => 'Es wurde kein Übersetzung mit der angegebenen ID gefunden.']); + exit; + } + + $translationData = $this->BlogModel->getTranslationDataByID($postID, $translationID, $language); + + if(empty($translationData)) { + echo json_encode(['status' => 'error', 'message' => 'Es wurde kein Übersetzung mit der angegebenen ID gefunden.']); + exit; + } + + echo json_encode(['status' => 'success', 'translationData' => $translationData[0]]); + } + + public function getPostTags() { + header('Content-Type: application/json'); + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) { + echo json_encode(['success' => false, 'message' => 'Du musst eingeloggt sein, um Blog-Posts zu verfassen.']); + exit; + } + + $postID = intval($this->input->post('postID')); + + if(!is_numeric($postID)) { + echo json_encode(['success' => false, 'message' => 'Es wurde eine ungültige Post-ID angegeben.']); + exit; + } + + $postTags = $this->BlogModel->getTags($postID); + + echo json_encode(['success' => true, 'tags' => $postTags]); + } + + public function edit($postID = -1, $lang = "de") + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) redirect(base_url('login')); + + $translations = ['de' => -1]; + $contents = ['de' => -1]; + + if(!$postID != -1) { + if($this->BlogModel->postIDExisting($postID)) { + $postTranslations = $this->BlogModel->getPostTranslationIDs($postID); + foreach ($postTranslations as $postTranslation) { + $translations[$postTranslation['language']] = $postTranslation['postTranslationID']; + } + + $postContents = $this->BlogModel->getPostContentIDs($postID); + foreach ($postContents as $postContent) { + $contents[$postContent['language']] = $postContent['contentID']; + } + } + } + + $categories = $this->BlogModel->getCategories(); + $this->load->view('admin/sidebar', ['title' => 'Blog-Post erstellen', 'additionalStyles' => ['lib/medium-editor.min.css', 'lib/default.min.css', 'lib/medium-editor-insert-plugin.min.css']]); + $this->load->view('admin/blog_edit', ['categories' => $categories, 'postID' => $postID, 'contents' => $contents, 'translations' => $translations, 'postLanguage' => $lang]); + $this->load->view('admin/footer', ['additionalScripts' => 'lib/medium-editor.min.js,lib/handlebars.runtime-v4.0.10.js,lib/jquery-sortable.min.js,lib/jquery.ui.widget.js,lib/jquery.iframe-transport.js,lib/jquery.fileupload.js,lib/medium-editor-insert-plugin.min.js,lib/autolist.min.js,lib/highlight.pack.js,lib/quill.min.js,blog-edit.js']); + } + + public function history($postID = NULL) + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) redirect(base_url('login')); + if ($postID === NULL) redirect(base_url('admin/blog')); + + $content['de'] = $this->BlogModel->getAllContentVersions($postID, 'de'); + $content['en'] = $this->BlogModel->getAllContentVersions($postID, 'en'); + $content['fr'] = $this->BlogModel->getAllContentVersions($postID, 'fr'); + + $this->load->view('admin/sidebar', ['title' => 'Geschichte']); + $this->load->view('admin/blog_history', ['content' => $content]); + $this->load->view('admin/footer'); + } + + public function new_category() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] !== 'admin') redirect(base_url('login')); + $name = filter_input(INPUT_POST, "name"); + $display_name = filter_input(INPUT_POST, "display_name"); + if ($name !== NULL && $display_name !== NULL) { + $category = $this->BlogModel->getCategoryIDAfterInsert($name, $display_name); + echo $category; + } + } + + public function delete() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) redirect(base_url('login')); + $id = filter_input(INPUT_POST, "id"); + echo $this->BlogModel->deletePost($id); + } + + public function deleteFinally() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) redirect(base_url('login')); + $id = filter_input(INPUT_POST, "id"); + $this->BlogModel->deletePostFinally($id); + } + + public function restore() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) redirect(base_url('login')); + $id = filter_input(INPUT_POST, "id"); + echo $this->BlogModel->restorePost($id); + } + + public function trashbin() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) redirect(base_url('login')); + $posts = $this->BlogModel->getPostList(true); + $this->load->view('admin/sidebar', ['title' => 'Alle Blog-Posts']); + $this->load->view('admin/blog_posts', ['posts' => $posts, 'trashbin' => true]); + $this->load->view('admin/footer'); + } + + public function tagsList() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) { + echo '{"type":"error", "message":"Fehler beim Upload! Aufgrund von zu geringen Zugriffsrechten konnte das Bild leider nicht hochgeladen werden Sollte es sich dabei um ein Irrtum handeln, kontaktiere bitte einen Admin über das Kontakformular."}'; + header("Content-Type: application/json"); + exit; + } + echo json_encode($this->BlogModel->getAllTags()); + header("Content-Type: application/json"); + } +} \ No newline at end of file diff --git a/application/controllers/admin/Calendar.php b/application/controllers/admin/Calendar.php new file mode 100644 index 0000000..5b3599f --- /dev/null +++ b/application/controllers/admin/Calendar.php @@ -0,0 +1,24 @@ +load->model('adminModel', '', TRUE); + } + + public function index() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + $this->load->view('admin/sidebar', ['title' => 'Dashboard']); + $this->load->view('admin/calendar'); + $this->load->view('admin/footer'); + } + + public function getAllEvents() { + $events = $this->adminModel->getCalendarEvents(); + + echo json_encode($events); + } +} diff --git a/application/controllers/admin/Contact.php b/application/controllers/admin/Contact.php new file mode 100644 index 0000000..d711423 --- /dev/null +++ b/application/controllers/admin/Contact.php @@ -0,0 +1,18 @@ +load->model('UserModel', '', TRUE); + } + + public function index() { + + $this->load->view('admin/sidebar', ['title' => 'Kontakt-Nachrichten']); + $this->load->view('admin/footer'); + } +} \ No newline at end of file diff --git a/application/controllers/admin/Dashboard.php b/application/controllers/admin/Dashboard.php new file mode 100644 index 0000000..f32126c --- /dev/null +++ b/application/controllers/admin/Dashboard.php @@ -0,0 +1,17 @@ +load->view('admin/sidebar', ['title' => 'Dashboard']); + $this->load->view('admin/dashboard'); + $this->load->view('admin/footer'); + } +} diff --git a/application/controllers/admin/Downloads.php b/application/controllers/admin/Downloads.php new file mode 100644 index 0000000..b44ffd9 --- /dev/null +++ b/application/controllers/admin/Downloads.php @@ -0,0 +1,74 @@ +load->model('downloadsModel', '', TRUE); + $this->load->model('FileModel', '', TRUE); + } + + public function index() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + $downloads = $this->downloadsModel->getDownloads(); + $this->load->view('admin/sidebar', ['title' => 'Alle Downloads']); + $this->load->view('admin/downloads', ['downloads' => $downloads]); + $this->load->view('admin/footer'); + } + + public function edit($id = NULL) + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + $edit = $id === NULL ? false : true; + $p = $this->input->post(['title', 'description', 'descriptionEnglish', 'image', 'url', 'datetime']); + + if ($edit) { + if ($this->downloadsModel->checkIfExists($id)) { + $downloadContent = $this->downloadsModel->getDownload($id); + } else { + redirect(base_url('admin/downloads/edit')); + } + + if ($p['title'] != NULL && $p['description'] != NULL && $p['datetime'] != NULL && $p['url'] !== NULL) { + $imgurl = '/assets/images/placeholder.jpg'; + if (isset($_FILES['downloadImage']) && $_FILES['downloadImage']['size'] > 0) { + $fileName = $_FILES['downloadImage']['name']; + $tmpName = $_FILES['downloadImage']['tmp_name']; + $fileSize = $_FILES['downloadImage']['size']; + $fileType = $_FILES['downloadImage']['type']; + unset($_FILES['downloadImage']); + + $imgurl = $this->FileModel->uploadFile($fileName, $tmpName, $fileSize, $fileType); + } + $this->downloadsModel->addNewDownload($p['datetime'], $p['title'], $p['description'], $p['descriptionEnglish'], $imgurl, $p['url']); + redirect(base_url('admin/downloads/edit/' . $id)); + } + + $this->load->view('admin/sidebar', ['title' => 'Download-Eintrag bearbeiten']); + $this->load->view('admin/download_edit', ['edit' => $edit, 'content' => $downloadContent]); + $this->load->view('admin/footer'); + } else { + if ($p['title'] != NULL && $p['description'] != NULL && $p['datetime'] != NULL && isset($_FILES['downloadImage']) && $_FILES['downloadImage']['size'] > 0 && $p['url'] !== NULL) { + $fileName = $_FILES['downloadImage']['name']; + $tmpName = $_FILES['downloadImage']['tmp_name']; + $fileSize = $_FILES['downloadImage']['size']; + $fileType = $_FILES['downloadImage']['type']; + + $imgurl = $this->FileModel->uploadFile($fileName, $tmpName, $fileSize, $fileType); + unset($_FILES['downloadImage']); + + $this->downloadsModel->addNewDownload($p['datetime'], $p['title'], $p['description'], $p['descriptionEnglish'], $imgurl, $p['url']); + redirect(base_url('admin/downloads/edit')); + } + + $this->load->view('admin/sidebar', ['title' => 'Download-Eintrag erstellen']); + $this->load->view('admin/download_edit', ['edit' => $edit]); + $this->load->view('admin/footer'); + } + } + +} \ No newline at end of file diff --git a/application/controllers/admin/Feedback.php b/application/controllers/admin/Feedback.php new file mode 100644 index 0000000..340461a --- /dev/null +++ b/application/controllers/admin/Feedback.php @@ -0,0 +1,67 @@ +load->model('MessageModel', '', TRUE); + } + + public function index() { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + + $feedback = $this->MessageModel->getFeedbackMessages(); + + $this->load->view('admin/sidebar', ['title' => 'Feedback-Nachrichten']); + $this->load->view('admin/feedback', ['feedback' => $feedback]); + $this->load->view('admin/footer', ['additionalScripts' => 'feedback.js']); + } + + public function takeover($id = null, $state = 1) { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + + if($id != null) { + $this->MessageModel->setFeedbackSupporter($id, $_SESSION['user']['ID'], $state); + } + + redirect(base_url('admin/feedback')); + } + + public function change($id) { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + + if($id != null) { + $newStatus = $this->input->post('feedbackState'); + + $this->MessageModel->updateState($id, $_SESSION['user']['ID'], $newStatus); + } + + redirect(base_url('admin/feedback')); + } + + public function archive() { +// header('Content-Type: application/json'); + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) { + echo json_encode(['type' => 'error', 'message' => 'Du musst eingeloggt sein, um Feedbacks zu beantworten.']); + exit; + } + + $feedbackID = intval($this->input->post('id')); + + if(!is_numeric($feedbackID)) { + echo json_encode(['type' => 'error', 'message' => 'Die angegebene Feedback-ID ist ungültig.']); + exit; + } + + $successful = $this->MessageModel->archiveFeedback($feedbackID); + + if($successful) { + echo json_encode(['type' => 'success', 'message' => 'Das Feedback wurde erfolgreich gelöscht.']); + } else { + echo json_encode(['type' => 'error', 'message' => 'Das Feedback muss vor dem Löschen zuerst bearbeitet und geschlossen werden.']); + } + } +} \ No newline at end of file diff --git a/application/controllers/admin/Files.php b/application/controllers/admin/Files.php new file mode 100644 index 0000000..533b605 --- /dev/null +++ b/application/controllers/admin/Files.php @@ -0,0 +1,74 @@ +load->model('FileModel', '', TRUE); + } + + public function index() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + + if(isset($_FILES['fileUpload'])) { + $fileName = $_FILES['fileUpload']['name']; + $tmpName = $_FILES['fileUpload']['tmp_name']; + $fileSize = $_FILES['fileUpload']['size']; + $fileType = $_FILES['fileUpload']['type']; + + $this->FileModel->uploadFile($fileName, $tmpName, $fileSize, $fileType); + + unset($_FILES['fileUpload']); + + redirect(base_url('admin/files')); + } + + + $files = $this->FileModel->getFileList(); + + $this->load->view('admin/sidebar', ['title' => 'Alle Dateien', 'additionalStyles' => ['lib/jquery.fileupload.css', 'lib/jquery.fileupload-ui.css']]); + $this->load->view('admin/files', ['files' => $files]); + $this->load->view('admin/footer', ['additionalScripts' => ['lib/jquery.ui.widget.js', 'lib/jquery.iframe-transport.js', 'lib/jquery.fileupload.js', 'lib/jquery.fileupload-process.js', 'lib/jquery.fileupload-image.js', 'lib/jquery.fileupload-audio.js', 'lib/jquery.fileupload-video.js', 'lib/jquery.fileupload-validate.js', 'lib/jquery.fileupload-ui.js']]); + } + + public function delete() { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + $id = filter_input(INPUT_POST, "id"); + $this->FileModel->delete($id); + } + + public function uploadImage() + { + header("Content-Type: application/json"); + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 6) { + echo json_encode([ + 'success' => false, + 'message' => 'Fehler beim Upload! Aufgrund von zu geringen Zugriffsrechten konnte das Bild leider nicht hochgeladen werden. Sollte es sich dabei um ein Irrtum handeln, kontaktiere bitte einen Admin über das Kontaktformular.' + ]); + exit; + } + + if(!isset($_POST['image']) || !isset($_POST['name']) || !isset($_POST['type']) || !isset($_POST['size'])) { + echo json_encode([ + 'success' => false, + 'message' => 'Fehler beim Upload! Das hochgeladene Bild enthält fehlerhafte Informationen.' + ]); + exit; + } + $image = str_replace(' ', '+', $_POST['image']); + $image = substr($image, strpos($image, ',') + 1); + $image = base64_decode($image); + + $fileUrl = $this->FileModel->uploadFileByContent($image, $_POST['name'], $_POST['type'], $_POST['size']); + + echo json_encode([ + 'success' => true, + 'message' => 'Bild erfolgreich hochgeladen!', + 'url' => $fileUrl + ]); + } +} \ No newline at end of file diff --git a/application/controllers/admin/Projects.php b/application/controllers/admin/Projects.php new file mode 100644 index 0000000..d42391d --- /dev/null +++ b/application/controllers/admin/Projects.php @@ -0,0 +1,109 @@ +load->model('ProjectsModel', '', TRUE); + $this->load->model('FileModel', '', TRUE); + } + + public function index() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + + $entries = $this->ProjectsModel->getEntries('all'); + $categories = $this->ProjectsModel->getCategories('all'); + + $this->load->view('admin/sidebar', ['title' => 'Projekte verwalten']); + $this->load->view('admin/projects', ['entries' => $entries, 'categories' => $categories]); + $this->load->view('admin/footer'); + } + + public function edit($id = NULL) + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + $edit = $id === NULL ? false : true; + $content = null; + $projectCategories = []; + + if ($edit) { + if ($this->ProjectsModel->checkIfExists($id)) { + $content = $this->ProjectsModel->getEntry($id)[0]; + $projectCategories = $this->ProjectsModel->getEntryCategories($id); + } else { + redirect(base_url('admin/projects/edit')); + } + } + + $categories = $this->ProjectsModel->getCategories(); + + $this->load->view('admin/sidebar', ['title' => 'Projekt erstellen', 'additionalStyles' => ['lib/content-tools/content-tools.min.css', 'project-edit.css']]); + $this->load->view('admin/project_edit', ['edit' => -1, 'categories' => $categories, 'content' => $content, 'pCategories' => $projectCategories]); + $this->load->view('admin/footer', ['additionalScripts' => ['lib/content-tools/content-tools.min.js', 'project-edit.js']]); + } + + public function sendEdit() + { + header('Content-Type: application/json'); + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) { + echo json_encode(['success' => false, 'message' => 'Du hast nicht genügend Rechte, um Projekte zu erstellen bzw. bearbeiten.']); + exit; + } + + $translations = []; + $translations['de']['title'] = $this->input->post('titleDE'); + $translations['de']['description'] = $this->input->post('headlineDE'); + $translations['de']['content'] = $this->input->post('contentDE'); + + $url = $this->input->post('url'); + + $download['available'] = $this->input->post('isDownloadable') == 'on' ? true : false; + $download['link'] = $this->input->post('downloadLink'); + $download['name'] = $this->input->post('downloadLinkName'); + + $openSource['available'] = $this->input->post('isOpenSource') == 'on' ? true : false; + $openSource['link'] = $this->input->post('openSourceLink'); + $openSource['name'] = $this->input->post('openSourceLinkName'); + + $customLink['link'] = $this->input->post('customLink'); + $customLink['name'] = $this->input->post('customLinkName'); + + $categories = $this->input->post('categories'); + $date = date('Y-m-d H:i:s', strtotime($this->input->post('date'))); + $image = $this->input->post('image'); + + $editingID = $this->input->post('editingID'); + + if($editingID == '-1' && $this->ProjectsModel->checkIfNameExists($url)) { + echo json_encode(['success' => false, 'message' => 'Die angegebene URL ist bereits vergeben.']); + exit; + } + + if ($editingID == '-1' || !$this->ProjectsModel->checkIfExists($editingID)) { + $editingID = $this->ProjectsModel->createNewProjectDraft(); + } + + $this->ProjectsModel->updateProject($editingID, $translations, $url, $download, $openSource, $customLink, $date, $image); + $this->ProjectsModel->updateCategories($editingID, $categories); + + echo json_encode(['success' => true, 'message' => 'Das Projekt wurde erfolgreich gespeichert.', 'id' => $editingID]); + } + + public function delete() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + $id = filter_input(INPUT_POST, "id"); + $this->ProjectsModel->delete($id); + } + + public function delete_category() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + $id = filter_input(INPUT_POST, "id"); + $this->ProjectsModel->deleteCategory($id); + } + } diff --git a/application/controllers/admin/Redirects.php b/application/controllers/admin/Redirects.php new file mode 100644 index 0000000..0c9ca4b --- /dev/null +++ b/application/controllers/admin/Redirects.php @@ -0,0 +1,49 @@ +load->model('RedirectModel', '', TRUE); + } + + public function index() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + $redirects = $this->RedirectModel->getItems(); + $this->load->view('admin/sidebar', ['title' => 'Alle Weiterleitungen']); + $this->load->view('admin/redirects', ['redirects' => $redirects]); + $this->load->view('admin/footer', ['additionalScripts' => ['redirects.js']]); + } + + public function addRedirect() { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + + $id = $this->input->post('redirectID'); + $name = $this->input->post('redirectName'); + $url = $this->input->post('redirectUrl'); + + if(isset($name) && isset($url)) { + if(isset($id)) { + $this->RedirectModel->editRedirect($id, $url, $name); + } else { + $this->RedirectModel->insertRedirect($url, $name); + } + } + + redirect(base_url('admin/redirects')); + } + + public function removeRedirect($id = null) { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + + if($id != null) { + $this->RedirectModel->removeRedirect($id); + } + + redirect(base_url('admin/redirects')); + } +} \ No newline at end of file diff --git a/application/controllers/admin/Users.php b/application/controllers/admin/Users.php new file mode 100644 index 0000000..f676735 --- /dev/null +++ b/application/controllers/admin/Users.php @@ -0,0 +1,84 @@ +load->model('UserModel', '', TRUE); + } + + public function index() + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + + $usersData = $this->UserModel->getUserList(50, 0); + + $this->load->view('admin/sidebar', ['title' => 'Alle Nutzer']); + $this->load->view('admin/users', ['users' => $usersData]); + $this->load->view('admin/footer'); + } + + public function details($userID = NULL) + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + + if ($userID == NULL) redirect(base_url('admin/users')); + + $userData = $this->UserModel->getUserByID($userID); + + if ($userData == null) redirect(base_url('admin/users')); + $userData = $userData[0]; + + $this->load->view('admin/sidebar', ['title' => 'Details - ' . $userData['displayname']]); + $this->load->view('admin/user_details', ['user' => $userData]); + $this->load->view('admin/footer'); + } + + public function settings($userID = NULL) + { + if (!isset($_SESSION['user']) || empty($_SESSION['user']) || $_SESSION['user']['rank'] < 9) redirect(base_url('login')); + + if ($userID == NULL) redirect(base_url('admin/users')); + + $userData = $this->UserModel->getUserByID($userID); + + if ($userData == null) redirect(base_url('admin/users')); + $userData = $userData[0]; + + if (isset($_POST['rank'])) { + $rank = intval($_POST['rank']); + if (($rank < 1) || ($rank > 3 && $rank < 6) || $rank > 10) { + redirect(base_url(uri_string())); + } + // Add entry to history + $historyData = [ + 'ID' => $userID, + 'username' => $userData['username'], + 'displayname' => $userData['displayname'], + 'email' => $userData['email'], + 'rank' => $userData['rank'], + 'profile_picture' => $userData['profile_picture'], + 'header_image' => $userData['header_image'], + 'social_networks' => $userData['social_networks'], + 'showAds' => $userData['showAds'], + 'about' => $userData['about'], + 'language' => $userData['language'], + 'country' => $userData['country'], + 'gender' => $userData['gender'], + 'receiveEmails' => $userData['receiveEmails'], + 'receiveNewsletter' => $userData['receiveNewsletter'] + ]; + $this->UserModel->insertIntoHistory($historyData); + // Update profile + $this->UserModel->updateProfile(['rank' => $rank], $userID); + redirect(base_url(uri_string())); + } + + $this->load->view('admin/sidebar', ['title' => 'Nutzer-Einstellungen - ' . $userData['displayname']]); + $this->load->view('admin/user_settings', ['user' => $userData]); + $this->load->view('admin/footer'); + } +} \ No newline at end of file diff --git a/application/controllers/index.html b/application/controllers/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/controllers/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/application/core/MY_Controller.php b/application/core/MY_Controller.php new file mode 100644 index 0000000..7b15f98 --- /dev/null +++ b/application/core/MY_Controller.php @@ -0,0 +1,36 @@ +load->helper('cookie'); + + $lang = isset($_SESSION['site_lang']) ? $_SESSION['site_lang'] : 'de'; + $_SESSION['site_lang'] = $lang; + + foreach($this->lang->is_loaded as $loadedName => $loadedLang) { + if($loadedLang != $lang) { + $this->lang->load($loadedName, 'de'); // Fallback + $this->lang->load($loadedName, $lang); + } + } + + foreach ($names as $name) { + $this->lang->load($name, 'de'); + $this->lang->load($name, $lang); + } + + setlocale(LC_TIME, $lang); + + $rememberMe = get_cookie('rememberMe'); + + if($rememberMe != NULL) { + $token = get_cookie('token'); + var_dump($rememberMe, $token); + } + } +} \ No newline at end of file diff --git a/application/core/index.html b/application/core/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/core/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/application/helpers/index.html b/application/helpers/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/helpers/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/application/helpers/is_allowed.php b/application/helpers/is_allowed.php new file mode 100644 index 0000000..eca82fe --- /dev/null +++ b/application/helpers/is_allowed.php @@ -0,0 +1,33 @@ += 6) return TRUE; + else return FALSE; +} + +?> \ No newline at end of file diff --git a/application/helpers/jbimages_helper.php b/application/helpers/jbimages_helper.php new file mode 100644 index 0000000..53f8dd6 --- /dev/null +++ b/application/helpers/jbimages_helper.php @@ -0,0 +1,6 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/application/index.html b/application/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/application/language/de/about_lang.php b/application/language/de/about_lang.php new file mode 100644 index 0000000..5033102 --- /dev/null +++ b/application/language/de/about_lang.php @@ -0,0 +1,138 @@ +designe gerne.programmiere gerne.fotografiere gerne.schneide gerne.bearbeite gerne.animiere gerne.filme gerne.schreibe gerne.'; +$lang['about_introduction'] = 'Im Internet bin ich auch als KingOfDog vertreten.'; +$lang['about_text'] = '

    + All das, was ich heute tue, fing mit einer einfachen Digital-Kamera (soweit + ich weiß von Olympus) an. Natürlich hatten die Fotos keine gute Qualität - + geschweige denn die Videos. Allerdings habe ich dadurch den unglaublichen + Spaß, den Fotos machen, entdeckt. +

    +

    + So richtig startete es aber eigentlich erst 2013. Denn damals habe ich + meinen YouTube-Kanal erstellt, der zu dem Zeitpunkt noch „yourobonatic" + hieß. Warum dieser Name? Wegen dem Content, den ich auf diesem Kanal + hochgeladen habe. Das erste Video war nämlich ein Video zu einem kleinen + Programm, das ich für den Lego Mindstorms NXT 2.0 erstellt habe. Jedoch + blieb dieser Name nicht lange, da ich bald angefangen habe, Minecraft + stattdessen hochzuladen. Und so änderte sich mein Name zu + DerMinecrafterMarcel, beziehungsweise MinecrafterMarcel nach einer weiteren + Umbenennung in 2014. +

    +

    + Nachdem meine ersten Videos noch mit Windows Movie Maker „geschnitten" + wurden, habe ich bald (ungefähr spätes 2014) angefangen Sony Vegas Pro zu + nutzen. Die Thumbnails der Videos waren dabei noch ein Werk von Gimp. +

    +

    + Im nächsten Jahr habe ich mich dann an noch professionellere Software ran + gewagt. Damit ist die gesamte Adobe Creative Cloud gemeint: Photoshop für + die Thumbnails, Premiere für den Schnitt. Die restlichen Programme hatten + noch eine untergeordnetere Rolle. Jedenfalls habe ich mir durch die + Benutzung dieser Programme beigebracht, zu Designen und Videos zu + schneiden. +

    +

    + Ungefähr zu dieser Zeit im Jahre 2015 fing ich auch an, Programmieren zu + lernen. Ich hatte zwar früher schon ein wenig mit Python rumgewerkelt, + allerdings habe ich jetzt auch mit Java begonnen. +

    +

    + 2015 war übrigens das Jahr mit den meisten Video-Uploads. Diese + beinhalteten neben Minecraft auch Clash of Clans, Happy Wheels und mehr, + was alles Serien waren, die ich bereits Anfang 2014 gestartet habe. +

    +

    + 2016 hingegen war weitaus leerer. Irgendwie war das, die Zeit der + Selbstfindung, in der ich nicht so ganz wusste, was ich hochladen wollte. + Zum einen hatte ich keine Lust mehr, weiter Minecraft und anderen + Billig-Content zu veröffentlichen, aber ich war auch ideenlos, was + qualitativeren Inhalt anging. Erst, als sich das Jahr zum Ende neigte, + kamen wieder mehr Videos. Das ganze Jahr über arbeitete ich allerdings an + einem gewissen Riesen-Projekt: einer Webseite zu meinem Kanal. Und heute - + könnt ihr sie sehen! Unzählige Stunden sind hier reingeflossen. +

    +

    + Und dieses Jahr, 2017, habe ich dann letztendlich mich darauf + spezialisiert, Wissens-Videos mit Fokus auf Computer und Programmieren zu + produzieren. Nebenbei habe ich mir selbst die Verwendung von AfterEffects + angefangen beizubringen und gestartet, deutlich mehr mit Adobe Illustrator + zu arbeiten. Ach ja, und natürlich diese Seite hier veröffentlicht. +

    +

    + Und damit bleibt nur noch abzuwarten, was die Zukunft so bringen wird. +

    '; +$lang['about_events_title'] = 'Wichtige Ereignisse'; +$lang['about_events'] = [ + [ + "color" => "red", + "icon" => "fab fa-youtube", + "name" => "Erstellung meines YouTube-Kanals", + "date" => "16. September 2013" + ], + [ + "color" => "blue", + "icon" => "fab fa-twitter", + "name" => "Beitritt bei Twitter", + "date" => "18. September 2013" + ], + [ + "color" => "grey", + "icon" => "fa fa-upload", + "name" => "Erster Videoupload", + "date" => "6. Oktober 2013" + ], + [ + "color" => "green", + "icon" => "fa fa-gamepad", + "name" => "Erstes Minecraft-Video", + "date" => "7. Oktober 2013" + ], + [ + "color" => "yellow", + "icon" => "fa fa-mobile", + "name" => "Erstes Clash of Clans-Video", + "date" => "12. Februar 2014" + ], + [ + "color" => "blue", + "icon" => "fa fa-trophy", + "name" => "500 Abonnenten auf YouTube", + "date" => "10. Mai 2015" + ], + [ + "color" => "red", + "icon" => "fab fa-twitch", + "name" => "Erstellung meines Twitch-Kanals", + "date" => "28. Juli 2015" + ], + [ + "color" => "grey", + "icon" => "fa fa-trophy", + "name" => "25.000 Views auf YouTube", + "date" => "25. November 2015" + ], + [ + "color" => "yellow", + "icon" => "fa fa-pencil-alt", + "name" => "5.000 Tweets verfasst", + "date" => "15. Juni 2017" + ], + [ + "color" => "blue", + "icon" => "fa fa-trophy", + "name" => "50.000 Views auf YouTube", + "date" => "1. Dezember 2017" + ], + [ + "color" => "green", + "icon" => "fa fa-columns", + "name" => "Erste Veröffentlichung der Website", + "date" => "16. September 2017" + ] +]; diff --git a/application/language/de/blog_lang.php b/application/language/de/blog_lang.php new file mode 100644 index 0000000..0e91db9 --- /dev/null +++ b/application/language/de/blog_lang.php @@ -0,0 +1,43 @@ +1€ Spende reicht für \'ne Tüte Süßigkeiten für den Entwickler'; +$lang['donate_level2'] = 'Eine 2€ Spende ermöglicht weiterhin die Entwicklung der Webseite.'; +$lang['donate_level3'] = 'Eine 5€ Spende kann 2GB mehr RAM für den Server kaufen!'; +$lang['donate_level4'] = 'Eine 10€ Spende würde den Mindestlohn für 1 Stunde Arbeit eines Entwicklers decken.'; +$lang['donate_level5'] = 'Eine 15€ Spende könnte 150GB mehr Speicherplatz für eure Bilder, Texte, Videos und co. ermöglichen.'; +$lang['donate_level6'] = 'Eine 20€ Spende wäre die Grundlage für den Kauf eines weiteren Servers.'; +$lang['donate_level7'] = 'Eine 25€ Spende würde es uns ermöglichen verschiedene wichtige Lizenzen zu erwerben.'; +$lang['donate_level8'] = 'Eine 30€ Spende reicht für eine PlayStore App-Veröffentlichung dieser Webseite.'; +$lang['donate_level9'] = 'Eine 50€ Spende würde direkt in den Kauf eines weiteren Servers gesteckt werden.'; +$lang['donate_level10'] = 'Eine 100€ Spende würde für 1 Monat lang für keine Verluste sorgen!'; +$lang['donate_btn'] = "Spenden"; \ No newline at end of file diff --git a/application/language/de/email_lang.php b/application/language/de/email_lang.php new file mode 100644 index 0000000..96952d3 --- /dev/null +++ b/application/language/de/email_lang.php @@ -0,0 +1,30 @@ +Solltest du diese Seite benutzen und gerne weiter benutzen können, deaktiviere bitte deinen AdBlocker (falls vorhanden) auf dieser Seite, damit wir uns finanzieren können!'; +$lang['faq_section1_q4'] = 'Gibt es ein Team hinter der Webseite? Und wenn ja, wer gehört dazu?'; +$lang['faq_section1_a4'] = 'Jein. Ein kleines Team, bestehend aus Moderatoren und Admins, welche helfen die Seite "sauber" zu halten, gibt es schon. Die meisten technischen Fehler und Neuerungen werden aber von dem Webseiten-Besitzer selbst entwickelt, designed und programmiert.'; +$lang['faq_section1_q5'] = 'In welchen Sprachen gibt es diese Webseite?'; +$lang['faq_section1_a5'] = 'Offensichtlich ist diese Seite in Deutsch verfügbar. Außerdem wurde sie auf Englisch übersetzt und teilweise auf Französisch. Alle derzeit verfügbaren Sprachen sind am unteren Seitenende zu finden. Jedoch sind die Übersetzungen derzeit noch nicht 100%-ig perfekt, daher wird das Team diese fortlaufend verbessern. Auch die Nutzer, also genau du, können mithelfen bei der Übersetzung der Seite in vielleicht sogar noch andere Sprachen!'; +$lang['faq_section2_title'] = 'Wer ist KingOfDog? Muss man den kennen?'; +$lang['faq_section2_q1'] = 'Wer ist KingOfDog?'; +$lang['faq_section2_a1'] = 'KingOfDog ist (Hobby-) YouTuber, Designer, Programmierer, Entwickler, Fotograf, Cutter, Animator, Konzeptor und vieles mehr - und ist erst 15 Jahre alt. Diese Webseite hat er als kleines Hobby-Projekt neben der Schule gemacht. Genauso wie seine YouTube-Kanäle, die Tools auf dieser Webseite, alle Projekte aus dem Portfolio und so weiter und so fort. Außerdem schreibt er auch einen Großteil der Posts auf dem Blog und geht neben all dem noch zur Schule. "WTF" denkt ihr euch? Ich mir manchmal auch. Ich bin echt nicht normal. Aber ich fühle mich unwohl so sehr mit all dem anzugeben. Solltet ihr also wirklich noch mehr wissen wollen, könnt ihr auf der "About"-Seite nachgucken (auch wenn ich das nicht verstehen kann!).'; +$lang['faq_section2_q2'] = 'Was macht der Typ?'; +$lang['faq_section2_a2'] = 'Kurz gesagt: YouTube, Design, Software, Fotografie, Animation, Film und Skripting. Für mehr könnt ihr euch die "About"-Seite durchlesen.
    Ach ja, und Schule. Mathe, Deutsch, Englisch, Französisch und so. Einige seiner Klassenkameraden sagen, er wäre ganz gut. Er selbst sieht das nicht ganz so. (Seine Noten sprechen für Ersteres)'; +$lang['faq_section2_q3'] = 'Woher kennt man den überhaupt?'; +$lang['faq_section2_a3'] = 'Wahrscheinlich kennt man den Typen eher nicht, aber vielleicht gehört ihr zu den über 600 Abonnenten auf seinem YouTube-Kanal. Oder vielleicht gehört ihr zu den ca. 100 Leuten, die seinem Twitter-Profil folgen!'; +$lang['faq_section2_q4'] = 'Warum hat er diese Seite gemacht?'; +$lang['faq_section2_a4'] = 'Vor allem aus Langeweile. An zweiter Stelle folgt wahrscheinlich "Fähigkeiten im Webdesign trainieren und PHP lernen". Danach kommt nochmal Langeweile und an letzter Stelle Idiotismus.
    Nein, mal ernsthaft: Man bringt sich einfach am besten eine Programmiersprache oder ähnliches bei, indem man etwas damit programmiert bzw. entwickelt. Und das ist auch der Grund für diese Webseite! Und vielleicht auch noch ein wenig Zurschaustellung der eigenen Leistungen!'; +$lang['faq_section2_q5'] = 'Wo hat er Programmieren und Designen gelernt?'; +$lang['faq_section2_a5'] = 'Was heißt hier "wo"? Programmieren bringt man sich am besten, genauso wie Designen, selbst bei und zwar durch "Learning by Doing". Man lernt am besten eine Programmiersprache, wenn man einfach anfängt etwas in dieser Sprache zu programmieren und gleichzeitig nachguckt, wie man etwas bestimmtes macht, was man gerade zum Coden braucht. Beim Designen ist das ähnlich. Sobald du die Grundbedienung deines verwendeten Programmes raushast, designest du einfach, als wäre dein Leben in Gefahr. Dann guckst du dir hier das eine Video dazu an, liest dir da den Blog dazu durch und das wichtigste: designest diese Ding nach. So lernt man einfach am besten - egal wobei!'; +$lang['faq_section3_title'] = 'Accounts auf KingOfDogTV.de'; +$lang['faq_section3_q1'] = 'Was bringt mir ein Account?'; +$lang['faq_section3_a1'] = 'Wenn du dir ein Account auf dieser Seite erstellst, bekommst du die Möglichkeit Kommentare unter Blog-Posts zu hinterlassen und selbige zu bewerten. Außerdem erhält jeder Nutzer eine Profile Page mit verschiedenen Inhalten. In Zukunft wird diese Profile Page auch noch ausgebaut und mit mehr Funktionen versehen. Manchmal erhälst du als Nutzer auch Ankündigungen und bekommst die exklusive Möglichkeit, an Gewinnspielen teilzunehmen!'; +$lang['faq_section3_q2'] = 'Kostet das was?'; +$lang['faq_section3_a2'] = 'Ein Account auf dieser Webseite ist völlig kostenlos. Solltest du das Projekt dennoch unterstützen wollen, kannst du gerne spenden und somit für das Fortbestehen dieser Webseite sorgen. Durch eine Spende, egal welchen Betrages, entfernst du zudem alle Werbebanner auf der Seite!'; +$lang['faq_section3_q3'] = 'Und wieso sollte ich mir einen Account erstellen?'; +$lang['faq_section3_a3'] = 'Vor allem, wegen den zuvor genannten Gründen. Aber gleichzeitig zeigst du mir auch, dass du interessiert bist an meinem Content und unterstützt mich so mental. Und als kleine Gegenleistung erhälst du als Account-Besitzer die exklusive Möglichkeit, gegenüber Nicht-Account-Besitzern, an Gewinnspielen teilnehmen zu können.'; +$lang['faq_section3_q4'] = 'Ist das mit Wordpress gemacht?'; +$lang['faq_section3_a4'] = 'Nein! Das User-System, sowie die komplette restliche Webseite auch wurde "per Hand" von KingOfDog programmiert und nutzt keine Drittanbietersoftware, wie Wordpress, Typo3 oder ähnliches zur Verwaltung von Daten und Bereitstellung eines Registrierungssystems. Weitere Informationen findest du im Bereich "Technisches".'; +$lang['faq_section4_title'] = 'Datenschutz und co.'; +$lang['faq_section4_q1'] = 'Sind meine Daten hier sicher?'; +$lang['faq_section4_a1'] = 'Die Betreiber dieser Webseite sehen Privatsphäre als ein Menschenrecht an, welches grundsätzlich und bedingungslos für alle Bewohner dieses Planeten gilt - unabhängig von Einkommen, Alter, Herkunft oder politischen Ansichten. Daher werden keinerlei privaten Daten ohne deine Zustimmung gespeichert. Wir haben leider jedoch keinen Einfluss oder gar Kontrolle darauf, was Drittanbieter für Werbung an Daten speichern. Daher versuchen wir möglichst wenige dieser Dienste in Anspruch zu nehmen. Für Nutzerstatistiken nutzen wir beispielsweise aus Datenschutzgründen keine externe Dienste wie Google Analytics, sondern das OpenSource-verfügbare Analysetool namens Piwik. Die Daten werden anonymisiert auf unseren Servern gespeichert und es ist nicht möglich Daten zurückzuverfolgen, da IP-Adressen nicht einlesbar, sondern "geschwärzt", gespeichert werden. Sollten noch Fragen aufkommen zu diesem sensiblen Thema, steht das Kontakt-Formular dazu bereit.'; +$lang['faq_section4_q2'] = 'Werden meine Daten für Werbezwecke genutzt?'; +$lang['faq_section4_a2'] = 'Die Webseite muss sich irgendwie finanzieren. Die Serverkosten müssen gedeckt werden und auch die Erweiterung des Serverplatzes kostet Geld. Da diese Seite grundsätzlich kostenlos sein soll, müssen wir Werbung schalten. Dazu wird der Dienst Google AdSense, sowie teilweise auch Amazon AdSystem oder Affiliate-Dienste von anderen Seiten genutzt. Die Anbieter sammeln größtenteils Nutzerdaten, um maßgeschneiderte Werbung zu senden. Die Webseitenbetreiber und der Provider erhalten keinerlei Zugriff auf diese Nutzerdaten. Weitere Informationen zu diesem Thema finden sich in der Datenschutzerklärung und in der Datenschutzerklärung von Google AdSense.'; +$lang['faq_section4_q3'] = 'Gibt es hier Kekse?'; +$lang['faq_section4_a3'] = 'Mit "Keksen" sind natürlich Cookies gemeint. Oft wird vor Cookies gewarnt. Auch diese Seite nutzt Cookies, um dein Nutzererlebnis zu verbessern. Beispielsweise wird so die Möglichkeit geboten, deine Logindaten (natürlich verschlüsselt) abzuspeichern, so dass du nicht bei jedem Webseitenbesuch dich neu anmelden musst. Wir nutzen Cookies nur zur komfortableren Gestaltung des Nutzererlebnisses und nicht um schädliche Software auf den Rechner zu übertragen. Weiteres dazu in der Datenschutzerklärung!'; +$lang['faq_section4_q4'] = 'Wer garantiert mir meine Privatsphäre?'; +$lang['faq_section4_a4'] = 'Zu Zeiten von NSA und Datenkraken wie Google ist eine vollständige Garantie von Datenschutz und Privatsphäre bedauerlicherweise nicht mehr möglich. Wir versuchen möglichst wenige Drittanbieter-Software zu nutzen. Analyse-Daten werden nur auf unseren Servern gesammelt und gespeichert und nicht weitergegeben. Wir versuchen eine offene und transparente Datenschutz-Politik zu führen, da den Betreibern Privatsphäre ebenfalls ziemlich wichtig ist. Sollten noch offene Fragen verbleiben, besteht die Möglichkeit Kontakt mit uns über das Kontakt-Formular aufzunehmen!'; +$lang['faq_section4_q5'] = 'Was ist mit JavaScript?'; +$lang['faq_section4_a5'] = 'Wir nutzen JavaScript, um eine einfachere und intuitivere Bedienung der Webseite zu ermöglichen. Manche Dinge auf dieser Webseite wären ohne die Verwendung von einer Programmiersprache wie JavaScript nicht möglich. Wir bemühen uns die Seite so sicher wie möglich zu halten und keinen Dritten Zugriff auf unsere Server zu gewähren. Alle Skripte sind sicher und laden auf keinen Fall Schadsoftware oder unerwünschte Daten auf Ihren PC.'; +$lang['faq_section5_title'] = 'Blog'; +$lang['faq_section5_q1'] = 'Was gibt es auf dem Blog?'; +$lang['faq_section5_a1'] = 'Auf dem Blog gibt es Posts zu verschiedenen Themen, vor allem aber zu Programmierung und Design. Außerdem werden auch Neuigkeiten zu den YouTube-Kanälen "KingOfDog" und "ZeybeFX" und zu dieser Webseite an dich weitergegeben. Zudem gibt es einige Posts zu aktuellen politischen, wirtschaftlichen und gesellschaftlichen Themen zu denen ich mir eine Meinung gebildet habe, welche ich an euch weitergeben will. Von Zeit zu Zeit kommen auch Posts zu technischen Themen, wie Computern, Smartphones etc. Außerdem setze ich mich für Netzneutralität, besseres Internet in allen Regionen der Welt, Anti-Copyright (Creative Commons) und weitere ähnliche Themen ein! Auf dem Blog gibt es beispielsweise auch wichtige Tools und Ressourcen für Webdesigner, Informatiker, UX-Designer und so weiter.'; +$lang['faq_section5_q2'] = 'Interessiert mich das?'; +$lang['faq_section5_a2'] = 'Wenn du interessiert bist an Programmierung, Technik, Fortschritt, Entwicklung und Design, solltest du auf jeden Fall auf dem Blog vorbei schauen. Auch, wenn du gerne Meinungen, Argumentationen und Stellungnahmen zu bestimmten, aktuellen Themen liest, solltest du vielleicht mal ein Blick auf den Blog werfen.'; +$lang['faq_section5_q3'] = 'Kostet das was?'; +$lang['faq_section5_a3'] = 'Der Blog ist natürlich, wie der Rest der Webseite, völlig kostenlos und für jeden frei zugänglich. Ich möchte mit zu einem freien Internet beitragen, in dem offener Meinungsaustausch stattfindet und keine Idee zurückgehalten wird, weil irgendjemand oder irgendetwas etwas dagegen hat.'; +$lang['faq_section5_q4'] = 'Wie häufig kommen da neue Posts?'; +$lang['faq_section5_a4'] = 'Das ist sehr unterschiedlich. Es gibt Zeiten, in denen kommen täglich mehrere Artikel online, dafür gibt es manchmal auch Zeiten, da herrscht ziemliche Flaute auf dem Blog. Es sind aber natürlich jederzeit alle vorherigen und jetztigen Posts zugänglich für jeden.'; +$lang['faq_section5_q5'] = 'Auf welcher Sprache ist das? Englisch?'; +$lang['faq_section5_a5'] = 'Nicht direkt. Die überwiegende Mehrheit der Posts ist auf Deutsch verfasst. Jedoch sind viele Artikel auch von einem Teammitglied ins Englische übersetzt, um mehr potentielle Leser zu erreichen, die das Thema eventuell interessieren könnte.'; +$lang['faq_section6_title'] = 'Technisches'; +$lang['faq_section6_q1'] = 'Wie wurde die Seite programmiert?'; +$lang['faq_section6_a1'] = 'Natürlich mit HTML und CSS. Auch wenn dieser Teil nicht als Programmierung zählt, denn beides ist eher als sogenannte Design-Sprache anzusehen. Außerdem wurde viel mit JavaScript und PHP gemacht. Das gesamte Backend besteht zu sehr großen Teilen aus PHP-Code.'; +$lang['faq_section6_q2'] = 'Wurde dafür Drittanbieter-Software/Frameworks wie Wordpress genutzt?'; +$lang['faq_section6_a2'] = 'Teilweise. Diese Seite nutzt kein CMS (Content Management System) wie Wordpress, Typo3 oder Joomla, jedoch wurde ein PHP-, ein CSS- und ein JavaScript-Framework genutzt. Diese Frameworks sind CodeIgniter, Bootstrap und jQuery. Mehr Infos zu diesen Frameworks findet ihr durch eine Suchmaschinen-Anfrage oder auf der jeweiligen Internet-Seite!'; +$lang['faq_section6_q3'] = 'Kannst du mir den Quellcode schicken?'; +$lang['faq_section6_a3'] = 'Nein! Erstens: warum sollte ich? Und zweitens: ich möchte nicht riskieren, die Sicherheit der Nutzerdaten und Passwörter zu vernachlässigen. Diese sind zwar verschlüsselt gespeichert und mit einem "Salt" versehen, jedoch würde die Entdeckung dieses Salzes einem potenziellen Angreifer es einfacher machen Passwörter zu knacken und genau das möchte ich nicht riskieren! Das ist auch der Grund, warum diese Webseite nicht auf GitHub oder ähnlichen Plattformen unter der von mir geliebten Creative Commons-Lizenz verfügbar ist, beziehungsweise, warum der Quellcode nicht einsehbar ist.'; +$lang['faq_section6_q4'] = 'Bekomme ich Admin-Zugriff?'; +$lang['faq_section6_a4'] = 'Das ist jetzt nicht unbedingt eine technische Frage, aber trotzdem: nein. Ich kenne dich nicht und weiß nicht, ob ich dir vertrauen kann. Außerdem gebe ich grundsätzlich keinem Fremden einen Zugriff auf das Kontrollsystem und die Statistiken dieser Webseite!'; +$lang['faq_section6_q5'] = 'Auf was für Servern wird die Webseite gehostet?'; +$lang['faq_section6_a5'] = 'Diese Seite wird auf einem V-Server gehostet.'; \ No newline at end of file diff --git a/application/language/de/footer_lang.php b/application/language/de/footer_lang.php new file mode 100644 index 0000000..0fce38d --- /dev/null +++ b/application/language/de/footer_lang.php @@ -0,0 +1,14 @@ +deine Hilfe angewiesen! Sollte dir ein Fehler auf dieser Seite aufgefallen sein, solltest du eine Idee für die Verbesserung dieser Seite haben oder solltest du etwas zu Kritisieren haben, nutze dieses Feld, um uns dies zu senden. Wir freuen uns über jedes Feedback und versuchen so immer weiter, diese Seite zu verbessern. Vielen Dank im Vorraus!'; + $lang['header_feedback_msg'] = 'Dein Feedback'; + $lang['header_feedback_msg_placeholder'] = 'Bitte gib dein Feedback zu dieser Seite ein'; + $lang['header_feedback_anonymous'] = 'Anonym senden?'; + $lang['header_feedback_anonymous_info'] = 'Anonymes Feedback enthält keinerlei Daten über den Nutzer, wie IP, E-Mail-Adresse, Nutzer-ID oder ähnliches.
    Nicht anonymisiertes Feedback hilft uns, besser Nutzergruppen und deren Bedürfnisse zu analysieren und vor allem mit dem Feedback-Sender in Kontakt zu bleiben, sollten noch weitere Fragen aufkommen.
    In allen Fällen gehen wir mit deinen Daten sensibel um und geben diese keinesfalls an Drittanbieter weiter!'; + + $lang['header_share'] = 'Teilen'; + $lang['header_share_title'] = 'Seite teilen'; + + $lang['header_post'] = 'Post'; + $lang['header_post_title'] = 'Post verfassen'; + $lang['header_post_content'] = 'Inhalt'; + $lang['header_post_notice'] = 'Es wird an einer Funktion zum Uploaden von Fotos, Videos und anderen Medien gearbeitet. In hoffentlich naher Zukunft wirst du auch die Möglichkeit haben, diese zu deinen Posts hinzuzufügen!'; + $lang['header_post_publish'] = 'Veröffentlichen'; diff --git a/application/language/de/home_lang.php b/application/language/de/home_lang.php new file mode 100644 index 0000000..b3760dc --- /dev/null +++ b/application/language/de/home_lang.php @@ -0,0 +1,37 @@ +Bedenken Sie, einen Drücker mit dem linken Bedienfeld Ihres Maus-Eingabegerätes für Ihren Person auf das rechts abgedruckte Bild, damit Sie zu der wiedergebenden Internetseite des aktuellsten DuRöhren-Films von meiner Persönlichkeit gelangen könnten, wenn Sie dies wöllteren!'; +$lang['home_slider_video_btn'] = 'Jetzt ansehen'; + +$lang['home_channels_title'] = 'YouTube-Kanäle'; +$lang['home_kingofdog_des'] = 'KingOfDog ist mein erster YouTube-Kanal und besteht mittlerweile schon seit über 4 Jahren. Hier gibt es Gaming, Fakten, Informationen, News, Meinungen, Reviews, Vlogs und vieles mehr. Über 600 Abonnenten können sich hier ca. 350 Videos ansehen.'; +$lang['home_zeybefx_des'] = 'Auf ZeybeFX gibt es seit über anderthalb Jahren Speedarts, Design-Tutorials, Giveaways und alle möglichen anderen Videos, die mit Design zu tun haben. Der Kanal ist englischsprachig und ist derzeit noch etwas inaktiv.'; +$lang['home_zeybeofficial_des'] = 'Der neueste Kanal von mir existiert erst seit Anfang 2017, ist dafür jedoch sehr aktiv. Täglich um 15 Uhr gibt es ein neues Video mit copyright-freier Musik, die jeder für seine eigenen Videos, Spiele, Webseiten, Podcasts oder ähnliches nutzen kann. Teilweise gibt es auch eigene Musik, die ich selbst erstellt habe.'; +$lang['home_kingofdogint_des'] = 'KingOfDog International ist die internationale bzw. englische Version meines Hauptkanals KingOfDog. Hier gibt es übersetzte Videos vom deutschen Kanal, um mehr Menschen erreichen zu können.'; + +$lang['home_active_users'] = 'Derzeit aktive Nutzer'; +$lang['home_newest_users'] = 'Neueste Nutzer'; +$lang['home_newest_posts'] = 'Neuste Posts'; +$lang['home_notice'] = 'Diese Funktion wird in Zukunft folgen. Bitte schaue später hier vorbei!'; + +$lang['home_error_twitter'] = 'Keine Tweets gefunden'; +$lang['home_error_instagram'] = 'Keine Bilder gefunden'; +$lang['home_error_youtube'] = 'Keine Videos gefunden'; +$lang['home_social_all'] = 'Alle'; +$lang['home_date'] = 'd.m.Y \u\m H:i \U\h\r'; +$lang['home_posts'] = 'Letzte Posts'; + +$lang['home_ads_title'] = 'Wieso zeigen wir Werbung?'; +$lang['home_ads_description'] = 'Das Angebot dieser Seite ist komplett kostenlos und das soll auch so bleiben. Die Werbeeinnahmen werden ausschließlich für die Finanzierung und Erweiterung des Servers genutzt. So können wir auch weiterhin alle Funktionen kostenlos anbieten! Wir verfolgen jedoch das Motto "Höchstens eine Werbung pro Seite". Das heißt jede Seite von KingOfDogTV.de enthält maximal einen einzigen Werbebanner. So wird die Werbung nicht zu nervig, die Seite braucht nicht allzu viel länger zum Laden und trotzdem können die Kosten für den Webserver (hoffentlich) gedeckt werden.'; diff --git a/application/language/de/imglib_lang.php b/application/language/de/imglib_lang.php new file mode 100644 index 0000000..98b3292 --- /dev/null +++ b/application/language/de/imglib_lang.php @@ -0,0 +1,28 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/application/language/de/language_names_lang.php b/application/language/de/language_names_lang.php new file mode 100644 index 0000000..0b2d150 --- /dev/null +++ b/application/language/de/language_names_lang.php @@ -0,0 +1,144 @@ +Erstelle dir kostenlos einen Account oder melde dich an.'; diff --git a/application/language/de/profiler_lang.php b/application/language/de/profiler_lang.php new file mode 100644 index 0000000..71cc283 --- /dev/null +++ b/application/language/de/profiler_lang.php @@ -0,0 +1,32 @@ +Cäsar Veschlüsselung ver- und entschlüsseln. Dabei wird jeder Buchstabe um die angegebene Zahl im Alphabet verschoben.'; +$lang['encrypter_unencrypted'] = 'Unverschlüsselter Text'; +$lang['encrypter_encrypted'] = 'Verschlüsselter Text'; +$lang['encrypter_input_plc'] = 'Gebe einen unverschlüsselten Text ein, um diesen zu verschlüsseln!'; +$lang['encrypter_decrypt_plc'] = 'Gebe einen verschlüsselten Text ein, um diesen zu entziffern!'; +$lang['encrypter_encrypt'] = 'Verschlüsseln'; +$lang['encrypter_decrypt'] = 'Entschlüsseln'; + +$lang['adfgvx_title'] = 'ADFGVX-Verschlüsselung'; +$lang['adfgvx_description'] = 'Die im Ersten Weltkrieg von den Deutschen verwendete ADFGVX-Verschlüsselung'; +$lang['adfgvx_key1'] = 'Erstes Schlüsselwort'; +$lang['adfgvx_key1_plc'] = 'Bitte gib ein 1. Schlüsselwort ein'; +$lang['adfgvx_key2'] = 'Zweites Schlüsselwort'; +$lang['adfgvx_key2_plc'] = 'Bitte gib ein 2. Schlüsselwort ein'; + +$lang['atbash_title'] = 'Atbash-Verschlüsselung'; +$lang['atbash_description'] = 'Die Atbash-Verschlüsselung ist eine sehr grundlegende Verschlüsselungsmethode, bei der lediglich das Alphabet invertiert wird'; + +$lang['gartenzaun_title'] = 'Gartenzaun-Verschlüsselung'; +$lang['gartenzaun_description'] = 'Mithilfe einer Transposition werden die Buchstaben des Klartextes verschoben'; +$lang['gartenzaun_keyword'] = 'Schlüsselwort'; +$lang['gartenzaun_keyword_plc'] = 'Bitte gib ein Schlüsselwort ein'; + +$lang['caesar_title'] = 'Cäsar-Verschlüsselung'; +$lang['caesar_description'] = 'Mit meinem Cäsar-Encrypter kannst du Texte nach der Cäsar Veschlüsselung ver- und entschlüsseln. Dabei wird jeder Buchstabe um die angegebene Zahl im Alphabet verschoben.'; +$lang['caesar_shiftkey'] = 'Shift-Key'; +$lang['caesar_shifthelp'] = 'Anzahl der im Alphabet verschobenen Buchstaben'; + +// URL-Encoder +$lang['url_site_title'] = 'URL-Encoder'; +$lang['url_title'] = 'URL-Encoder'; +$lang['url_description'] = 'Kodiere beziehungsweise dekodiere ganz einfach alle möglichen URLs oder Sätze!'; +$lang['url_input'] = 'Eingabe'; +$lang['url_input2'] = 'Eingabe des unkodierten Textes'; +$lang['url_input3'] = 'Eingabe des kodierten Textes'; +$lang['url_encode'] = 'Kodieren'; +$lang['url_decode'] = 'Dekodieren'; +$lang['url_output'] = 'Ausgabe'; +$lang['url_output2'] = 'Ausgabe des kodierten Textes'; +$lang['url_output3'] = 'Ausgabe des dekodierten Textes'; + +// Base64-Encoder +$lang['base64_site_title'] = 'Base64-Encoder'; +$lang['base64_title'] = 'Base64-Encoder'; +$lang['base64_description'] = 'Kodiere beziehungsweise dekodiere ganz einfach alle Sätze, Botschaften und Texte mit der Base64-Kodierung!'; +$lang['base64_input'] = 'Eingabe'; +$lang['base64_input2'] = 'Eingabe des unkodierten Textes'; +$lang['base64_input3'] = 'Eingabe des kodierten Textes'; +$lang['base64_encode'] = 'Kodieren'; +$lang['base64_decode'] = 'Dekodieren'; +$lang['base64_output'] = 'Ausgabe'; +$lang['base64_output2'] = 'Ausgabe des kodierten Textes'; +$lang['base64_output3'] = 'Ausgabe des dekodierten Textes'; + +// Passwort-Generator +$lang['pass_site_title'] = 'Passwort-Generator'; +$lang['pass_title'] = 'Passwort-Generator'; +$lang['pass_description'] = 'Mit meinem Passwort-Generator kannst du ein zufälliges Passwort ganz nach deinen Belieben erstellen.'; +$lang['pass_error'] = 'Fehler bei der Eingabe'; +$lang['pass_generate'] = 'Generieren'; +$lang['pass_copy'] = 'Kopieren'; +$lang['pass_length'] = 'Passwortlänge'; +$lang['pass_length_help'] = 'Wie lang soll das Passwort sein?'; +$lang['pass_components'] = 'Komponenten'; +$lang['pass_components_upper'] = 'Großbuchstaben'; +$lang['pass_components_lower'] = 'Kleinbuchstaben'; +$lang['pass_components_special'] = 'Sonderzeichen'; +$lang['pass_components_numbers'] = 'Zahlen'; +$lang['pass_tipps_title'] = 'Tipps für ein sicheres Passwort'; +$lang['pass_tipps1'] = 'Das Passwort sollte mindestens aus 10 Zeichen bestehen. Es gilt: Je länger, desto sicherer!'; +$lang['pass_tipps2'] = 'Jedoch macht Länge alleine ein Passwort auch nicht sicher, daher sollte das Passwort möglichst eine Mischung aus Groß- und Kleinbuchstaben, Zahlen und Sonderzeichen sein. (z.B. 2Hundesindtoll!)'; +$lang['pass_tipps3'] = 'Dein Passwort sollte keine persönlichen Informationen, die mit dir in Verbindung gebracht werden könnten, enthalten. (z.B. Name des Haustiers, Wohnort, etc.)'; +$lang['pass_tipps4'] = 'Es sollten keine häufig verwendeten Wörter oder Buchstabenketten (z.B. Test, QWERTZ, ABC, 1234, Passwort, etc.) in dem Passwort vorhanden sein.'; +$lang['pass_tipps5_title'] = 'Empfehlung:'; +$lang['pass_tipps5'] = 'Denke dir einen Satz aus und nehme von jedem Wort nur den Anfangsbuchstaben. Daraus entsteht ein sehr sicheres Passwort. Beispiel: Jeden Samstag um 18:00 Uhr kommt 100%-ig ein neues Video online. ==> JSu18:00Uk100%-igenVo.'; +$lang['pass_end'] = 'Viel Erfolg!'; + +// Nickname-Generator +$lang['nick_site_title'] = 'Nickname-Generator'; +$lang['nick_title'] = 'Nickname-Generator'; +$lang['nick_description'] = 'Dieser Nickname-Generator bietet'; +$lang['nick_description2'] = 'verschiedene Möglichkeiten - da ist ganz bestimmt auch was für dich dabei!'; +$lang['nick_generate'] = 'Generieren'; +$lang['nick_copy'] = 'Kopieren'; +$lang['nick_beginning'] = 'Beginn des Nicknames'; +$lang['nick_ending'] = 'Ende des Nicknames'; +$lang['nick_history'] = 'Verlauf'; + +// Minecraft Player-Tools +$lang['players_site_title'] = 'Minecraft Spieler-Tools'; +$lang['players_title'] = 'Minecraft Spieler-Tools'; +$lang['players_description'] = 'Finde Spieler-UUID und Server-Stats heraus & downloade verschiedene Skins, Avatare und Renders - alles nur per Spielername!'; +$lang['player_name'] = 'Minecraft-Name'; +$lang['players_search'] = 'Los'; +$lang['player_skin'] = 'Download Skin'; +$lang['player_skin_render'] = 'Download Skin-Render'; +$lang['player_head_render'] = 'Download Kopf-Render'; +$lang['player_avatar'] = 'Avatar-Downloads'; +$lang['player_history_name'] = 'Name'; +$lang['player_history_change'] = 'Änderungsdatum'; +$lang['player_original_name'] = 'Originalname'; +$lang['player_on_server'] = 'auf:'; + +// Minecraft Server-Tools +$lang['servers_site_title'] = 'Minecraft Server-Tools'; +$lang['servers_title'] = 'Minecraft Server-Tools'; +$lang['servers_description'] = 'Erfahre sofort die Spieleranzahl, die Minecraft-Version, den Ping und vieles mehr - nur über eine Server-IP!'; +$lang['servers_ip'] = 'Server-IP'; +$lang['servers_search'] = 'Los'; +$lang['servers_error'] = 'Fehler'; +$lang['servers_error_ip'] = 'Fehlerhafte IP'; +$lang['servers_player'] = 'Spieler'; +$lang['servers_version'] = 'Version'; +$lang['servers_ping'] = 'Ping'; + +// Twitch Tools +$lang['twitch_site_title'] = 'Twitch-Tools'; +$lang['twitch_title'] = 'Twitch-Tools'; +$lang['twitch_description'] = 'Gebe einen Twitch-Channel-Namen ein und erhalte verschiedene Statistiken und Informationen über diesen Kanal!'; +$lang['twitch_channel'] = 'Twitch-Channel'; +$lang['twitch_search'] = 'Suchen'; +$lang['twitch_name'] = 'Name'; +$lang['twitch_id'] = 'Account-ID'; +$lang['twitch_follower'] = 'Follower'; +$lang['twitch_views'] = 'Aufrufe'; +$lang['twitch_partner'] = 'Twitch-Partner?'; +$lang['twitch_youth'] = 'Jugendfrei?'; +$lang['twitch_language'] = 'Sprache'; +$lang['twitch_yes'] = 'Ja'; +$lang['twitch_no'] = 'Nein'; +$lang['twitch_created'] = 'Erstellungsdatum'; +$lang['twitch_changed'] = 'Änderungsdatum'; +$lang['twitch_stream'] = 'Stream-Infos'; +$lang['twitch_stream_title'] = 'Titel'; +$lang['twitch_stream_game'] = 'Spiel'; +$lang['twitch_stream_language'] = 'Sprache'; +$lang['twitch_url'] = 'URL'; +$lang['twitch_time'] = 'd. F Y \u\m H:i \U\h\r'; +$lang['twitch_media'] = 'Medien'; +$lang['twitch_livestream'] = 'Livestream'; + +// YouTube Downloader +$lang['ytdl_site_title'] = 'YouTube Video Downloader'; +$lang['ytdl_title'] = 'YouTube Video Downloader'; +$lang['ytdl_description'] = 'Lade ganz einfach und kostenlos YouTube Videos runter'; +$lang['ytdl_videoid'] = 'Video ID'; +$lang['ytdl_download'] = 'Download'; +$lang['ytdl_help'] = 'Gebe eine YouTube-Video ID (in der URL nach ?v=) ein. Beispiel:
    https://www.youtube.com/watch?v=-5h586HfAu8'; +$lang['ytdl_close'] = 'Schließen'; +$lang['ytdl_error'] = 'Fehler: '; +$lang['ytdl_errors'] = ['', 'Es wurde keine YouTube-VideoID übergeben!', 'Ungültige URL!', 'Fehler in der YouTube-VideoID!']; +$lang['ytdl_language'] = 'de_DE'; +$lang['ytdl_views'] = 'Aufrufe'; +$lang['ytdl_length'] = 'Länge'; +$lang['ytdl_minutes'] = 'Minuten'; +$lang['ytdl_author'] = 'von'; +$lang['ytdl_watch'] = 'Video ansehen'; +$lang['ytdl_error_no_downloads'] = 'Es konnten keine Download-Formate gefunden werden. Ist die Video ID korrekt?'; +$lang['ytdl_available_formats'] = 'Verfügbare Formate für dieses Video'; +$lang['ytdl_format'] = 'Format'; +$lang['ytdl_quality'] = 'Qualität'; +$lang['ytdl_size'] = 'Größe'; +$lang['ytdl_download_link'] = 'Download'; +$lang['ytdl_available_until'] = 'Verfügbar bis'; +$lang['ytdl_not_related_youtube'] = 'Der YouTube Video Downloader steht in keiner Verbindung mit YouTube Inc.'; +$lang['ytdl_no_haftung'] = 'Der Betreiber übernimmt keinerlei Haftung für die Nutzung dieses Dienstes.'; + +// CSGO stats +$lang['csgo_navbar'] = 'CS:GO Stats'; +$lang['csgo_kills'] = 'Kills'; +$lang['csgo_time_played'] = 'Spielzeit'; +$lang['csgo_accuracy'] = 'Treffgenauigkeit'; +$lang['csgo_headshots'] = 'Kopfschüsse'; +$lang['csgo_mvp'] = 'MVPs'; +$lang['csgo_wins'] = 'Siege'; +$lang['csgo_bombs_planted'] = 'Gelegte Bomben'; +$lang['csgo_hostages_rescued'] = 'Gerettete Geiseln'; +$lang['csgo_last_match'] = 'Letztes Match'; +$lang['csgo_rounds'] = 'Runden'; +$lang['csgo_bestweapon'] = 'Beste Waffe'; +$lang['csgo_kd'] = 'K/D'; +$lang['csgo_deaths'] = 'Tode'; +$lang['csgo_damage'] = 'Schaden'; +$lang['csgo_money_spent'] = 'Ausgegebenes Geld'; +$lang['csgo_money_earned'] = 'Verdientes Geld'; +$lang['csgo_dominations'] = 'Dominierungen'; +$lang['csgo_revenges'] = 'Rachen'; +$lang['csgo_score'] = 'Punktzahl'; +$lang['csgo_favweapons'] = 'Lieblingswaffen'; +$lang['csgo_favmaps'] = 'Lieblingsmaps'; +$lang['csgo_other_stats'] = 'Weitere Statistiken'; +$lang['csgo_total_score'] = 'Gesamte Punkte'; +$lang['csgo_shots'] = 'Schüsse'; +$lang['csgo_hits'] = 'Treffer'; +$lang['csgo_headshot_percent'] = 'Kopfschussquote'; +$lang['csgo_matches'] = 'Matches'; +$lang['csgo_matches_won'] = 'Gewonnene Matches'; +$lang['csgo_rounds_won'] = 'Gewonnene Runden'; +$lang['csgo_pistol_rounds_won'] = 'Gewonnene Pistolen-Runden'; +$lang['csgo_bombs_defused'] = 'Entschärfte Bomben'; +$lang['csgo_enemies_blinded_killed'] = 'Geblendete Gegner getötet'; +$lang['csgo_knife_fights_won'] = 'Gewonnene Messer-Kämpfe'; +$lang['csgo_aiming_snipers_killed'] = 'Zielende Sniper getötet'; +$lang['csgo_taser_kills'] = 'Taser-Kills'; +$lang['csgo_kills_enemy_weapon'] = 'Kills mit gegnerischen Waffen'; +$lang['csgo_weapon_spent'] = 'Gespendete Waffen'; +$lang['csgo_windows_broken'] = 'Zerbrochene Fenster'; +$lang['csgo_comma'] = ','; +$lang['csgo_point'] = '.'; +$lang['csgo_2'] = 'Sieg'; +$lang['csgo_1'] = 'Gleichstand'; +$lang['csgo_0'] = 'Niederlage'; diff --git a/application/language/de/unit_test_lang.php b/application/language/de/unit_test_lang.php new file mode 100644 index 0000000..1dd6c23 --- /dev/null +++ b/application/language/de/unit_test_lang.php @@ -0,0 +1,30 @@ +design.program.take photos.cut videos.edit photos.animate.shoot videos.write.'; +$lang['about_introduction'] = 'In the internet, I\'m also known as KingOfDog.'; +$lang['about_text'] = '

    + Everything I\'m doing nowadays started with a tiny digital camera (as far as I know by Olympus). Of course, the pictures hadn\'t a great quality, let alone the videos. However, I discovered the unbelievable fun of taking pictures. +

    +

    + But everything didn\'t really begin until 2013. Because then I created my own YouTube channel, which I initially tamed "yourobonatic". Why was this name? Because of the content, I planned to upload on the channel: videos about robots built with the Lego Mindstorms NXT 2.0 set. Thereby, the first video was a crappy showcase of an unspectacular program for one of this robots. This channel concept didn\'t stay for long, however. Soon, I started uploading videos of the popular video game Minecraft. Caused by this, I changed the channel name to DerMinecrafterMarcel (TheMinecrafterMarcel), or MinecrafterMarcel after another renaming in 2014. +

    +

    + After I "cut" my first few videos with Windows Movie Maker, I switched to Sony Vegas Pro very soon (late 2014-ish). The thumbnails from that time were "beautiful" creations with Gimp. +

    +

    + The following year, I dared to use the even more professional software. Therewith, I mean the entire Adobe Creative Cloud Suite: Photoshop for the thumbnails, Premiere Pro for the video editing and so on. However, in the beginning, the other programs had a minor role, as I didn\'t know at all how to use them. Anyways, by using these two pieces of software I learned more and more about editing and designing - learning by doing. +

    +

    + Around that time in 2015, I really started digging into the incredibly difficult world of programming. Indeed, I had already coded some small applications with Python already, but then I put much effort into understanding Java. +

    +

    + By the way, 2015 was the year with the most number of video uploads. These included besides Minecraft as well Clash of Clans, Happy Wheels, and many other games. Both of the last mentioned games were part of series I started in the previous year. +

    +

    + Whereas 2016 was pretty much emptier regarding the amount of uploaded videos. Somehow, this was a time of self-discovery of the channel, in which I wasn\'t really sure what to upload. On the one hand, I didn\'t feel like continuing making Minecraft and gaming videos in general. I didn\'t want to upload non-qualitative content. On the other hand, I hadn\'t a lot of ideas of high-qualitative content. Only at the end of the year, there came new, now qualitative videos. Throughout the year, however, I worked on a specific, gigantic project: this website. And now, finally: you can see it! Over the time, I invested hundreds of hours into this project. +

    +

    + And last year, in 2017, I eventually specialized in producing knowledge videos with the focus on computers and programming. Furthermore, I dabbled in AfterAffects and Adobe Illustrator, which had an enormous impact on the aesthetics and quality of my videos. On the fourth birthday of my YouTube channel, I initially opened this website to the public - unfortunately only for a duration of one month. +

    +

    + Finally, we can only wait and see what the future may bring. +

    '; +$lang['about_events_title'] = 'Important Events'; +$lang['about_events'] = [ + [ + "color" => "red", + "icon" => "youtube-play", + "name" => "Creation of my YouTube Channel", + "date" => "September 16th, 2013" + ], + [ + "color" => "blue", + "icon" => "twitter", + "name" => "Joining Twitter", + "date" => "September 18th, 2013" + ], + [ + "color" => "grey", + "icon" => "upload", + "name" => "First Video Upload", + "date" => "October 6th, 2013" + ], + [ + "color" => "green", + "icon" => "gamepad", + "name" => "First Minecraft Video", + "date" => "October 7th, 2013" + ], + [ + "color" => "yellow", + "icon" => "mobile", + "name" => "First Clash of Clans Video", + "date" => "February 12th, 2014" + ], + [ + "color" => "blue", + "icon" => "trophy", + "name" => "500 Subscribers on YouTube", + "date" => "May 10th, 2015" + ], + [ + "color" => "red", + "icon" => "twitch", + "name" => "Creation of my Twitch Channel", + "date" => "July 28th, 2015" + ], + [ + "color" => "grey", + "icon" => "trophy", + "name" => "25,000 Views on YouTube", + "date" => "November 25, 2015" + ], + [ + "color" => "yellow", + "icon" => "pencil", + "name" => "5,000 Tweets Published", + "date" => "June 15, 2017" + ], + [ + "color" => "blue", + "icon" => "trophy", + "name" => "50,000 Views on YouTube", + "date" => "December 1st, 2017" + ], + [ + "color" => "green", + "icon" => "columns", + "name" => "First Publishing of the Website", + "date" => "September 16th, 2017" + ] +]; diff --git a/application/language/en/blog_lang.php b/application/language/en/blog_lang.php new file mode 100644 index 0000000..75a0c4a --- /dev/null +++ b/application/language/en/blog_lang.php @@ -0,0 +1,43 @@ +DesignerCutterWebdesignerDeveloperAnimatorPhotograf'; +$lang['about_introduction'] = 'I\'m KingOfDog, especially Youtuber and Designer, but I\'m a huge fan of dogs too.'; +$lang['about_skills'] = 'My skills'; diff --git a/application/language/en/donate_lang.php b/application/language/en/donate_lang.php new file mode 100644 index 0000000..9bc531e --- /dev/null +++ b/application/language/en/donate_lang.php @@ -0,0 +1,17 @@ +1€ donation is enough for one bag of sweets for the developer.'; +$lang['donate_level2'] = 'A 2€ donation enables us to continue developing this website.'; +$lang['donate_level3'] = 'A 5€ donation makes possible to buy 2GB more RAM for the server.'; +$lang['donate_level4'] = 'A 10€ donation would cover the minimum wage for one hour of work of one single developer.'; +$lang['donate_level5'] = 'A 15€ donation could afford us to buy 150GB more disk space for your images, texts, videos etc.'; +$lang['donate_level6'] = 'A 20€ donation would be the foundation for another server.'; +$lang['donate_level7'] = 'A 25€ donation allows us to buy several different licenses.'; +$lang['donate_level8'] = 'A 30€ donation is enough for publishing an app version of this website in the PlayStore.'; +$lang['donate_level9'] = 'A 50€ donation would be directly invested into the purchase of another server unit.'; +$lang['donate_level10'] = 'An 100€ donation would cover all major expenses for one month!'; +$lang['donate_btn'] = "Donate"; diff --git a/application/language/en/faq_lang.php b/application/language/en/faq_lang.php new file mode 100644 index 0000000..56c99ca --- /dev/null +++ b/application/language/en/faq_lang.php @@ -0,0 +1,44 @@ +your help! If you discover a bug on this page or if you have any kind of ideas for improvements or if you have something to criticize, use the textarea below in order to let us know about it. We are happy about every single feedback and try to enhance this website further. Thanks in advance!'; + $lang['header_feedback_msg'] = 'Your Feedback'; + $lang['header_feedback_msg_placeholder'] = 'Please enter your feedback to this page'; + $lang['header_feedback_anonymous'] = 'Send anonymously?'; + $lang['header_feedback_anonymous_info'] = 'Anonymous feedback contains no kind of data about the user like for example the IP address, e-mail, user id or any other information.
    On the other hand, non anonymous feedback helps us to analyse groups of users and their needs as well as keep in contact with the writer of the feedback in the case of further questions.
    In all cases we treat your personal data sensible and will never ever give them to third parties.'; + + $lang['header_share'] = 'Share'; + $lang['header_share_title'] = 'Share Page'; + + $lang['header_post'] = 'Post'; + $lang['header_post_title'] = 'Write a post'; + $lang['header_post_content'] = 'Post Content'; + $lang['header_post_notice'] = 'Currently, we are working on a function to upload photos, videos and other media easily. In the near future, you will be able to add them to your unique posts!'; + $lang['header_post_publish'] = 'Publish'; diff --git a/application/language/en/home_lang.php b/application/language/en/home_lang.php new file mode 100644 index 0000000..45e3820 --- /dev/null +++ b/application/language/en/home_lang.php @@ -0,0 +1,37 @@ +Press the left mouse button over the right printed picture for reaching the playback website of the most recent You Tube movie of mine personality.'; +$lang['home_slider_video_btn'] = 'Watch now'; + +$lang['home_channels_title'] = 'YouTube Channels'; +$lang['home_kingofdog_des'] = 'KingOfDog is my very first YouTube channel and have existed meanwhile for more than 3 years. On this channel you get access to the newest games, facts, information, news, opinions, reviews, vlogs and much more. Over 600 subscribers can watch around 350 videos here.'; +$lang['home_zeybefx_des'] = 'There have been speedarts, design tutorials, giveaways, and much more videos dealing with design on ZeybeFX for more than one and a half years. This channel is in English and currently a little bit inactive.'; +$lang['home_zeybeofficial_des'] = 'The most recent channel of mine has existed since the beginning of 2017, but is very active. Each of the daily videos at 3 pm delivers you a new copyright free music track, which you can use in your own videos, games, websites, podcast, and similar things. Partially I upload my own music, which I created on my own, also.'; +$lang['home_kingofdogint_des'] = 'KingOfDog International is the (as the name already tells) international, English version of my main channel KingOfDog. Here you can discover translated videos from the German channel - because subtitles aren\'t that cool.'; + +$lang['home_active_users'] = 'Currently Active Users'; +$lang['home_newest_users'] = 'Newly Registered Users'; +$lang['home_newest_posts'] = 'Most Recent Posts'; +$lang['home_notice'] = 'This feature will follow in the future. Please return here later.'; + +$lang['home_error_twitter'] = 'No tweets were found in the database currently. Maybe this is an error. Please try again later.'; +$lang['home_error_instagram'] = 'No images were found in the database currently. Maybe this is an error. Please try again later.'; +$lang['home_error_youtube'] = 'No videos were found in the database currently. Maybe this is an error. Please try again later.'; +$lang['home_social_all'] = 'All'; +$lang['home_date'] = 'Y-m-d \a\t g:i a'; +$lang['home_posts'] = 'Most Recent Posts'; + +$lang['home_ads_title'] = 'Why are we showing ads?'; +$lang['home_ads_description'] = 'The whole page and all of its services are completely free. And we want this to be the same in the future. The earnings through advertising are only used for financing and expanding the servers. Ads allow us to keep offering this free service! But we follow the motto "At Most One Ad per Site". That means that every page of KingOfDogTV.de contains maximally one single advertisment. So we achieve a not too annoying advertising model, the page doesn\'t take longer to load, and despite we can (hopefully) cover the costs for the webservers.'; \ No newline at end of file diff --git a/application/language/en/index.html b/application/language/en/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/language/en/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/application/language/en/jbstrings_lang.php b/application/language/en/jbstrings_lang.php new file mode 100644 index 0000000..b41237c --- /dev/null +++ b/application/language/en/jbstrings_lang.php @@ -0,0 +1,6 @@ +Caesar cipher method. Therefor each letter is shifted by the specified shift amount in the alphabet.'; +$lang['encrypter_text'] = 'Unencrypted text'; +$lang['encrypter_text2'] = 'Unencrypted text'; +$lang['encrypter_shiftkey'] = 'Shift key (Amount of shifted letters in the alphabet)'; +$lang['encrypter_shiftkey2'] = 'Shift key'; +$lang['encrypter_output'] = 'Encrypted text'; +$lang['encrypter_output2'] = 'Output'; + +// Cäsar-Entschlüsselung +$lang['decrypter_title'] = 'Caesar cipher-Decrypter'; +$lang['decrypter_description'] = 'This decrypter decrypts your encrypted texts with the Caesar cipher method. Therefor each letter is shifted by the specified shift amount in the alphabet.'; +$lang['decrypter_text'] = 'Encrypted text'; +$lang['decrypter_text2'] = 'Encrypted text'; +$lang['decrypter_shiftkey'] = 'Shift key (Amount of shifted letters in the alphabet)'; +$lang['decrypter_shiftkey2'] = 'Shift key'; +$lang['decrypter_output'] = 'Decrypted text'; +$lang['decrypter_output2'] = 'Output'; + +// URL-Encoder +$lang['url_site_title'] = 'URL Encoder'; +$lang['url_title'] = 'URL Encoder'; +$lang['url_description'] = 'Encode or rather decode simply all URLs or sentences!'; +$lang['url_input'] = 'Input'; +$lang['url_input2'] = 'Input of the uncoded text'; +$lang['url_input3'] = 'Input of the encoded text'; +$lang['url_encode'] = 'Encode'; +$lang['url_decode'] = 'Decode'; +$lang['url_output'] = 'Output'; +$lang['url_output2'] = 'Output of the encoded text'; +$lang['url_output3'] = 'Output of the decoded text'; + +// base64-Encoder +$lang['base64_site_title'] = 'Base64 Encoder'; +$lang['base64_title'] = 'Base64 Encoder'; +$lang['base64_description'] = 'Encode or rather decode simply all sentences, messages and textes with the base64 encoding!'; +$lang['base64_input'] = 'Input'; +$lang['base64_input2'] = 'Input of the uncoded text'; +$lang['base64_input3'] = 'Input of the encoded text'; +$lang['base64_encode'] = 'Encode'; +$lang['base64_decode'] = 'Decode'; +$lang['base64_output'] = 'Output'; +$lang['base64_output2'] = 'Output of the encoded text'; +$lang['base64_output3'] = 'Output of the decoded text'; + +// Passwort-Generator +$lang['pass_site_title'] = 'Password Generator'; +$lang['pass_title'] = 'Password Generator'; +$lang['pass_description'] = 'With this password generator you can generate a save and random password however you like!'; +$lang['pass_error'] = 'Error at the input'; +$lang['pass_generate'] = 'Generate'; +$lang['pass_copy'] = 'Copy'; +$lang['pass_length'] = 'Password length'; +$lang['pass_length_help'] = 'How long should the password be?'; +$lang['pass_components'] = 'Components'; +$lang['pass_components_upper'] = 'Uppercase letters'; +$lang['pass_components_lower'] = 'Lowercase letters'; +$lang['pass_components_special'] = 'Special characters'; +$lang['pass_components_numbers'] = 'Numbers'; +$lang['pass_tipps_title'] = 'Tips for a perfect password'; +$lang['pass_tipps1'] = 'The password should have at least 10 characters. Notice: The longer the better!'; +$lang['pass_tipps2'] = 'A password isn\'t save only because the length, a password should be a mixture of upper- and lowercase letters, numbers and special characters. (e.g. Your2DogsAreC00l!)'; +$lang['pass_tipps3'] = 'Your password shouldn\'t contain any personal information, which can be associated with you. (e.g. name of the pet, address, etc.)'; +$lang['pass_tipps4'] = 'Your password shouldn\'t contain any casual used words or letters chains (e.g. test, QWERTY, abc, 1234, password, etc.)'; +$lang['pass_tipps5_title'] = 'Recommendation:'; +$lang['pass_tipps5'] = 'Imagine you a sentence and take the first letter of each word. From that a very save password results. Example: My tennis courses takes place 2 times the week at 18 o\'clock. 100%! ==> Mtctp2ttwa18o\'c.100%!'; +$lang['pass_end'] = 'I wish you success!'; + +// Nickname-Generator +$lang['nick_site_title'] = 'Nickname Generator'; +$lang['nick_title'] = 'Nickname Generator'; +$lang['nick_description'] = 'This Nickname Generator offers'; +$lang['nick_description2'] = 'different possibles for generate names. There is certainly something for you here!'; +$lang['nick_generate'] = 'Generate'; +$lang['nick_copy'] = 'Copy'; +$lang['nick_beginning'] = 'Beginning of the nickname'; +$lang['nick_ending'] = 'Ending of the nickname'; +$lang['nick_history'] = 'History'; + +// Minecraft Player-Tools +$lang['players_site_title'] = 'Minecraft Player Tools'; +$lang['players_title'] = 'Minecraft Player Tools'; +$lang['players_description'] = 'Find out player UUID and server stats, download different skins, avatars and renders - everything only with the player name!'; +$lang['player_name'] = 'Minecraft player name'; +$lang['players_search'] = 'Go'; +$lang['player_skin'] = 'Download skin'; +$lang['player_skin_render'] = 'Download skin render'; +$lang['player_head_render'] = 'Download head render'; +$lang['player_avatar'] = 'Avatar downloads'; +$lang['player_history_name'] = 'Name'; +$lang['player_history_change'] = 'Changing date'; +$lang['player_original_name'] = 'Original name'; +$lang['player_on_server'] = 'on:'; + +// Minecraft Server-Tools +$lang['servers_site_title'] = 'Minecraft Server Tools'; +$lang['servers_title'] = 'Minecraft Server Tools'; +$lang['servers_description'] = 'Find out the player count, the minecraft version, the ping and more instantly - only with the server IP!'; +$lang['servers_ip'] = 'Server IP'; +$lang['servers_search'] = 'Go'; +$lang['servers_error'] = 'Error'; +$lang['servers_error_ip'] = 'Incorrect IP'; +$lang['servers_player'] = 'Players'; +$lang['servers_version'] = 'Version'; +$lang['servers_ping'] = 'Ping'; + +// Twitch Tools +$lang['twitch_site_title'] = 'Twitch Tools'; +$lang['twitch_title'] = 'Twitch Tools'; +$lang['twitch_description'] = 'Enter a Twitch Channel name and receive severant statistics and information about this channel!'; +$lang['twitch_channel'] = 'Twitch Channel'; +$lang['twitch_search'] = 'Search'; +$lang['twitch_name'] = 'Name'; +$lang['twitch_id'] = 'Account ID'; +$lang['twitch_follower'] = 'Follower'; +$lang['twitch_views'] = 'Views'; +$lang['twitch_partner'] = 'Twitch Partner?'; +$lang['twitch_youth'] = 'Family Safe?'; +$lang['twitch_language'] = 'Language'; +$lang['twitch_yes'] = 'Yes'; +$lang['twitch_no'] = 'No'; +$lang['twitch_created'] = 'Creation Date'; +$lang['twitch_changed'] = 'Modified date'; +$lang['twitch_stream'] = 'Stream information'; +$lang['twitch_stream_title'] = 'Title'; +$lang['twitch_stream_game'] = 'Game'; +$lang['twitch_stream_language'] = 'Language'; +$lang['twitch_url'] = 'URL'; +$lang['twitch_time'] = 'd F Y \a\t H:i a'; +$lang['twitch_media'] = 'Media'; +$lang['twitch_livestream'] = 'Livestream'; + +// YouTube Downloader +$lang['ytdl_site_title'] = 'YouTube Video Downloader'; +$lang['ytdl_title'] = 'YouTube Video Downloader'; +$lang['ytdl_description'] = 'Download YouTube videos easy and for free'; +$lang['ytdl_videoid'] = 'Video ID'; +$lang['ytdl_download'] = 'Download'; +$lang['ytdl_help'] = 'Enter a YouTube video ID (the part after ?v= in the URL). Example:
    https://www.youtube.com/watch?v=-5h586HfAu8'; +$lang['ytdl_close'] = 'Close'; +$lang['ytdl_error'] = 'Error: '; +$lang['ytdl_errors'] = ['', 'No YouTube video ID was comitted!', 'Invalid URL!', 'YouTube video ID is incorrect!']; +$lang['ytdl_language'] = 'en_US'; +$lang['ytdl_views'] = 'Views'; +$lang['ytdl_length'] = 'Length'; +$lang['ytdl_minutes'] = 'Minutes'; +$lang['ytdl_author'] = 'by'; +$lang['ytdl_watch'] = 'Watch video'; +$lang['ytdl_error_no_downloads'] = 'No download formats were found. Is the video ID correct?'; +$lang['ytdl_available_formats'] = 'Available formats for this video'; +$lang['ytdl_format'] = 'Format'; +$lang['ytdl_quality'] = 'Quality'; +$lang['ytdl_size'] = 'Size'; +$lang['ytdl_download_link'] = 'Download'; +$lang['ytdl_available_until'] = 'Available until'; +$lang['ytdl_not_related_youtube'] = 'The YouTube downloader is not affiliated with YouTube Inc.'; +$lang['ytdl_no_haftung'] = 'The operator assumes no liability for the use of this service.'; + +// CSGO stats +$lang['csgo_navbar'] = 'CS:GO Stats'; +$lang['csgo_kills'] = 'Kills'; +$lang['csgo_time_played'] = 'Time played'; +$lang['csgo_accuracy'] = 'Accuracy'; +$lang['csgo_headshots'] = 'Headshots'; +$lang['csgo_mvp'] = 'MVPs'; +$lang['csgo_wins'] = 'Wins'; +$lang['csgo_bombs_planted'] = 'Bombs planted'; +$lang['csgo_hostages_rescued'] = 'Hostages rescued'; +$lang['csgo_last_match'] = 'Last match'; +$lang['csgo_rounds'] = 'Rounds'; +$lang['csgo_bestweapon'] = 'Best weapon'; +$lang['csgo_kd'] = 'K/D'; +$lang['csgo_deaths'] = 'Deaths'; +$lang['csgo_damage'] = 'Damage'; +$lang['csgo_money_spent'] = 'Money spent'; +$lang['csgo_money_earned'] = 'Money earned'; +$lang['csgo_dominations'] = 'Dominations'; +$lang['csgo_revenges'] = 'Revenges'; +$lang['csgo_score'] = 'Score'; +$lang['csgo_favweapons'] = 'Favorite weapons'; +$lang['csgo_favmaps'] = 'Favorite maps'; +$lang['csgo_other_stats'] = 'More statistics'; +$lang['csgo_total_score'] = 'Total score'; +$lang['csgo_shots'] = 'Shots'; +$lang['csgo_hits'] = 'Hits'; +$lang['csgo_headshot_percent'] = 'Headshot rate'; +$lang['csgo_matches'] = 'Matches'; +$lang['csgo_matches_won'] = 'Matches won'; +$lang['csgo_rounds_won'] = 'Rounds won'; +$lang['csgo_pistol_rounds_won'] = 'Pistol rounds won'; +$lang['csgo_bombs_defused'] = 'Bombs defused'; +$lang['csgo_enemies_blinded_killed'] = 'Flashed enemies killed'; +$lang['csgo_knife_fights_won'] = 'Knife fights won'; +$lang['csgo_aiming_snipers_killed'] = 'Aiming snipers killed'; +$lang['csgo_taser_kills'] = 'Taser kills'; +$lang['csgo_kills_enemy_weapon'] = 'Enemy weapon kills'; +$lang['csgo_weapon_spent'] = 'Weapons spent'; +$lang['csgo_windows_broken'] = 'Windows broken'; +$lang['csgo_comma'] = '.'; +$lang['csgo_point'] = ','; +$lang['csgo_2'] = 'Win'; +$lang['csgo_1'] = 'Draw'; +$lang['csgo_0'] = 'Defeat'; diff --git a/application/language/fr/about_lang.php b/application/language/fr/about_lang.php new file mode 100644 index 0000000..01dd2b3 --- /dev/null +++ b/application/language/fr/about_lang.php @@ -0,0 +1,10 @@ +DesignerCutterWebdesignerDeveloperAnimateurPhotographe'; +$lang['about_introduction'] = 'Je suis KingOfDog, surtout youtuber et designer, mais un incroyable fan de chiens aussi.'; +$lang['about_skills'] = 'Mes compétences'; diff --git a/application/language/fr/blog_lang.php b/application/language/fr/blog_lang.php new file mode 100644 index 0000000..d2846e5 --- /dev/null +++ b/application/language/fr/blog_lang.php @@ -0,0 +1,26 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/application/language/fr/notification_lang.php b/application/language/fr/notification_lang.php new file mode 100644 index 0000000..22afe1e --- /dev/null +++ b/application/language/fr/notification_lang.php @@ -0,0 +1,4 @@ +Chiffrement par décalage. Ici, chaque lettre est décalée de la quantité spécifiée dans l\'alphabet.'; +$lang['encrypter_text'] = 'Texte unencrypted'; +$lang['encrypter_text2'] = 'Entrant'; +$lang['encrypter_shiftkey'] = 'Shift-Key (Quantité de décalage)'; +$lang['encrypter_shiftkey2'] = 'Shift-Key'; +$lang['encrypter_output'] = 'Texte chiffré'; +$lang['encrypter_output2'] = 'Sortie'; + +// Cäsar-Entschlüsselung +$lang['decrypter_title'] = 'César décryptage'; +$lang['decrypter_description'] = 'Avec mon decrypter vous pouvez déchiffrer des textes avec le Chiffrement par décalage. Ici, chaque lettre est décalée de la quantité spécifiée dans l\'alphabet.'; +$lang['decrypter_text'] = 'Texte chiffré'; +$lang['decrypter_text2'] = 'Entrant'; +$lang['decrypter_shiftkey'] = 'Shift-Key (Quantité de décalage)'; +$lang['decrypter_shiftkey2'] = 'Shift-Key'; +$lang['decrypter_output'] = 'Texte décodée'; +$lang['decrypter_output2'] = 'Sortie'; + +// URL-Encoder +$lang['url_site_title'] = 'Codeur URL'; +$lang['url_title'] = 'Codeur URL'; +$lang['url_description'] = 'Encoder ou décoder facilement toutes les URL ou expressions possibles!'; +$lang['url_input'] = 'Entrant'; +$lang['url_input2'] = 'Entrée du texte uncodé'; +$lang['url_input3'] = 'Entrée du texte codé'; +$lang['url_encode'] = 'Encoder'; +$lang['url_decode'] = 'Décoder'; +$lang['url_output'] = 'Sortie'; +$lang['url_output2'] = 'Sortie du texte encodé'; +$lang['url_output3'] = 'Sortie du texte décodé'; + +// base64-Encoder +$lang['base64_site_title'] = 'Codeur Base64'; +$lang['base64_title'] = 'Codeur Base64'; +$lang['base64_description'] = 'Encoder ou décoder facilement toutes les expressions, messages ou textes!'; +$lang['base64_input'] = 'Entrant'; +$lang['base64_input2'] = 'Entrée du texte uncodé'; +$lang['base64_input3'] = 'Entrée du texte codé'; +$lang['base64_encode'] = 'Encoder'; +$lang['base64_decode'] = 'Décoder'; +$lang['base64_output'] = 'Sortie'; +$lang['base64_output2'] = 'Sortie du texte encodé'; +$lang['base64_output3'] = 'Sortie du texte décodé'; + +// Passwort-Generator +$lang['pass_site_title'] = 'Password Generator'; +$lang['pass_title'] = 'Password Generator'; +$lang['pass_description'] = 'Avec mon Password Generator vous pouvez complètement créer autant que vous le souhaitez un mot de passe aléatoire.'; +$lang['pass_error'] = 'Erreur lors de la saisie'; +$lang['pass_generate'] = 'Générer'; +$lang['pass_copy'] = 'Copier'; +$lang['pass_length'] = 'Longueur du mot de passe'; +$lang['pass_length_help'] = 'Combien de longueur si le mot de passe?'; +$lang['pass_components'] = 'Composants'; +$lang['pass_components_upper'] = 'Majuscule'; +$lang['pass_components_lower'] = 'Minuscules'; +$lang['pass_components_special'] = 'Caractère spécial'; +$lang['pass_components_numbers'] = 'Numéros'; +$lang['pass_tipps_title'] = 'Conseils pour un mot de passe sécurisé'; +$lang['pass_tipps1'] = 'Le mot de passe doit être d\'au moins 10 caractères.'; +$lang['pass_tipps2'] = 'Cependant, la longueur seule rend un mot de passe ne sais pas, il devrait donc contenir un mélange de lettres majuscules et minuscules, chiffres et caractères spéciaux. (ex. #Tes2ChiensSontJol1e!)'; +$lang['pass_tipps3'] = 'Votre mot de passe ne doit pas contenir des renseignements personnels qui pourraient être associés avec vous. (ex. nom de l\'animal, âge etc.)'; +$lang['pass_tipps4'] = 'Il doit être couramment utilisé des mots ou lettres des chaînes (ex. 1234, test, password, QWERTY, QWERTZ etc.) présentes dans le mot de passe.'; +$lang['pass_tipps5_title'] = 'Recommandation:'; +$lang['pass_tipps5'] = 'Il suffit de penser à une phrase et de prendre chaque mot initiales seulement. Il est un mot de passe très sécurisé. Par example: Chaque 2ième lundi je vais à 100% dans le gymnase #cool 3 pâtés de maisons. Promesse! ==> C2iLjva100%dlg#c3pdm.P!'; +$lang['pass_end'] = 'Bonne chance!'; + +// Nickname-Generator +$lang['nick_site_title'] = 'Nickname Générateur'; +$lang['nick_title'] = 'Nickname Générateur'; +$lang['nick_description'] = 'Ce Nickname générateur fournit'; +$lang['nick_description2'] = 'diverses options - il y a certainement quelque chose pour vous ici!'; +$lang['nick_generate'] = 'Générer'; +$lang['nick_copy'] = 'Copier'; +$lang['nick_beginning'] = 'Le début du nom'; +$lang['nick_ending'] = 'La fin du nom'; +$lang['nick_history'] = 'Cours'; + +// Minecraft Player-Tools +$lang['players_site_title'] = 'Minecraft Outils pour Joueurs'; +$lang['players_title'] = 'Minecraft Outils pour Joueurs'; +$lang['players_description'] = 'Découvrez le joueurs UUID et ses statistiques du serveur & de charger différents skins, avatars et renders vers le bas - tout seulement par le nom du joueur!'; +$lang['player_name'] = 'Minecraft Nom'; +$lang['players_search'] = 'On y va'; +$lang['player_skin'] = 'Download skin'; +$lang['player_skin_render'] = 'Download skin render'; +$lang['player_head_render'] = 'Download tête render'; +$lang['player_avatar'] = 'Avatar downloads'; +$lang['player_history_name'] = 'Nom'; +$lang['player_history_change'] = 'Date de modification'; +$lang['player_original_name'] = 'Nom d\'origine'; +$lang['player_on_server'] = 'sur:'; + +// Minecraft Server-Tools +$lang['servers_site_title'] = 'Minecraft Outils pour Serveurs'; +$lang['servers_title'] = 'Minecraft Outils pour Serveurs'; +$lang['servers_description'] = 'Obtenez le nombre de joueurs, la version Minecraft, la ping et plus - suelement sur un serveur IP!'; +$lang['servers_ip'] = 'Serveur IP'; +$lang['servers_search'] = 'On y va'; +$lang['servers_error'] = 'Erreur'; +$lang['servers_error_ip'] = 'IP incorrectement'; +$lang['servers_player'] = 'Joueurs'; +$lang['servers_version'] = 'Version'; +$lang['servers_ping'] = 'Ping'; + +// Twitch Tools +$lang['twitch_site_title'] = 'Twitch Outils'; +$lang['twitch_title'] = 'Twitch Outils'; +$lang['twitch_description'] = 'Entrez un nom de canal de Twitch et obtenir diverses statistiques et des informations sur ce canal!'; +$lang['twitch_channel'] = 'Twitch canal'; +$lang['twitch_search'] = 'Chercher'; +$lang['twitch_name'] = 'Nom'; +$lang['twitch_id'] = 'Account ID'; +$lang['twitch_follower'] = 'Suiveurs'; +$lang['twitch_views'] = 'Vues'; +$lang['twitch_partner'] = 'Twitch partenaire?'; +$lang['twitch_youth'] = 'Famille Coffre-fort?'; +$lang['twitch_language'] = 'Langue'; +$lang['twitch_yes'] = 'Oui'; +$lang['twitch_no'] = 'Non'; +$lang['twitch_created'] = 'Date de création'; +$lang['twitch_changed'] = 'Date de modification'; +$lang['twitch_stream'] = 'Stream information'; +$lang['twitch_stream_title'] = 'Titre'; +$lang['twitch_stream_game'] = 'Jeu'; +$lang['twitch_stream_language'] = 'Langue'; +$lang['twitch_url'] = 'URL'; +$lang['twitch_time'] = 'd-m-Y \à H:i \h\e\u\r\e\s'; +$lang['twitch_media'] = 'Médias'; +$lang['twitch_livestream'] = 'Live stream'; + +// YouTube Downloader +$lang['ytdl_site_title'] = 'YouTube Vidéo Downloader'; +$lang['ytdl_title'] = 'YouTube Vidéo Downloader'; +$lang['ytdl_description'] = 'Télécharger simple et gratuit vidéos YoutTube!'; +$lang['ytdl_videoid'] = 'Vidéo ID'; +$lang['ytdl_download'] = 'Download'; +$lang['ytdl_help'] = 'Donnez une YouTube vidéo ID (dans l\'URL après ?v=). Par example:
    https://www.youtube.com/watch?v=-5h586HfAu8'; +$lang['ytdl_close'] = 'Fermeture'; +$lang['ytdl_error'] = 'Erreur: '; +$lang['ytdl_errors'] = ['', 'Il n\'y avait pas un YouTube vidéo ID transmis!', 'URL incorrectement!', 'Erreur dans le YouTube vidéo ID!']; +$lang['ytdl_language'] = 'fr_FR'; +$lang['ytdl_views'] = 'Vues'; +$lang['ytdl_length'] = 'Longueur'; +$lang['ytdl_minutes'] = 'Minutes'; +$lang['ytdl_author'] = 'de'; +$lang['ytdl_watch'] = 'Voir la vidéo'; +$lang['ytdl_error_no_downloads'] = 'Il pourrait y avoir aucun téléchargement formats trouvés. L\'ID vidéo est correcte?'; +$lang['ytdl_available_formats'] = 'Formats disponibles pour cette vidéo'; +$lang['ytdl_format'] = 'Format'; +$lang['ytdl_quality'] = 'Qualité'; +$lang['ytdl_size'] = 'Taille'; +$lang['ytdl_download_link'] = 'Download'; +$lang['ytdl_available_until'] = 'Disponible'; +$lang['ytdl_not_related_youtube'] = 'Le YouTube Video Downloader est pas affilié à YouTube Inc.'; +$lang['ytdl_no_haftung'] = 'L\'opérateur décline toute responsabilité pour l\'utilisation de ce service.'; + +// CSGO stats +$lang['csgo_navbar'] = 'CS:GO Stats'; +$lang['csgo_kills'] = 'Kills'; +$lang['csgo_time_played'] = 'Temps joué'; +$lang['csgo_accuracy'] = 'Exatitude'; +$lang['csgo_headshots'] = 'Headshots'; +$lang['csgo_mvp'] = 'MVPs'; +$lang['csgo_wins'] = 'Victoires'; +$lang['csgo_bombs_planted'] = 'Bombes plantées'; +$lang['csgo_hostages_rescued'] = 'Otages secourus'; +$lang['csgo_last_match'] = 'Le dernier match'; +$lang['csgo_rounds'] = 'Tours'; +$lang['csgo_bestweapon'] = 'Meilleure arme'; +$lang['csgo_kd'] = 'K/D'; +$lang['csgo_deaths'] = 'Des morts'; +$lang['csgo_damage'] = 'Dommage'; +$lang['csgo_money_spent'] = 'Argent dépensé'; +$lang['csgo_money_earned'] = 'L\'argent gagné'; +$lang['csgo_dominations'] = 'Dominations'; +$lang['csgo_revenges'] = 'Vengeances'; +$lang['csgo_score'] = 'Score'; +$lang['csgo_favweapons'] = 'Armes Favorite'; +$lang['csgo_favmaps'] = 'Cartes favorites'; +$lang['csgo_other_stats'] = 'D\'autres États'; +$lang['csgo_total_score'] = 'Score total'; +$lang['csgo_shots'] = 'Coups'; +$lang['csgo_hits'] = 'Succès'; +$lang['csgo_headshot_percent'] = 'Taux headshot'; +$lang['csgo_matches'] = 'Matchs'; +$lang['csgo_matches_won'] = 'Matchs gagnés'; +$lang['csgo_rounds_won'] = 'Rounds gagnés'; +$lang['csgo_pistol_rounds_won'] = 'Tours de pistolet gagné'; +$lang['csgo_bombs_defused'] = 'Bombes désamorcées'; +$lang['csgo_enemies_blinded_killed'] = 'Ennemis Flash tués'; +$lang['csgo_knife_fights_won'] = 'Combats au couteau gagné'; +$lang['csgo_aiming_snipers_killed'] = 'Snipers aiming tués'; +$lang['csgo_taser_kills'] = 'Taser kills'; +$lang['csgo_kills_enemy_weapon'] = 'Kills ennemi arme'; +$lang['csgo_weapon_spent'] = 'Armes dépensés'; +$lang['csgo_windows_broken'] = 'Fenêtres brisées'; +$lang['csgo_comma'] = ','; +$lang['csgo_point'] = '.'; +$lang['csgo_2'] = 'Victoire'; +$lang['csgo_1'] = 'Cravate'; +$lang['csgo_0'] = 'Défaite'; diff --git a/application/language/index.html b/application/language/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/language/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/application/libraries/index.html b/application/libraries/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/libraries/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/application/logs/index.html b/application/logs/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/logs/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/application/models/AdminModel.php b/application/models/AdminModel.php new file mode 100644 index 0000000..dd6b813 --- /dev/null +++ b/application/models/AdminModel.php @@ -0,0 +1,77 @@ +db->query('SELECT * FROM redirects WHERE redirect = ?', [$name])->result_array(); + + if(empty($result1)) { + $this->db->query('INSERT INTO redirects (url, redirect) VALUES (?, ?)', [$url, $name]); + return ['feedback' => 'success']; + } else { + return ['feedback' => 'error', 'message' => 'Umleitungs-Code ist schon vergeben!']; + } + } + + public function getUrl($name) { + + $result1 = $this->db->query('SELECT * FROM redirects WHERE redirect = ?', [$name])->result_array(); + + if(empty($result1)) { + return base_url(); + } else { + $result = $result1[0]; + return $result['url']; + } + } + + public function getItems() { + + $result = $this->db->query('SELECT * FROM redirects')->result_array(); + + return $result; + } + + public function getName($url) { + $result = $this->db->query('SELECT * FROM redirects WHERE url = ?', [$url])->result_array(); + + if(empty($result)) { + return ''; + } else { + $result1 = $result[0]; + return $result1['redirect']; + } + } + + public function addRandomItem($url) { + if($this->redirect->getName($url) == '') { + for($i = 0; $i < 1; $i++) { + $randomName = base64_encode($url); + $name = ''; + for($j = 0; $j < 5; $j++) { + $random = rand(0, strlen($randomName) - 1); + $name .= $randomName[$random]; + } + if($this->redirect->insertRedirect($url, $name)['feedback'] == 'success') { + return $this->redirect->getName($url); + } else { + $i--; + } + } + } else { + return $this->redirect->getName($url); + } + } + + public function getCalendarEvents() + { + return $this->db->query('SELECT * FROM calendar')->result_array(); + } + +} diff --git a/application/models/BlogModel.php b/application/models/BlogModel.php new file mode 100644 index 0000000..2f9c49c --- /dev/null +++ b/application/models/BlogModel.php @@ -0,0 +1,665 @@ +load->model('UserModel', '', TRUE); + } + + function getAllPosts($search, $amount, $offset = 0) + { + $offset *= $amount; + if ($search !== '') { + $posts = $this->db->query(' +SELECT + p.*, + ca.name categoryName, + ca.display_name categoryDisplayName, + (SELECT count(*) + FROM blog_comments + WHERE post_id = p.postID) commentCount, + (SELECT count(*) + FROM blog_post_likes + WHERE post_id = p.postID) likeCount, + (SELECT wordCount FROM blog_content c WHERE c.postID = p.postID AND isActive = TRUE AND c.language = ? ORDER BY c.contentDate DESC LIMIT 1) wordCount +FROM blog_posts p, blog_categories ca +WHERE ca.id = p.postCategoryID + AND (CONCAT((SELECT t.postTitle FROM blog_translations t WHERE t.postID = p.postID AND language = ?), postUrl, (SELECT t.postDesc FROM blog_translations t WHERE t.postID = p.postID AND language = ?)) RLIKE ? + OR (SELECT content + FROM blog_content + WHERE blog_content.postID = p.postID AND isActive = TRUE + LIMIT 1) RLIKE ?) + AND postState = 1 +ORDER BY postPublishDate DESC +LIMIT ? OFFSET ?', [$_SESSION['site_lang'], $_SESSION['site_lang'], $_SESSION['site_lang'], $search, $search, $amount, $offset])->result_array(); + } else { + $posts = $this->db->query(' + SELECT p.*, + ca.name categoryName, + ca.display_name categoryDisplayName, + (SELECT count(*) FROM blog_comments WHERE post_id = p.postID) commentCount, + (SELECT count(*) FROM blog_post_likes WHERE post_id = p.postID) likeCount, + (SELECT wordCount FROM blog_content c WHERE c.postID = p.postID AND isActive = TRUE AND c.language = ? ORDER BY c.contentDate DESC LIMIT 1) wordCount + FROM blog_posts p, blog_categories ca + WHERE ca.id = p.postCategoryID + AND postState = 1 + ORDER BY postPublishDate DESC + LIMIT ? OFFSET ?', [$_SESSION['site_lang'], $amount, $offset])->result_array(); + } + $posts = $this->mergePostTitleDesc($posts); + $posts = $this->mergePostAuthorData($posts); + return $posts; + } + + public function getPostPageCount($search, $postsPerPage) + { + if ($search !== '') { + $data = $this->db->query(' +SELECT COUNT(*) pageCount +FROM blog_posts p, blog_categories ca +WHERE ca.id = p.postCategoryID +AND (CONCAT((SELECT t.postTitle FROM blog_translations t WHERE t.postID = p.postID AND language = ?), postUrl, (SELECT t.postDesc FROM blog_translations t WHERE t.postID = p.postID AND language = ?)) RLIKE ? +OR (SELECT content FROM blog_content WHERE blog_content.postID = p.postID AND isActive = TRUE LIMIT 1) RLIKE ?) +AND postState = 1', [$_SESSION['site_lang'], $_SESSION['site_lang'], $search, $search])->result_array(); + } else { + $data = $this->db->query('SELECT COUNT(*) pageCount FROM blog_posts')->result_array(); + } + return ($data[0]['pageCount']) / $postsPerPage; + } + + function getCategoryPosts($category, $amount, $offset = 0) + { + $offset *= $amount; + $posts = $this->db->query(' + SELECT p.*, ca.name categoryName, ca.display_name categoryDisplayName, (SELECT count(*) FROM blog_comments WHERE post_id = p.postID) commentCount, (SELECT count(*) FROM blog_post_likes WHERE post_id = p.postID) likeCount + FROM blog_posts p, blog_categories ca + WHERE ca.id = p.postCategoryID + AND postState = 1 + AND ca.name = ? + ORDER BY postPublishDate DESC + LIMIT ? OFFSET ?', [$category, $amount, $offset])->result_array(); + $posts = $this->mergePostTitleDesc($posts); + $posts = $this->mergePostAuthorData($posts); + return $posts; + } + + public function getCategoryPostsByID($categoryID, $amount = 3, $postID = NULL) + { + $posts = $this->db->query('SELECT * FROM blog_posts WHERE postCategoryID = ? AND postID != ? AND blog_posts.postState = 1 ORDER BY postPublishDate DESC LIMIT ?', [$categoryID, $postID, $amount])->result_array(); + return $this->mergePostTitleDesc($posts); + } + + public function getTagPosts($tag, $amount, $offset = 0) { + $offset *= $amount; + $posts = $this->db->query('SELECT p.*, ca.name categoryName, ca.display_name categoryDisplayName, (SELECT count(*) FROM blog_comments WHERE post_id = p.postID) commentCount, (SELECT count(*) FROM blog_post_likes WHERE post_id = p.postID) likeCount FROM blog_posts p LEFT JOIN blog_categories ca ON ca.ID = p.postCategoryID WHERE postState = 1 AND EXISTS(SELECT post_id FROM blog_post_tags WHERE tag_id = (SELECT ID FROM blog_tags t WHERE t.name = ?) AND post_id = p.postID) ORDER BY postPublishDate DESC LIMIT ? OFFSET ?', [$tag, $amount, $offset])->result_array(); + $posts = $this->mergePostTitleDesc($posts); + $posts = $this->mergePostAuthorData($posts); + return $posts; + } + + function getCategoryIDAfterInsert($name, $display_name) + { + if (!$this->db->simple_query('INSERT INTO blog_categories (name, display_name) VALUES (?, ?)', [$name, $display_name])) { + $return = $this->db->query('SELECT ID FROM blog_categories WHERE name = ? AND display_name = ? LIMIT 1', [$name, $display_name])->result_array()[0]; + $return = $return['ID']; + } else { + $return = $this->db->query('SELECT LAST_INSERT_ID() ID')->result_array()[0]['ID']; + } + return $return; + } + + function incrementViews($id) + { + $this->db->query('UPDATE blog_posts SET postViews = postViews+1 WHERE postID = ?', [$id]); + $this->db->cache_delete('admin', 'blog'); + } + + public function getCategories() + { + $this->db->cache_off(); + $categories = $this->db->query('SELECT * FROM blog_categories')->result_array(); + $this->db->cache_on(); + return $categories; + } + + public function getPost($postUrl) + { + $content = $this->db->query(' + SELECT p.*, + ca.name categoryName, + ca.display_name categoryDisplayName, + COUNT(co.comment) commentCount, + (SELECT count(*) FROM blog_post_likes l WHERE l.post_id = p.postID) likeCount + FROM blog_posts p + LEFT JOIN blog_categories ca ON p.postCategoryID = ca.ID + LEFT JOIN blog_comments co ON p.postID = co.post_id + LEFT JOIN blog_post_likes l ON p.postID = l.post_id + WHERE postUrl = ? AND postState = 1 + GROUP BY p.postID', [$postUrl])->result_array(); //TODO: language integration + + $content = $this->mergePostTitleDesc($content); + $content = $this->mergePostAuthorData($content); + $content = $this->mergePostContent($content, $_SESSION['site_lang']); + return $content[0]; + } + + public function getPostDataByID($postID) + { + $data = $this->db->query(' + SELECT p.*, + ca.name AS categoryName, + ca.display_name AS categoryDisplayName, + COUNT(co.comment) AS commentCount, + COUNT(l.post_id) AS likeCount + FROM blog_posts p + LEFT JOIN blog_categories ca ON p.postCategoryID = ca.ID + LEFT JOIN blog_comments co ON p.postID = co.post_id + LEFT JOIN blog_post_likes l ON p.postID = l.post_id + WHERE postID = ? + GROUP BY p.postID', [$postID])->result_array(); + + return $data; + } + + public function getContentDataByID($postID, $contentID, $lang) + { + $data = $this->db->query('SELECT * FROM blog_content WHERE postID = ? AND contentID = ? AND language = ?', [$postID, $contentID, $lang])->result_array(); + return $data; + } + + public function getTranslationDataByID($postID, $translationID, $lang) + { + $data = $this->db->query('SELECT * FROM blog_translations WHERE postID = ? AND postTranslationID = ? AND language = ?', [$postID, $translationID, $lang])->result_array(); + return $data; + } + + private function getPostContentByID($postID, $language) + { + $content = $this->db->query('SELECT * FROM blog_content WHERE postID = ? AND isActive = TRUE AND language = ? ORDER BY contentDate DESC LIMIT 1', [$postID, $language])->result_array(); + return $content; + } + + public function getRandomPosts($postID) + { + $posts = $this->db->query('SELECT * FROM blog_posts WHERE postID <> ? AND postState = 1 ORDER BY RAND() LIMIT 3', [$postID])->result_array(); + $posts = $this->mergePostTitleDesc($posts); + $posts = $this->mergePostAuthorData($posts); + return $posts; + } + + public function mergePostTitleDesc($posts, $language = NULL) + { + $language = ($language == NULL ? $_SESSION['site_lang'] : $language); + foreach ($posts as $i => $post) { + $titleDesc = $this->getPostTitleDesc($post['postID'], $language); + $posts[$i]['postTitle'] = $titleDesc['title']; + $posts[$i]['postDesc'] = $titleDesc['desc']; + } + return $posts; + } + + private function mergePostAuthorData($posts) + { + foreach ($posts as $i => $post) { + $authorData = $this->getAuthorData($post['postAuthorID']); + $posts[$i]['postAuthorDisplayname'] = $authorData['displayname']; + $posts[$i]['postAuthorUsername'] = $authorData['username']; + $posts[$i]['postAuthorProfilePicture'] = $authorData['profile_picture']; + $posts[$i]['postAuthorHeaderImage'] = $authorData['header_image']; + $posts[$i]['postAuthorRank'] = $authorData['rank']; + $posts[$i]['postAuthorAbout'] = $authorData['about']; + } + return $posts; + } + + private function mergePostContent($posts, $language) + { + $language = ($language == NULL ? $_SESSION['site_lang'] : $language); + foreach ($posts as $i => $post) { + $content = $this->getPostContentByID($post['postID'], $language); + if (empty($content) && $_SESSION['site_lang'] !== 'de') { + $content = $this->getPostContentByID($post['postID'], 'de'); + } + if (!empty($content)) { + $content = $content[0]; + $posts[$i]['postContent'] = $content['content']; + $posts[$i]['postWordCount'] = $content['wordCount']; + } + } + return $posts; + } + + public function getPostTitleDesc($postID, $language) + { + $data = $this->db->query('SELECT * FROM blog_translations WHERE postID = ? ORDER BY blog_translations.language ASC', [$postID])->result_array(); + if (empty($data)) { + return ['title' => 'Nicht vorhandener Post', 'desc' => 'Aus unbekannten Gründen ist dieser Blog-Post nicht vorhanden. Bitte versuche es später erneut oder kontaktiere das Support-Team']; + } + $postTitle = $data[0]['postTitle']; + $postDesc = $data[0]['postDesc']; + foreach ($data as $row) { + if ($row['language'] == $language) { + $postTitle = $row['postTitle']; + $postDesc = $row['postDesc']; + break; + } + } + return ['title' => $postTitle, 'desc' => $postDesc]; + } + + public function getAuthorData($authorID) + { + $author = $this->db->query('SELECT ID, username, displayname, rank, profile_picture, header_image, about FROM users WHERE ID = ?', [$authorID])->result_array(); + + $author = $this->UserModel->setDefaultImages($author); + + if(empty($author)) { + return null; + } + return $author[0]; + } + + public function getComments($postID) + { + $comments = $this->db->query('SELECT * FROM blog_comments WHERE post_id = ? ORDER BY date_created DESC', [$postID])->result_array(); + return $comments; + } + + public function getCommentsByUrl($postUrl) + { + return $this->db->query('SELECT * FROM blog_comments WHERE post_id = (SELECT postID FROM blog_posts WHERE postUrl = ?) ORDER BY date_created DESC', [$postUrl])->result_array(); + } + + public function addComment($postID, $userID, $comment, $reply, $replyTo) + { + $this->db->query('INSERT INTO blog_comments (post_id, user_id, comment, reply, replyTo_id) VALUES (?, ?, ?, ?, ?)', [$postID, $userID, $comment, $reply, $replyTo]); + + $this->db->cache_delete('blog', 'index'); + $this->db->cache_delete('blog', 'post'); + $this->db->cache_delete('blog', 'comment'); + $this->db->cache_delete('blog', 'getComments'); + $this->db->cache_delete('admin', 'blog'); + } + + public function addCommentByUrl($postUrl, $userID, $comment, $reply, $replyTo) + { + $postID = $this->db->query('SELECT postID FROM blog_posts WHERE postUrl = ?', [$postUrl])->result_array(); + if(empty($postID)) { + return null; + } + + $this->addComment($postID[0]['postID'], $userID, $comment, $reply, $replyTo); + + return $this->db->query('SELECT * FROM blog_comments WHERE post_id = ? AND user_id = ? ORDER BY ID DESC LIMIT 1', [$postID[0]['postID'], $userID])->result_array()[0]; + } + + public function getAllTags() + { + return $this->db->query('SELECT * FROM blog_tags')->result_array(); + } + + public function getTags($postID) + { + $tags = $this->db->query('SELECT t.* FROM blog_tags t WHERE ID IN (SELECT tag_id FROM blog_post_tags WHERE post_id = ?)', [$postID])->result_array(); + return $tags; + } + + public function mergeTagInfo($tags) { + foreach ($tags as $i => $tag) { + $data = $this->db->query('SELECT count(*) countUsed, SUM(postViews) totalViews FROM blog_posts WHERE postID = (SELECT post_id FROM blog_post_tags WHERE tag_id = ? AND post_id = postID)', [$tag['ID']])->result_array(); + $data = $data[0]; + $tags[$i]['countUsed'] = $data['countUsed']; + $tags[$i]['totalViews'] = $data['totalViews'] != '' ? $data['totalViews'] : 0; + } + return $tags; + } + + public function hasAlreadyLiked($postID, $userID) + { + $getLikes = $this->db->query('SELECT * FROM blog_post_likes WHERE post_id = ? AND user_id = ?', [$postID, $userID])->result_array(); + if (empty($getLikes)) { + return false; + } else { + return true; + } + } + + public function addLike($postID, $userID) + { + $this->db->query('INSERT INTO blog_post_likes (post_id, user_id) VALUES (?, ?)', [$postID, $userID]); + + $this->db->cache_delete('blog', 'index'); + $this->db->cache_delete('blog', 'post'); + $this->db->cache_delete('blog', 'like'); + $this->db->cache_delete('admin', 'blog'); + + return $this->db->query('SELECT count(*) likeCount FROM blog_post_likes WHERE post_id = ?', [$postID])->result_array()[0]; + } + + public function removeLike($postID, $userID) + { + $this->db->query('DELETE FROM blog_post_likes WHERE post_id = ? AND user_id = ?', [$postID, $userID]); + + $this->db->cache_delete('blog', 'index'); + $this->db->cache_delete('blog', 'post'); + $this->db->cache_delete('blog', 'like'); + $this->db->cache_delete('admin', 'blog'); + + return $this->db->query('SELECT count(*) likeCount FROM blog_post_likes WHERE post_id = ?', [$postID])->result_array()[0]; + } + + public function getPostList($onlyTrash) + { + $posts = $this->db->query('SELECT p.*, + ca.name categoryName, + ca.display_name categoryDisplayName, + (SELECT count(*) + FROM blog_comments + WHERE post_id = p.postID) commentCount, + (SELECT count(*) + FROM blog_post_likes + WHERE post_id = p.postID) likeCount, + (SELECT display_name + FROM blog_states + WHERE ID = p.postState) postStateDisplay + FROM blog_posts p + LEFT JOIN blog_categories ca ON ca.ID = p.postCategoryID + WHERE postIsDeleted = ?', [$onlyTrash])->result_array(); + $posts = $this->mergePostTitleDesc($posts); + $posts = $this->mergePostAuthorData($posts); + return $posts; + } + + public function getAllContentVersions($postID, $lang) + { + $content = $this->db->query('SELECT * FROM blog_content WHERE postID = ? AND language = ? ORDER BY contentDate DESC', [$postID, $lang])->result_array(); + return $content; + } + + public function createTagIfNotExists($tag) + { + $this->db->cache_off(); + $tagData = $this->db->query('SELECT ID FROM blog_tags WHERE name = ?', [strtolower($tag)])->result_array(); + if (empty($tagData)) { + $this->db->query('INSERT INTO blog_tags (name, display_name) VALUES (?, ?)', [strtolower($tag), $tag]); + $tagData = $this->db->query('SELECT ID FROM blog_tags WHERE name = ?', [strtolower($tag)])->result_array(); + } + $this->db->cache_on(); + $tagID = $tagData[0]['ID']; + return $tagID; + } + + public function addPostTagByID($postID, $tagID) + { + $this->db->query('INSERT INTO blog_post_tags (post_id, tag_id) VALUES (?, ?) ON DUPLICATE KEY UPDATE post_id = post_id', [$postID, $tagID]); + + $this->db->cache_delete('blog', 'index'); + $this->db->cache_delete('blog', 'post'); + $this->db->cache_delete('blog', 'like'); + $this->db->cache_delete('admin', 'blog'); + } + + public function deleteAllPostTags($postID) + { + $this->db->query('DELETE FROM blog_post_tags WHERE post_id = ?', [$postID]); + + $this->db->cache_delete('blog', 'index'); + $this->db->cache_delete('blog', 'post'); + $this->db->cache_delete('blog', 'tag'); + $this->db->cache_delete('admin', 'blog'); + } + + // TODO: Update + public function prepareContentForRelease($content) + { + $dom = new Dom; + $dom->load($content); + $images = $dom->find('img'); + foreach ($images as $image) { + $image_src = $image->getAttribute('src'); + $image_caption = $image->getAttribute('alt'); + $image->removeAllAttributes(); + $image->setAttribute('class', 'img-fluid'); + $image->setAttribute('src', $image_src); + $image->setAttribute('alt', $image_caption); + + $container = new HtmlNode('div'); + $container->setAttribute('class', 'img'); + + $caption_node = new HtmlNode('p'); + $caption = new TextNode($image_caption); + $caption_node->addChild($caption); + + $parent = $image->getParent(); + $parent->addChild($container); + $container->addChild($image); + $container->addChild($caption_node); + } + $iframes = $dom->find('iframe'); + foreach ($iframes as $iframe) { + $container = new HtmlNode('div'); + $container->setAttribute('class', 'responsive-video'); + $parent = $iframe->getParent(); + $parent->addChild($container); + $container->addChild($iframe); + } + return $dom; + } + + public function getFirstImage($content) + { + $dom = new Dom; + $dom->load($content); + $images = $dom->find('img'); + if ($images[0] == null) + return ''; + $imageSrc = $images[0]->getAttribute('src'); + return $imageSrc; + } + + public function deletePost($id) + { + $this->db->query('UPDATE blog_posts SET postIsDeleted = TRUE, postDeletedDate = NOW(), postState = 4 WHERE postID = ? LIMIT 1', [$id]); + + $this->db->cache_delete('blog', 'index'); + $this->db->cache_delete('blog', 'post'); + $this->db->cache_delete('blog', 'like'); + $this->db->cache_delete('blog', 'comment'); + $this->db->cache_delete('blog', 'getComments'); + $this->db->cache_delete('admin', 'blog'); + } + + public function restorePost($id) + { + $this->db->query('UPDATE blog_posts SET postIsDeleted = FALSE, postDeletedDate = NULL, postState = 1 WHERE postID = ? LIMIT 1', [$id]); + + $this->db->cache_delete('blog', 'index'); + $this->db->cache_delete('blog', 'post'); + $this->db->cache_delete('blog', 'like'); + $this->db->cache_delete('blog', 'comment'); + $this->db->cache_delete('blog', 'getComments'); + $this->db->cache_delete('admin', 'blog'); + } + + public function deletePostFinally($id) + { + $this->db->query('DELETE FROM blog_content WHERE postID = ? AND (SELECT postIsDeleted FROM blog_posts WHERE postID = ?) = TRUE', [$id, $id]); + $this->db->query('DELETE FROM blog_post_likes WHERE post_id = ? AND (SELECT postIsDeleted FROM blog_posts WHERE postID = ?) = TRUE', [$id, $id]); + $this->db->query('DELETE FROM blog_post_tags WHERE post_id = ? AND (SELECT postIsDeleted FROM blog_posts WHERE postID = ?) = TRUE', [$id, $id]); + $this->db->query('DELETE FROM blog_comments WHERE post_id = ? AND (SELECT postIsDeleted FROM blog_posts WHERE postID = ?) = TRUE', [$id, $id]); + $this->db->query('DELETE FROM blog_posts WHERE postID = ? AND postIsDeleted = TRUE LIMIT 1', [$id]); + + $this->db->cache_delete('blog', 'index'); + $this->db->cache_delete('blog', 'post'); + $this->db->cache_delete('blog', 'like'); + $this->db->cache_delete('blog', 'comment'); + $this->db->cache_delete('blog', 'getComments'); + $this->db->cache_delete('admin', 'blog'); + } + + public function getPrevPost($id) + { + $posts = $this->db->query('SELECT postID, postUrl, postImage FROM blog_posts WHERE postPublishDate < (SELECT postPublishDate FROM blog_posts WHERE postID = ?) AND postState = 1 ORDER BY postPublishDate DESC LIMIT 1', [$id])->result_array(); + return $this->mergePostTitleDesc($posts); + } + + public function getNextPost($id) + { + $posts = $this->db->query('SELECT postID, postUrl, postImage FROM blog_posts WHERE postPublishDate > (SELECT postPublishDate FROM blog_posts WHERE postID = ?) AND postState = 1 ORDER BY postPublishDate ASC LIMIT 1', [$id])->result_array(); + return $this->mergePostTitleDesc($posts); + } + + public function getMostRecentPosts($count) + { + $posts = $this->db->query('SELECT postID, postImage, postUrl, postPublishDate FROM blog_posts WHERE postState = 1 ORDER BY postPublishDate DESC LIMIT ?', [$count])->result_array(); + return $this->mergePostTitleDesc($posts); + } + + private function countWords($text) + { + $text = preg_replace("/<[a-zA-Z0-9\/ .,:;\-_+!?&%=\"]+>/", '', $text); + return str_word_count($text); + } + + public function getReadingTime($postID) + { + $data = $this->db->query('SELECT wordCount, language FROM blog_content c WHERE postID = ? AND isActive = TRUE AND (c.language = ? OR c.language = "de") ORDER BY contentDate DESC', [$postID, $_SESSION['site_lang']])->result_array(); + + if (empty($data)) { + return 0; + } + + $wordCount = $data[0]['wordCount']; + + foreach ($data as $entry) { + if ($entry['language'] == $_SESSION['site_lang']) { + $wordCount = $entry['wordCount']; + break; + } + } + + $wordsPerSecond = 3; + $duration = $wordCount / $wordsPerSecond; + $duration /= 60; + $duration = round($duration); + return $duration; + } + + public function createNewPostDraft($authorID) + { + $this->db->query('INSERT INTO blog_posts (postAuthorID, postState) VALUE (?, 2)', [$authorID]); + $data = $this->db->query('SELECT postID FROM blog_posts WHERE postState = 2 ORDER BY postID DESC LIMIT 1')->result_array(); + return intval($data[0]['postID']); + } + + public function createNewContentDraft($postID) + { + $this->db->query('INSERT INTO blog_content (postID, isActive) VALUES (?, 0)', [$postID]); + $this->db->cache_delete('admin', 'blog'); + $data = $this->db->query('SELECT contentID FROM blog_content WHERE postID = ? ORDER BY contentID DESC LIMIT 1', [$postID])->result_array(); + return intval($data[0]['contentID']); + } + + public function createNewTranslation($postID, $language) + { + $data = $this->db->query('SELECT postTranslationID FROM blog_translations WHERE postID = ? AND language = ?', [$postID, $language])->result_array(); + + if (empty($data)) { + $this->db->query('INSERT INTO blog_translations (postID, language) VALUES (?, ?)', [$postID, $language]); + $data = $this->db->query('SELECT postTranslationID FROM blog_translations WHERE postID = ? AND language = ? ORDER BY postTranslationID DESC', [$postID, $language])->result_array(); + } + + return intval($data[0]['postTranslationID']); + } + + public function updatePostDraft($postID, $postUrl, $postCategory, $postPublishDate, $postImage) + { + $this->db->query('UPDATE blog_posts SET postUrl = ?, postCategoryID = ?, postPublishDate = ?, postImage = ? WHERE postID = ?', [$postUrl, $postCategory, $postPublishDate, $postImage, $postID]); + $this->db->cache_delete('admin', 'edit'); + } + + public function updateContentDraft($contentID, $postContent, $postLang) + { + $wordCount = $this->countWords($postContent); + $this->db->query('UPDATE blog_content SET content = ?, language = ?, contentDate = NOW(), wordCount = ? WHERE contentID = ?', [$postContent, $postLang, $wordCount, $contentID]); + $this->db->cache_delete('admin', 'blog'); + } + + public function updateTranslation($translationID, $postTitle, $postDesc) + { + $this->db->query('UPDATE blog_translations SET postTitle = ?, postDesc = ? WHERE postTranslationID = ?', [$postTitle, $postDesc, $translationID]); + $this->db->cache_delete('admin', 'blog'); + } + + public function publishPostDraft($postID) + { + $this->db->query('UPDATE blog_posts SET postPublishDate = NOW(), postLastEdit = NOW(), postState = 1 WHERE postID = ?', [$postID]); + $this->db->cache_delete('blog', 'index'); + $this->db->cache_delete('blog', 'post'); + $this->db->cache_delete('blog', 'tag'); + $this->db->cache_delete('blog', 'category'); + $this->db->cache_delete('blog', 'search'); + $this->db->cache_delete('admin', 'blog'); + } + + public function publishContentDraft($authorID, $contentID, $postID, $lang) + { + $firstContent = $this->db->query('SELECT contentID FROM blog_content WHERE postID = ? AND contentID != ? AND language = ?', [$postID, $contentID, $lang])->result_array(); + $isNative = TRUE; + if(!empty($firstContent)) { + $isNative = FALSE; + } + + $this->db->query('UPDATE blog_content SET isActive = FALSE WHERE postID = ?', [$postID]); + $this->db->query('UPDATE blog_content SET isActive = TRUE, isNativePost = ?, contentDate = NOW(), contentAuthorID = ? WHERE contentID = ?', [$isNative, $authorID, $contentID]); + } + + public function getPostTranslationIDs($postID) { + $data = $this->db->query('SELECT postTranslationID, language FROM blog_translations WHERE postID = ?', [$postID])->result_array(); + return $data; + } + + public function getPostContentIDs($postID) { + $data = $this->db->query('SELECT (SELECT contentID FROM blog_content WHERE language = c.language ORDER BY contentID DESC LIMIT 1) contentID, language FROM blog_content c WHERE postID = ? AND language IS NOT NULL GROUP BY language ORDER BY contentID DESC', [$postID])->result_array(); + return $data; + } + + public function getPostTranslations($postID) + { + $data = $this->db->query('SELECT * FROM blog_translations t LEFT JOIN blog_content c ON c.postID = t.postID AND c.language = t.language WHERE t.postID = ?', [$postID])->result_array(); + return $data; + } + + public function postIDExisting($postID) + { + $data = $this->db->query('SELECT postID FROM blog_posts WHERE postID = ?', [$postID])->result_array(); + return !empty($data); + } + + public function contentIDExisting($postID, $contentID) + { + $data = $this->db->query('SELECT contentID FROM blog_content WHERE postID = ? AND contentID = ?', [$postID, $contentID])->result_array(); + return !empty($data); + } + + public function translationIDExisting($postID, $translationID) + { + $data = $this->db->query('SELECT postTranslationID FROM blog_translations WHERE postID = ? AND postTranslationID = ?', [$postID, $translationID])->result_array(); + return !empty($data); + } + + public function postUrlExisting($postUrl) { + $data = $this->db->query('SELECT postUrl FROM blog_posts WHERE postUrl = ?', [$postUrl])->result_array(); + return !empty($data); + } + } \ No newline at end of file diff --git a/application/models/DatabaseModel.php b/application/models/DatabaseModel.php new file mode 100644 index 0000000..428ef70 --- /dev/null +++ b/application/models/DatabaseModel.php @@ -0,0 +1,373 @@ +createMissingDatbases(); + } + + public function createMissingDatbases() { + $this->createDatabases(); + $this->createTables(); + $this->fillBlogDb(); + $this->fillMainDb(); + $this->fillPortfolioDb(); + } + + public function createDatabases() { +// $this->db->query('CREATE DATABASE IF NOT EXISTS `blog` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci'); +// $this->db->query('CREATE DATABASE IF NOT EXISTS `kingofdog` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci'); +// $this->db->query('CREATE DATABASE IF NOT EXISTS `portfolio` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci'); +// $this->db->query('CREATE DATABASE IF NOT EXISTS `social_media` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci'); + } + + + public function createTables() + { + // Calendar Table + $this->db->query('CREATE TABLE IF NOT EXISTS `calendar` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `title` VARCHAR(300) NOT NULL, + `allDay` TINYINT(1) NOT NULL, + `start` VARCHAR(20) NOT NULL, + `end` VARCHAR(20) NOT NULL, + `url` TEXT NOT NULL, + `overlap` TINYINT(1) NOT NULL, + `color` TEXT NOT NULL, + `textColor` TEXT NOT NULL, + `description` TEXT NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1'); + // Feedback Table + $this->db->query('CREATE TABLE IF NOT EXISTS `feedback` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `page` VARCHAR(100) DEFAULT NULL, + `message` TEXT, + `datetime` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + `anonymous` TINYINT(1) DEFAULT \'1\', + `userID` INT(11) DEFAULT NULL, + `email` VARCHAR(50) DEFAULT NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1'); + // Files Table + $this->db->query('CREATE TABLE IF NOT EXISTS `files` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(50) NOT NULL, + `original_name` VARCHAR(50) NOT NULL, + `type` VARCHAR(30) NOT NULL, + `size` INT(11) NOT NULL, + `path` VARCHAR(300) NOT NULL, + `uploadDate` DATETIME DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=72 DEFAULT CHARSET=latin1'); + // Redirects Table + $this->db->query('CREATE TABLE IF NOT EXISTS `redirects` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `redirect` TEXT NOT NULL, + `url` TEXT NOT NULL, + `temporary` TINYINT(1) NOT NULL, + `expireDate` DATETIME DEFAULT NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=220 DEFAULT CHARSET=latin1'); + // User Followers Table + $this->db->query('CREATE TABLE IF NOT EXISTS `user_followers` ( + `followedUserID` INT(11) NOT NULL, + `followerUserID` INT(11) NOT NULL, + `followedSince` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=latin1'); + // User Posts Table + $this->db->query('CREATE TABLE IF NOT EXISTS `user_posts` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `user_id` INT(11) DEFAULT NULL, + `title` VARCHAR(150) NOT NULL, + `content` TEXT, + `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `reply_to` INT(11) DEFAULT NULL, + PRIMARY KEY (`ID`), + UNIQUE KEY `user_posts_ID_uindex` (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=145 DEFAULT CHARSET=latin1'); + // User Posts Likes Table + $this->db->query('CREATE TABLE IF NOT EXISTS `user_posts_likes` ( + `postID` INT(11) NOT NULL, + `likedUserID` INT(11) NOT NULL, + `likerUserID` INT(11) NOT NULL, + UNIQUE KEY `likerUserID` (`likerUserID`), + UNIQUE KEY `postID` (`postID`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1'); + // Users Table + $this->db->query('CREATE TABLE IF NOT EXISTS `users` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `original_name` VARCHAR(25) NOT NULL, + `username` VARCHAR(25) NOT NULL, + `displayname` VARCHAR(25) NOT NULL, + `login_method` INT(11) DEFAULT \'0\', + `password` TEXT, + `email` TEXT NOT NULL, + `rank` TEXT NOT NULL, + `profile_picture` TEXT NOT NULL, + `header_image` TEXT, + `social_networks` TEXT, + `is_activated` TINYINT(1) NOT NULL, + `activation_key` VARCHAR(256) DEFAULT NULL, + `showAds` TINYINT(1) NOT NULL DEFAULT \'1\', + `date_created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `isCurrentlyOnline` TINYINT(1) DEFAULT \'0\', + `about` TEXT NOT NULL, + `lastLogin` DATETIME NOT NULL, + `language` VARCHAR(10) DEFAULT \'DE\', + `country` VARCHAR(2) DEFAULT NULL, + `gender` VARCHAR(10) DEFAULT NULL, + `receiveEmails` TINYINT(1) NOT NULL DEFAULT \'1\', + `receiveNewsletter` TINYINT(1) NOT NULL DEFAULT \'1\', + `forget_password_key` VARCHAR(256) DEFAULT NULL, + `isDeleted` TINYINT(1) DEFAULT \'0\', + UNIQUE KEY `id` (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1'); + // Users History Table + $this->db->query('CREATE TABLE IF NOT EXISTS `users_history` ( + `changeID` INT(11) NOT NULL AUTO_INCREMENT, + `changeDate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `ID` INT(11) NOT NULL, + `username` VARCHAR(25) NOT NULL, + `displayname` VARCHAR(25) NOT NULL, + `email` TEXT NOT NULL, + `rank` INT(11) NOT NULL, + `profile_picture` TEXT NOT NULL, + `header_image` TEXT, + `social_networks` TEXT, + `showAds` TINYINT(1) NOT NULL DEFAULT \'1\', + `about` TEXT NOT NULL, + `language` VARCHAR(10) DEFAULT \'DE\', + `country` VARCHAR(2) DEFAULT NULL, + `gender` VARCHAR(10) DEFAULT NULL, + `receiveEmails` TINYINT(1) NOT NULL DEFAULT \'1\', + `receiveNewsletter` TINYINT(1) NOT NULL DEFAULT \'1\', + UNIQUE KEY `changeID` (`changeID`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1'); + // Blog Categories Table + $this->db->query('CREATE TABLE IF NOT EXISTS `blog_categories` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(25) NOT NULL, + `display_name` VARCHAR(50) NOT NULL, + PRIMARY KEY (`ID`), + UNIQUE KEY `blog_categories_name_display_name_uindex` (`name`,`display_name`) +) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=latin1'); + // Blog Comments Table + $this->db->query('CREATE TABLE IF NOT EXISTS `blog_comments` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `post_id` INT(11) NOT NULL, + `user_id` INT(11) NOT NULL, + `comment` TEXT NOT NULL, + `date_created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `like_count` INT(11) NOT NULL, + `reply` TINYINT(1) NOT NULL DEFAULT \'0\', + `replyTo_id` INT(11) DEFAULT NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1'); + // Blog Content Table + $this->db->query('CREATE TABLE IF NOT EXISTS `blog_content` ( + `contentID` INT(11) NOT NULL AUTO_INCREMENT, + `postID` INT(11) NOT NULL, + `contentDate` DATETIME NOT NULL, + `content` MEDIUMTEXT NOT NULL, + `contentAuthorID` INT(11) DEFAULT NULL, + `isNativePost` TINYINT(1) NOT NULL, + `isActive` TINYINT(1) NOT NULL, + `versionMessage` VARCHAR(300) NOT NULL, + `language` VARCHAR(10) DEFAULT NULL, + PRIMARY KEY (`contentID`) +) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=latin1'); + // Blog Posts Table + $this->db->query('CREATE TABLE IF NOT EXISTS `blog_posts` ( + `postID` INT(11) NOT NULL AUTO_INCREMENT, + `postUrl` VARCHAR(300) NOT NULL, + `postTitle` VARCHAR(255) DEFAULT NULL, + `postDesc` TEXT, + `postPublishDate` DATETIME DEFAULT NULL, + `postLastEdit` DATETIME DEFAULT NULL, + `postAuthorID` INT(11) DEFAULT NULL, + `postImage` TEXT NOT NULL, + `postState` VARCHAR(50) NOT NULL, + `postViews` INT(11) NOT NULL DEFAULT \'0\', + `postCategoryID` INT(11) NOT NULL, + `postIsDeleted` TINYINT(1) NOT NULL DEFAULT \'0\', + `postDeletedDate` DATETIME DEFAULT NULL, + PRIMARY KEY (`postID`) +) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=latin1'); + // Blog Post Likes Table + $this->db->query('CREATE TABLE IF NOT EXISTS `blog_post_likes` ( + `post_id` int(11) NOT NULL, + `user_id` int(11) NOT NULL, + PRIMARY KEY (`post_id`,`user_id`), + KEY `fk_post_likes_user` (`user_id`), + CONSTRAINT `fk_post_likes_post` FOREIGN KEY (`post_id`) REFERENCES `blog_posts` (`postID`), + CONSTRAINT `fk_post_likes_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1'); + // Blog Post Tags Table + $this->db->query('CREATE TABLE IF NOT EXISTS `blog_post_tags` ( + `post_id` INT(11) NOT NULL, + `tag_id` INT(11) NOT NULL, + PRIMARY KEY (`post_id`,`tag_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1'); + // Blog States Table + $this->db->query('CREATE TABLE IF NOT EXISTS `blog_states` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(15) NOT NULL, + `display_name` VARCHAR(15) NOT NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1'); + // Blog Tags Table + $this->db->query('CREATE TABLE IF NOT EXISTS `blog_tags` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(25) NOT NULL, + `display_name` VARCHAR(50) NOT NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=latin1'); + // Blog Translations Table + $this->db->query('CREATE TABLE IF NOT EXISTS `blog_translations` ( + `postID` INT(11) DEFAULT NULL, + `language` VARCHAR(10) DEFAULT \'en\', + `postTitle` VARCHAR(255) DEFAULT NULL, + `postDesc` TEXT, + UNIQUE KEY `blog_translations_language_uindex` (`language`), + UNIQUE KEY `blog_translations_postID_uindex` (`postID`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1'); + // Collections Table + $this->db->query('CREATE TABLE IF NOT EXISTS `collections` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `collection` TEXT NOT NULL, + `displayname` TEXT NOT NULL, + `displaynameEnglish` TEXT NOT NULL, + `displaynameFrench` TEXT NOT NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=latin1'); + // Portfolio Table + $this->db->query('CREATE TABLE IF NOT EXISTS `portfolio` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NOT NULL, + `datetime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `source` TEXT NOT NULL, + `isDownloadable` TINYINT(1) NOT NULL DEFAULT \'0\', + `isOpenSource` TINYINT(1) NOT NULL DEFAULT \'0\', + `title` TEXT NOT NULL, + `titleEnglish` TEXT NOT NULL, + `titleFrench` TEXT NOT NULL, + `headline` TEXT NOT NULL, + `headlineEnglish` TEXT NOT NULL, + `headlineFrench` TEXT NOT NULL, + `description` TEXT NOT NULL, + `descriptionEnglish` TEXT NOT NULL, + `descriptionFrench` TEXT NOT NULL, + PRIMARY KEY (`ID`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=latin1'); + // Project Categories Table + $this->db->query('CREATE TABLE IF NOT EXISTS `project_categories` ( + `projectID` INT(11) NOT NULL, + `categoryID` INT(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1'); + // Social Posts Table + $this->db->query('CREATE TABLE IF NOT EXISTS `social_posts` ( + `post_id` INT(11) NOT NULL AUTO_INCREMENT, + `post_plattform` VARCHAR(20) NOT NULL, + `post_content` TEXT NOT NULL, + `post_url` VARCHAR(75) NOT NULL, + `post_author` VARCHAR(20) NOT NULL, + `post_author_url` TEXT NOT NULL, + `post_date` INT(11) NOT NULL, + `post_img_source` TEXT, + `post_original_id` BIGINT(20) NOT NULL, + PRIMARY KEY (`post_id`), + UNIQUE KEY `post_url` (`post_url`) +) ENGINE=InnoDB AUTO_INCREMENT=5474 DEFAULT CHARSET=latin1'); + } + + public function fillBlogDb() { + if($this->db->query('SELECT COUNT(*) count FROM blog_categories')->result_array()[0]['count'] == 0) { + $this->db->query("INSERT INTO `blog_categories` (`ID`, `name`, `display_name`) VALUES +(1, 'design', 'Design'), +(2, 'development', 'Entwicklung & Programmierung'), +(3, 'internet', 'Internet'), +(4, 'minepoint', 'MinePoint'), +(5, 'social_media', 'Soziale Medien'), +(6, 'technic', 'Technik'), +(7, 'youtube', 'YouTube')"); + } + if($this->db->query('SELECT COUNT(*) count FROM blog_states')->result_array()[0]['count'] == 0) { + $this->db->query("INSERT INTO `blog_states` (`ID`, `name`, `display_name`) VALUES +(1, 'published', 'Veröffentlicht'), +(2, 'draft', 'Entwurf'), +(3, 'pending', 'Geplant'), +(4, 'trashbin', 'Im Papierkorb')"); + } + if($this->db->query('SELECT COUNT(*) count FROM blog_tags')->result_array()[0]['count'] == 0) { + $this->db->query("INSERT INTO `blog_tags` (`ID`, `name`, `display_name`) VALUES +(1, 'youtube', 'YouTube'), +(2, 'twitter', 'Twitter'), +(3, 'smartphones', 'Smartphones'), +(4, 'coding', 'Programmieren'), +(5, 'development', 'Entwicklung'), +(6, 'design', 'Design'), +(7, 'adobe', 'Adobe'), +(8, '3d', '3D'), +(9, 'ux', 'User Experience'), +(10, 'ui', 'User Interface'), +(11, 'design-thinking', 'Thinking on Design'), +(12, 'games', 'Spiele'), +(13, 'hardware', 'Hardware'), +(14, 'software', 'Software'), +(15, 'photography', 'Fotografie'), +(16, 'videos', 'Videos & Filmen'), +(17, 'learning', 'Lernen'), +(28, '', ''), +(29, 'test', 'test'), +(30, 'kacke', 'kacke'), +(31, 'asdfla', 'asdfla'), +(32, 'admin', 'Admin'), +(33, 'tset', 'tset'), +(34, 'programmiersprachen', 'Programmiersprachen'), +(35, 'sprachen', 'Sprachen'), +(36, 'serie', 'Serie'), +(37, 'kanal', 'Kanal'), +(38, 'neu', 'Neu'), +(39, 'kingofdog', 'KingOfDog'), +(40, 'entwicklung', 'Entwicklung'), +(41, 'programmierung', 'Programmierung'), +(42, 'webseite', 'Webseite'), +(43, 'posts', 'Posts'), +(44, 'post', 'Post'), +(45, 'system', 'System'), +(46, 'nutzer', 'Nutzer'), +(47, 'user', 'User'), +(48, 'php', 'PHP')"); + } + } + + public function fillMainDb() { + if($this->db->query('SELECT COUNT(*) count FROM redirects')->result_array()[0]['count'] == 0) { + $this->db->query("INSERT INTO `redirects` (`ID`, `date`, `redirect`, `url`, `temporary`, `expireDate`) VALUES +(1, '2016-10-15 18:09:51', 'yt', 'http://youtube.com/KingOfDog', 0, '0000-00-00 00:00:00'), +(2, '2016-10-15 18:10:13', 'youtube', 'http://youtube.com/KingOfDog', 0, '0000-00-00 00:00:00'), +(3, '2016-10-15 18:10:27', 'tw', 'http://twitter.com/KingOfDogTV', 0, '0000-00-00 00:00:00'), +(4, '2016-10-15 18:10:37', 'twitter', 'http://twitter.com/KingOfDogTV', 0, '0000-00-00 00:00:00')"); + } + } + + public function fillPortfolioDb() { + if($this->db->query('SELECT COUNT(*) count FROM projects_categories')->result_array()[0]['count'] == 0) { + $this->db->query("INSERT INTO `projects_categories` (`ID`, `collection`, `displayname`, `displaynameEnglish`, `displaynameFrench`) VALUES +(1, 'banner', 'Banner', 'Banner', 'Bannière'), +(2, 'fotografie', 'Fotografie', 'Photography', 'Photographie'), +(3, 'minecraft', 'Minecraft', 'Minecraft', 'Minecraft'), +(4, 'websites', 'Webseiten', 'Websites', 'Sites'), +(5, 'logo', 'Logo', 'Logo', 'Logo'), +(6, 'development', 'Programmierung', 'Development', ''), +(7, 'games', 'Spiele', 'Games', ''), +(8, 'design', 'Design', 'Design', 'Design')"); + } + } +} \ No newline at end of file diff --git a/application/models/FileModel.php b/application/models/FileModel.php new file mode 100644 index 0000000..2c8022a --- /dev/null +++ b/application/models/FileModel.php @@ -0,0 +1,96 @@ +generateName() . '.' . $filetype; + $name = explode('.' . $filetype, explode(DIRECTORY_SEPARATOR, $target_file)[1])[0]; + + if (!move_uploaded_file($tmpname, $target_file)) { + die('File couldn\'t be uploaded!'); + } + + $this->db->query('INSERT INTO files (name, original_name, type, size, path) VALUES (?, ?, ?, ?, ?)', [$name, $original_name, $type, $size, $target_file]); + + return "/file/open/" . $name; + } + + public function uploadImage($name, $max_size, $originalname, $max_width) { + $config['upload_path'] = './files/'; + $config['allowed_types'] = 'gif|jpg|png'; + $config['max_size'] = $max_size; + $config['file_name'] = $this->generateName() . "." . pathinfo(basename($originalname), PATHINFO_EXTENSION); + + $this->load->library('upload', $config); + + if ( ! $this->upload->do_upload($name)) { + return null; + } else { + $data = $this->upload->data(); + + // Resize + $config['image_library'] = 'gd2'; + $config['source_image'] = $data['full_path']; + $config['maintain_ratio'] = TRUE; + $config['width'] = $max_width; + + $this->load->library('image_lib', $config); + + $this->image_lib->resize(); + + $this->db->query('INSERT INTO files (name, original_name, type, size, path) VALUES (?, ?, ?, ?, ?)', [$data['raw_name'], $originalname, $data['file_type'], $data['file_size'] * 1024, 'files/' . $data['file_name']]); + return '/f/' . $data['raw_name']; + } + } + + public function uploadFileByContent($content, $original_name, $fullType, $fileSize) { + $target_dir = "files" . DIRECTORY_SEPARATOR; + $filetype = pathinfo(basename($original_name), PATHINFO_EXTENSION); + $target_file = $target_dir . $this->generateName() . '.' . $filetype; + $name = explode('.' . $filetype, explode(DIRECTORY_SEPARATOR, $target_file)[1])[0]; + + $fp = fopen($target_file, 'w'); + fwrite($fp, $content); + fclose($fp); + + $this->db->query('INSERT INTO files (name, original_name, type, size, path) VALUES (?, ?, ?, ?, ?)', [$name, $original_name, $fullType, $fileSize, $target_file]); + + return '/f/' . $name; + } + + public function generateName() + { + return md5(uniqid(rand(), true)); + } + + public function getFileList() + { + $unfiltered_result = $this->db->query('SELECT * FROM files')->result_array(); + $result = []; + foreach ($unfiltered_result as $item) { + $item['size'] = NumberHumanizer::binarySuffix(intval($item['size']), $_SESSION['site_lang']); + $result[] = $item; + } + return $result; + } + + public function delete($id) { + $filePath = $this->db->query('SELECT path FROM files WHERE ID = ? LIMIT 1', [$id])->result_array()[0]; + unlink($filePath['path']); + + $this->db->query('DELETE FROM files WHERE ID = ? LIMIT 1', [$id]); + } + +} \ No newline at end of file diff --git a/application/models/GeneralModel.php b/application/models/GeneralModel.php new file mode 100644 index 0000000..782ef19 --- /dev/null +++ b/application/models/GeneralModel.php @@ -0,0 +1,62 @@ +load->model('BlogModel', '', TRUE); + $this->load->model('NotificationModel', '', TRUE); + } + + function getBlogPosts($count) + { + $posts = $this->BlogModel->getMostRecentPosts($count); + + $return = ''; + foreach($posts as $result) { + $date = strtotime($result['postPublishDate']); + $return .= '
    +
    + +
    +
    + ' . $result['postTitle'] . ' + ' . lang('footer_published') . ' ' . DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$date"), $_SESSION['site_lang']) . ' +
    +
    '; + } + return $return; + } + + function addFeedbackAnonymously($pageUrl, $message) { + $this->addFeedback($pageUrl, $message, true, NULL, NULL); + } + + function addFeedback($pageUrl, $message, $anonymous, $userID, $email) { + $this->db->query('INSERT INTO feedback (page, message, anonymous, userID, email) VALUES (?, ?, ?, ?, ?)', [$pageUrl, $message, $anonymous, $userID, $email]); + $this->db->cache_delete('admin', 'feedback'); + + // Send notifications + $this->NotificationModel->rankNotificationNewFeedback($userID != NULL ? $userID : -1, 9, $pageUrl); + } + + function getRankName($rankID) { + $ranks = [ + 0 => "Nutzer", + 1 => "Registrierter Nutzer", + 2 => "Premium-Nutzer", + 3 => "Plus-Nutzer", + 6 => "Autor (Blog)", + 7 => "Editor (Blog)", + 8 => "Moderator", + 9 => "Admin", + 10 => "Admin" + ]; + return isset($ranks[$rankID]) ? $ranks[$rankID] : "Nutzer"; + } + +} \ No newline at end of file diff --git a/application/models/LoginModel.php b/application/models/LoginModel.php new file mode 100644 index 0000000..ec313b3 --- /dev/null +++ b/application/models/LoginModel.php @@ -0,0 +1,222 @@ +load->model('NotificationModel', '', TRUE); + $this->load->helper('cookie'); + } + + public function getLoginData($username) + { + $return = $this->db->query('SELECT * FROM users WHERE (username = lower(?) OR email = lower(?)) AND is_activated = TRUE LIMIT 1', + [htmlspecialchars($username, ENT_QUOTES), $username])->result_array(); + return $return; + } + + public function getPasswordHash($password, $original_name) + { + $salt = md5($original_name); + $passwordHash = hash('sha256', $salt . $password . $salt); + return $passwordHash; + } + + public function login($username, $password, $rememberMe) + { + $logindata = $this->getLoginData($username); + $_SESSION['notice'] = ''; + if (empty($logindata)) { + $_SESSION['notice'] .= '
    Der Account existiert nicht oder wurde noch nicht aktiviert! Bitte überprüfe noch einmal dein Mail-Postfach, ob du eine Aktivierungs-Mail erhalten hast.
    E-Mail erneut senden
    '; + return; + } + $logindata = $logindata[0]; + + $encryptedPassword = $this->getPasswordHash($password, $logindata['original_name']); + + if ($encryptedPassword == $logindata['password']) { + $this->startLoginSession($logindata, $rememberMe); + } else { + $_SESSION['notice'] .= '
    Falsche Anmeldedaten! Benutzername und Passwort stimmen nicht überein!
    '; + } + } + + public function startLoginSession($logindata, $rememberMe) + { + $_SESSION['user']['displayname'] = $logindata['displayname']; + $_SESSION['user']['username'] = $logindata['username']; + $_SESSION['user']['rank'] = $logindata['rank']; + $_SESSION['user']['ID'] = $logindata['ID']; + $_SESSION['user']['ads'] = $logindata['showAds']; + $profilePic = $logindata['profile_picture']; + if (empty($profilePic)) { + $_SESSION['user']['profilePic'] = '/assets/images/steam.jpg'; + } else { + $_SESSION['user']['profilePic'] = $profilePic; + } + + $this->db->query('UPDATE users SET isCurrentlyOnline = 1, lastLogin = CURRENT_TIMESTAMP() WHERE ID = ?', [$logindata['ID']]); + + if ($rememberMe == 'on') { + $expire = time() + 3600 * 24 * 60; + $userHash = $this->LoginModel->getUserHash($logindata['username'], $logindata['password'], $logindata['email'], $logindata['ID']); + var_dump($expire); + set_cookie('rememberMe', base64_encode($logindata['username']), $expire, base_url(), '/'); + set_cookie('token', $userHash, $expire, base_url(), '/'); + } + } + + public function getUserHash($username, $password, $email, $id) + { + $hash = hash('sha256', $id . '//' . $username . '//' . substr($password, 0, 5) . '//' . substr($email, 0, 5)); + return $hash; + } + + public function isTrashMail($email) + { + $emailList = ["0-mail.com", "027168.com", "0815.ru", "0815.su", "0clickemail.com", "0wnd.net", "0wnd.org", "10mail.org", "10minutemail.cf", "10minutemail.com", "10minutemail.de", "10minutemail.ga", "10minutemail.gq", "10minutemail.ml", "123-m.com", "12minutemail.com", "1ce.us", "1chuan.com", "1mail.ml", "1pad.de", "1zhuan.com", "20email.eu", "20mail.in", "20mail.it", "20minutemail.com", "21cn.com", "24hourmail.com", "2prong.com", "30minutemail.com", "33mail.com", "3d-painting.com", "3mail.ga", "4mail.cf", "4mail.ga", "4warding.com", "4warding.net", "4warding.org", "5mail.cf", "5mail.ga", "60minutemail.com", "675hosting.com", "675hosting.net", "675hosting.org", "6ip.us", "6mail.cf", "6mail.ga", "6mail.ml", "6paq.com", "6url.com", "75hosting.com", "75hosting.net", "75hosting.org", "7days-printing.com", "7mail.ga", "7mail.ml", "7tags.com", "8mail.cf", "8mail.ga", "8mail.ml", "99experts.com", "9mail.cf", "9ox.net", "a-bc.net", "a.betr.co", "a45.in", "abusemail.de", "abyssmail.com", "ac20mail.in", "acentri.com", "advantimo.com", "afrobacon.com", "ag.us.to", "agedmail.com", "ahk.jp", "ajaxapp.net", "alivance.com", "amail.com", "amilegit.com", "amiri.net", "amiriindustries.com", "anappthat.com", "ano-mail.net", "anonbox.net", "anonymail.dk", "anonymbox.com", "antichef.com", "antichef.net", "antispam.de", "apkmd.com", "appixie.com", "armyspy.com", "asdasd.nl", "ass.pp.ua", "aver.com", "azmeil.tk", "baxomale.ht.cx", "beddly.com", "beefmilk.com", "big1.us", "bigprofessor.so", "bigstring.com", "binkmail.com", "bio-muesli.net", "bladesmail.net", "blogmyway.org", "bobmail.info", "bodhi.lawlita.com", "bofthew.com", "bootybay.de", "boun.cr", "bouncr.com", "boxformail.in", "boxtemp.com.br", "brefmail.com", "brennendesreich.de", "broadbandninja.com", "bsnow.net", "bu.mintemail.com", "buffemail.com", "bugmenot.com", "bumpymail.com", "bund.us", "bundes-li.ga", "burnthespam.info", "burstmail.info", "buyusedlibrarybooks.org", "c2.hu", "c51vsgq.com", "cachedot.net", "car101.pro", "casualdx.com", "cbair.com", "ce.mintemail.com", "cellurl.com", "centermail.com", "centermail.net", "chacuo.net", "chammy.info", "cheatmail.de", "chogmail.com", "choicemail1.com", "chong-mail.com", "chong-mail.net", "chong-mail.org", "clixser.com", "cmail.com", "cmail.net", "cmail.org", "coldemail.info", "consumerriot.com", "cool.fr.nf", "correo.blogos.net", "cosmorph.com", "courriel.fr.nf", "courrieltemporaire.com", "crapmail.org", "crazespaces.pw", "crazymailing.com", "cubiclink.com", "curryworld.de", "cust.in", "cuvox.de", "cx.de-a.org", "dacoolest.com", "daintly.com", "dandikmail.com", "dayrep.com", "dbunker.com", "dcemail.com", "deadaddress.com", "deadchildren.org", "deadfake.cf", "deadfake.ga", "deadfake.ml", "deadfake.tk", "deadspam.com", "deagot.com", "dealja.com", "despam.it", "despammed.com", "devnullmail.com", "dfgh.net", "dharmatel.net", "digitalsanctuary.com", "dingbone.com", "discard.cf", "discard.email", "discard.ga", "discard.gq", "discard.ml", "discard.tk", "discardmail.com", "discardmail.de", "disposable-email.ml", "disposable.cf", "disposable.ga", "disposable.ml", "disposableaddress.com", "disposableemailaddresses.com", "disposableemailaddresses.emailmiser.com", "disposableinbox.com", "dispose.it", "disposeamail.com", "disposemail.com", "dispostable.com", "divermail.com", "dlemail.ru", "dm.w3internet.co.uk", "dodgeit.com", "dodgit.com", "dodgit.org", "dodsi.com", "doiea.com", "domforfb1.tk", "domforfb2.tk", "domforfb3.tk", "domforfb4.tk", "domforfb5.tk", "domforfb6.tk", "domforfb7.tk", "domforfb8.tk", "domforfb9.tk", "domozmail.com", "donemail.ru", "dontreg.com", "dontsendmespam.de", "dotmsg.com", "drdrb.com", "drdrb.net", "droplar.com", "dropmail.me", "duam.net", "dudmail.com", "dump-email.info", "dumpandjunk.com", "dumpmail.de", "dumpyemail.com", "duskmail.com", "dw.now.im", "dx.abuser.eu", "dx.allowed.org", "dx.awiki.org", "dx.ez.lv", "dx.sly.io", "e-mail.com", "e-mail.org", "e4ward.com", "easytrashmail.com", "ee2.pl", "eelmail.com", "einrot.com", "einrot.de", "email-fake.cf", "email-fake.ga", "email-fake.gq", "email-fake.ml", "email-fake.tk", "email.cbes.net", "email60.com", "emailage.cf", "emailage.ga", "emailage.gq", "emailage.ml", "emailage.tk", "emaildienst.de", "emailgo.de", "emailias.com", "emailigo.de", "emailinfive.com", "emailisvalid.com", "emaillime.com", "emailmiser.com", "emailproxsy.com", "emails.ga", "emailsensei.com", "emailspam.cf", "emailspam.ga", "emailspam.gq", "emailspam.ml", "emailspam.tk", "emailtemporar.ro", "emailtemporario.com.br", "emailthe.net", "emailtmp.com", "emailto.de", "emailwarden.com", "emailx.at.hm", "emailxfer.com", "emailz.cf", "emailz.ga", "emailz.gq", "emailz.ml", "emeil.in", "emeil.ir", "emil.com", "emkei.cf", "emkei.ga", "emkei.gq", "emkei.ml", "emkei.tk", "eml.pp.ua", "emz.net", "enterto.com", "ephemail.net", "est.une.victime.ninja", "etranquil.com", "etranquil.net", "etranquil.org", "evopo.com", "explodemail.com", "eyepaste.com", "facebook-email.cf", "facebook-email.ga", "facebook-email.ml", "facebookmail.gq", "facebookmail.ml", "fake-email.pp.ua", "fake-mail.cf", "fake-mail.ga", "fake-mail.ml", "fakeinbox.cf", "fakeinbox.com", "fakeinbox.ga", "fakeinbox.ml", "fakeinbox.tk", "fakeinformation.com", "fakemail.fr", "fakemailgenerator.com", "fakemailz.com", "fammix.com", "fansworldwide.de", "fantasymail.de", "fastacura.com", "fastchevy.com", "fastchrysler.com", "fastkawasaki.com", "fastmazda.com", "fastmitsubishi.com", "fastnissan.com", "fastsubaru.com", "fastsuzuki.com", "fasttoyota.com", "fastyamaha.com", "fatflap.com", "fdfdsfds.com", "fightallspam.com", "fiifke.de", "filzmail.com", "fixmail.tk", "fizmail.com", "fleckens.hu", "flemail.ru", "flurred.com", "flyspam.com", "footard.com", "forgetmail.com", "fornow.eu", "fr33mail.info", "frapmail.com", "free-email.cf", "free-email.ga", "freemail.ms", "freemails.cf", "freemails.ga", "freemails.ml", "freundin.ru", "friendlymail.co.uk", "front14.org", "fuckingduh.com", "fudgerub.com", "fun64.com", "fux0ringduh.com", "fw.moza.pl", "g.hmail.us", "garliclife.com", "gawab.com", "gelitik.in", "get-mail.cf", "get-mail.ga", "get-mail.ml", "get-mail.tk", "get.pp.ua", "get1mail.com", "get2mail.fr", "getairmail.cf", "getairmail.com", "getairmail.ga", "getairmail.gq", "getairmail.ml", "getairmail.tk", "getmails.eu", "getonemail.com", "getonemail.net", "ghosttexter.de", "girlsundertheinfluence.com", "gishpuppy.com", "go.irc.so", "go2usa.info", "goemailgo.com", "gorillaswithdirtyarmpits.com", "gotmail.com", "gotmail.net", "gotmail.org", "gotti.otherinbox.com", "gowikibooks.com", "gowikicampus.com", "gowikicars.com", "gowikifilms.com", "gowikigames.com", "gowikimusic.com", "gowikinetwork.com", "gowikitravel.com", "gowikitv.com", "grandmamail.com", "grandmasmail.com", "great-host.in", "greensloth.com", "grr.la", "gsrv.co.uk", "guerillamail.biz", "guerillamail.com", "guerillamail.net", "guerillamail.org", "guerrillamail.biz", "guerrillamail.com", "guerrillamail.de", "guerrillamail.net", "guerrillamail.org", "guerrillamailblock.com", "gustr.com", "h.mintemail.com", "h8s.org", "hacccc.com", "haltospam.com", "harakirimail.com", "hartbot.de", "hatespam.org", "hellodream.mobi", "herp.in", "hidemail.de", "hidzz.com", "hmamail.com", "hochsitze.com", "hopemail.biz", "hot-mail.cf", "hot-mail.ga", "hot-mail.gq", "hot-mail.ml", "hot-mail.tk", "hotpop.com", "hulapla.de", "humn.ws.gy", "ieatspam.eu", "ieatspam.info", "ieh-mail.de", "ihateyoualot.info", "iheartspam.org", "ikbenspamvrij.nl", "imails.info", "imgof.com", "imstations.com", "inbax.tk", "inbound.plus", "inbox.si", "inboxalias.com", "inboxclean.com", "inboxclean.org", "inboxproxy.com", "incognitomail.com", "incognitomail.net", "incognitomail.org", "insorg-mail.info", "instant-mail.de", "instantemailaddress.com", "ip4.pp.ua", "ip6.pp.ua", "ipoo.org", "irish2me.com", "iroid.com", "iwi.net", "jetable.com", "jetable.fr.nf", "jetable.net", "jetable.org", "jnxjn.com", "jobbikszimpatizans.hu", "jourrapide.com", "jp.ftp.sh", "jsrsolutions.com", "junk1e.com", "junkmail.ga", "junkmail.gq", "kasmail.com", "kaspop.com", "keepmymail.com", "killmail.com", "killmail.net", "kimsdisk.com", "kingsq.ga", "kir.ch.tc", "klassmaster.com", "klassmaster.net", "klzlk.com", "kook.ml", "koszmail.pl", "kulturbetrieb.info", "kurzepost.de", "l33r.eu", "labetteraverouge.at", "lackmail.net", "lags.us", "landmail.co", "lastmail.co", "lastmail.com", "lazyinbox.com", "letthemeatspam.com", "lhsdv.com", "lifebyfood.com", "link2mail.net", "litedrop.com", "loadby.us", "loan101.pro", "login-email.cf", "login-email.ga", "login-email.ml", "login-email.tk", "loh.pp.ua", "lol.ovpn.to", "lookugly.com", "lopl.co.cc", "lortemail.dk", "lovemeleaveme.com", "lr7.us", "lr78.com", "lroid.com", "luv2.us", "m.ddcrew.com", "m4ilweb.info", "maboard.com", "mail-filter.com", "mail-temporaire.fr", "mail.by", "mail.mezimages.net", "mail114.net", "mail2rss.org", "mail333.com", "mail4trash.com", "mailbidon.com", "mailblocks.com", "mailbucket.org", "mailcat.biz", "mailcatch.com", "maildrop.cc", "maildrop.cf", "maildrop.ga", "maildrop.gq", "maildrop.ml", "maildx.com", "maileater.com", "mailed.ro", "mailexpire.com", "mailfa.tk", "mailforspam.com", "mailfree.ga", "mailfree.gq", "mailfree.ml", "mailfreeonline.com", "mailfs.com", "mailguard.me", "mailimate.com", "mailin8r.com", "mailinater.com", "mailinator.com", "mailinator.gq", "mailinator.net", "mailinator.org", "mailinator.us", "mailinator2.com", "mailincubator.com", "mailismagic.com", "mailjunk.cf", "mailjunk.ga", "mailjunk.gq", "mailjunk.ml", "mailjunk.tk", "mailmate.com", "mailme.gq", "mailme.ir", "mailme.lv", "mailme24.com", "mailmetrash.com", "mailmoat.com", "mailnator.com", "mailnesia.com", "mailnull.com", "mailpick.biz", "mailproxsy.com", "mailquack.com", "mailrock.biz", "mailsac.com", "mailscrap.com", "mailseal.de", "mailshell.com", "mailsiphon.com", "mailslapping.com", "mailslite.com", "mailtemp.info", "mailtothis.com", "mailzi.ru", "mailzilla.com", "mailzilla.org", "mailzilla.orgmbx.cc", "makemetheking.com", "manifestgenerator.com", "manybrain.com", "mbx.cc", "mciek.com", "mega.zik.dj", "meinspamschutz.de", "meltmail.com", "messagebeamer.de", "mezimages.net", "mfsa.ru", "mierdamail.com", "migmail.net", "migmail.pl", "migumail.com", "mintemail.com", "mjukglass.nu", "moakt.com", "mobi.web.id", "mobileninja.co.uk", "moburl.com", "mohmal.com", "moncourrier.fr.nf", "monemail.fr.nf", "monmail.fr.nf", "monumentmail.com", "mor19.uu.gl", "ms9.mailslite.com", "msa.minsmail.com", "mt2009.com", "mt2014.com", "mx0.wwwnew.eu", "my.efxs.ca", "my10minutemail.com", "mycleaninbox.net", "myemailboxy.com", "mymail-in.net", "mymailoasis.com", "mynetstore.de", "mypacks.net", "mypartyclip.de", "myphantomemail.com", "myspaceinc.com", "myspaceinc.net", "myspaceinc.org", "myspacepimpedup.com", "myspamless.com", "mytemp.email", "mytempemail.com", "mytrashmail.com", "neomailbox.com", "nepwk.com", "nervmich.net", "nervtmich.net", "netmails.com", "netmails.net", "netzidiot.de", "neverbox.com", "nice-4u.com", "nmail.cf", "no-spam.ws", "nobulk.com", "noclickemail.com", "nogmailspam.info", "nomail.xl.cx", "nomail2me.com", "nomorespamemails.com", "nonspam.eu", "nonspammer.de", "noref.in", "nospam.wins.com.br", "nospam.ze.tc", "nospam4.us", "nospamfor.us", "nospamthanks.info", "notmailinator.com", "notsharingmy.info", "nowhere.org", "nowmymail.com", "ntlhelp.net", "nurfuerspam.de", "nus.edu.sg", "nutpa.net", "nwldx.com", "objectmail.com", "obobbo.com", "odaymail.com", "olypmall.ru", "one-time.email", "oneoffemail.com", "oneoffmail.com", "onewaymail.com", "online.ms", "oopi.org", "opayq.com", "ordinaryamerican.net", "oshietechan.link", "otherinbox.com", "ourklips.com", "outlawspam.com", "ovpn.to", "owlpic.com", "pancakemail.com", "paplease.com", "pcusers.otherinbox.com", "pepbot.com", "pfui.ru", "phpbb.uu.gl", "pimpedupmyspace.com", "pjjkp.com", "plexolan.de", "po.bot.nu", "poczta.onet.pl", "poh.pp.ua", "politikerclub.de", "poofy.org", "pookmail.com", "postacin.com", "privacy.net", "privy-mail.com", "privymail.de", "proxymail.eu", "prtnx.com", "prtz.eu", "punkass.com", "putthisinyourspamdatabase.com", "pwrby.com", "qasti.com", "qisdo.com", "qisoa.com", "qs.dp76.com", "quickinbox.com", "quickmail.nl", "radiku.ye.vc", "rcpt.at", "reallymymail.com", "receiveee.chickenkiller.com", "receiveee.com", "recode.me", "reconmail.com", "recursor.net", "recyclemail.dk", "regbypass.com", "regbypass.comsafe-mail.net", "rejectmail.com", "remail.cf", "remail.ga", "rhyta.com", "rk9.chickenkiller.com", "rklips.com", "rmqkr.net", "royal.net", "rppkn.com", "rtrtr.com", "ruffrey.com", "rx.dred.ru", "rx.qc.to", "s0ny.net", "safe-mail.net", "safersignup.de", "safetymail.info", "safetypost.de", "sandelf.de", "saynotospams.com", "scatmail.com", "schafmail.de", "selfdestructingmail.com", "selfdestructingmail.org", "sendspamhere.com", "sharedmailbox.org", "sharklasers.com", "shieldedmail.com", "shiftmail.com", "shitmail.de", "shitmail.me", "shitmail.org", "shitware.nl", "shortmail.net", "shotmail.ru", "showslow.de", "sibmail.com", "sinnlos-mail.de", "siteposter.net", "skeefmail.com", "slaskpost.se", "slave-auctions.net", "slopsbox.com", "slushmail.com", "smashmail.de", "smellfear.com", "smellrear.com", "snakemail.com", "sneakemail.com", "snkmail.com", "sofimail.com", "sofort-mail.de", "softpls.asia", "sogetthis.com", "sohu.com", "soisz.com", "solvemail.info", "soodomail.com", "soodonims.com", "spam-be-gone.com", "spam.la", "spam.su", "spam4.me", "spamavert.com", "spambob.com", "spambob.net", "spambob.org", "spambog.com", "spambog.de", "spambog.net", "spambog.ru", "spambooger.com", "spambox.info", "spambox.irishspringrealty.com", "spambox.us", "spamcannon.com", "spamcannon.net", "spamcero.com", "spamcon.org", "spamcorptastic.com", "spamcowboy.com", "spamcowboy.net", "spamcowboy.org", "spamday.com", "spamdecoy.net", "spamex.com", "spamfighter.cf", "spamfighter.ga", "spamfighter.gq", "spamfighter.ml", "spamfighter.tk", "spamfree.eu", "spamfree24.com", "spamfree24.de", "spamfree24.eu", "spamfree24.info", "spamfree24.net", "spamfree24.org", "spamgoes.in", "spamgourmet.com", "spamgourmet.net", "spamgourmet.org", "spamherelots.com", "spamhereplease.com", "spamhole.com", "spamify.com", "spaminator.de", "spamkill.info", "spaml.com", "spaml.de", "spammotel.com", "spamobox.com", "spamoff.de", "spamsalad.in", "spamslicer.com", "spamspot.com", "spamstack.net", "spamthis.co.uk", "spamthisplease.com", "spamtrail.com", "spamtroll.net", "speed.1s.fr", "spikio.com", "spoofmail.de", "spybox.de", "squizzy.de", "sr.ro.lt", "ss.undo.it", "ssoia.com", "startkeys.com", "stinkefinger.net", "stop-my-spam.cf", "stop-my-spam.com", "stop-my-spam.ga", "stop-my-spam.ml", "stop-my-spam.tk", "streetwisemail.com", "stuffmail.de", "sudolife.me", "sudolife.net", "sudomail.biz", "sudomail.com", "sudomail.net", "sudoverse.com", "sudoverse.net", "sudoweb.net", "sudoworld.com", "sudoworld.net", "supergreatmail.com", "supermailer.jp", "superrito.com", "superstachel.de", "suremail.info", "svk.jp", "sweetxxx.de", "t.psh.me", "tafmail.com", "tagyourself.com", "talkinator.com", "tapchicuoihoi.com", "teewars.org", "teleworm.com", "teleworm.us", "temp-mail.com", "temp-mail.de", "temp-mail.org", "temp.bartdevos.be", "temp.emeraldwebmail.com", "temp.headstrong.de", "tempail.com", "tempalias.com", "tempe-mail.com", "tempemail.biz", "tempemail.co.za", "tempemail.com", "tempemail.net", "tempinbox.co.uk", "tempinbox.com", "tempmail.co", "tempmail.it", "tempmail2.com", "tempmaildemo.com", "tempmailer.com", "tempomail.fr", "temporarily.de", "temporarioemail.com.br", "temporaryemail.net", "temporaryemail.us", "temporaryforwarding.com", "temporaryinbox.com", "tempsky.com", "tempthe.net", "tempymail.com", "thanksnospam.info", "thankyou2010.com", "thecloudindex.com", "thisisnotmyrealemail.com", "thrma.com", "throam.com", "thrott.com", "throwawayemailaddress.com", "throwawaymail.com", "tilien.com", "tittbit.in", "tmail.ws", "tmailinator.com", "toiea.com", "toomail.biz", "tradermail.info", "trash-amil.com", "trash-mail.at", "trash-mail.cf", "trash-mail.com", "trash-mail.de", "trash-mail.ga", "trash-mail.gq", "trash-mail.ml", "trash-mail.tk", "trash2009.com", "trash2010.com", "trash2011.com", "trashdevil.com", "trashdevil.de", "trashemail.de", "trashmail.at", "trashmail.com", "trashmail.de", "trashmail.me", "trashmail.net", "trashmail.org", "trashmail.ws", "trashmailer.com", "trashymail.com", "trashymail.net", "trayna.com", "trbvm.com", "trbvn.com", "trbvo.com", "trickmail.net", "trillianpro.com", "tryalert.com", "turoid.com", "turual.com", "twinmail.de", "twoweirdtricks.com", "ty.ceed.se", "tyldd.com", "ubismail.net", "uggsrock.com", "umail.net", "unmail.ru", "upliftnow.com", "uplipht.com", "uroid.com", "username.e4ward.com", "ux.dob.jp", "ux.uk.to", "valemail.net", "venompen.com", "veryrealemail.com", "vfemail.net", "vidchart.com", "viditag.com", "viewcastmedia.com", "viewcastmedia.net", "viewcastmedia.org", "vkcode.ru", "vomoto.com", "vps30.com", "vp.ycare.de", "vubby.com", "walala.org", "walkmail.net", "walkmail.ru", "we.qq.my", "webemail.me", "webm4il.info", "webuser.in", "wee.my", "wefjo.grn.cc", "weg-werf-email.de", "wegwerf-email-addressen.de", "wegwerf-emails.de", "wegwerfadresse.de", "wegwerfemail.de", "wegwerfmail.de", "wegwerfmail.info", "wegwerfmail.net", "wegwerfmail.org", "wegwerpmailadres.nl", "wetrainbayarea.com", "wetrainbayarea.org", "wh4f.org", "whatiaas.com", "whatpaas.com", "whatsaas.com", "whopy.com", "whtjddn.33mail.com", "whyspam.me", "wickmail.net", "wilemail.com", "willselfdestruct.com", "winemaven.info", "wmail.cf", "wollan.info", "wovz.cu.cc", "wr.moeri.org", "wronghead.com", "wuzup.net", "wuzupmail.net", "www.e4ward.com", "www.gishpuppy.com", "www.mailinator.com", "wwwnew.eu", "xagloo.com", "xemaps.com", "xents.com", "xing886.uu.gl", "xmaily.com", "xoxox.cc", "xoxy.net", "xww.ro", "xyzfree.net", "yapped.net", "yeah.net", "yep.it", "yert.ye.vc", "yogamaven.com", "yomail.info", "yopmail.com", "yopmail.fr", "yopmail.gq", "yopmail.net", "youmail.ga", "ypmail.webarnak.fr.eu.org", "yuurok.com", "za.com", "ze.gally.jp", "zehnminutenmail.de", "zetmail.com", "zippymail.info", "zoaxe.com", "zoemail.com", "zoemail.net", "zoemail.org", "zomg.info", "zxcv.com", "zxcvbnm.com", "zzz.com"]; + + $mail = explode('@', $email)[1]; + return in_array($mail, $emailList); + } + + public function isRegistered($email) + { + $registered = $this->db->query('SELECT * FROM users WHERE email = ?', [$email])->result_array(); + + return !empty($registered); + } + + public function isAvailable($username) + { + $registered = $this->db->query('SELECT * FROM users WHERE username = lower(?) OR original_name = lower(?)', [$username, $username])->result_array(); + + if (empty($registered)) { + return ''; + } + return '
    Fehler bei der Eingabe! Nutzername ist bereits vergeben!
    '; + + } + + public function register($username, $email, $password, $login_method) + { + $encryptedPassword = $this->LoginModel->getPasswordHash($password, strtolower($username)); + $activation_key = hash("sha512", uniqid(rand(), true)) . hash("sha512", uniqid(rand(), true)); + $this->db->query('INSERT INTO users (original_name, username, displayname, login_method, password, email, rank, is_activated, activation_key) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', [strtolower($username), strtolower($username), $username, $login_method, $encryptedPassword, $email, 1, false, $activation_key]); + + $this->db->cache_delete('admin', 'users'); + + // TODO: TRANSLATE + $message = "Hallo, bitte aktiviere deinen Account: " . base_url('activate/' . md5($email) . '/' . $activation_key); + // TODO: Send email + mail($email, "Registrierung auf KingOfDogTV.de", $message); + + // Send notification + $createdUser = $this->db->query('SELECT ID FROM users WHERE username = ?', [$username])->result_array(); + $this->NotificationModel->rankNotificationNewUserRegistered($createdUser[0]['ID'], 10); + } + + public function autoLogin() + { + if (isset($_SESSION['loggedOut']) && $_SESSION['loggedOut']) { + return; + } + if (!isset($_SESSION['user']) && isset($_COOKIE['rememberMe']) && isset($_COOKIE['token'])) { + $logindata = $this->getLoginData(base64_decode($_COOKIE['rememberMe'])); + if (!empty($logindata)) { + $logindata = $logindata[0]; + $token = $this->getUserHash($logindata['username'], $logindata['password'], $logindata['email'], $logindata['ID']); + + if ($_COOKIE['token'] == $token) { + $this->startLoginSession($logindata, 'on'); + } + } + } + } + + public function hashMailExists($emailHash, $activation_key) + { + $results = $this->db->query('SELECT ID FROM users WHERE MD5(email) = ? AND is_activated = 0 AND activation_key = ?', [$emailHash, $activation_key])->result_array(); + if (!empty($results)) { + return $results[0]['ID']; + } else { + return NULL; + } + } + + public function activateMail($id) + { + $this->db->query('UPDATE users SET is_activated = 1, activation_key = NULL WHERE ID = ? LIMIT 1', [$id]); + + // Clear cached queries + $username = $this->db->query('SELECT username FROM users WHERE ID = ?', [$id])->result_array(); + $this->db->cache_delete('admin', 'users'); + $this->db->cache_delete('users', $username[0]['username']); + } + + public function changeMailAddress($email, $username) + { + $activation_key = hash("sha512", uniqid(rand(), true)) . hash("sha512", uniqid(rand(), true)); + $this->db->query('UPDATE users SET email = lower(?), is_activated = FALSE, activation_key = ? WHERE username = ?', [$email, $activation_key, $username]); + $this->db->cache_delete('admin', 'users'); + } + + public function changePassword($newPassword, $original_name) + { + $encryptedPassword = $this->getPasswordHash($newPassword, $original_name); + $this->db->query('UPDATE users SET password = ? WHERE original_name = ?', [$encryptedPassword, $original_name]); + } + + public function checkPassword($password) + { + if (!$this->checkPasswordLength($password) || !$this->checkPasswordComposition($password)) { + return false; + } + return true; + } + + public function checkPasswordLength($password) + { + return strlen($password) >= 8; + } + + public function checkPasswordComposition($password) + { + $passwordArr = str_split($password); + $lower = $upper = $num = $special = 0; + foreach ($passwordArr as $char) { + if ($char >= 'a' && $char <= 'z') { + $lower++; + continue; + } + if ($char >= 'A' && $char <= 'Z') { + $upper++; + continue; + } + if ($char >= '0' && $char <= '9') { + $num++; + continue; + } + $special++; + } + return $lower > 0 && $upper > 0 && $num > 0 && $special > 0; + } + + public function createForgetPasswordKey($username) { + $activation_key = hash("sha512", uniqid(rand(), true)) . hash("sha512", uniqid(rand(), true)); + $this->db->query('UPDATE users SET forget_password_key = ? WHERE username = ?', [$activation_key, $username]); + return $activation_key; + } + + public function resetKeyIsValid($username, $resetKey) { + $result = $this->db->query('SELECT forget_password_key FROM users WHERE username = ?', [$username])->result_array(); + return !empty($result) && $result[0]['forget_password_key'] == $resetKey; + } + + public function unsetResetKey($id) { + $this->db->query('UPDATE users SET forget_password_key = NULL WHERE ID = ?', [$id]); + } +} diff --git a/application/models/MessageModel.php b/application/models/MessageModel.php new file mode 100644 index 0000000..1e782b7 --- /dev/null +++ b/application/models/MessageModel.php @@ -0,0 +1,35 @@ +db->query('SELECT feedback.*, feedback_states.name feedbackStateName, feedback_states.displayname feedbackStateDisplayname, users.username username, users.displayname userDisplayname, supporter.username supporterUsername, supporter.displayname supporterDisplayname FROM feedback LEFT JOIN feedback_states ON feedback.feedbackState = feedback_states.ID LEFT JOIN users ON feedback.userID = users.ID LEFT JOIN users supporter ON feedback.supporterID = supporter.ID ORDER BY feedbackState ASC, datetime DESC')->result_array(); + } + + public function setFeedbackSupporter($feedbackID, $userID, $feedbackState = 1) { + if($feedbackState == 0) + $feedbackState = 1; + $this->db->query('UPDATE feedback SET feedbackState = ?, supporterID = ?, lastStateUpdate = NOW() WHERE ID = ?', [$feedbackState, $userID, $feedbackID]); + } + + public function updateState($feedbackID, $userID, $feedbackState) { + $this->db->query('UPDATE feedback SET feedbackState = (SELECT ID FROM feedback_states WHERE name = ?), lastStateUpdate = NOW() WHERE ID = ? AND supporterID = ?', [$feedbackState, $feedbackID, $userID]); + } + + public function archiveFeedback($feedbackID) { + $data = $this->db->query('SELECT * FROM feedback WHERE ID = ? AND feedbackState >= 10', [$feedbackID])->result_array(); + + if(!empty($data)) { + $this->db->query('INSERT INTO feedback_archive (ID, page, message, datetime, anonymous, userID, email, feedbackState, feedbackStatusMessage, supporterID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', $data[0]); + } + + return !empty($data); + } +} \ No newline at end of file diff --git a/application/models/MinecraftModel.php b/application/models/MinecraftModel.php new file mode 100644 index 0000000..387a59c --- /dev/null +++ b/application/models/MinecraftModel.php @@ -0,0 +1,101 @@ +id; + $name = $json->name; + return [$uuid, $name, false]; + } + } + public function getIcon($user) { + return "https://crafatar.com/avatars/" . $user . "?overlay&size=64&default=MHF_Alex"; + } + public function getRender($user) { + return "https://crafatar.com/renders/body/" . $user . "?overlay&scale=7&default=MHF_Alex"; + } + public function serverIcon($server) { + return "https://craftapi.com/api/server/favicon/" . $server; + } + public function getServerName($server) { + $json = json_decode(@file_get_contents('https://craftapi.com/api/server/info/' . $server)); + + if(!empty($json->error) || empty($json)) { + return lang('servers_error_ip'); + } else { + return $json->server; + } + } + public function getPlayers($server) { + $json = json_decode(@file_get_contents('https://craftapi.com/api/server/info/' . $server)); + + if (!empty($json->error)) { + return lang('servers_error'); + } else { + $online = $json->players->online; + $max = $json->players->max; + $ping = floatval($json->latency) * 1000; + $version = $json->version->name; + + if($online < $max) { + $color = "#00AA00"; + } else { + $color = "#FFAA00"; + } + + return [$online, $max, $color, $ping, $version]; + } + } + public function getMOTD($server) { + $json = json_decode(@file_get_contents('https://craftapi.com/api/server/info/' . $server)); + + if(!empty($json->error) || empty($json)) { + return lang('servers_error'); + } else { + return $json->motd; + } + } + public function getHistory($uuid) { + $json = json_decode(@file_get_contents('https://craftapi.com/api/user/namehistory/' . $uuid)); + + $return = ''; + if(!empty($json)) { + foreach($json as $element) { + $name = $element->name; + + if(!empty($element->changedToAt)) { + $milliseconds = floatval($element->changedToAt); + $date = date("d.m.Y \u\m H:i:s", $milliseconds/1000); + $changedtoat = $date . " Uhr"; + } else { + $changedtoat = "" . lang('player_original_name') . ""; + } + + $return .= "" . $name . "" . $changedtoat . ""; + } + return $return; + } else { + return null; + } + } + + public function formatUUID($uuid) { + $return = $uuid; + $return = substr_replace($return, '-' . $uuid[8], 8, -23); + $return = substr_replace($return, '-' . $uuid[12], 13, -19); + $return = substr_replace($return, '-' . $uuid[16], 18, -15); + $return = substr_replace($return, '-' . $uuid[20], 23, -11); + + return $return; + } +} diff --git a/application/models/NicknameModel.php b/application/models/NicknameModel.php new file mode 100644 index 0000000..3c69fc3 --- /dev/null +++ b/application/models/NicknameModel.php @@ -0,0 +1,105 @@ + $letter) { + $letter = strtolower($letter); + if (!array_key_exists($key + 1, $letters)) { + continue; + } + $nextLetter = strtolower($letters[$key + 1]); + if (!(array_key_exists($letter, $table) && array_key_exists($nextLetter, $table[$letter]))) { + $table[$letter][$nextLetter] = 1; + continue; + } + $table[$letter][$nextLetter] = $table[$letter][$nextLetter] + 1; + } + } + return $table; + } + + function generateMarkovName($table, $minLength = 3, $maxLength = 10) + { + $currentLetter = array_rand($table); + $text = [$currentLetter]; + $length = mt_rand($minLength, $maxLength); + for ($i = 0; $i < $length; $i++) { + $nextLetter = $this->getRandomWeightedElement($currentLetter, $table); + if (count($text) > 1) { + $previousLetter = $text[$i - 1]; + while ($previousLetter == $nextLetter) { + $nextLetter = $this->getRandomWeightedElement($currentLetter, $table); + } + } + $text[] = $nextLetter; + $currentLetter = $nextLetter; + } + return ucfirst(implode('', $text)); + } + + function getRandomWeightedElement($key, array $table) + { + if (array_key_exists($key, $table)) { + $weightedValues = $table[$key]; + $rand = mt_rand(1, (int) array_sum($weightedValues)); + foreach ($weightedValues as $key => $value) { + $rand -= $value; + if ($rand <= 0) { + return $key; + } + } + } + return array_rand($table); + } + + public function generateName() { + $names = [ + 'Gronkh', + 'Currywurst', + 'KingOfDog', + 'Zeybe', + 'unge', + 'Dner', + 'Arazhul', + 'Hopson', + 'Carykh', + 'Benx', + 'Demaster', + 'Manucraft', + 'Minecraft', + 'ProPlayer91', + 'Green', + 'Blue', + 'Red', + 'Ultra', + 'Pro', + 'Racing', + 'Shooter', + 'King', + 'Yellow', + 'Gold', + 'xXXx', + 'iTz_', + 'Running', + 'YT', + 'TV', + 'HD', + 'Huge', + 'Best', + 'imFlying', + 'Not' + ]; + $table = $this->generateMarkovTable($names); + echo str_pad($this->generateMarkovName($table, 4, 7), 12); + } +} diff --git a/application/models/NotificationModel.php b/application/models/NotificationModel.php new file mode 100644 index 0000000..f9f794a --- /dev/null +++ b/application/models/NotificationModel.php @@ -0,0 +1,211 @@ +lang->load('notification', 'de'); + $this->lang->load('notification', $_SESSION['site_lang']); + } + + public function getUserNotificationsRaw($userID, $limit = 20, $offset = 0) + { + $this->db->cache_off(); + $rawData = $this->db->query('SELECT n.*, count(*) count, s.username senderName, s.displayname senderDisplayname, s.profile_picture senderPicture, r.username recipientName, r.displayName recipientDisplayname FROM notifications n LEFT JOIN users s ON n.senderID = s.ID LEFT JOIN users r ON n.recipientID = r.ID WHERE recipientID = ? GROUP BY type, referenceID ORDER BY createdAt DESC, unread DESC LIMIT ? OFFSET ?', [$userID, $limit, $offset])->result_array(); + + $notifications = []; + foreach ($rawData as $notification) { + $notificationGroup = ['count' => $notification['count']]; + + if ($notificationGroup['count'] == 1) { + $notificationGroup['items'] = [$notification]; + } else { + $notificationGroup['items'] = $this->db->query('SELECT n.*, s.username senderName, s.displayname senderDisplayname, s.profile_picture senderPicture, r.username recipientName, r.displayName recipientDisplayname FROM notifications n LEFT JOIN users s ON n.senderID = s.ID LEFT JOIN users r ON n.recipientID = r.ID WHERE recipientID = ? AND type = ? AND referenceID = ? LIMIT 5', [$userID, $notification['type'], $notification['referenceID']])->result_array(); + } + + $notifications[] = $notificationGroup; + } + + $this->db->cache_on(); + + return $notifications; + } + + public function getUserNotifications($userID, $limit = 20, $offset = 0) + { + $result = []; + foreach ($notifications = $this->get($userID, $limit, $offset) as $group) { + $date = strtotime($group->createdAt); + $messageData = $group->message(); + $result[] = [ + 'sender' => $group->sender->getName(), + 'unread' => $group->unread, + 'message' => sprintf(lang($messageData['line']), ...$messageData['attributes']), + 'link' => base_url($group->getNotificationLink()), + 'image' => base_url($group->getNotificationImage()), + 'time' => \Coduo\PHPHumanizer\DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$date"), $_SESSION['site_lang']) + ]; + } + + return $result; +// Mark as read + } + + private function add(Notification $notification) { + $results = $this->db->query('SELECT * FROM notifications WHERE referenceID = ? AND recipientID = ? AND senderID = ? AND type = ? AND parameters = ?', [$notification->referenceID, $notification->recipient->getID(), $notification->sender->getID(), $notification->type, $notification->parameters])->result_array(); + if(empty($results)) { + $this->db->insert('notifications', [ + 'recipientID' => $notification->recipient->getID(), + 'senderID' => $notification->sender->getID(), + 'unread' => 1, + 'type' => $notification->type, + 'parameters' => $notification->parameters, + 'referenceID' => $notification->referenceID, + 'createdAt' => date('Y-m-d H:i:s', time()) + ]); + } + $this->db->cache_delete('Main', 'getNotifications'); + } + + public function markAsRead(array $notifications) { + + } + + public function markUserNotificationsAsRead($userID) { + $this->db->query('UPDATE notifications SET unread = FALSE WHERE recipientID = ?', [$userID]); + } + + public function get($userID, $limit = 20, $offset = 0) { + $groups = []; + + $results = $this->getUserNotificationsRaw($userID, $limit, $offset); + foreach ($results as $group) { + $items = []; + foreach ($group['items'] as $item) { + switch ($item['type']) { + case 'users.newFollower': + $items[] = new \Notification\Users\NewFollowerNotification($item); + break; + case 'users.likedPost': + $items[] = new \Notification\Users\PostLikeNotification($item); + break; + case 'users.mentionedPost': + $items[] = new \Notification\Users\PostMentionNotification($item); + break; + case 'users.repliedPost': + $items[] = new \Notification\Users\PostReplyNotification($item); + break; + case 'admin.newUserRegistered': + $items[] = new \Notification\Admin\UserRegisteredNotification($item); + break; + case 'admin.feedback': + $items[] = new \Notification\Admin\NewFeedbackNotification($item); + break; + } + } + $groups[] = new NotificationGroup($items, $group['count']); + } + + return $groups; + } + + public function removeNotification($senderID, $recipientID, $referenceID, $type) + { + $this->db->query('DELETE FROM notifications WHERE senderID = ? AND recipientID = ? AND referenceID = ? AND type = ?', [$senderID, $recipientID, $referenceID, $type]); + $this->db->cache_delete('Main', 'getNotifications'); + } + + public function userNotificationNewFollower($senderID, $recipientID) { + $notification = new \Notification\Users\NewFollowerNotification([ + 'senderID' => $senderID, + 'recipientID' => $recipientID, + 'referenceID' => $recipientID + ]); + $this->add($notification); + } + + public function userNotificationPostLike($senderID, $recipientID, $postID, $postUuid) { + $notification = new \Notification\Users\PostLikeNotification([ + 'senderID' => $senderID, + 'recipientID' => $recipientID, + 'referenceID' => $postID, + 'parameters' => $postUuid + ]); + $this->add($notification); + } + + public function userNotificationPostMentioned($senderID, $recipientID, $postID, $postUuid) { + $notification = new \Notification\Users\PostMentionNotification([ + 'senderID' => $senderID, + 'recipientID' => $recipientID, + 'referenceID' => $postID, + 'parameters' => $postUuid + ]); + $this->add($notification); + } + + public function userNotificationPostReply($senderID, $recipientID, $postID, $postUuid) { + $notification = new \Notification\Users\PostReplyNotification([ + 'senderID' => $senderID, + 'recipientID' => $recipientID, + 'referenceID' => $postID, + 'parameters' => $postUuid + ]); + $this->add($notification); + } + + public function rankNotificationNewUserRegistered($senderID, $rankRecipientID) { + $rankUsers = $this->db->query('SELECT ID FROM users WHERE rank >= ?', [$rankRecipientID])->result_array(); + foreach ($rankUsers as $user) { + $notification = new \Notification\Admin\UserRegisteredNotification([ + 'senderID' => $senderID, + 'recipientID' => $user['ID'], + 'referenceID' => $senderID, + ]); + $this->add($notification); + } + } + + public function rankNotificationNewFeedback($senderID, $rankRecipientID, $pageName) { + $rankUsers = $this->db->query('SELECT ID FROM users WHERE rank >= ?', [$rankRecipientID])->result_array(); + foreach ($rankUsers as $user) { + $notification = new \Notification\Admin\NewFeedbackNotification([ + 'senderID' => $senderID, + 'recipientID' => $user['ID'], + 'referenceID' => base_convert(md5($pageName), 16, 10) % 9999 + ]); + $this->add($notification); + } + } + + public function rankNotificationPostReport($senderID, $rankRecipientID, $postID, $postUUID) { + $rankUsers = $this->db->query('SELECT ID FROM users WHERE rank >= ?', [$rankRecipientID])->result_array(); + foreach ($rankUsers as $user) { + $notification = new \Notification\Users\PostReportNotification([ + 'senderID' => $senderID, + 'recipientID' => $user['ID'], + 'referenceID' => $postID, + 'parameters' => $postUUID + ]); + $this->add($notification); + } + } + + } + + + diff --git a/application/models/PostsModel.php b/application/models/PostsModel.php new file mode 100644 index 0000000..9567d68 --- /dev/null +++ b/application/models/PostsModel.php @@ -0,0 +1,378 @@ +load->model('UserModel', '', TRUE); + $this->load->model('NotificationModel', '', TRUE); + } + + function addPost($userID, $content) + { + return $this->addReply($userID, $content, NULL); + } + + public function addReply($userID, $content, $replyToUUID) + { + $content = $this->preparePostContent($content); + $uuid = $this->generatePostUUID($userID, $content); + $replyTo = NULL; + if ($replyToUUID !== NULL) { + $replyToID = $this->db->query('SELECT ID FROM user_posts WHERE uuid = ?', [$replyToUUID])->result_array(); + $replyTo = !empty($replyToID) ? $replyToID[0]['ID'] : NULL; + } + $this->db->query('INSERT INTO user_posts (user_id, content, uuid, reply_to) VALUES (?, ?, ?, ?)', [$userID, $content, $uuid, $replyTo]); + + + $insertedPost = $this->db->query('SELECT ID, user_id FROM user_posts WHERE uuid = ?', [$uuid])->result_array(); + $this->addPostMentions($insertedPost[0]['ID'], $content, $uuid); + $this->addPostHashtags($insertedPost[0]['ID'], $content); + + // Send notification to user whose post was replied to + if ($userID != $insertedPost[0]['user_id']) { + $this->NotificationModel->userNotificationPostReply($userID, $insertedPost[0]['user_id'], $insertedPost[0]['ID'], $uuid); + } + + return $insertedPost[0]['ID']; + } + + public function addImageToPost($postID, $imageUrl) { + $this->db->query('INSERT INTO user_posts_media (postID, mediaType, mediaUrl) VALUES (?, ?, ?)', [$postID, 'image', $imageUrl]); + } + + public function preparePostContent($content) + { + if ($this->endsWith($content, '
     ')) { + $content = substr($content, 0, strlen($content) - 10); + } + $content = htmlspecialchars($content); + return $content; + } + + function endsWith($haystack, $needle) + { + $length = strlen($needle); + + return $length === 0 || + (substr($haystack, -$length) === $needle); + } + + function generatePostUUID($userID, $content) + { + return md5($userID . $content . date("Y-m-d H:i:s")); + } + + public function addPostMentions($postID, $content, $postUUID) + { + preg_match_all('/@([A-Za-z0-9._]+)/', $content, $mentions, PREG_OFFSET_CAPTURE); + foreach ($mentions[1] as $mention) { + $mentionedUser = $this->UserModel->getUserIDByUsername(strtolower($mention[0])); + if ($mentionedUser == null) { + continue; + } + $mentionedUser = $mentionedUser[0]; + $this->addMention($postID, $_SESSION['user']['ID'], $mentionedUser['ID'], $mention[1], $postUUID); + } + } + + public function addMention($postID, $userID, $mentionedUserID, $position, $postUUID) + { + $this->db->query('INSERT INTO user_posts_mentions (userID, postID, mentionedUserID, position) VALUES (?, ?, ?, ?)', [$userID, $postID, $mentionedUserID, $position]); + + // Send notification + $this->NotificationModel->userNotificationPostMentioned($userID, $mentionedUserID, $postID, $postUUID); + } + + public function addPostHashtags($postID, $content) + { + preg_match_all('/#([A-Za-z0-9]+)/', $content, $hashtags, PREG_OFFSET_CAPTURE); + foreach ($hashtags[1] as $hashtag) { + $this->addHashtag($postID, $_SESSION['user']['ID'], $hashtag[0], $hashtag[1]); + } + } + + public function addHashtag($postID, $userID, $hashtag, $position) + { + $this->db->query('INSERT INTO user_posts_hashtags (userID, postID, hashtag, position) VALUES (?, ?, ?, ?)', [$userID, $postID, $hashtag, $position]); + } + + function getUserPosts($id, $count, $offset, $maxLength = 250) + { + $this->db->cache_off(); + $posts = $this->db->query('SELECT * FROM user_posts p WHERE user_id = ? ORDER BY date DESC LIMIT ? OFFSET ?', [$id, $count, $offset])->result_array(); + $this->db->cache_on(); + + $posts = $this->preparePostList($posts, $maxLength); + + return $posts; + } + + public function preparePostList($postList, $maxLength = 250) + { + foreach ($postList as $i => $post) { + $post = $this->mergePostUserData($post); + + $post['replyCount'] = $this->getPostReplyCountByID($post['ID']); + $post['likeCount'] = $this->getPostLikeCountByID($post['ID']); + if ($maxLength > 0) { + $post['content'] = strlen($post['content']) > $maxLength ? substr($post['content'], 0, $maxLength) . '...' : $post['content']; + } + $post['content'] = $this->mergePostMentionsHashtags($post['ID'], $post['content']); + $post['media'] = $this->getPostMedia($post['ID']); + + if (isset($_SESSION['user']) && !empty($_SESSION['user'])) { + $post = $this->mergeUserHasLiked($post, $_SESSION['user']['ID']); + } + + if($post['reply_to'] != NULL) { + $post = $this->mergeReplyData($post); + } + + $postList[$i] = $post; + } + + $postList = $this->UserModel->setDefaultImages($postList); + + return $postList; + } + + public function getPostMedia($postID) { + $result = $this->db->query('SELECT * FROM user_posts_media WHERE postID = ?', [$postID])->result_array(); + return $result; + } + + private function mergePostUserData($post) + { + $user = $this->UserModel->getUserByID($post['user_id']); + $user = $user[0]; + + $post['username'] = $user['username']; + $post['displayname'] = $user['displayname']; + $post['profile_picture'] = $user['profile_picture']; + return $post; + } + + public function getPostReplyCountByID($postID) + { + $this->db->cache_off(); + $data = $this->db->query('SELECT count(*) replyCount FROM user_posts WHERE reply_to = ?', [$postID])->result_array(); + $this->db->cache_on(); + + return $data[0]['replyCount']; + } + + public function getPostLikeCountByID($id) + { + $this->db->cache_off(); + $data = $this->db->query('SELECT count(*) likeCount FROM user_posts_likes WHERE postID = ?', [$id])->result_array(); + $this->db->cache_on(); + return $data[0]['likeCount']; + } + + private function mergePostMentionsHashtags($postID, $content) + { + $mentions = $this->db->query('SELECT m.*, u.username, u.displayname FROM user_posts_mentions m LEFT JOIN users u ON m.mentionedUserID = u.ID WHERE postID = ?', [$postID])->result_array(); + $hashtags = $this->db->query('SELECT * FROM user_posts_hashtags WHERE postID = ?', [$postID])->result_array(); + + $links = array_merge($mentions, $hashtags); + usort($links, function ($a, $b) { + return $a['position'] - $b['position']; + }); + + $finalContent = ''; + $prevPos = 0; + foreach ($links as $link) { + $finalContent .= substr($content, $prevPos, $link['position'] - $prevPos - 1); + + if (isset($link['username'])) { // Is link a mention? + $finalContent .= '@' . $link['displayname'] . ''; + $prevPos = $link['position'] + strlen($link['username']); + } else { // Link is a hashtag + $finalContent .= '#' . $link['hashtag'] . ''; + $prevPos = $link['position'] + strlen($link['hashtag']); + } + + if ($prevPos > strlen($content)) { + break; + } + + } + $finalContent .= substr($content, $prevPos, strlen($content) - $prevPos); + + return $finalContent; + } + + private function mergeUserHasLiked($post, $userID) + { + $this->db->cache_off(); + $data = $this->db->query('SELECT * FROM user_posts_likes WHERE postID = (SELECT ID FROM user_posts WHERE uuid = ?) AND likerUserID = ?', [$post['uuid'], $userID])->result_array(); + $this->db->cache_on(); + + if (empty($data)) { + $post['userHasLiked'] = FALSE; + } else { + $post['userHasLiked'] = TRUE; + } + return $post; + } + + private function mergeReplyData($post) { + $data = $this->db->query('SELECT uuid, username, displayname FROM user_posts LEFT JOIN users ON users.ID = user_posts.user_id WHERE user_posts.ID = ?', [$post['reply_to']])->result_array(); + $post['replyToUuid'] = $data[0]['uuid']; + $post['replyToUsername'] = $data[0]['username']; + $post['replyToDisplayname'] = $data[0]['displayname']; + + return $post; + } + + public function getNewestPosts($count, $maxLength = 250) + { + $this->db->cache_off(); + $data = $this->db->query('SELECT * FROM user_posts ORDER BY date DESC LIMIT ?', [$count])->result_array(); + $this->db->cache_on(); + + $data = $this->preparePostList($data, $maxLength); + + return $data; + } + + public function getFeedPosts($userID, $amount, $offset) + { + $this->db->cache_off(); + $data = $this->db->query('SELECT * FROM user_posts WHERE user_id IN (SELECT followedUserID FROM user_followers WHERE followerUserID = ?) OR ID IN(SELECT postID FROM user_posts_mentions WHERE mentionedUserID = ?) OR ID IN (SELECT postID FROM user_posts_likes WHERE likedUserID = ?) OR user_id = ? ORDER BY date DESC LIMIT ? OFFSET ?', [$userID, $userID, $userID, $userID, $amount, $offset])->result_array(); + $this->db->cache_on(); + + $data = $this->preparePostList($data); + + return $data; + } + + public function getPopularPosts($amount, $offset) + { + $this->db->cache_off(); + $data = $this->db->query('SELECT * FROM user_posts p ORDER BY ((SELECT count(*) FROM user_posts_likes WHERE postID = p.ID) + (SELECT count(*) FROM user_posts WHERE reply_to = p.ID)) DESC, date DESC LIMIT ? OFFSET ?', [$amount, $offset])->result_array(); + $this->db->cache_on(); + + $data = $this->preparePostList($data); + + return $data; + } + + public function getPostDetails($userID, $uuid) + { + $this->db->cache_off(); + $data = $this->db->query('SELECT * FROM user_posts WHERE user_id = ? AND uuid = ?', [$userID, $uuid])->result_array(); + $this->db->cache_on(); + + $data = $this->preparePostList($data); + + return $data; + } + + public function getPostReplies($postID) + { + $this->db->cache_off(); + $replies = $this->db->query('SELECT * FROM user_posts WHERE reply_to = ? ORDER BY date', [$postID])->result_array(); + $this->db->cache_on(); + + $replies = $this->preparePostList($replies); + + return $replies; + } + + public function getPostByUUID($uuid) { + $result = $this->db->query('SELECT * FROM user_posts WHERE uuid = ?', [$uuid])->result_array(); + return $result; + } + + public function addPostLikeByUUID($uuid, $userID) + { + $this->db->cache_off(); + $data = $this->db->query('SELECT * FROM user_posts_likes WHERE postID = (SELECT ID FROM user_posts WHERE uuid = ?) AND likerUserID = ?', [$uuid, $userID])->result_array(); + $this->db->cache_on(); + + // IDs needed for handling notifications later + $postUser = $this->db->query('SELECT ID FROM users WHERE ID = (SELECT user_id FROM user_posts WHERE uuid = ?)', [$uuid])->result_array(); + $postID = $this->db->query('SELECT ID FROM user_posts WHERE uuid = ?', [$uuid])->result_array(); + if (empty($data)) { + $this->db->query('INSERT INTO user_posts_likes (postID, likedUserID, likerUserID) VALUES ((SELECT ID FROM user_posts WHERE uuid = ?), (SELECT user_id FROM user_posts WHERE uuid = ?), ?)', [$uuid, $uuid, $userID]); + + // Send like notification + if ($postUser[0]['ID'] != $userID) { + $this->NotificationModel->userNotificationPostLike($userID, $postUser[0]['ID'], $postID[0]['ID'], $uuid); + } + + return true; + } else { + $this->db->query('DELETE FROM user_posts_likes WHERE postID = (SELECT ID FROM user_posts WHERE uuid = ?) AND likerUserID = ?', [$uuid, $userID]); + + // Remove existing notification + $this->NotificationModel->removeNotification($userID, $postUser[0]['ID'], $postID[0]['ID'], 'users.likedPost'); + + return false; + } + + } + + public function getPostLikeCountByUUID($uuid) + { + $this->db->cache_off(); + $data = $this->db->query('SELECT count(*) likeCount FROM user_posts_likes WHERE postID = (SELECT ID FROM user_posts WHERE uuid = ?)', [$uuid])->result_array(); + $this->db->cache_on(); + return $data[0]['likeCount']; + } + + public function isUUIDValid($uuid) + { + $this->db->cache_off(); + $data = $this->db->query('SELECT ID FROM user_posts WHERE uuid = ?', [$uuid])->result_array(); + $this->db->cache_on(); + return !empty($data); + } + + public function closeTags($html) + { + preg_match_all('#<(?!meta|img|br|hr|input\b)\b([a-z]+)(?: .*)?(?#iU', $html, $result); + $openedtags = $result[1]; + preg_match_all('##iU', $html, $result); + $closedtags = $result[1]; + $len_opened = count($openedtags); + if (count($closedtags) == $len_opened) { + return $html; + } + $openedtags = array_reverse($openedtags); + for ($i = 0; $i < $len_opened; $i++) { + if (!in_array($openedtags[$i], $closedtags)) { + $html .= ''; + } else { + unset($closedtags[array_search($openedtags[$i], $closedtags)]); + } + } + return $html; + } + + public function searchPosts($query, $limit = 20, $offset = 0) + { + $this->db->cache_off(); + $results = $this->db->query('SELECT * FROM user_posts WHERE content RLIKE ? OR (SELECT username FROM users WHERE ID = user_id) RLIKE ? ORDER BY (SELECT count(*) FROM user_posts_likes WHERE postID = ID) DESC, (SELECT count(*) FROM user_posts WHERE user_posts.reply_to = ID) DESC, date DESC LIMIT ? OFFSET ?', [$query, $query, $limit, $offset])->result_array(); + $this->db->cache_on(); + + $results = $this->preparePostList($results); + + return $results; + } + + public function reportPost($uuid, $reason, $reasonText) { + $this->db->query('INSERT INTO user_posts_reports (postID, reason, reasonText) VALUES ((SELECT ID FROM user_posts WHERE uuid = ?), ?, ?)', [$uuid, $reason, $reasonText]); + $this->db->cache_delete('admin', 'reports'); + + // Send notification + $postID = $this->db->query('SELECT ID FROM user_posts WHERE uuid = ?', [$uuid])->result_array(); + $this->NotificationModel->rankNotificationPostReport( + isset($_SESSION['user']) ? $_SESSION['user']['ID'] : -1, + 8, $postID[0]['ID'], $uuid); + } + } \ No newline at end of file diff --git a/application/models/ProjectsModel.php b/application/models/ProjectsModel.php new file mode 100644 index 0000000..2365921 --- /dev/null +++ b/application/models/ProjectsModel.php @@ -0,0 +1,207 @@ +load->model('projectsModel', '', TRUE); + } + + public function getEntries($category) { + if($category !== 'all') { + $content = $this->db->query('SELECT *, (SELECT (SELECT COUNT(*) FROM projects_entry_votes WHERE projectID = p.ID AND type = 1) - (SELECT COUNT(*) FROM projects_entry_votes WHERE projectID = p.ID AND type = -1)) voteCount FROM projects p WHERE ID IN (SELECT projectID FROM projects_entry_categories WHERE categoryID = ?) ORDER BY datetime DESC', [$category])->result_array(); + } else { + $content = $this->db->query('SELECT *, (SELECT (SELECT COUNT(*) FROM projects_entry_votes WHERE projectID = p.ID AND type = 1) - (SELECT COUNT(*) FROM projects_entry_votes WHERE projectID = p.ID AND type = -1)) voteCount FROM projects p ORDER BY datetime DESC')->result_array(); + } + + $content = $this->mergeTranslationData($content, $_SESSION['site_lang']); + + return $content; + } + + public function getCategories() { + $collections = $this->db->query('SELECT c.*, count(p.projectID) count FROM projects_categories c LEFT JOIN projects_entry_categories p ON c.ID = p.categoryID GROUP BY c.ID ORDER BY c.collection')->result_array(); + return $collections; + } + + public function editEntry($data, $id) { + $this->db->update('projects', $data, ['id' => $id]); + $this->db->cache_delete('projects', 'index'); + $this->db->cache_delete('projects', 'entry'); + $this->db->cache_delete('admin', 'projects'); + } + + public function addEntry($data) { + $this->db->insert('projects', $data); + $this->db->cache_delete('projects', 'index'); + $this->db->cache_delete('admin', 'projects'); + } + + public function delete($id) { + $this->db->query('DELETE FROM projects WHERE ID = ? LIMIT 1', [$id]); + $this->db->cache_delete('projects', 'index'); + $this->db->cache_delete('projects', 'entry'); + $this->db->cache_delete('admin', 'projects'); + } + + public function deleteCategory($id) { + $this->db->query('DELETE FROM projects_entry_categories WHERE categoryID = ?', [$id]); + $this->db->query('DELETE FROM projects_categories WHERE ID = ? LIMIT 1', [$id]); + $this->db->cache_delete('projects', 'index'); + $this->db->cache_delete('projects', 'entry'); + $this->db->cache_delete('admin', 'projects'); + } + + public function checkIfExists($id) { + $result = $this->db->query('SELECT ID FROM projects WHERE ID = ? LIMIT 1', [$id])->result_array(); + if(!empty($result)) { + return true; + } else { + return false; + } + } + + public function checkIfNameExists($name) { + $result = $this->db->query('SELECT ID FROM projects WHERE name = ? LIMIT 1', [$name])->result_array(); + if(!empty($result)) { + return true; + } else { + return false; + } + } + + public function getEntry($id) { + return $this->db->query('SELECT * FROM projects WHERE ID = ? LIMIT 1', [$id])->result_array(); + } + + public function getEntryByName($name, $lang = 'de') { + $result = $this->db->query('SELECT * FROM projects WHERE name = ? LIMIT 1', [$name])->result_array(); + + $result = $this->mergeTranslationData($result, $lang); + + return !empty($result) ? $result[0] : null; + } + + public function getEntryCategories($id) { + return $this->db->query('SELECT * FROM projects_categories WHERE ID IN (SELECT categoryID FROM projects_entry_categories WHERE projectID = ?)', [$id])->result_array(); + } + + public function resetEntryCategories($postID) { + $this->db->query('DELETE FROM projects_entry_categories WHERE projectID = ?', $postID); + $this->db->cache_delete('projects', 'index'); + $this->db->cache_delete('projects', 'entry'); + $this->db->cache_delete('admin', 'projects'); + } + + public function addCategoryToEntryID($postID, $categoryID) { + $this->db->query('INSERT INTO projects_entry_categories (projectID, categoryID) VALUES (?, ?)', [$postID, $categoryID]); + $this->db->cache_delete('projects', 'index'); + $this->db->cache_delete('projects', 'entry'); + $this->db->cache_delete('admin', 'projects'); + } + + public function updateCategories($postID, $categories) { + $this->resetEntryCategories($postID); + foreach ($categories as $category) { + $this->addCategoryToEntryID($postID, $category); + } + } + + public function addCategoryToEntryName($name, $categoryID) { + $id = $this->db->query('SELECT ID FROM projects WHERE name = ? LIMIT 1', [$name])->result_array()[0]; + $this->addCategoryToEntryID(intval($id['ID']), $categoryID); + } + + public function getPrevProject($id) { + $result = $this->db->query('SELECT * FROM projects WHERE datetime < (SELECT datetime FROM projects WHERE ID = ?) ORDER BY datetime DESC LIMIT 1', [$id])->result_array(); + + $result = $this->mergeTranslationData($result, $_SESSION['site_lang']); + + return $result; + } + + public function getNextProject($id) { + $result = $this->db->query('SELECT * FROM projects WHERE datetime > (SELECT datetime FROM projects WHERE ID = ?) ORDER BY datetime ASC LIMIT 1', [$id])->result_array(); + + $result = $this->mergeTranslationData($result, $_SESSION['site_lang']); + + return $result; + } + + public function addVote($projectID, $userID, $voteType) { + $this->db->query('DELETE FROM projects_entry_votes WHERE projectID = ? AND userID = ?', [$projectID, $userID]); + $this->db->query('INSERT INTO projects_entry_votes (projectID, userID, type) VALUES (?, ?, ?)', [$projectID, $userID, $voteType]); + $this->db->cache_delete('projects', 'index'); + $this->db->cache_delete('projects', 'entry'); + $this->db->cache_delete('projects', 'addVote'); + $this->db->cache_delete('admin', 'projects'); + } + + public function getVoteCount($projectID) { + $result = $this->db->query('SELECT (SELECT COUNT(*) FROM projects_entry_votes WHERE projectID = ? AND type = 1) - (SELECT COUNT(*) FROM projects_entry_votes WHERE projectID = ? AND type = -1) voteCount', [$projectID, $projectID])->result_array(); + return $result[0]['voteCount']; + } + + public function getUserVoteType($projectID, $userID) { + $result = $this->db->query('SELECT type FROM projects_entry_votes WHERE projectID = ? AND userID = ?', [$projectID, $userID])->result_array(); + if(empty($result)) + return 0; + return $result[0]['type']; + } + + public function createNewProjectDraft() { + $this->db->query('INSERT INTO projects () VALUES ()'); + + $this->db->cache_delete('admin', 'projects'); + + $data = $this->db->query('SELECT ID FROM projects ORDER BY ID DESC LIMIT 1')->result_array(); + return $data[0]['ID']; + } + + public function updateProject($id, $translations, $url, $download, $openSource, $customLink, $date, $image) { + $this->db->query('UPDATE projects SET name = ?, isDownloadable = ?, downloadLink = ?, isOpenSource = ?, openSourceLink = ?, customLink = ?, datetime = ?, source = ? WHERE ID = ?', [$url, $download['available'], $download['link'], $openSource['available'], $openSource['link'], $customLink['link'], $date, $image, $id]); + + $this->db->cache_off(); + foreach($translations as $lang => $translation) { + $data = $this->db->query('SELECT translationID FROM projects_translations WHERE projectID = ? AND lang = ?', [$id, $lang])->result_array(); + + if(empty($data)) { + $this->db->query('INSERT INTO projects_translations (projectID, lang) VALUES (?, ?)', [$id, $lang]); + + $data = $this->db->query('SELECT translationID FROM projects_translations WHERE projectID = ? AND lang = ?', [$id, $lang])->result_array(); + } + + $translationID = $data[0]['translationID']; + + $this->db->query('UPDATE projects_translations SET title = ?, description = ?, content = ?, downloadName = ?, openSourceName = ?, customLinkName = ? WHERE translationID = ?', array_merge($translation, [$download['name'], $openSource['name'], $customLink['name'], $translationID])); + } + $this->db->cache_on(); + + $this->db->cache_delete('admin', 'projects'); + $this->db->cache_delete('projects', 'index'); + $this->db->cache_delete('projects', 'entry'); + } + + public function mergeTranslationData($postList, $lang = 'de') { + foreach ($postList as $i => $post) { + $data = $this->db->query('SELECT * FROM projects_translations WHERE projectID = ? AND (lang = ? OR lang = ?) ORDER BY lang', [$post['ID'], 'de', $lang])->result_array(); + if(sizeof($data) == 1) { + $postList[$i] = array_merge($post, $data[0]); + continue; + } + + $merged = []; + foreach ($data[0] as $key => $value) { + if(($value == NULL && $data[1][$key] == NULL) || ($value != NULL && $data[1][$key] == NULL)) { + $merged[$key] = $value; + } else { + $merged[$key] = $data[1][$key]; + } + } + + $postList[$i] = array_merge($post, $merged); + } + return $postList; + } +} diff --git a/application/models/RedirectModel.php b/application/models/RedirectModel.php new file mode 100644 index 0000000..6ce5c27 --- /dev/null +++ b/application/models/RedirectModel.php @@ -0,0 +1,79 @@ +load->model('blogModel', '', TRUE); + } + + public function insertRedirect($url, $name, $temp = false, $expireDate = null) { + $result1 = $this->db->query('SELECT * FROM redirects WHERE redirect = ?', [$name])->result_array(); + + if(empty($result1)) { + $this->db->query('INSERT INTO redirects (url, redirect, temporary, expireDate) VALUES (?, ?, ?, ?)', [$url, $name, $temp, $expireDate]); + return ['feedback' => 'success']; + } else { + return ['feedback' => 'error', 'message' => 'Umleitungs-Code ist schon vergeben!']; + } + } + + public function editRedirect($id, $url, $name) { + $this->db->query('UPDATE redirects SET url = ? WHERE ID = ? AND redirect = ?', [$url, $id, $name]); + } + + public function removeRedirect($id) { + $this->db->query('DELETE FROM redirects WHERE ID = ?', [$id]); + } + + public function getUrl($name) { + $result1 = $this->db->query('SELECT * FROM redirects WHERE redirect = ?', [$name])->result_array(); + + if(empty($result1)) { + return base_url(); + } else { + $result = $result1[0]; + return $result['url']; + } + } + + public function getItems() { + $result = $this->db->query('SELECT * FROM redirects')->result_array(); + return $result; + } + + public function getName($url) { + $result = $this->db->query('SELECT * FROM redirects WHERE url = ?', [$url])->result_array(); + + if(empty($result)) { + return ''; + } else { + $result1 = $result[0]; + return $result1['redirect']; + } + } + + public function addRandomItem($url, $temporary, $temporaryTime) { + $alreadyExists = $this->getName($url); + if($alreadyExists == '') { + for($i = 0; $i < 1; $i++) { + $randomName = base64_encode($url); + $name = ''; + for($j = 0; $j < 5; $j++) { + $random = rand(0, strlen($randomName) - 1); + $name .= $randomName[$random]; + } + $expireDate = date('Y-m-d H:i:s', strtotime(date('Y-m-d H:i:s') . ' + ' . $temporaryTime . ' hours')); + if($this->insertRedirect($url, $name, $temporary, $expireDate)['feedback'] == 'success') { + return $this->getName($url); + } else { + $i--; + } + } + } else { + return $alreadyExists; + } + } + +} diff --git a/application/models/SocialMediaModel.php b/application/models/SocialMediaModel.php new file mode 100644 index 0000000..c6df1f2 --- /dev/null +++ b/application/models/SocialMediaModel.php @@ -0,0 +1,113 @@ +getSslPage($apiUrl)); + $items = $apiResult->items; + foreach ($items as $item) { + $snippet = $item->snippet; + $published = $snippet->publishedAt; + $author = $snippet->channelTitle; + $author_url = "https://youtube.com/channel/" . $snippet->channelId; + $title = $snippet->title; + if (isset($snippet->thumbnails->maxres->url)) $thumbnail = $snippet->thumbnails->maxres->url; + else $thumbnail = $snippet->thumbnails->standard->url; + $url = "http://youtu.be/" . $snippet->resourceId->videoId; + + $this->db->query('INSERT INTO social_posts (post_plattform, post_content, post_url, post_author, post_author_url, post_date, post_img_source) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE post_content = ?, post_img_source = ?;', ["YouTube", $title, $url, $author, $author_url, strtotime($published), $thumbnail, $title, $thumbnail]); + } + } + + public function getTwitterPosts() + { + $consumer_key = 'TsUzd4stukv9Ix7TGG7RdYq4k'; + $consumer_key_secret = 'sTRq4WcELJZuciTrkNUttGgWhEiGaUkuqNhISgaG4uHRFgzm0B'; + $access_token = '1880071790-Nij2RaBDVRGVWoWW2PSJUwAvuLAOaQFAAr5tAtC'; + $access_token_secret = 'ldhLg0SP3ycrrdIqhNcddj0042pdGY9vmZMKQJRClmDkD'; + + $oauth_hash = 'count=20&oauth_consumer_key=' . $consumer_key . '&oauth_nonce=' . time() . '&oauth_signature_method=HMAC-SHA1&oauth_timestamp=' . time() . '&oauth_token=' . $access_token . '&oauth_version=1.0'; + $base = 'GET&' . urlencode('https://api.twitter.com/1.1/statuses/user_timeline.json') . '&' . rawurlencode($oauth_hash); + $key = rawurlencode($consumer_key_secret) . '&' . rawurlencode($access_token_secret); + $signature = base64_encode(hash_hmac('sha1', $base, $key, true)); + $signature = rawurlencode($signature); + + $oauth_header = 'oauth_consumer_key="' . $consumer_key . '", oauth_nonce="' . time() . '", oauth_signature="' . $signature . '", oauth_signature_method="HMAC-SHA1", oauth_timestamp="' . time() . '", oauth_token="' . $access_token . '", oauth_version="1.0", '; + $curl_header = array("Authorization: Oauth {$oauth_header}", 'Expect:'); + + $curl_request = curl_init(); + curl_setopt($curl_request, CURLOPT_HTTPHEADER, $curl_header); + curl_setopt($curl_request, CURLOPT_HEADER, false); + curl_setopt($curl_request, CURLOPT_URL, 'https://api.twitter.com/1.1/statuses/user_timeline.json?count=20'); + curl_setopt($curl_request, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl_request, CURLOPT_SSL_VERIFYPEER, false); + $json = curl_exec($curl_request); + curl_close($curl_request); + + $posts = json_decode($json); + + + foreach ($posts as $post) { + $content = str_replace("\n", "
    ", $post->text); + $author = $post->user->screen_name; + $author_url = 'https://twitter.com/' . $author; + $url = $author_url . '/status/' . $post->id_str; + $published = strtotime($post->created_at); + $original_id = $post->id_str; + if (isset($post->extended_entities->media[0]->media_url)) { + $image = $post->extended_entities->media[0]->media_url; + } else { + $image = ''; + } + $this->db->query('INSERT INTO social_posts (post_plattform, post_content, post_url, post_author, post_author_url, post_date, post_img_source, post_original_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE post_content = ?, post_author_url = ?, post_original_id = ?;', ["Twitter", $content, $url, $author, $author_url, $published, $image, $original_id, $content, $author_url, $original_id]); + } + } + + public function getAllPosts() + { + $this->getTwitterPosts(); + $items = $this->db->query('SELECT * FROM social_posts ORDER BY post_date DESC')->result_array(); + return $items; + } + + public function getPosts($amount, $offset) + { + if($offset == 0) { + $items = $this->db->query('SELECT * FROM social_posts ORDER BY post_date DESC LIMIT ?', [$amount])->result_array(); + } else { + $items = $this->db->query('SELECT * FROM social_posts ORDER BY post_date DESC LIMIT ? OFFSET ?', [$amount, $offset])->result_array(); + } + return $items; + } + + public function getPostsOfCategory($amount, $offset, $category) { + if($offset == 0) { + $items = $this->db->query('SELECT * FROM social_posts WHERE post_plattform LIKE ? ORDER BY post_date DESC LIMIT ?', [$category, $amount])->result_array(); + } else { + $items = $this->db->query('SELECT * FROM social_posts WHERE post_plattform LIKE ? ORDER BY post_date DESC LIMIT ? OFFSET ?', [$category, $amount, $offset])->result_array(); + } + return $items; + } +} diff --git a/application/models/TwitchModel.php b/application/models/TwitchModel.php new file mode 100644 index 0000000..705e6b9 --- /dev/null +++ b/application/models/TwitchModel.php @@ -0,0 +1,47 @@ +load->model('BlogModel', '', TRUE); + $this->load->model('NotificationModel', '', TRUE); + } + + function getUser($username) + { + $result = $this->db->query('SELECT ID, username, displayname, email, rank, profile_picture, header_image, about, social_networks, showAds, date_created, gender, language, country, birthdate, birthyear, receiveEmails, receiveNewsletter FROM users WHERE username = ? AND is_activated = TRUE LIMIT 1', [$username])->result_array(); + if (empty($result)) { + return null; + } + $result = $this->setDefaultImages($result); + $result = $this->setRankname($result); + return $result; + } + + public function setDefaultImages($userList) + { + for ($i = 0; $i < sizeof($userList); $i++) { + if ((isset($userList[$i]['header_image']) && ($userList[$i]['header_image'] == '' || $userList[$i]['header_image'] == NULL)) || !isset($userList[$i]['header_image'])) { + $userList[$i]['header_image'] = substr(base_url(), 0, base_url() - 1) . ':3000/' . $userList[$i]['displayname']; + } + if (isset($userList[$i]['profile_picture']) && $userList[$i]['profile_picture'] == '') { + $userList[$i]['profile_picture'] = base_url('/f/8d204712d8132b36d765640ce775ce15'); + } + } + return $userList; + } + + public function setRankname($userList) + { + for ($i = 0; $i < sizeof($userList); $i++) { + if (isset($userList[$i]['rank'])) { + $userList[$i]['rankName'] = $this->GeneralModel->getRankName($userList[$i]['rank']); + } + } + return $userList; + } + + public function getUserIDByUsername($username) + { + $result = $this->db->query('SELECT ID FROM users WHERE username = ?', [$username])->result_array(); + return $result; + } + + public function mergeFollowerCount($users) { + foreach ($users as $i => $user) { + $this->db->cache_off(); + $followerCount = $this->db->query('SELECT count(*) followerCount FROM user_followers WHERE followedUserID = ?', [$user['ID']])->result_array(); + $this->db->cache_on(); + $users[$i]['followerCount'] = $followerCount[0]['followerCount']; + } + return $users; + } + + public function getFollowers($id) + { + $this->db->cache_off(); + $followers = $this->db->query('SELECT ID, followedSince, username, displayname, profile_picture, header_image FROM user_followers LEFT JOIN users ON ID = followerUserID WHERE followedUserID = ? ORDER BY followedSince DESC', [$id])->result_array(); + $this->db->cache_on(); + $followers = $this->setDefaultImages($followers); + $followers = $this->mergeFollowerCount($followers); + return $followers; + } + + function getUserByID($id) + { + $result = $this->db->query('SELECT ID, original_name, username, displayname, email, rank, profile_picture, header_image, is_activated, about, lastLogin, social_networks, showAds, date_created, gender, language, country, birthdate, birthyear, receiveEmails, receiveNewsletter FROM users WHERE ID = ? AND is_activated = TRUE LIMIT 1', [$id])->result_array(); + if (empty($result)) { + return null; + } + $result = $this->setDefaultImages($result); + $result = $this->setRankname($result); + return $result; + } + + public function getFollowing($id) + { + $this->db->cache_off(); + $following = $this->db->query('SELECT ID, followedSince, username, displayname, profile_picture, header_image FROM user_followers LEFT JOIN users ON ID = followedUserID WHERE followerUserID = ? ORDER BY followedSince DESC', [$id])->result_array(); + $this->db->cache_on(); + $following = $this->setDefaultImages($following); + $following = $this->mergeFollowerCount($following); + return $following; + } + + function getUserComments($id, $count, $offset) + { + $comments = $this->db->query('SELECT *, p.postUrl FROM blog_comments c LEFT JOIN blog_posts p ON p.postID = c.post_id WHERE user_id = ? ORDER BY date_created DESC LIMIT ? OFFSET ?', [$id, $count, $offset])->result_array(); + $comments = $this->BlogModel->mergePostTitleDesc($comments); + return $comments; + } + + function getUserBlogPosts($id, $count, $offset) + { + $posts = $this->db->query('SELECT * FROM blog_posts WHERE postIsDeleted = FALSE AND postState = 1 AND postAuthorID = ? ORDER BY postPublishDate DESC LIMIT ? OFFSET ?', [$id, $count, $offset])->result_array(); + $posts = $this->BlogModel->mergePostTitleDesc($posts); + return $posts; + } + + + function getUserStats($userID) + { + $result = []; + $this->db->cache_off(); + $user = $this->db->query('SELECT + COUNT(*) postCount, + (SELECT COUNT(*) + FROM user_followers + WHERE followedUserID = ?) followerCount, + (SELECT COUNT(*) + FROM user_followers + WHERE followerUserID = ?) followedCount +FROM user_posts +WHERE user_id = ?', [$userID, $userID, $userID])->result_array()[0]; + $result['postCount'] = $user['postCount']; + $result['followerCount'] = $user['followerCount']; + $result['followedCount'] = $user['followedCount']; + $blogResults = $this->db->query('SELECT COUNT(*) blogCount, (SELECT COUNT(*) FROM blog_comments WHERE user_id = ?) commentCount FROM blog_posts WHERE postIsDeleted = FALSE AND postState = 1 AND postAuthorID = ?', [$userID, $userID])->result_array()[0]; + $result['blogCount'] = $blogResults['blogCount']; + $result['commentCount'] = $blogResults['commentCount']; + $this->db->cache_on(); + return $result; + } + + function isFollowing($followerID, $followingID) + { + $this->db->cache_off(); + $response = $this->db->query('SELECT followedUserID FROM user_followers WHERE followerUserID = ? AND followedUserID = ?', [$followerID, $followingID])->result_array(); + $this->db->cache_off(); + return !empty($response); + } + + function unfollow($followerID, $followedID) + { + $this->db->query('DELETE FROM user_followers WHERE followerUserID = ? AND followedUserID = ?', [$followerID, $followedID]); + + // Remove notification + $this->NotificationModel->removeNotification($followerID, $followedID, $followedID, 'users.newFollower'); + } + + function follow($followerID, $followedID) + { + $this->db->query('INSERT INTO user_followers (followerUserID, followedUserID) VALUES (?, ?)', [$followerID, $followedID]); + + // Send notification to followed user + $this->NotificationModel->userNotificationNewFollower($followerID, $followedID); + } + + function updateProfile($data, $id) + { + $this->db->where('ID', $id); + $this->db->update('users', $data); + } + + function insertIntoHistory($data) + { + unset($data['date_created']); + $this->db->insert('users_history', $data); + } + + function getUserList($amount, $offset) + { + $data = $this->db->query('SELECT ID, username, displayname, rank, profile_picture, header_image, is_activated, showAds, receiveEmails, receiveNewsletter, date_created, isCurrentlyOnline, lastLogin, login_method, language, country, gender FROM users LIMIT ? OFFSET ?', [$amount, $offset])->result_array(); + $data = $this->setDefaultImages($data); + $data = $this->setRankname($data); + return $data; + } + + public function updateOnline($id) + { + $this->db->query('UPDATE users SET isCurrentlyOnline = 1, lastOnlineUpdate = NOW() WHERE ID = ? LIMIT 1', [$id]); + } + + function getActiveUsers($count) + { + $data = $this->db->query('SELECT username, displayname, profile_picture, lastLogin, (SELECT COUNT(*) FROM user_followers WHERE followedUserID = users.ID) follower_count FROM users WHERE isCurrentlyOnline = TRUE ORDER BY lastLogin DESC LIMIT ?', [$count])->result_array(); + $data = $this->setDefaultImages($data); + return $data; + } + + public function getNewestUsers($count) + { + $data = $this->db->query('SELECT username, displayname, profile_picture, date_created, (SELECT COUNT(*) FROM user_followers WHERE followedUserID = users.ID) follower_count FROM users ORDER BY date_created DESC LIMIT ?', [$count])->result_array(); + $data = $this->setDefaultImages($data); + return $data; + } + + public function searchUsers($query, $rank = '', $region = '', $lang = '', $amount = 3, $offset = 0) { + $conditions = []; + $inputs = []; + if($query !== '') { + $conditions[] = 'username RLIKE ?'; + $inputs[] = $query; + } + if($rank !== '') { + $conditions[] = 'rank = ?'; + $inputs[] = $rank; + } + if($region !== '') { + $conditions[] = 'country = ?'; + $inputs[] = $region; + } + if($lang !== '') { + $conditions[] = 'language = ?'; + $inputs[] = $lang; + } + + $dbClause = join(' AND ', $conditions); + $inputs[] = $amount; + $inputs[] = $offset; + $data = $this->db->query('SELECT username, displayname, profile_picture, header_image, about, rank FROM users WHERE ' . $dbClause . ' LIMIT ? OFFSET ?', $inputs)->result_array(); + + $data = $this->setDefaultImages($data); + $data = $this->setRankname($data); + + return $data; + } + + public function getAvailableCountries() { + return $this->db->query('SELECT country, count(*) countryUserCount FROM users WHERE country IS NOT NULL AND country != "" GROUP BY country ORDER BY country')->result_array(); + } + + public function getAvailableLanguages() { + return $this->db->query('SELECT language, count(*) langUserCount FROM users GROUP BY language ORDER BY language')->result_array(); + } + + } diff --git a/application/models/YoutubeDownloadModel.php b/application/models/YoutubeDownloadModel.php new file mode 100644 index 0000000..ed34348 --- /dev/null +++ b/application/models/YoutubeDownloadModel.php @@ -0,0 +1,92 @@ +loadHTML($fullpage); + $xpath = new DOMXPath($dom); + $tags = $xpath->query('//div[@class="info-description-body"]'); + foreach ($tags as $tag) { + $my_description .= (trim($tag->nodeValue)); + } + + return utf8_decode($my_description); + } + + function clean($string) { + $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens. + return preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars. + } + + function formatBytes($bytes, $precision = 2) { + $units = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); + $bytes = max($bytes, 0); + $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); + $pow = min($pow, count($units) - 1); + $bytes /= pow(1024, $pow); + return round($bytes, $precision) . ' ' . $units[$pow]; + } + function is_chrome(){ + $agent=$_SERVER['HTTP_USER_AGENT']; + if( preg_match("/like\sGecko\)\sChrome\//", $agent) ){ // if user agent is google chrome + if(!strstr($agent, 'Iron')) // but not Iron + return true; + } + return false; // if isn't chrome return false + } +} \ No newline at end of file diff --git a/application/models/YoutubePlayerModel.php b/application/models/YoutubePlayerModel.php new file mode 100644 index 0000000..543c757 --- /dev/null +++ b/application/models/YoutubePlayerModel.php @@ -0,0 +1,134 @@ +youtubePlayerModel->newestVids('15'); + + $return = ''; + + if (!empty($data)) { + foreach ($data as $row) { + $videoId = $row['contentDetails']; + $videoId = $videoId['videoId']; + $title = $this->youtubePlayerModel->getInfos($videoId)['title']; + + if ($id == $videoId) { + $return .= '
  • + +
    + ' . $title . ' +
    ' . $title . '
    +
    +
    +
  • '; + } else { + $return .= '
  • + +
    + ' . $title . ' +
    ' . $title . '
    +
    +
    +
  • '; + } + + +// if($id == $videoId) { +// $return .= '' .$title. ''; +// } else { +// $return .= '' .$title. ''; +// } + } + } else { + $return = null; + } + + return $return; + } + + public function newestVids($vidCount) + { + $data = $this->db->query('SELECT * FROM social_posts WHERE post_plattform = \'YouTube\' ORDER BY post_date DESC LIMIT ?', [$vidCount])->result_array(); + + if (!empty($data)) { + return $data; + } else { + return null; + } + } + + public function getInfos($id) + { + $data = json_decode(@file_get_contents('https://www.googleapis.com/youtube/v3/videos?part=snippet%2Cstatistics&hl=de&id=' . $id . '®ionCode=de&key=AIzaSyAZi6W9FODqd-bjlmV0sGJ8vjvSgFNTXVM'), true)['items']; + $data = $data[0]; + $infos = $data['snippet']; + $stats = $data['statistics']; + + $return = []; + + $return['title'] = $infos['title']; + $description = htmlspecialchars($infos['description']); + $descriptionList = explode(' ', $description); + $description = ''; + foreach ($descriptionList as $item) { + if (isset(parse_url($item)['scheme']) && isset(parse_url($item)['host'])) { + $description .= '' . $item . ' '; + } else { + if ($infos['channelTitle'] == 'KingOfDog') { + $items1 = ['✔️', '➕', '©']; + $items2 = ['

    ✔️', '
    ➕', '
    ©']; + $description .= str_replace($items1, $items2, $item) . ' '; + } else { + $description .= $item . ' '; + } + } + } + $return['description'] = $description; + $published = strtotime($infos['publishedAt']); + $return['published'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$published"), $_SESSION['site_lang']); + $return['channelName'] = $infos['channelTitle']; + $return['channelUrl'] = 'http://youtube.com/channel/' . $infos['channelId']; + $return['views'] = number_format($stats['viewCount'], 0, ',', '.'); + $return['likes'] = $stats['likeCount']; + $return['dislikes'] = $stats['dislikeCount']; + $return['comments'] = number_format($stats['commentCount'], 0, ',', '.'); + $rateCount = intval($return['likes']) + intval($return['dislikes']); + if (intval($return['likes']) > 0 && intval($return['dislikes']) > 0) { + $return['likeWidth'] = intval($return['likes']) / $rateCount * 100; + $return['dislikeWidth'] = intval($return['dislikes']) / $rateCount * 100; + $return['grayWidth'] = 0; + } elseif (intval($return['likes']) == 0 && intval($return['dislikes']) == 0) { + $return['likeWidth'] = 0; + $return['dislikeWidth'] = 0; + $return['grayWidth'] = 100; + } elseif (intval($return['likes']) == 0) { + $return['likeWidth'] = 0; + $return['dislikeWidth'] = 100; + $return['grayWidth'] = 0; + } else { + $return['likeWidth'] = 100; + $return['dislikeWidth'] = 0; + $return['grayWidth'] = 0; + } + $return['thumbnails'] = $infos['thumbnails']; + + return $return; + } + + public function checkVideo($videoID) + { + $data = json_decode(@file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=" . $videoID . "&key=AIzaSyAZi6W9FODqd-bjlmV0sGJ8vjvSgFNTXVM")); + return $data->pageInfo->totalResults !== 0; + } +} diff --git a/application/models/index.html b/application/models/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/models/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/application/models/notifications/NewFeedbackNotification.php b/application/models/notifications/NewFeedbackNotification.php new file mode 100644 index 0000000..da80e22 --- /dev/null +++ b/application/models/notifications/NewFeedbackNotification.php @@ -0,0 +1,46 @@ +sender->getProfilePicture(); + } + + public function messageForNotification(Notification $notification) + { + return ['line' => 'admin.feedback.single', 'attributes' => [$this->sender->getName()]]; + } + + public function messageForNotifications(array $notifications, $realCount = 0) + { + if ($realCount === 0) { + $realCount = count($notifications); + } + + if ($realCount < 5) { + $names = $this->manyNames($notifications); + return ['line' => 'admin.feedback.multiple', 'attributes' => [$names]]; + } else { + $names = $this->manyNamesCutoff($notifications, $realCount); + return ['line' => 'admin.feedback.many', 'attributes' => [$names]]; + } + } + } \ No newline at end of file diff --git a/application/models/notifications/NewFollowerNotification.php b/application/models/notifications/NewFollowerNotification.php new file mode 100644 index 0000000..540f74a --- /dev/null +++ b/application/models/notifications/NewFollowerNotification.php @@ -0,0 +1,46 @@ +recipient->getUsername() . '/followers'; + } + + public function getNotificationImage() + { + return $this->sender->getProfilePicture(); + } + + public function messageForNotification(Notification $notification) + { + return ['line' => 'users.newFollower.single', 'attributes' => [$this->sender->getName()]]; + } + + public function messageForNotifications(array $notifications, $realCount = 0) + { + if ($realCount === 0) { + $realCount = count($notifications); + } + + if ($realCount < 5) { + $names = $this->manyNames($notifications); + return ['line' => 'users.newFollower.multiple', 'attributes' => [$names]]; + } else { + $names = $this->manyNamesCutoff($notifications, $realCount); + return ['line' => 'users.newFollower.many', 'attributes' => [$names]]; + } + } + } \ No newline at end of file diff --git a/application/models/notifications/Notification.php b/application/models/notifications/Notification.php new file mode 100644 index 0000000..b9f07cb --- /dev/null +++ b/application/models/notifications/Notification.php @@ -0,0 +1,63 @@ +recipient = new NotificationUser($data['recipientID'], + isset($data['recipientName']) ? $data['recipientName'] : '', + isset($data['recipientDisplayname']) ? $data['recipientDisplayname'] : ($data['recipientID'] == -1 ? 'Anonym' : ($data['recipientID'] == -2 ? 'System' : 'Unbekannt'))); + + $this->sender = new NotificationUser($data['senderID'], + isset($data['senderName']) ? $data['senderName'] : '', + isset($data['senderDisplayname']) ? $data['senderDisplayname'] : ($data['senderID'] == -1 ? 'Anonym' : ($data['senderID'] == -2 ? 'System' : 'Unbekannt'))); + $this->sender->setProfilePicture(isset($data['senderPicture']) ? $data['senderPicture'] : ''); + + $this->unread = isset($data['unread']) ? $data['unread'] : 1; + $this->type = $data['type']; + $this->parameters = isset($data['parameters']) ? $data['parameters'] : ''; + $this->referenceID = $data['referenceID']; + $this->createdAt = isset($data['createdAt']) ? $data['createdAt'] : time(); + } + + public abstract function getNotificationLink(); + + public abstract function getNotificationImage(); + + public abstract function messageForNotification(Notification $notification); + + public abstract function messageForNotifications(array $notifications); + + public function message() + { + return $this->messageForNotification($this); + } + + protected function manyNames(array $names) { + $last = array_pop($names); + + $finalNames = ''; + foreach ($names as $name) { + $finalNames .= $name->sender->getName() . ', '; + } + + return sprintf(lang('notification.multiple'), substr($finalNames, 0, -2), $last->sender->getName()); + } + + protected function manyNamesCutoff(array $names, $realCount) { + list($first, $second) = array_slice($names, 0, 2); + + return sprintf(lang('notification.many'), $first->sender->getName(), $second->sender->getName(), $realCount); + } + } \ No newline at end of file diff --git a/application/models/notifications/NotificationGroup.php b/application/models/notifications/NotificationGroup.php new file mode 100644 index 0000000..a2e3c42 --- /dev/null +++ b/application/models/notifications/NotificationGroup.php @@ -0,0 +1,33 @@ +notifications = $notifications; + $this->realCount = $count; + } + + public function message() { + if($this->realCount == 1) { + return $this->notifications[0]->messageForNotification($this->notifications[0]); + } + return $this->notifications[0]->messageForNotifications($this->notifications, $this->realCount); + } + + public function __get($attribute) + { + return $this->notifications[0]->{$attribute}; + } + + public function __call($name, $arguments) + { + return call_user_func_array([$this->notifications[0], $name], $arguments); + } + } diff --git a/application/models/notifications/NotificationUser.php b/application/models/notifications/NotificationUser.php new file mode 100644 index 0000000..df195f5 --- /dev/null +++ b/application/models/notifications/NotificationUser.php @@ -0,0 +1,42 @@ +id = $id; + $this->username = $username; + $this->displayname = $displayname; + } + + public function getId() + { + return $this->id; + } + + public function getUsername() + { + return $this->username; + } + + public function getName() + { + return $this->displayname; + } + + public function getProfilePicture() + { + return $this->profilePicture; + } + + public function setProfilePicture($profilePicture) + { + $this->profilePicture = $profilePicture; + } + } \ No newline at end of file diff --git a/application/models/notifications/PostLikeNotification.php b/application/models/notifications/PostLikeNotification.php new file mode 100644 index 0000000..c3bce0f --- /dev/null +++ b/application/models/notifications/PostLikeNotification.php @@ -0,0 +1,46 @@ +recipient->getUsername() . '/post/' . $this->parameters; + } + + public function getNotificationImage() + { + return $this->sender->getProfilePicture(); + } + + public function messageForNotification(Notification $notification) + { + return ['line' => 'users.likedPost.single', 'attributes' => [$this->sender->getName()]]; + } + + public function messageForNotifications(array $notifications, $realCount = 0) + { + if ($realCount === 0) { + $realCount = count($notifications); + } + + if ($realCount < 5) { + $names = $this->manyNames($notifications); + return ['line' => 'users.likedPost.multiple', 'attributes' => [$names]]; + } else { + $names = $this->manyNamesCutoff($notifications, $realCount); + return ['line' => 'users.likedPost.many', 'attributes' => [$names]]; + } + + } + } \ No newline at end of file diff --git a/application/models/notifications/PostMentionNotification.php b/application/models/notifications/PostMentionNotification.php new file mode 100644 index 0000000..0460d53 --- /dev/null +++ b/application/models/notifications/PostMentionNotification.php @@ -0,0 +1,34 @@ +sender->getUsername() . '/post/' . $this->parameters; + } + + public function getNotificationImage() + { + return $this->sender->getProfilePicture(); + } + + public function messageForNotification(Notification $notification) + { + return ['line' => 'users.mentionedPost.single', 'attributes' => [$this->sender->getName()]]; + } + + public function messageForNotifications(array $notifications, $realCount = 0) + { + } + } \ No newline at end of file diff --git a/application/models/notifications/PostReplyNotification.php b/application/models/notifications/PostReplyNotification.php new file mode 100644 index 0000000..c90f3de --- /dev/null +++ b/application/models/notifications/PostReplyNotification.php @@ -0,0 +1,46 @@ +recipient->getUsername() . '/post/' . $this->parameters; + } + + public function getNotificationImage() + { + return $this->sender->getProfilePicture(); + } + + public function messageForNotification(Notification $notification) + { + return ['line' => 'users.repliedPost.single', 'attributes' => [$this->sender->getName()]]; + } + + public function messageForNotifications(array $notifications, $realCount = 0) + { + if ($realCount === 0) { + $realCount = count($notifications); + } + + if ($realCount < 5) { + $names = $this->manyNames($notifications); + return ['line' => 'users.replied.multiple', 'attributes' => [$names]]; + } else { + $names = $this->manyNamesCutoff($notifications, $realCount); + return ['line' => 'users.replied.many', 'attributes' => [$names]]; + } + } + + } \ No newline at end of file diff --git a/application/models/notifications/PostReportNotification.php b/application/models/notifications/PostReportNotification.php new file mode 100644 index 0000000..3125b72 --- /dev/null +++ b/application/models/notifications/PostReportNotification.php @@ -0,0 +1,46 @@ +recipient->getUsername() . '/post/' . $this->parameters; + } + + public function getNotificationImage() + { + return $this->recipient->getProfilePicture(); + } + + public function messageForNotification(Notification $notification) + { + return ['line' => 'users.reportedPost.single', 'attributes' => [$this->recipient->getName()]]; + } + + public function messageForNotifications(array $notifications, $realCount = 0) + { + if ($realCount === 0) { + $realCount = count($notifications); + } + + if ($realCount < 5) { + $names = $this->manyNames($notifications); + return ['line' => 'users.reportedPost.multiple', 'attributes' => [$names]]; + } else { + $names = $this->manyNamesCutoff($notifications, $realCount); + return ['line' => 'users.reportedPost.many', 'attributes' => [$names]]; + } + } + } \ No newline at end of file diff --git a/application/models/notifications/UserRegisteredNotification.php b/application/models/notifications/UserRegisteredNotification.php new file mode 100644 index 0000000..a2f3ca9 --- /dev/null +++ b/application/models/notifications/UserRegisteredNotification.php @@ -0,0 +1,34 @@ +sender->getUsername(); + } + + public function getNotificationImage() + { + return $this->sender->getProfilePicture(); + } + + public function messageForNotification(Notification $notification) + { + return ['line' => 'admin.newUserRegistered.single', 'attributes' => [$this->sender->getName()]]; + } + + public function messageForNotifications(array $notifications, $realCount = 0) + { + } + } \ No newline at end of file diff --git a/application/third_party/index.html b/application/third_party/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/third_party/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/application/views/404.php b/application/views/404.php new file mode 100644 index 0000000..6d2969d --- /dev/null +++ b/application/views/404.php @@ -0,0 +1,42 @@ + + + +
    +
    + +

    4:04 Uhr - Die Seite konnte nicht erreicht werden!

    +

    Bitte hinterlassen Sie eine Nachricht oder versuchen Sie es später erneut!

    + Auflegen +
    +
    + + +
    +
    + +

    4.04. - Es wird Geschichte geschrieben!

    +

    Aber nicht auf dieser Seite... na los sieh dich weiter um!

    + Abenteuer erleben +
    +
    + + +
    +
    + +

    Sie haben 404 neue Nachrichten!

    +

    Aber nicht auf dieser Seite... na los sieh dich weiter um!

    + Ignorieren +
    +
    + \ No newline at end of file diff --git a/application/views/about.php b/application/views/about.php new file mode 100644 index 0000000..bfd48b5 --- /dev/null +++ b/application/views/about.php @@ -0,0 +1,60 @@ + + +
    +
    +
    +
    +

    +

    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +

    +
    + +
    +

    +

    + +
    +
    +

    +
    +
    + +
    +
    +
    + +
    +
    +

    +

    +
    +
    +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/application/views/ad.php b/application/views/ad.php new file mode 100644 index 0000000..b7f152a --- /dev/null +++ b/application/views/ad.php @@ -0,0 +1,141 @@ + + +

    Sponsored

    + + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + + + diff --git a/application/views/admin/blog_edit.php b/application/views/admin/blog_edit.php new file mode 100644 index 0000000..042b635 --- /dev/null +++ b/application/views/admin/blog_edit.php @@ -0,0 +1,247 @@ + +
    +
    +
    +
    +
    + +
    +
    +
    +

    Blog-Post bearbeiten

    +
    +
    +
    + + + + + + +
    +
    +
    +
    +
    + +
    +
    +
    + +

    +

    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Zusatzinformationen

    +
    +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + + +
    + +
    + + +
    +
    +
    + +
    +
    +

    Übersetzungen

    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + + + diff --git a/application/views/admin/blog_history.php b/application/views/admin/blog_history.php new file mode 100644 index 0000000..3d10562 --- /dev/null +++ b/application/views/admin/blog_history.php @@ -0,0 +1,59 @@ + +
    +
    +
    +
    +
    +
    +

    Blog-Post History

    +
    +
    +
    +
    + $items): ?> +
    +

    + +
    + +
    +
    +
    +
    +
    +
    +
    diff --git a/application/views/admin/blog_posts.php b/application/views/admin/blog_posts.php new file mode 100644 index 0000000..4bc4550 --- /dev/null +++ b/application/views/admin/blog_posts.php @@ -0,0 +1,144 @@ + +
    +
    +
    +
    +
    +
    +

    Blog-Posts

    +
    +
    +
    +

    + +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IDTitelBeschreibungStatusVeröffentlichungLetzte ÄnderungAuthorKategorieAufrufeLikesKommentareAktionen
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    +
    +
    +
    +
    +
    + diff --git a/application/views/admin/blog_tags.php b/application/views/admin/blog_tags.php new file mode 100644 index 0000000..221869a --- /dev/null +++ b/application/views/admin/blog_tags.php @@ -0,0 +1,59 @@ + +
    +
    +
    +
    +
    +
    +

    Blog-Tags

    +
    +
    +
    +

    + Hier sind alle existierenden Blog-Tags aufgelistet. +

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    IDTagHäufigkeitGesamte AufrufeAktionen
    + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/application/views/admin/calendar.php b/application/views/admin/calendar.php new file mode 100644 index 0000000..e848348 --- /dev/null +++ b/application/views/admin/calendar.php @@ -0,0 +1,100 @@ + + +
    +
    +
    +
    +
    +
    +

    Kalender

    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    +
    + \ No newline at end of file diff --git a/application/views/admin/dashboard.php b/application/views/admin/dashboard.php new file mode 100644 index 0000000..a18fabf --- /dev/null +++ b/application/views/admin/dashboard.php @@ -0,0 +1,20 @@ + +
    +
    +
    +
    +
    +

    Dashboard

    +
    +
    +
    + +
    +
    +
    +
    +
    + diff --git a/application/views/admin/download_edit.php b/application/views/admin/download_edit.php new file mode 100644 index 0000000..518b951 --- /dev/null +++ b/application/views/admin/download_edit.php @@ -0,0 +1,61 @@ + +
    +
    +
    +
    +
    +
    +

    Download-Eintrag bearbeiten

    +
    +
    +
    +
    +
    + +
    + + +
    + +
    + + +
    + +
    + + + +
    + +
    + + +
    +
    +
    + +
    + + +
    + +
    + + +
    +
    + +
    +
    +
    +
    +
    +
    +
    diff --git a/application/views/admin/downloads.php b/application/views/admin/downloads.php new file mode 100644 index 0000000..9e66fa1 --- /dev/null +++ b/application/views/admin/downloads.php @@ -0,0 +1,49 @@ + +
    +
    +
    +
    +
    +
    +

    Downloads

    +
    +
    +
    +

    + Hier sind alle derzeitigen Downloads zu finden! +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    IDTitelBeschreibungBildDatumURLTools
    +
    +
    +
    +
    +
    +
    + diff --git a/application/views/admin/feedback.php b/application/views/admin/feedback.php new file mode 100644 index 0000000..44a6139 --- /dev/null +++ b/application/views/admin/feedback.php @@ -0,0 +1,126 @@ + + +
    +
    +
    +
    +
    +
    +

    Feedbacks

    +
    +
    +
    +

    + Hier sind alle bisher erhaltenden Feedback-Meldungen der Nutzer aufgelistet. +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IDDatumSeiteNachrichtAnonym?NutzerEmail-AdresseStatusStatus-NachrichtSupporterTools
    + + Ja' : ' Nein' ?> + + + + + + + + + + + + + + + = 10): ?> + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/application/views/admin/files.php b/application/views/admin/files.php new file mode 100644 index 0000000..99eaf4e --- /dev/null +++ b/application/views/admin/files.php @@ -0,0 +1,229 @@ + +
    +
    +
    +
    +
    +
    +

    Dateien

    +
    +
    +
    +

    + Hier sind alle bisher hochgeladenen Dateien zu finden! +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    IDNameOriginaler NameTypGrößePfadTools
    + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +

    Datei-Upload

    +
    +
    +
    +

    + Das ist zum Hochladen von allen wichtigen Dateien für den Server! +

    +
    + +
    +
    + + + + Add files... + + + + + + + + +
    + +
    + +
    +
    +
    + +
     
    +
    +
    + + + + +
    +
    + File input +
    + + +
    + +
    +
    +
    +
    +
    +
    +
    + + + diff --git a/application/views/admin/files_footer.php b/application/views/admin/files_footer.php new file mode 100644 index 0000000..197f85a --- /dev/null +++ b/application/views/admin/files_footer.php @@ -0,0 +1,22 @@ + + +
    +
    + KingOfDog Admin Panel | © 2016 KingOfDog +
    +
    +
    + + + + + + + + + + diff --git a/application/views/admin/footer.php b/application/views/admin/footer.php new file mode 100644 index 0000000..ab2bdb6 --- /dev/null +++ b/application/views/admin/footer.php @@ -0,0 +1,45 @@ + + +
    +
    + KingOfDog Admin Panel | © KingOfDog +
    +
    +
    + + + + + + + + + + + + diff --git a/application/views/admin/project_edit.php b/application/views/admin/project_edit.php new file mode 100644 index 0000000..14ae673 --- /dev/null +++ b/application/views/admin/project_edit.php @@ -0,0 +1,230 @@ + +
    +
    +
    +
    +
    +
    +

    Projekt bearbeiten

    +
    +
    +
    +
    + + + + +
    + +
    +
    + +
    +
    + +
    +
    + + +
    + +
    + + " /> +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    + + +
    + + +
    + +
    + + +
    + +
    + +
    + +
    +
    +
    +
    + +
    + + +
    + +
    + + +
    + +
    + +
    + +
    +
    +
    +
    + +
    + + +
    + +
    + + +
    + +
    + +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    diff --git a/application/views/admin/projects.php b/application/views/admin/projects.php new file mode 100644 index 0000000..ad4eac5 --- /dev/null +++ b/application/views/admin/projects.php @@ -0,0 +1,149 @@ + + +
    +
    +
    +
    +
    +
    +

    Projekte

    +
    +
    +
    +

    + Alle derzeit vorhandenen Einträge im Portfolio sind hier aufgelistet +

    +
    + + + + + + + + + + + + + + + projectsModel->getEntryCategories($entry['ID']); + $pCategoriesList = ""; + foreach ($pCategories as $pCategory) { + $pCategoriesList .= $pCategory['displayname'] . "
    "; + } + ?> + + + + + + + + + + + + + +
    IDNameTitelKategorieHeadlineDatumBildTools
    + + + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +

    Projekt-Kategorien

    +
    +
    +
    +

    + Alle derzeit vorhandenen Kategorien sind hier aufgelistet +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    IDNameTitel - DeutschTitel - EnglishTitel - FranzösischAnzahl EinträgeTools
    + +
    + +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/application/views/admin/projects_category_edit.php b/application/views/admin/projects_category_edit.php new file mode 100644 index 0000000..9ae950d --- /dev/null +++ b/application/views/admin/projects_category_edit.php @@ -0,0 +1,89 @@ + +
    +
    +
    +
    +
    +
    +

    Blog-Post bearbeiten

    +
    +
    +
    +
    + +
    +
    + + value=""/> +
    +
    + +
    +
    + +
    + https://www.kingofdog.de/blog/post/ + value="" > +
    +
    +
    + +
    + + +
    + +
    + + +
    + +
    + + value=""/> +
    +
    +
    + + +
    +
    style="display:none"> +
    + + +
    +
    + + +
    + +
    +
    +
    + + value=""> +
    + +
    + + +
    + + +
    +
    +
    +
    +
    +
    +
    diff --git a/application/views/admin/redirects.php b/application/views/admin/redirects.php new file mode 100644 index 0000000..1470609 --- /dev/null +++ b/application/views/admin/redirects.php @@ -0,0 +1,97 @@ + +
    +
    +
    +
    +
    +
    +

    Weiterleitungen

    +
    +
    +
    +

    + Hier sind alle derzeitigen Weiterleitungen (Short-Links) auf andere Seiten zu finden! +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    IDRedirectURLDatumTemporärAblauf-DatumTools
    + + + + Ja' : ' Nein' ?> + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Weiterleitung hinzufügen

    +
    +
    +
    +

    + Füge eine neue Weiterleitung hinzu. +

    +
    + +
    + + +
    +
    + + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + diff --git a/application/views/admin/sidebar.php b/application/views/admin/sidebar.php new file mode 100644 index 0000000..404af6c --- /dev/null +++ b/application/views/admin/sidebar.php @@ -0,0 +1,269 @@ + + + + + + + + + + + <?= $title; ?> | KingOfDog Admin Panel + + + + + + + + + + +
    +
    + + + +
    + +
    + + +
    +
    diff --git a/application/views/admin/user_details.php b/application/views/admin/user_details.php new file mode 100644 index 0000000..3fc8bab --- /dev/null +++ b/application/views/admin/user_details.php @@ -0,0 +1,90 @@ + +
    +
    +
    +
    +
    +
    +

    Details zum Nutzer

    +
    +
    +
    +
    +
    + +
    +
    +

    + +

    + Account erstellt: + + () +

    +

    Originaler Name:

    +
    +
    +
    +

    + Letzer Login: + + + () +

    +

    + E-Mail-Adresse: + + + +

    +

    + Rang: + "Nutzer", 1 => "Registrierter Nutzer", 2 => "Premium-Nutzer", 3 => "Plus-Nutzer", 6 => "Autor", 7 => "Editor", 8 => "Moderator", 9 => "Semi-Admin", 10 => "Admin"]; ?> + +

    +

    + Geschlecht: + 'Männlich', 'female' => 'Weiblich', 'other' => 'Anderes', '' => 'Nicht Angegeben'] ?> + +

    +

    + Aktiviert? + Ja' : 'Nein' ?> +

    +

    + Zeige Werbung? + Ja' : 'Nein' ?> +

    +

    + Biographie + +

    +

    + Sprache: + +

    +

    + Land: + +

    +

    + Erhalte E-Mails? + Ja' : 'Nein' ?> +

    +

    + Erhalte Newsletter? + Ja' : 'Nein' ?> +

    +
    +
    +
    +
    +
    +
    +
    diff --git a/application/views/admin/user_settings.php b/application/views/admin/user_settings.php new file mode 100644 index 0000000..67dccaa --- /dev/null +++ b/application/views/admin/user_settings.php @@ -0,0 +1,81 @@ + +
    +
    +
    +
    +
    +

    Einstellungen von dem Nutzer

    +
    +
    +
    +
    +
    + Rang +
    + + + + + + + + +
    + + Nutzer: + Der Standard-Rang für alle registrierten Nutzer. Kann Kommentare schreiben, Posts veröffentlichen und Nutzern folgen. +
    + Premium: + Erhält man nach einer Spende in jeglicher Höhe. Kann Werbung deaktivieren und alle Funktionen des normalen Nutzers. +
    + Plus: + Kann nur manuell vergeben werden. Vorgesehen für YouTuber, sehr aktive Nutzer, großzügige Spender, Freunde und ähnliches. Hat alle Funktionen der vorherigen Ränge. +
    + Autor: + Vor allem für den Blog-Bereich. Kann dort Artikel veröffentlichen und seine eigenen bearbeiten. Zusätzlich hat er alle Funktionen der vorherigen Ränge. Kann nur manuell vergeben werden, z.B. an aktive Post-Schreiber. +
    + Editor: + Vor allem für den Blog-Bereich. Kann wie der Autor Artikel schreiben, allerdings kann er auch Artikel von anderen verändern. Zusätzlich hat er alle Funktionen der vorherigen Ränge. Kann nur manuell vergeben werden, z.B. an sehr aktive Autoren. +
    + Moderator: + Hauptaufgabe: Soll Nutzern bei Fragen und Problemen helfen. Kann neben den Funktionen der vorhergenden Ränge auch Nutzerposts löschen oder Nutzer verwarnen. Wird manuell ernannt. +
    + Semi-Admin: + Hat beinahe unbegrenzten Zugriff mit nur leichten Einschränken. Kann Nutzern alle Ränge (außer Semi-Admin & höher) vergeben. Ist nicht dazu in der Lage, persönliche Informationen von Nutzern zu sehen oder Website-Statistiken einzusehen. +
    + Admin: + Unbeschränkter Zugriff auf alle Funktionen. +
    + +
    +
    +
    +
    +
    +
    diff --git a/application/views/admin/users.php b/application/views/admin/users.php new file mode 100644 index 0000000..4f7d115 --- /dev/null +++ b/application/views/admin/users.php @@ -0,0 +1,136 @@ + +
    +
    +
    +
    +
    +

    Alle Nutzer

    +
    +
    +
    +

    + Alle registrierten Nutzer dieser Plattform sind hier aufgelistet! +

    +
    + + + + + + + + + + + + + + + + + + + + + + M"; + else if ($user['gender'] == "female") + $gender = " W"; + else if ($user['gender'] == 'other') + $gender = ' A'; + + $loginMethods = [ + 0 => "Standard", + 1 => "Google", + 2 => "Twitter", + 3 => "GitHub" + ]; + $loginMethod = $loginMethods[$user['login_method']]; + + $date_created = strtotime($user['date_created']); + $last_login = strtotime($user['lastLogin']); + $date_created_str = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$date_created"), "de_DE"); + $last_login_str = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$last_login"), "de_DE"); + ?> + + + + + + + + + + + + + + + + + + + +
    IDNicknameSexRangErstelltLogoAkt.?Ads?Mails?Newsletter?Online?Login-MethodeLetzter LoginSprache, LandTools
    + + + + + + + + + + + +
    + () +
    + Profilbild + + Ja" : " Nein" ?> + + Ja' : ' Nein' ?> + + Ja' : ' Nein' ?> + + Ja' : ' Nein' ?> + + Ja" : " Nein" ?> + + + + +
    + () +
    + +
    + +
    + = 8 && ($_SESSION['user']['rank'] > $user['rank'] || $_SESSION['user']['rank'] == 10)): ?> + + + + + + + +
    +
    +
    +
    +
    +
    +
    + diff --git a/application/views/ajax_upload_result.php b/application/views/ajax_upload_result.php new file mode 100644 index 0000000..1fb96c4 --- /dev/null +++ b/application/views/ajax_upload_result.php @@ -0,0 +1,23 @@ + + + + +JustBoil's Result Page + + + + + + +Result: + + + diff --git a/application/views/blank.php b/application/views/blank.php new file mode 100644 index 0000000..bfe32c2 --- /dev/null +++ b/application/views/blank.php @@ -0,0 +1,16 @@ + + + + +JustBoil's Blank + + + + + +

    + + + diff --git a/application/views/blog/comment.php b/application/views/blog/comment.php new file mode 100644 index 0000000..5d5d7d8 --- /dev/null +++ b/application/views/blog/comment.php @@ -0,0 +1,27 @@ + +
  • > +
    +
    + + + +
    +
    +
    +

    + von + + + + / + +

    +

    + +

    +
    +
    +
    +
  • \ No newline at end of file diff --git a/application/views/blog/first.php b/application/views/blog/first.php new file mode 100644 index 0000000..d1b8483 --- /dev/null +++ b/application/views/blog/first.php @@ -0,0 +1,72 @@ + +
    +
    + +
    + diff --git a/application/views/blog/pagination.php b/application/views/blog/pagination.php new file mode 100644 index 0000000..8a936fc --- /dev/null +++ b/application/views/blog/pagination.php @@ -0,0 +1,15 @@ + + + diff --git a/application/views/blog/post.php b/application/views/blog/post.php new file mode 100644 index 0000000..f3787aa --- /dev/null +++ b/application/views/blog/post.php @@ -0,0 +1,262 @@ + + +
    + + +
    +
    + +

    + +

    + + + + +
    + +

    +

    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +

    + + Tags +

    +
    + + + + +
    +
    +
    +

    + +

    + + load->view('network/user/user_overview_card', [ + 'noContainer' => true, + 'username' => $postAuthorUsername, + 'displayname' => $postAuthorDisplayname, + 'profile_picture' => $postAuthorProfilePicture, + 'header_image' => $postAuthorHeaderImage, + 'about' => $postAuthorAbout]) + ?> +
    +
    +
    +
    + +
    +
    +
    +

    +

    + +
    +
    +
    + +
    +
    +
    +
    +

    + () +

    +
      +
    +
    +
    +
    +
    + +
    +
    +
    +

    + +

    +
    + +
    +
    +
    + + +
    +
    + +
    + +

    + + +
    + +
    + +
    + + + + + + + + +
    +
    + +
    +
    + + + diff --git a/application/views/blog/postList.php b/application/views/blog/postList.php new file mode 100644 index 0000000..278c642 --- /dev/null +++ b/application/views/blog/postList.php @@ -0,0 +1,17 @@ + +
    +
    +
      +
      + load->view('blog/postListEntry', $item); + } ?> +
      +
        +
        +
        +
        +
        + diff --git a/application/views/blog/postListEntry.php b/application/views/blog/postListEntry.php new file mode 100644 index 0000000..456130d --- /dev/null +++ b/application/views/blog/postListEntry.php @@ -0,0 +1,40 @@ + +
        + + +
        +
        + +
        + + +

        +
        +
        +
        +

        +
        +
        + + + +
        +
        +
        +
        diff --git a/application/views/blog/postListError.php b/application/views/blog/postListError.php new file mode 100644 index 0000000..41fc50b --- /dev/null +++ b/application/views/blog/postListError.php @@ -0,0 +1,22 @@ + + +
        +
        +
          +
          +

          +

          + + + . +

          + +
          +
            +
            +
            + + + \ No newline at end of file diff --git a/application/views/csgo-tools.php.alt b/application/views/csgo-tools.php.alt new file mode 100644 index 0000000..2faf72d --- /dev/null +++ b/application/views/csgo-tools.php.alt @@ -0,0 +1,261 @@ + +
            + + +
            +
            +
            +
            + + Avatar + +
            + +
            +

            + +
            +
            +
            +
            +
            +
            +
            +
            +
              +
            • + +

              +

              +
            • +
            • + +

              +

              h

              +
            • +
            +
            +
            +
              +
            • + +

              +

              %

              +
            • +
            • + +

              +

              %

              +
            • +
            +
            +
            +
              +
            • + +

              +

              +
            • +
            • + +

              +

              %

              +
            • +
            +
            +
            +
              +
            • + +

              +

              +
            • +
            • + +

              +

              +
            • +
            +
            +
            +
            +
            +
            +
            +
            +
            +

            +
            +

            : /

            +

            + + + + + + +

            +
            +
            +
            + +

            + + + +

            + +

            +
            +

            + + + + +

            +

            + % + + + +

            +
            +
            +
              +
            • + + +
            • +
            • + + +
            • +
            • + + +
            • +
            • + + +
            • +
            • + + HP +
            • +
            • + + $ +
            • +
            • + + +
            • +
            • + + +
            • +
            • + + +
            • +
            +
            +
            +
            +
            +
            +
            +
            +

            +
              + +
            1. +

              0): ?>.

              + + + + + +

              + + + + +

              +
            2. + +
            +
            +
            +
            +
            +
            +
            +

            +
            +
            +
            +
            +
            +
            +

            +
              +
            • +
            • +
            • +
            • +
            • HP
            • +
            • +
            • +
            • %
            • +
            • +
            • %
            • +
            • +
            • +
            • h
            • +
            • +
            • +
            • (%) %
            • +
            • +
            • +
            • (%) %
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • $
            • +
            • +
            • +
            +
            +
            +
            diff --git a/application/views/dogpvp.php b/application/views/dogpvp.php new file mode 100644 index 0000000..0cb23a0 --- /dev/null +++ b/application/views/dogpvp.php @@ -0,0 +1,450 @@ + +
            +
            +
            +
            +

            +

            +
            +
            + +
            +
            +
            +
            + +
            +
            +

            +

            +
            +
            +
            + +
            +
            +
            +
            +

            +

            +
            + + +
            +

            +
            +
            + +
            +
            +
            + +
            +
            +
            +

            Downloads

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            VersionMinecraft-VersionChangelogDownload
            3.71.8.xLeere Texturen mit Faithful ausgefüllt, Neues LogoDownload
            3.61.8.xNeue GUIsDownload
            3.51.8.xLavatextur gefixedDownload
            3.41.8.xNicht veränderte Inhalte entfernt (zweites Pack muss "drunter" gelegt werden)Download
            3.31.8.xNeue BlocktexturenDownload
            3.21.8.xÄnderung von allen Gemälden, Kleine ÄnderungenDownload
            3.11.8.xVerbesserte Feuertextur, 3D-Modelle hinzugefügt, Anpassung der deutschen und englischen SpracheDownload
            3.01.7.x - 1.8.xKomplette Neuauflage, letzter Support für Minecraft 1.7 + +
            2.51.7.x - 1.8.xVerändertes Startmenü und neue MobtexturenDownload
            2.41.7.x - 1.8.xKleine ÄnderungenDownload
            2.31.7.x - 1.8.xNeue Truhen, Bögen und PfeileDownload
            2.21.7.x - 1.8.xKleinere ÄnderungenDownload
            2.11.7.x - 1.8.xNeue Mobtexturen, Essens- und Rüstungswerte in die deutsche Sprache hinzugefügtDownload
            2.01.7.x - 1.8.xTeilweise 1.8 kompatibelDownload
            1.81.7.xGroße TexturänderungenDownload
            1.71.7.xTest eines animierten Diamanterzes und kleine ÄnderungenDownload
            1.61.7.xSchärfere Schwerter und kleine ÄnderungenDownload
            1.51.7.xEinige TexturverbesserungenDownload
            1.41.7.xVeränderte BlocktexturenDownload
            1.31.7.xNeue Gemälde und kleinere TexturänderungenDownload
            1.21.7.xÄnderung des Logos und der BeschreibungDownload
            1.11.7.xDie meisten Inhalte von Sphax entferntDownload
            1.01.7.xDie allererste Version des Resource PacksDownload
            +
            +
            +
            diff --git a/application/views/donate.php b/application/views/donate.php new file mode 100644 index 0000000..27ccecf --- /dev/null +++ b/application/views/donate.php @@ -0,0 +1,317 @@ + + + + +
            +

            +

            +
            +

            +
            +
            + €1 +

            + €2 +

            + €5 +

            + €10 +

            + €15 +

            + €20 +

            + €25 +

            + €30 +

            + €50 +

            + €100 +

            +
            + +
            +
            + 10 +
            +
            + + \ No newline at end of file diff --git a/application/views/emails/register.php b/application/views/emails/register.php new file mode 100644 index 0000000..a12f785 --- /dev/null +++ b/application/views/emails/register.php @@ -0,0 +1,4 @@ + +Hallo, Test1123 diff --git a/application/views/errors/cli/error_404.php b/application/views/errors/cli/error_404.php new file mode 100644 index 0000000..6984b61 --- /dev/null +++ b/application/views/errors/cli/error_404.php @@ -0,0 +1,8 @@ + + +An uncaught Exception was encountered + +Type: +Message: +Filename: getFile(), "\n"; ?> +Line Number: getLine(); ?> + + + +Backtrace: +getTrace() as $error): ?> + + File: + Line: + Function: + + + + diff --git a/application/views/errors/cli/error_general.php b/application/views/errors/cli/error_general.php new file mode 100644 index 0000000..6984b61 --- /dev/null +++ b/application/views/errors/cli/error_general.php @@ -0,0 +1,8 @@ + + +A PHP Error was encountered + +Severity: +Message: +Filename: +Line Number: + + + +Backtrace: + + + File: + Line: + Function: + + + + diff --git a/application/views/errors/cli/index.html b/application/views/errors/cli/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/views/errors/cli/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

            Directory access is forbidden.

            + + + diff --git a/application/views/errors/html/error_404.php b/application/views/errors/html/error_404.php new file mode 100644 index 0000000..756ea9d --- /dev/null +++ b/application/views/errors/html/error_404.php @@ -0,0 +1,64 @@ + + + + +404 Page Not Found + + + +
            +

            + +
            + + \ No newline at end of file diff --git a/application/views/errors/html/error_db.php b/application/views/errors/html/error_db.php new file mode 100644 index 0000000..f5a43f6 --- /dev/null +++ b/application/views/errors/html/error_db.php @@ -0,0 +1,64 @@ + + + + +Database Error + + + +
            +

            + +
            + + \ No newline at end of file diff --git a/application/views/errors/html/error_exception.php b/application/views/errors/html/error_exception.php new file mode 100644 index 0000000..8784886 --- /dev/null +++ b/application/views/errors/html/error_exception.php @@ -0,0 +1,32 @@ + + +
            + +

            An uncaught Exception was encountered

            + +

            Type:

            +

            Message:

            +

            Filename: getFile(); ?>

            +

            Line Number: getLine(); ?>

            + + + +

            Backtrace:

            + getTrace() as $error): ?> + + + +

            + File:
            + Line:
            + Function: +

            + + + + + + +
            \ No newline at end of file diff --git a/application/views/errors/html/error_general.php b/application/views/errors/html/error_general.php new file mode 100644 index 0000000..fc3b2eb --- /dev/null +++ b/application/views/errors/html/error_general.php @@ -0,0 +1,64 @@ + + + + +Error + + + +
            +

            + +
            + + \ No newline at end of file diff --git a/application/views/errors/html/error_php.php b/application/views/errors/html/error_php.php new file mode 100644 index 0000000..b146f9c --- /dev/null +++ b/application/views/errors/html/error_php.php @@ -0,0 +1,33 @@ + + +
            + +

            A PHP Error was encountered

            + +

            Severity:

            +

            Message:

            +

            Filename:

            +

            Line Number:

            + + + +

            Backtrace:

            + + + + +

            + File:
            + Line:
            + Function: +

            + + + + + + + +
            \ No newline at end of file diff --git a/application/views/errors/html/index.html b/application/views/errors/html/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/views/errors/html/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

            Directory access is forbidden.

            + + + diff --git a/application/views/errors/index.html b/application/views/errors/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/views/errors/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

            Directory access is forbidden.

            + + + diff --git a/application/views/faq.php b/application/views/faq.php new file mode 100644 index 0000000..48065d4 --- /dev/null +++ b/application/views/faq.php @@ -0,0 +1,463 @@ + + +
            +
            +
            +
            +

            +

            +
            +
            + +
            +
            +
            +
            + +
            + + + +
              +
            • + 01 +
              +

              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              +
            • +
            • + 02 +
              +

              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              +
            • +
            • + 03 +
              +

              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              +
            • +
            • + 04 +
              +

              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              +
            • +
            • + 05 +
              +

              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              +
            • +
            • + 06 +
              +

              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              + +
              +
              +
              + +
              +
              +
              +
              +
              +
            • +
            +
            \ No newline at end of file diff --git a/application/views/footer.php b/application/views/footer.php new file mode 100644 index 0000000..cc16146 --- /dev/null +++ b/application/views/footer.php @@ -0,0 +1,150 @@ + +
            +
            +
            +
            +

            +

            + + ! +

            +
            + + +
            +

            Links

            +
            +
              +
            • + +
            • +
            • + +
            • +
            • + +
            • +
            • + +
            • +
            • + +
            • +
            • + +
            • +
            +
            +
            + + +
            +

            +
            + GeneralModel->getBlogPosts(3); + ?> +
            +
            + + + + +
            +
            +
            + + +
            +
            +
            +
            + © Copyright + KingOfDog + + , 2015 - + . All Rights Reserved. +
            +
            + +
            +
            +
            +
            + + + + + + + + + + + + diff --git a/application/views/header.php b/application/views/header.php new file mode 100644 index 0000000..445e547 --- /dev/null +++ b/application/views/header.php @@ -0,0 +1,475 @@ +LoginModel->autoLogin(); + + if (!isset($_SESSION['site_lang']) && isset($_COOKIE['language']) && in_array($_COOKIE['language'], ['de', 'en', 'fr'])) { + $this->session->set_userdata('site_lang', $_COOKIE['language']); + redirect(base_url(uri_string())); + } +?> + + + + + + + + + + + + + + <?= $title; ?> | KingOfDog + + + + + + + + + + + + + + + + + +
            +
            + + + +
            +
            + + + + + + + +
            +
            \ No newline at end of file diff --git a/application/views/home.php b/application/views/home.php new file mode 100644 index 0000000..865ffb3 --- /dev/null +++ b/application/views/home.php @@ -0,0 +1,399 @@ + +
            +
            + +
            +

            +
            +
            +
            +
            +
            + + + +
            + +
            +
            +
            +
            +
            + + + +
            + +
            +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +

            Social Media

            + +
            + +
            +
            +

            KOD Network

            +
            +
            +

            + +
            + + +
            + +
            +
            +

            + +
            + + +
            + +
            +
            +

            +
              + load->view('network/posts/post_item', $newestPost); + endforeach; ?> +
            +
            +
            +
            +
            + +
            + +
            +
            +

            +
            +
            +
            +
            + +
            +
            + +
            +
            +
              +
            +
            +
            +
            + +
            + +
            + +
            +
            +
            +
            + +
            +
            +

            +

            +
            +
            +
            +
            + diff --git a/application/views/impressum.php b/application/views/impressum.php new file mode 100644 index 0000000..493db59 --- /dev/null +++ b/application/views/impressum.php @@ -0,0 +1,389 @@ + +
            +

            Inhaltsverzeichnis

            + +

            Impressum

            +

            Marcel Struck +
            Auf Anfrage per E-Mail mehr Informationen +

            +

            E-Mail: info@ +
            +

            +
            +
            +

            Disclaimer – rechtliche Hinweise

            § + 1 Haftungsbeschränkung +
            Die Inhalte dieser Website werden mit größtmöglicher Sorgfalt erstellt. Der Anbieter übernimmt jedoch keine + Gewähr für die Richtigkeit, Vollständigkeit und Aktualität der bereitgestellten Inhalte. Die Nutzung der Inhalte der + Website erfolgt auf eigene Gefahr des Nutzers. Namentlich gekennzeichnete Beiträge geben die Meinung des jeweiligen + Autors und nicht immer die Meinung des Anbieters wieder. Mit der reinen Nutzung der Website des Anbieters kommt + keinerlei Vertragsverhältnis zwischen dem Nutzer und dem Anbieter zustande. +
            +
            § 2 Externe Links +
            Diese Website enthält Verknüpfungen zu Websites Dritter ("externe Links"). Diese Websites unterliegen der + Haftung der jeweiligen Betreiber. Der Anbieter hat bei der erstmaligen Verknüpfung der externen Links die fremden + Inhalte daraufhin überprüft, ob etwaige Rechtsverstöße bestehen. Zu dem Zeitpunkt waren keine Rechtsverstöße + ersichtlich. Der Anbieter hat keinerlei Einfluss auf die aktuelle und zukünftige Gestaltung und auf die Inhalte der + verknüpften Seiten. Das Setzen von externen Links bedeutet nicht, dass sich der Anbieter die hinter dem Verweis oder + Link liegenden Inhalte zu Eigen macht. Eine ständige Kontrolle der externen Links ist für den Anbieter ohne konkrete + Hinweise auf Rechtsverstöße nicht zumutbar. Bei Kenntnis von Rechtsverstößen werden jedoch derartige externe Links + unverzüglich gelöscht. +
            +
            § 3 Urheber- und Leistungsschutzrechte +
            Die auf dieser Website veröffentlichten Inhalte unterliegen dem deutschen Urheber- und Leistungsschutzrecht. + Jede vom deutschen Urheber- und Leistungsschutzrecht nicht zugelassene Verwertung bedarf der vorherigen + schriftlichen Zustimmung des Anbieters oder jeweiligen Rechteinhabers. Dies gilt insbesondere für Vervielfältigung, + Bearbeitung, Übersetzung, Einspeicherung, Verarbeitung bzw. Wiedergabe von Inhalten in Datenbanken oder anderen + elektronischen Medien und Systemen. Inhalte und Rechte Dritter sind dabei als solche gekennzeichnet. Die unerlaubte + Vervielfältigung oder Weitergabe einzelner Inhalte oder kompletter Seiten ist nicht gestattet und strafbar. + Lediglich die Herstellung von Kopien und Downloads für den persönlichen, privaten und nicht kommerziellen Gebrauch + ist erlaubt. +
            +
            Die Darstellung dieser Website in fremden Frames ist nur mit schriftlicher Erlaubnis zulässig. +
            +
            § 4 Besondere Nutzungsbedingungen +
            Soweit besondere Bedingungen für einzelne Nutzungen dieser Website von den vorgenannten Paragraphen abweichen, + wird an entsprechender Stelle ausdrücklich darauf hingewiesen. In diesem Falle gelten im jeweiligen Einzelfall die + besonderen Nutzungsbedingungen. +
            +
            +

            Datenschutzerklärung

            + +

            Verantwortliche Stelle im Sinne der Datenschutzgesetze ist:

            + +

            Marcel Struck

            + +

            Erfassung allgemeiner Informationen

            + +

            Wenn Sie auf unsere Webseite zugreifen, werden automatisch Informationen allgemeiner Natur erfasst. Diese + Informationen (Server-Logfiles) beinhalten etwa die Art des Webbrowsers, das verwendete Betriebssystem, den + Domainnamen Ihres Internet Service Providers und Ähnliches. Hierbei handelt es sich ausschließlich um + Informationen, welche keine Rückschlüsse auf Ihre Person zulassen. Diese Informationen sind technisch notwendig, + um von Ihnen angeforderte Inhalte von Webseiten korrekt auszuliefern und fallen bei Nutzung des Internets + zwingend an. Anonyme Informationen dieser Art werden von uns statistisch ausgewertet, um unseren + Internetauftritt und die dahinter stehende Technik zu optimieren.

            + +

            Registrierung auf unserer Webseite

            + +

            Bei der Registrierung für die Nutzung unserer personalisierten Leistungen werden einige personenbezogene Daten + erhoben, wie Name, Anschrift, Kontakt- und Kommunikationsdaten wie Telefonnummer und E-Mail-Adresse. Sind Sie + bei uns registriert, können Sie auf Inhalte und Leistungen zugreifen, die wir nur registrierten Nutzern + anbieten. Angemeldete Nutzer haben zudem die Möglichkeit, bei Bedarf die bei Registrierung angegebenen Daten + jederzeit zu ändern oder zu löschen. Selbstverständlich erteilen wir Ihnen darüber hinaus jederzeit Auskunft + über die von uns über Sie gespeicherten personenbezogenen Daten. Gerne berichtigen bzw. löschen wir diese auch + auf Ihren Wunsch, soweit keine gesetzlichen Aufbewahrungspflichten entgegenstehen. Zur Kontaktaufnahme in diesem + Zusammenhang nutzen Sie bitte die am Ende dieser Datenschutzerklärung angegebenen Kontaktdaten. Die erhobenen + Daten sind aus der Eingabemaske im Rahmen der Registrierung ersichtlich.

            + +

            Erbringung kostenpflichtiger Leistungen

            + +

            Zur Erbringung kostenpflichtiger Leistungen werden von uns zusätzliche Daten erfragt, wie z.B. + Zahlungsangaben.

            + +

            Um die Sicherheit Ihrer Daten bei der Übertragung zu schützen, verwenden wir dem aktuellen Stand der Technik + entsprechende Verschlüsselungsverfahren (z. B. SSL) über HTTPS.

            + +

            Newsletter

            + +

            Bei der Anmeldung zum Bezug unseres Newsletters werden die von Ihnen angegebenen Daten ausschließlich für diesen + Zweck verwendet. Abonnenten können auch über Umstände per E-Mail informiert werden, die für den Dienst oder die + Registrierung relevant sind (Beispielsweise Änderungen des Newsletterangebots oder technische + Gegebenheiten).

            + +

            Für eine wirksame Registrierung benötigen wir eine valide E-Mail-Adresse. Um zu überprüfen, dass eine Anmeldung + tatsächlich durch den Inhaber einer E-Mail Adresse erfolgt, setzen wir das „double-opt-in“ Verfahren ein. Hierzu + protokollieren wir die Bestellung des Newsletters, den Versand einer Bestätigungsmail und den Eingang der + hiermit angeforderten Antwort. Weitere Daten werden nicht erhoben. Die Daten werden ausschließlich für den + Newsletter-Versand verwendet und nicht an Dritte weitergegeben.

            + +

            Die Einwilligung zur Speicherung Ihrer persönlichen Daten und ihrer Nutzung für den Newsletterversand können Sie + jederzeit widerrufen. In jedem Newsletter findet sich dazu ein entsprechender Link. Außerdem können Sie sich + jederzeit auch direkt auf dieser Webseite abmelden oder uns Ihren entsprechenden Wunsch über die am Ende dieses + Dokuments angegebene Kontaktmöglichkeiten mitteilen.

            + +

            Mit dem Newsletter informieren wir Sie über uns und unsere Angebote.
            +
            + Mit der Anmeldung zum Newsletter speichern wir Ihre IP-Adresse und das Datum der Anmeldung. Diese Speicherung + dient alleine dem Nachweis im Fall, dass ein Dritter eine Emailadresse missbraucht und sich ohne Wissen des + Berechtigten für den Newsletterempfang anmeldet.
            +
            + Ihre Einwilligung zur Speicherung der Daten, der Email-Adresse sowie deren Nutzung zum Versand des Newsletters + können Sie jederzeit widerrufen. Der Widerruf kann über einen Link in den Newslettern selbst, in Ihrem + Profilbereich oder per Mitteilung an die oben stehenden Kontaktmöglichkeiten erfolgen.

            + +

            Kontaktaufnahme

            + +

            Bei der Kontaktaufnahme mit dem Anbieter (zum Beispiel per Kontaktformular oder E-Mail) werden die Angaben des + Nutzers zwecks Bearbeitung der Anfrage sowie für den Fall, dass Anschlussfragen entstehen, gespeichert.

            + +

            Löschung bzw. Sperrung der Daten

            + +

            Wir halten uns an die Grundsätze der Datenvermeidung und Datensparsamkeit. Wir speichern Ihre personenbezogenen + Daten daher nur so lange, wie dies zur Erreichung der hier genannten Zwecke erforderlich ist oder wie es die vom + Gesetzgeber vorgesehenen vielfältigen Speicherfristen vorsehen. Nach Fortfall des jeweiligen Zweckes bzw. Ablauf + dieser Fristen werden die entsprechenden Daten routinemäßig und entsprechend den gesetzlichen Vorschriften + gesperrt oder gelöscht.

            + +

            Ihre Rechte auf Auskunft, Berichtigung, Sperre, Löschung und Widerspruch

            + +

            Sie haben das Recht, jederzeit Auskunft über Ihre bei uns gespeicherten personenbezogenen Daten zu erhalten. + Ebenso haben Sie das Recht auf Berichtigung, Sperrung oder, abgesehen von der vorgeschriebenen Datenspeicherung + zur Geschäftsabwicklung, Löschung Ihrer personenbezogenen Daten. Bitte wenden Sie sich dazu an unseren + Datenschutzbeauftragten. Die Kontaktdaten finden Sie ganz unten.

            + +

            Damit eine Sperre von Daten jederzeit berücksichtigt werden kann, müssen diese Daten zu Kontrollzwecken in einer + Sperrdatei vorgehalten werden. Sie können auch die Löschung der Daten verlangen, soweit keine gesetzliche + Archivierungsverpflichtung besteht. Soweit eine solche Verpflichtung besteht, sperren wir Ihre Daten auf + Wunsch.

            + +

            Sie können Änderungen oder den Widerruf einer Einwilligung durch entsprechende Mitteilung an uns mit Wirkung für + die Zukunft vornehmen.

            + +

            Cookies

            + +

            Wie viele andere Webseiten verwenden wir auch so genannte „Cookies“. Cookies sind kleine Textdateien, die von + einem Webseitenserver auf Ihre Festplatte übertragen werden. Hierdurch erhalten wir automatisch bestimmte Daten + wie z. B. IP-Adresse, verwendeter Browser, Betriebssystem über Ihren Computer und Ihre Verbindung zum + Internet.

            + +

            Cookies können nicht verwendet werden, um Programme zu starten oder Viren auf einen Computer zu übertragen. + Anhand der in Cookies enthaltenen Informationen können wir Ihnen die Navigation erleichtern und die korrekte + Anzeige unserer Webseiten ermöglichen.

            + +

            In keinem Fall werden die von uns erfassten Daten an Dritte weitergegeben oder ohne Ihre Einwilligung eine + Verknüpfung mit personenbezogenen Daten hergestellt.

            + +

            Natürlich können Sie unsere Website grundsätzlich auch ohne Cookies betrachten. Internet-Browser sind regelmäßig + so eingestellt, dass sie Cookies akzeptieren. Sie können die Verwendung von Cookies jederzeit über die + Einstellungen Ihres Browsers deaktivieren. Bitte verwenden Sie die Hilfefunktionen Ihres Internetbrowsers, um zu + erfahren, wie Sie diese Einstellungen ändern können. Bitte beachten Sie, dass einzelne Funktionen unserer + Website möglicherweise nicht funktionieren, wenn Sie die Verwendung von Cookies deaktiviert haben.

            + +

            Cookies sind kleine Dateien, die es ermöglichen, auf dem Zugriffsgerät der Nutzer (PC, Smartphone o.ä.) + spezifische, auf das Gerät bezogene Informationen zu speichern. Sie dienen zum einem der Benutzerfreundlichkeit + von Webseiten und damit den Nutzern (z.B. Speicherung von Logindaten). Zum anderen dienen sie, um die + statistische Daten der Webseitennutzung zu erfassen und sie zwecks Verbesserung des Angebotes analysieren zu + können. Die Nutzer können auf den Einsatz der Cookies Einfluss nehmen. Die meisten Browser verfügen eine Option + mit der das Speichern von Cookies eingeschränkt oder komplett verhindert wird. Allerdings wird darauf + hingewiesen, dass die Nutzung und insbesondere der Nutzungskomfort ohne Cookies eingeschränkt werden.

            + +

            Verwendung von Piwik

            + +

            Diese Webseite benutzt Piwik, eine Open.Source-Software zur statistischen Auswertung von Besucherzugriffen. Piwik + verwendet sog. „Cookies“, Textdateien, die auf Ihrem Computer gespeichert werden und die eine Analyse der + Benutzung der Website durch Sie ermöglichen.
            + Die durch den Cookie erzeugten Informationen über Ihre Nutzung des Internetangebotes werden auf einem Server in + Deutschland gespeichert.
            + Die IP-Adresse wird unmittelbar nach der Verarbeitung und vor deren Speicherung anonymisiert. Sie haben die + Möglichkeit, die Installation der Cookies durch Änderung der Einstellung Ihrer Browser-Software zu verhindern. + Wir weisen Sie darauf hin, dass bei entsprechender Einstellung eventuell nicht mehr alle Funktionen dieser + Website zur Verfügung stehen.

            + +

            Sie können sich entscheiden, ob in Ihrem Browser ein eindeutiger Webanalyse-Cookie abgelegt werden darf, um dem + Betreiber der Webseite die Erfassung und Analyse verschiedener statistischer Daten zu ermöglichen.

            + +

            Google AdWords

            + +

            Unsere Webseite nutzt das Google Conversion-Tracking. Sind Sie über eine von Google geschaltete Anzeige auf + unsere Webseite gelangt, wird von Google Adwords ein Cookie auf Ihrem Rechner gesetzt. Das Cookie für + Conversion-Tracking wird gesetzt, wenn ein Nutzer auf eine von Google geschaltete Anzeige klickt. Diese Cookies + verlieren nach 30 Tagen ihre Gültigkeit und dienen nicht der persönlichen Identifizierung. Besucht der Nutzer + bestimmte Seiten unserer Website und das Cookie ist noch nicht abgelaufen, können wir und Google erkennen, dass + der Nutzer auf die Anzeige geklickt hat und zu dieser Seite weitergeleitet wurde. Jeder Google AdWords-Kunde + erhält ein anderes Cookie. Cookies können somit nicht über die Websites von AdWords-Kunden nachverfolgt werden. + Die mithilfe des Conversion-Cookies eingeholten Informationen dienen dazu, Conversion-Statistiken für + AdWords-Kunden zu erstellen, die sich für Conversion-Tracking entschieden haben. Die Kunden erfahren die + Gesamtanzahl der Nutzer, die auf ihre Anzeige geklickt haben und zu einer mit einem Conversion-Tracking-Tag + versehenen Seite weitergeleitet wurden. Sie erhalten jedoch keine Informationen, mit denen sich Nutzer + persönlich identifizieren lassen.

            + +

            Möchten Sie nicht am Tracking teilnehmen, können Sie das hierfür erforderliche Setzen eines Cookies ablehnen + – etwa per Browser-Einstellung, die das automatische Setzen von Cookies generell deaktiviert oder Ihren + Browser so einstellen, dass Cookies von der Domain „googleleadservices.com“ blockiert werden.

            + +

            Bitte beachten Sie, dass Sie die Opt-out-Cookies nicht löschen dürfen, solange Sie keine Aufzeichnung von + Messdaten wünschen. Haben Sie alle Ihre Cookies im Browser gelöscht, müssen Sie das jeweilige Opt-out Cookie + erneut setzen.

            + +

            Google AdSense

            + +

            Dieses Angebot benutzt Google AdSense, einen Dienst zum Einbinden von Werbeanzeigen der Google Inc. ("Google"). + Google AdSense verwendet sog. "Cookies", Textdateien, die auf dem Computer der Nutzer gespeichert werden und die + eine Analyse der Benutzung der Website ermöglicht. Google AdSense verwendet auch so genannte Web Beacons + (unsichtbare Grafiken). Durch diese Web Beacons können Informationen wie der Besucherverkehr auf den Seiten + dieses Angebots ausgewertet werden.
            +
            + Die durch Cookies und Web Beacons erzeugten Informationen über die Benutzung dieser Website (einschließlich der + IP-Adresse der Nutzer) und Auslieferung von Werbeformaten werden an einen Server von Google in den USA + übertragen und dort gespeichert. Diese Informationen können von Google an Vertragspartner von Google weiter + gegeben werden. Google wird Ihre IP-Adresse jedoch nicht mit anderen von Ihnen gespeicherten Daten + zusammenführen.
            +
            + Die Nutzer können die Installation der Cookies durch eine entsprechende Einstellung Ihrer Browser Software + verhindern; der Anbieter weist die Nutzer jedoch darauf hin, dass sie in diesem Fall gegebenenfalls nicht + sämtliche Funktionen dieses Angebotes voll umfänglich nutzen können. Durch die Nutzung dieser Website erklären + die Nutzer sich mit der Bearbeitung der über sie erhobenen Daten durch Google in der zuvor beschriebenen Art und + Weise und zu dem zuvor benannten Zweck einverstanden.

            + +

            Änderung unserer Datenschutzbestimmungen

            + +

            Wir behalten uns vor, diese Datenschutzerklärung gelegentlich anzupassen, damit sie stets den aktuellen + rechtlichen Anforderungen entspricht oder um Änderungen unserer Leistungen in der Datenschutzerklärung + umzusetzen, z. B. bei der Einführung neuer Services. Für Ihren erneuten Besuch gilt dann die neue + Datenschutzerklärung.

            + +

            Zugriffsdaten/Server-Logfiles

            + +

            Der Anbieter (beziehungsweise sein Webspace-Provider) erhebt Daten über jeden Zugriff auf das Angebot (so + genannte Serverlogfiles). Zu den Zugriffsdaten gehören:
            +
            + Name der abgerufenen Webseite, Datei, Datum und Uhrzeit des Abrufs, übertragene Datenmenge, Meldung über + erfolgreichen Abruf, Browsertyp nebst Version, das Betriebssystem des Nutzers, Referrer URL (die zuvor besuchte + Seite), IP-Adresse und der anfragende Provider.
            +
            + Der Anbieter verwendet die Protokolldaten nur für statistische Auswertungen zum Zweck des Betriebs, der + Sicherheit und der Optimierung des Angebotes. Der Anbieterbehält sich jedoch vor, die Protokolldaten + nachträglich zu überprüfen, wenn aufgrund konkreter Anhaltspunkte der berechtigte Verdacht einer rechtswidrigen + Nutzung besteht.

            + +

            Kommentarfunktion

            + +

            Wenn Nutzer Kommentare im Blog hinterlassen, werden neben diesen Angaben auch der Zeitpunkt ihrer Erstellung, die + IP-Adresse des Nutzers und der zuvor durch den Webseitenbesucher gewählte Nutzername gespeichert. Das erfolgt + zur Sicherheit des Anbieters, falls jemand in Kommentaren und Beiträgen widerrechtliche Inhalte schreibt + (Beleidigungen, verbotene politische Propaganda, etc.). In diesem Fall kann der Anbieter selbst für den + Kommentar oder Beitrag belangt werden und ist daher an der Identität des Verfassers interessiert.

            + +

            Kommentarabonnements

            + +

            Die Nachfolgekommentare können durch Nutzer abonniert werden. Die Nutzer erhalten eine Bestätigungsemail, um zu + überprüfen, ob sie der Inhaber der eingegebenen Emailadresse sind. Nutzer können laufende Kommentarabonnements + jederzeit abbestellen. Die Bestätigungsemail wird Hinweise dazu enthalten.

            + +

            Einbindung von Diensten und Inhalten Dritter

            + +

            Es kann vorkommen, dass innerhalb dieses Onlineangebotes Inhalte Dritter, wie zum Beispiel Videos von YouTube, + Kartenmaterial von Google-Maps, RSS-Feeds oder Grafiken von anderen Webseiten eingebunden werden. Dies setzt + immer voraus, dass die Anbieter dieser Inhalte (nachfolgend bezeichnet als "Dritt-Anbieter") die IP-Adresse der + Nutzer wahr nehmen. Denn ohne die IP-Adresse, könnten sie die Inhalte nicht an den Browser des jeweiligen + Nutzers senden. Die IP-Adresse ist damit für die Darstellung dieser Inhalte erforderlich. Wir bemühen uns nur + solche Inhalte zu verwenden, deren jeweilige Anbieter die IP-Adresse lediglich zur Auslieferung der Inhalte + verwenden. Jedoch haben wir keinen Einfluss darauf, falls die Dritt-Anbieter die IP-Adresse z.B. für + statistische Zwecke speichern. Soweit dies uns bekannt ist, klären wir die Nutzer darüber auf.

            + +

            Datenschutzerklärung für das soziale Netzwerk Google Plus

            +

            + Unsere Seiten nutzen Funktionen von Google +1. Anbieter ist die Google Inc. 1600 Amphitheatre Parkway Mountain + View, CA 94043, USA.
            +
            + Erfassung und Weitergabe von Informationen: Mithilfe der Google +1-Schaltfläche können Sie Informationen + weltweit veröffentlichen. über die Google +1-Schaltfläche erhalten Sie und andere Nutzer personalisierte Inhalte + von Google und unseren Partnern. Google speichert sowohl die Information, dass Sie für einen Inhalt +1 gegeben + haben, als auch Informationen über die Seite, die Sie beim Klicken auf +1 angesehen haben. Ihre +1 können als + Hinweise zusammen mit Ihrem Profilnamen und Ihrem Foto in Google-Diensten, wie etwa in Suchergebnissen oder in + Ihrem Google-Profil, oder an anderen Stellen auf Websites und Anzeigen im Internet eingeblendet werden. Google + zeichnet Informationen über Ihre +1-Aktivitäten auf, um die Google-Dienste für Sie und andere zu verbessern. Um + die Google +1-Schaltfläche verwenden zu können, benötigen Sie ein weltweit sichtbares, öffentliches + Google-Profil, das zumindest den für das Profil gewählten Namen enthalten muss. Dieser Name wird in allen + Google-Diensten verwendet. In manchen Fällen kann dieser Name auch einen anderen Namen ersetzen, den Sie beim + Teilen von Inhalten über Ihr Google-Konto verwendet haben. Die Identität Ihres Google- Profils kann Nutzern + angezeigt werden, die Ihre E-Mail-Adresse kennen oder über andere identifizierende Informationen von Ihnen + verfügen.

            +

            + Verwendung der erfassten Informationen: Neben den oben erläuterten Verwendungszwecken werden die von Ihnen + bereitgestellten Informationen gemäß den geltenden Google-Datenschutzbestimmungen genutzt. Google veröffentlicht + möglicherweise zusammengefasste Statistiken über die +1-Aktivitäten der Nutzer bzw. gibt diese an Nutzer und + Partner weiter, wie etwa Publisher, Inserenten oder verbundene Websites. +

            + +

            Datenschutzerklärung für die Nutzung von Youtube

            +

            + Unsere Webseite nutzt Plugins der von Google betriebenen Seite YouTube. Betreiber der Seiten ist die YouTube, + LLC, 901 Cherry Ave., San Bruno, CA 94066, USA. Wenn Sie eine unserer mit einem YouTube-Plugin ausgestatteten + Seiten besuchen, wird eine Verbindung zu den Servern von YouTube hergestellt. Dabei wird dem Youtube-Server + mitgeteilt, welche unserer Seiten Sie besucht haben. Wenn Sie in Ihrem YouTube-Account eingeloggt sind + ermöglichen Sie YouTube, Ihr Surfverhalten direkt Ihrem persönlichen Profil zuzuordnen. Dies können Sie + verhindern, indem Sie sich aus Ihrem YouTube-Account ausloggen.

            +

            + Weitere Informationen zum Umgang von Nutzerdaten finden Sie in der Datenschutzerklärung von YouTube unter https://www.google.de/intl/de/policies/privacy +

            + +

            Datenschutzerklärung für die Nutzung von dem Webmessagedienst twitter.com

            +

            + Wir haben auf unserer Webseite auch den Webmessagedienst twitter.com integriert. Dieser wird durch die Twitter + Inc., 1355 Market St, Suite 900, San Francisco, CA 94103, USA bereitgestellt. Twitter bietet die sog. „Tweet“ – + Funktion an. Damit kann man 140 Zeichen lange Nachrichten auch mit Webseitenlinks in seinem eigenen + Twitteraccount veröffentlichen. Wenn Sie die „Tweet“-Funktion von Twitter auf unseren Webseiten nutzen, wird die + jeweilige Webseite mit Ihrem Account auf Twitter verknüpft und dort ggf. öffentlich bekannt gegeben. Hierbei + werden auch Daten an Twitter übertragen.
            + Von dem Inhalt der übermittelten Daten und deren Nutzung durch Twitter erhalten wir keine Kenntnis. Konsultieren + Sie daher für weitere Informationen die Datenschutzerklärung von Twitter: http://twitter.com/privacy +

            +

            + Twitter bietet Ihnen unter nachfolgendem Link die Möglichkeit, Ihre Datenschutzeinstellungen selbst festzulegen: + http://twitter.com/account/settings. +

            + +

            Datenschutzerklärung für die Nutzung von Instagram

            +

            + Auf unseren Seiten sind Funktionen des Dienstes Instagram eingebunden. Diese Funktionen werden angeboten durch + die Instagram Inc., 1601 Willow Road, Menlo Park, CA, 94025, USA integriert. Wenn Sie in Ihrem Instagram - + Account eingeloggt sind können Sie durch Anklicken des Instagram - Buttons die Inhalte unserer Seiten mit Ihrem + Instagram - Profil verlinken. Dadurch kann Instagram den Besuch unserer Seiten Ihrem Benutzerkonto zuordnen. Wir + weisen darauf hin, dass wir als Anbieter der Seiten keine Kenntnis vom Inhalt der übermittelten Daten sowie + deren Nutzung durch Instagram erhalten. Weitere Informationen hierzu finden Sie in der Datenschutzerklärung von + Instagram: http://instagram.com/about/legal/privacy/ +

            + +

            Amazon-Partnerprogramm

            +

            Marcel Struck ist Teilnehmer des Partnerprogramms von Amazon EU, das zur Bereitstellung eines Mediums für + Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu Amazon.de + Werbekostenerstattung verdient werden kann. Amazon setzt Cookies ein, um die Herkunft der Bestellungen + nachvollziehen zu können. Unter anderem kann Amazon erkennen, dass Sie den Partnerlink auf dieser Website + geklickt haben. Weitere Informationen zur Datennutzung durch Amazon erhalten Sie in der Datenschutzerklärung des + Unternehmens: + http://www.amazon.de/gp/help/customer/display.html/ref=footer_privacy?ie=UTF8&nodeId=3312401

            +

            Widerspruch Werbe-Mails

            +

            Der Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten zur Übersendung von nicht + ausdrücklich angeforderter Werbung und Informationsmaterialien wird hiermit widersprochen. Die Betreiber der + Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der unverlangten Zusendung von + Werbeinformationen, etwa durch Spam-E-Mails, vor.

            +
            + \ No newline at end of file diff --git a/application/views/index.html b/application/views/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/views/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

            Directory access is forbidden.

            + + + diff --git a/application/views/login.php b/application/views/login.php new file mode 100644 index 0000000..c4809ab --- /dev/null +++ b/application/views/login.php @@ -0,0 +1,97 @@ + +
            +
            + +
            +
            +
            + +
            +
            +

            KingOfDog

            +

            Erstelle dir jetzt kostenlos einen Account und lege so richtig los auf dieser Webseite!

            +
            + +
            + +
            + +
            +

            Willkommen! Du bist nun erfolgreich ein Mitglied geworden

            + Dein Profil +
            +
            + + +
            + + + + +
            +
            +
            +
            \ No newline at end of file diff --git a/application/views/network/blog/blog_post_item.php b/application/views/network/blog/blog_post_item.php new file mode 100644 index 0000000..419dd6f --- /dev/null +++ b/application/views/network/blog/blog_post_item.php @@ -0,0 +1,24 @@ + +
          • +
            + +
            +
            +
            +

            + + + + + + / + +

            +

            +
            +
            +
          • \ No newline at end of file diff --git a/application/views/network/blog/comment_item.php b/application/views/network/blog/comment_item.php new file mode 100644 index 0000000..9be4d81 --- /dev/null +++ b/application/views/network/blog/comment_item.php @@ -0,0 +1,47 @@ + +
          • +
            +
            + + + +
            +
            +
            +

            + + + + + + unter + + + + +

            +

            +
            +
            + +
            +
          • diff --git a/application/views/network/blog/user_blog_posts.php b/application/views/network/blog/user_blog_posts.php new file mode 100644 index 0000000..2677409 --- /dev/null +++ b/application/views/network/blog/user_blog_posts.php @@ -0,0 +1,21 @@ +load->view('network/user/profile_page_header', ['active' => 'blog-posts']); +?> +
            +
            +
            + load->view('network/user/user_profile_card', ['data' => $data]) ?> +
            +

            +
            +
              + +
            + +
            +
            +
            +
            +
            diff --git a/application/views/network/blog/user_blog_posts_end.php b/application/views/network/blog/user_blog_posts_end.php new file mode 100644 index 0000000..300f0d9 --- /dev/null +++ b/application/views/network/blog/user_blog_posts_end.php @@ -0,0 +1,46 @@ + + diff --git a/application/views/network/blog/user_comments.php b/application/views/network/blog/user_comments.php new file mode 100644 index 0000000..5d43354 --- /dev/null +++ b/application/views/network/blog/user_comments.php @@ -0,0 +1,20 @@ + +load->view('network/user/profile_page_header', ['active' => 'blog-comments']); ?> +
            +
            +
            + load->view('network/user/user_profile_card', ['data' => $data]) ?> +
            +

            +
            +
              + +
            + +
            +
            +
            +
            +
            diff --git a/application/views/network/blog/user_comments_end.php b/application/views/network/blog/user_comments_end.php new file mode 100644 index 0000000..8317842 --- /dev/null +++ b/application/views/network/blog/user_comments_end.php @@ -0,0 +1,46 @@ + + diff --git a/application/views/network/message.php b/application/views/network/message.php new file mode 100644 index 0000000..3142547 --- /dev/null +++ b/application/views/network/message.php @@ -0,0 +1,15 @@ + +
            +
            +
            +
            +
            + +
            +
            +
            diff --git a/application/views/network/password_reset.php b/application/views/network/password_reset.php new file mode 100644 index 0000000..9fe592c --- /dev/null +++ b/application/views/network/password_reset.php @@ -0,0 +1,60 @@ + +
            +
            + +
            +
            +
            + +
            +
            +

            KingOfDog

            +

            Anscheinend hast du dein Passwort vergessen - das ist vollkommen normal! Hier kannst du + jedenfalls ein neues Passwort setzen.

            +
            + +
            + +
            + +
            +

            Herzlichen Glückwunsch! Dein Passwort wurde geändert. Du kannst dich nun einloggen

            + Einloggen +
            +
            +
            + + + + +
            +
            +
            +
            \ No newline at end of file diff --git a/application/views/network/posts/post_item.php b/application/views/network/posts/post_item.php new file mode 100644 index 0000000..f09af43 --- /dev/null +++ b/application/views/network/posts/post_item.php @@ -0,0 +1,82 @@ + +
          • +
            +
            + + + +
            +
            +
            +

            + + + + + + + + als Antwort an + @ + + +

            +
            +

            + PostsModel->closeTags($content) ?> +

            + + +
            + +
            +
            +
            + +
            + +
            + +
            +
            +
            +
          • diff --git a/application/views/network/posts/posts_list.php b/application/views/network/posts/posts_list.php new file mode 100644 index 0000000..31cdece --- /dev/null +++ b/application/views/network/posts/posts_list.php @@ -0,0 +1,153 @@ + +
            +
            +
            +
            + load->view('network/user/user_profile_card') ?> +
            + + +
            +
            + > + +
            + +
            + > + +
            + +
            + > + +
            +
            + > + +
            +
            +
            + + + + + + + + + + + + + + + + + + +
            + +
            + +
            + + +
            +
            +
            +
              + +
            + +
            +
            +
            +
            diff --git a/application/views/network/posts/report_modal.php b/application/views/network/posts/report_modal.php new file mode 100644 index 0000000..8ce6714 --- /dev/null +++ b/application/views/network/posts/report_modal.php @@ -0,0 +1,37 @@ + + + diff --git a/application/views/network/posts/user_post_content.php b/application/views/network/posts/user_post_content.php new file mode 100644 index 0000000..33f873c --- /dev/null +++ b/application/views/network/posts/user_post_content.php @@ -0,0 +1,96 @@ + + + + +
            +
            + + + +
            + +
            +

            + + + + + + + +

            + +

            + +

            + +
            + +
            +
            +
            + +
            + + + +
            +
            + +
            +
            +
              + load->view('network/posts/post_item', $reply); + endforeach; ?> +
            + +

            + + Es gibt zu diesem Post keine Antworten. Wie wär's, wenn du der Erste bist, eine zu verfassen? +

            + +
            +
            + diff --git a/application/views/network/posts/user_post_page.php b/application/views/network/posts/user_post_page.php new file mode 100644 index 0000000..e7351cf --- /dev/null +++ b/application/views/network/posts/user_post_page.php @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/application/views/network/user/profile_edit.php b/application/views/network/user/profile_edit.php new file mode 100644 index 0000000..6874f5c --- /dev/null +++ b/application/views/network/user/profile_edit.php @@ -0,0 +1,1272 @@ +load->view('network/user/profile_page_header'); +?> +
            +
            + load->view('network/user/user_profile_card') ?> +
            +
            + +

            Profil bearbeiten

            +
            + +
            +
            +
            + +
            + + + + Dein Nutzername ist zu kurz! Er muss mindestens 4 Zeichen lang sein + + + Dein Nutzername enthält ungültige Zeichen! Er darf nur Groß- [A-Z] und Kleinbuchstaben [a-z], Zahlen [0-9] und Unterstriche [_] enthalten + +
            + +
            + + +
            + +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + +
            +
            +
            + +
            + + + Sollten viele Nutzer eine Sprache ausgewählt haben, die noch nicht von uns unterstützt wird, würden wir versuchen, eine übersetze Version dieser Webseite in der jeweiligen Sprache anzubieten. +
            + +
            + + + Sollte der Fall auftreten, dass viele Nutzer in einem bestimmten Land leben, welches noch keine gute Anbindung an unsere Server hat, würden wir dies schnellstmöchglich versuchen zu ändern. +
            + +
            + + +
            + +
            + + + + + +
            + +
            + + + + + +
            + +
            + +
            + +
            +
            +
            +
            +
            + + "> +
            +
            + + +
            +
            + > + +
            +
            + > + +
            + +
            +
            +
            +
            +
            + + +
            +
            + + +
            +
            + + +
            + +
            +
            +
            +
            + = 2): ?> +
            + > + + Danke für deine bisherige Unterstützung durch Spenden. Solltest du dennoch weiterhin uns unterstützen wollen, kannst du freiwilligerweise Werbeanzeigen aktivieren. Wie immer gilt unser Motto: höchstens eine Anzeige pro Seite! +
            + +

            Um diese Einstellungen zu sehen und zu verändern, musst du + entweder ein Team-Mitglied, ein Plus-Nutzer oder ein Premium-Nutzer sein.

            +

            Premium-Nutzer kannst du werden, indem du einen beliebigen Betrag auf der Spenden-Seite hinterlässt. So + unterstützt du zum einen diese Webseite und sorgst für ein Weiterleben dieses + Services und gleichzeitig erhälst du die Möglichkeit, den Dienst ohne Werbung zu + erleben.

            +

            Plus-Nutzer oder Team-Mitglied kannst du nur auf persönliche Einladung eines + hochrangigen Team-Mitgliedes werden. Der Plus-Rang wird beispielsweise an YouTuber, + bekannte Persönlichkeiten, sehr aktive Nutzer, sehr großzügige Spender, aktive + Abonnenten des Kanals KingOfDog + oder Freunde und Bekannte vergeben.

            +

            Es gilt jedoch eine Regel: Bitte. Nicht. Nach. Einem. Rang. Betteln. Durch + eine solche Aktivität verfliegt eure Chance auf einen Rang.

            + +
            +
            +
            +
            +
            +
            +
            + \ No newline at end of file diff --git a/application/views/network/user/profile_page.php b/application/views/network/user/profile_page.php new file mode 100644 index 0000000..5b1ff01 --- /dev/null +++ b/application/views/network/user/profile_page.php @@ -0,0 +1,57 @@ + +load->view('network/user/profile_page_header', ['active' => 'profile']) ?> +
            +
            +
            + load->view('network/user/user_profile_card') ?> +
            + + +

            +
            +
              + load->view('network/posts/post_item', $post); + } ?> +
            + + + + +
            + +

            +
            +
              + load->view('network/blog/comment_item', ['data' => $data, 'c' => $c]); + } ?> +
            + + + + +
            + +

            +
            +
              + load->view('network/blog/blog_post_item', ['data' => $data, 'post' => $post]); + } ?> +
            + + + + +
            +
            +
            +
            \ No newline at end of file diff --git a/application/views/network/user/profile_page_header.php b/application/views/network/user/profile_page_header.php new file mode 100644 index 0000000..872c05b --- /dev/null +++ b/application/views/network/user/profile_page_header.php @@ -0,0 +1,120 @@ + +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + +
            +
            +
            +
            + + + + + + + + + +
            +
            +
            +
            +
            +
            + + + + diff --git a/application/views/network/user/user_followers.php b/application/views/network/user/user_followers.php new file mode 100644 index 0000000..fe9105e --- /dev/null +++ b/application/views/network/user/user_followers.php @@ -0,0 +1,20 @@ +load->view('network/user/profile_page_header', ['active' => $active]); +?> +
            +
            +
            + load->view('network/user/user_profile_card', ['data' => $data]) ?> +
            +

            +
              + load->view('network/user/user_followers_item', ['data' => $follower]); + } ?> +
            +
            +
            +
            s +
            diff --git a/application/views/network/user/user_followers_item.php b/application/views/network/user/user_followers_item.php new file mode 100644 index 0000000..d028a7e --- /dev/null +++ b/application/views/network/user/user_followers_item.php @@ -0,0 +1,18 @@ + +
          • + +
            + +
            +

            + Follower | folgt + seit +
            +
            +
          • diff --git a/application/views/network/user/user_overview_card.php b/application/views/network/user/user_overview_card.php new file mode 100644 index 0000000..ceab556 --- /dev/null +++ b/application/views/network/user/user_overview_card.php @@ -0,0 +1,25 @@ + + +
            + + + +
            + \ No newline at end of file diff --git a/application/views/network/user/user_posts.php b/application/views/network/user/user_posts.php new file mode 100644 index 0000000..b33b267 --- /dev/null +++ b/application/views/network/user/user_posts.php @@ -0,0 +1,19 @@ +load->view('network/user/profile_page_header', ['active' => 'posts']); ?> +
            +
            +
            + load->view('network/user/user_profile_card') ?> +
            +

            +
            +
              + +
            + +
            +
            +
            +
            +
            diff --git a/application/views/network/user/user_posts_end.php b/application/views/network/user/user_posts_end.php new file mode 100644 index 0000000..0949abf --- /dev/null +++ b/application/views/network/user/user_posts_end.php @@ -0,0 +1,48 @@ + + diff --git a/application/views/network/user/user_profile_card.php b/application/views/network/user/user_profile_card.php new file mode 100644 index 0000000..e4ca33a --- /dev/null +++ b/application/views/network/user/user_profile_card.php @@ -0,0 +1,89 @@ + +
            + +

            +
            + +

            @

            +
            +
            + +

            + + + + +
            + diff --git a/application/views/post_list_entry.php b/application/views/post_list_entry.php new file mode 100644 index 0000000..edbee04 --- /dev/null +++ b/application/views/post_list_entry.php @@ -0,0 +1,37 @@ + + +
          • +
            + +
            + + +
            + +
            +
            + +
            +
            + +

            + +

            +
            +

            + + + +
            + + + + + +
            +

            +
            +
            +
          • diff --git a/application/views/projects.php b/application/views/projects.php new file mode 100644 index 0000000..eaffa5d --- /dev/null +++ b/application/views/projects.php @@ -0,0 +1,97 @@ + + +
            +
            +
            +
            +

            +

            +
            +
            + +
            +
            +
            +
            + +
            +
            +
            +

            +

            +
            +
            +

            + +
            + +
            +

            + +
            + +
            +

            +
              +
            • +
            • +
            • +
            +
            + +
            +
              + load->view('projects_list_entry', $item); + endforeach; ?> +
            +
            +
            +
            diff --git a/application/views/projects_entry.php b/application/views/projects_entry.php new file mode 100644 index 0000000..bbf3656 --- /dev/null +++ b/application/views/projects_entry.php @@ -0,0 +1,132 @@ +projectsModel->getEntryCategories($data['ID']); + $pCategoriesList = []; + $categoryUrls = []; + $lang = isset($_SESSION['site_lang']) ? $_SESSION['site_lang'] : 'de'; + + foreach ($pCategories as $pCategory) { + if ($lang == 'fr' && $pCategory['displaynameFrench'] != NULL) { + $pCategoriesList[] = $pCategory['displaynameFrench']; + $categoryUrls[$pCategory['displaynameFrench']] = $pCategory['collection']; + } else if ($lang == 'en' && $pCategory['displaynameEnglish'] != NULL) { + $pCategoriesList[] = $pCategory['displaynameEnglish']; + $categoryUrls[$pCategory['displaynameEnglish']] = $pCategory['collection']; + } else { + $pCategoriesList[] = $pCategory['displayname']; + $categoryUrls[$pCategory['displayname']] = $pCategory['collection']; + } + } + sort($pCategoriesList); + + $pCategoriesListUrls = []; + foreach ($pCategoriesList as $pCategory) { + $pCategoriesListUrls[] = '' . $pCategory . ''; + } + + $pCategoriesListUrls = implode(', ', $pCategoriesListUrls); +?> +
            +
            + + + + + + + +
            +
            + + + + + + + +
            +
            + +
            +
            +
            +
            + +
            +
            + + + + " + style="margin-left:50px"> + + + + + + Bearbeiten + + +

            +

            + +
            +
            + + + + + + Download + + + + OpenSource + +
            +
            + +
            +
            +
            + +
            +
            +
            \ No newline at end of file diff --git a/application/views/projects_list_entry.php b/application/views/projects_list_entry.php new file mode 100644 index 0000000..f82beba --- /dev/null +++ b/application/views/projects_list_entry.php @@ -0,0 +1,57 @@ +projectsModel->getEntryCategories($ID); + $categoriesClasses = ""; + foreach ($categories as $category) { + $categoriesClasses .= $category['collection'] . " "; + } + if ($isDownloadable) { + $categoriesClasses .= 'downloadable '; + } + if ($isOpenSource) { + $categoriesClasses .= 'opensource'; + } +?> +
          • +
            + +
            +

            + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +
            +

            + +

            + +

            + + + + + + +
            + + + + +
            +

            +
            +
            +
          • \ No newline at end of file diff --git a/application/views/redirect.php b/application/views/redirect.php new file mode 100644 index 0000000..52cafbf --- /dev/null +++ b/application/views/redirect.php @@ -0,0 +1,64 @@ + + +
            +
            + +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            + + + + + + + + + + + + + + + + + + + + + + + +
            IDUmleitungs-UrlUmleitungs-CodeHinzugefügt am...TemporärTemporäre Bestehungszeit
            100) { echo substr_replace($item['url'], '...', 100); } else { echo $item['url']; } ?>
            +
            +
            +
            + + + diff --git a/application/views/sudoku.php b/application/views/sudoku.php new file mode 100644 index 0000000..c13c13b --- /dev/null +++ b/application/views/sudoku.php @@ -0,0 +1,41 @@ + + +
            +
            +
            + + + + + + + + +
            + +
            + + +
            +
            +
            diff --git a/application/views/tools/csgo.php b/application/views/tools/csgo.php new file mode 100644 index 0000000..b41c00b --- /dev/null +++ b/application/views/tools/csgo.php @@ -0,0 +1,670 @@ + +
            + + +
            +
            +
            +
            + + +
            +

            + +

            + +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
              +
            • + + + +

              +

              0

              +
            • +
            • + + + +

              +

              0h

              +
            • +
            +
            +
            +
              +
            • + + + +

              +

              0%

              +
            • +
            • + + + +

              +

              0%

              +
            • +
            +
            +
            +
              +
            • + + + +

              +

              0

              +
            • +
            • + + + +

              +

              0%

              +
            • +
            +
            +
            +
              +
            • + + + +

              +

              0

              +
            • +
            • + + + +

              +

              0

              +
            • +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +

            +
            +

            : + 0 + / + 0 +

            +

            +
            +
            +
            +

            + +

            +
            +

            + 0 + + + +

            +

            + 0% + + + +

            +
            +
            +
              +
            • + + 0 +
            • +
            • + + 0 +
            • +
            • + + 0 +
            • +
            • + + 0 +
            • +
            • + + 0 HP +
            • +
            • + + 0 $ +
            • +
            • + + 0 +
            • +
            • + + 0 +
            • +
            • + + 0 +
            • +
            +
            +
            +
            +
            +
            +
            +
            +

            +
              + +
            +
            +
            +
            +
            +
            +
            +

            +
              +
            1. + Placeholder + +

              Dust II

              +

              204

              +
            2. +
            3. +
            4. +
            5. +
            6. +
            +
            +
            +
            +
            +
            +
            +
            +

            +
              +
            • + + 0 + +
            • +
            • + + 0 + +
            • +
            • + + 0 + +
            • +
            • + + 0 + +
            • +
            • + + 0 HP + +
            • +
            • + + 0 + +
            • +
            • + + 0 + +
            • +
            • + + 0 % + +
            • +
            • + + 0 + +
            • +
            • + + 0 % + +
            • +
            • + + 0 + +
            • +
            • + + 0 + +
            • +
            • + + 0 h + +
            • +
            • + + 0 + +
            • +
            • + + 0 + +
            • +
            • (%) + + 0 % + +
            • +
            • + + 0 + +
            • +
            • + + 0 + +
            • +
            • (%) + + 0 % + +
            • +
            • + + 0 + +
            • +
            • + + 0 + +
            • +
            • + + 0 + +
            • +
            • + + 0 + +
            • +
            • + + 0 + +
            • +
            • + + + 0 + +
            • +
            • + + 0 + +
            • +
            • + + + 0 + +
            • +
            • + + 0 + +
            • +
            • + + 0 + +
            • +
            • + + 0 $ + +
            • +
            • + + 0 + +
            • +
            • + + 0 + +
            • +
            +
            +
            +
            diff --git a/application/views/tools/dp_encoder_end.php b/application/views/tools/dp_encoder_end.php new file mode 100644 index 0000000..7ff2bb3 --- /dev/null +++ b/application/views/tools/dp_encoder_end.php @@ -0,0 +1,197 @@ + + + + + + + + + + diff --git a/application/views/tools/dp_encrypter_end.php b/application/views/tools/dp_encrypter_end.php new file mode 100644 index 0000000..3281bdb --- /dev/null +++ b/application/views/tools/dp_encrypter_end.php @@ -0,0 +1,61 @@ + + diff --git a/application/views/tools/encoders/base64.php b/application/views/tools/encoders/base64.php new file mode 100644 index 0000000..5960110 --- /dev/null +++ b/application/views/tools/encoders/base64.php @@ -0,0 +1,35 @@ + + +
            +

            +

            +
            +
            +
            +
            + + +
            +
            + + +
            +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            +
            diff --git a/application/views/tools/encoders/url.php b/application/views/tools/encoders/url.php new file mode 100644 index 0000000..b1e6e65 --- /dev/null +++ b/application/views/tools/encoders/url.php @@ -0,0 +1,32 @@ + +
            +

            +

            +
            +
            +
            +
            + + +
            +
            + + +
            +
            +
            +
            + + +
            + +
            +
            +
            +
            diff --git a/application/views/tools/encrypter/adfgvx.php b/application/views/tools/encrypter/adfgvx.php new file mode 100644 index 0000000..d296b70 --- /dev/null +++ b/application/views/tools/encrypter/adfgvx.php @@ -0,0 +1,40 @@ + +
            +

            +

            +
            +
            +
            +
            +
            + + +
            + +
            + + +
            + + + + + +
            +
            +
            + + +
            +
            + + +
            +
            +
            +
            +
            +
            diff --git a/application/views/tools/encrypter/atbash.php b/application/views/tools/encrypter/atbash.php new file mode 100644 index 0000000..a16425a --- /dev/null +++ b/application/views/tools/encrypter/atbash.php @@ -0,0 +1,39 @@ + +
            +

            +

            +
            +
            +
            +
            +
            + + +
            + +
            + + +
            +
            +
            +
            + + +
            +
            + + +
            +
            +
            +
            +
            +
            diff --git a/application/views/tools/encrypter/caesar.php b/application/views/tools/encrypter/caesar.php new file mode 100644 index 0000000..44ff29a --- /dev/null +++ b/application/views/tools/encrypter/caesar.php @@ -0,0 +1,42 @@ + +
            +

            +

            +
            +
            +
            +
            + + +
            + + + +
            +
            +
            +
            + + +
            +
            + + +
            +
            +
            +
            +
            +
            diff --git a/application/views/tools/encrypter/fleissner.php b/application/views/tools/encrypter/fleissner.php new file mode 100644 index 0000000..2190ec8 --- /dev/null +++ b/application/views/tools/encrypter/fleissner.php @@ -0,0 +1,36 @@ + +
            +
            +
            +

            +

            +
            +
            + + +
            + + + +
            +
            +
            +
            + + +
            +
            + + +
            +
            +
            +
            +
            +
            diff --git a/application/views/tools/encrypter/gartenzaun.php b/application/views/tools/encrypter/gartenzaun.php new file mode 100644 index 0000000..2393625 --- /dev/null +++ b/application/views/tools/encrypter/gartenzaun.php @@ -0,0 +1,36 @@ + +
            +

            +

            +
            +
            +
            +
            + + +
            + + + +
            +
            +
            +
            + + +
            +
            + + +
            +
            +
            +
            +
            +
            diff --git a/application/views/tools/encrypter/main.php b/application/views/tools/encrypter/main.php new file mode 100644 index 0000000..cea7d37 --- /dev/null +++ b/application/views/tools/encrypter/main.php @@ -0,0 +1,67 @@ + +
            +
            + +
            +
            + load->view('tools/encrypter/caesar'); ?> +
            +
            + load->view('tools/encrypter/adfgvx'); ?> +
            +
            + load->view('tools/encrypter/atbash'); ?> +
            +
            + load->view('tools/encrypter/gartenzaun'); ?> +
            +
            + load->view('tools/encrypter/monosubkey'); ?> +
            +
            + load->view('tools/encrypter/playfair'); ?> +
            +
            + load->view('tools/encrypter/vigenere'); ?> +
            +
            +
            +
            diff --git a/application/views/tools/encrypter/monosubkey.php b/application/views/tools/encrypter/monosubkey.php new file mode 100644 index 0000000..f72a6cf --- /dev/null +++ b/application/views/tools/encrypter/monosubkey.php @@ -0,0 +1,36 @@ + +
            +

            +

            +
            +
            +
            +
            + + +
            + + + +
            +
            +
            +
            + + +
            +
            + + +
            +
            +
            +
            +
            +
            diff --git a/application/views/tools/encrypter/playfair.php b/application/views/tools/encrypter/playfair.php new file mode 100644 index 0000000..f72a6cf --- /dev/null +++ b/application/views/tools/encrypter/playfair.php @@ -0,0 +1,36 @@ + +
            +

            +

            +
            +
            +
            +
            + + +
            + + + +
            +
            +
            +
            + + +
            +
            + + +
            +
            +
            +
            +
            +
            diff --git a/application/views/tools/encrypter/vigenere.php b/application/views/tools/encrypter/vigenere.php new file mode 100644 index 0000000..f72a6cf --- /dev/null +++ b/application/views/tools/encrypter/vigenere.php @@ -0,0 +1,36 @@ + +
            +

            +

            +
            +
            +
            +
            + + +
            + + + +
            +
            +
            +
            + + +
            +
            + + +
            +
            +
            +
            +
            +
            diff --git a/application/views/tools/generators/nickname.php b/application/views/tools/generators/nickname.php new file mode 100644 index 0000000..72d9e1b --- /dev/null +++ b/application/views/tools/generators/nickname.php @@ -0,0 +1,54 @@ + + +
            +

            +

            +

            +
            +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            +
            +
            + + +
            +
            + + +
            +
            +
            +

            Über diesen Generator

            +

            Dieser Nickname-Generator befindet sich derzeit noch in der Alpha-Phase. Das heißt, die gelieferten Ergebnisse sind nicht immer zu 100% zufriedenstellend und werden daher noch mit der Zeit verbessert.

            +

            Das Ziel für diesen Generator ist, zufällige Wörter zu generieren, die sehr nah an die englische Sprachstruktur heranreichen bzw. auf den ersten (und am besten auch auf den zweiten) Blick wie echte Nicknames von realen Spielern + aussehen. Aufgrund des Zufalls ergeben diese aber natürlich meist überhaupt keinen Sinn, was auch nicht unbedingt gewollt ist. Welche Nicknames ergeben schon wirklich Sinn?

            +

            Dazu wird der durchschnittliche Wortaufbau des englischen Wortschatzes analysiert und mit der Struktur eines typischen Nicknames gemixt. Um daraus dann Wörter zu generieren, wird auf eine Markov-Chain (Markov-Kette) gesetzt, die anhand + eines zufälligen Anfangsbuchstaben aus den erlernten Strukturen vollständige Wörter mit zufälliger Länge bildet.

            +

            Für die Zukunft ist es jedoch geplant, dass der Generator noch deutlich erweitert wird. Die Nutzernamen sollen vom Website-Besucher bewertet werden können. So erhalten bestimmte Wortkombinationen, Zahlenverwendungen und + Zeicheneinsetzungen Scores. Anhand von diesen soll ein neuronales Netzwerk erlernen, welche Nicknames gut/menschlich und welche schlecht/unnatürlich sind. Dadurch soll es uns dann möglich sein, mit höher Wahrscheinlichkeit + Nicknames zu generieren, die dem potenziellen Spieler gefallen könnten. Das bedeutet, wir müssen durch das neuronale Netzwerk erreichen, dass die Namen mehr so klingen, als hätte ein Mensch sie erstellt.

            +

            Das dürfte allerdings noch lange Zeit dauern. Wir hoffen dabei auf eure Unterstützung, indem ihr Nicknames bewertet (sobald diese Funktion implementiert ist).

            +
            +
            +
            +
            + +
            +
              +
              +
              +
              +
              \ No newline at end of file diff --git a/application/views/tools/generators/password.php b/application/views/tools/generators/password.php new file mode 100644 index 0000000..89df904 --- /dev/null +++ b/application/views/tools/generators/password.php @@ -0,0 +1,88 @@ + +
              +

              +

              +
              +
              +
              + +
              +
              + + +
              +
              +
              +
              +
              +
              +
              + +
              + + +
              +
              + + +
              + +
              +
              + +
              +
              + +
              +
              + +
              +
              + +
              +
              +
              +
              +

              +
                +
              • +
              • +
              • +
              • + +
              • +
              +

              +
              +
              +
              +
              + Verlauf +
              +
                +
                +
                +
                +
                \ No newline at end of file diff --git a/application/views/tools/index.php b/application/views/tools/index.php new file mode 100644 index 0000000..befaeed --- /dev/null +++ b/application/views/tools/index.php @@ -0,0 +1,165 @@ + +
                +
                +
                +
                +

                Tools

                +

                + Hier ist eine Auflistung aller derzeit auf dieser Website zur Verfügung stehenden Tools zu finden. Weitere + Tools werden in nächster Zeit folgen! +

                +
                +
                + +
                +
                +
                +
                +
                +

                Encoder/Decoder

                + +
                +

                Generatoren

                + +
                +

                Games

                + +
                +

                Social Networks

                + +
                diff --git a/application/views/tools/minecraft.php b/application/views/tools/minecraft.php new file mode 100644 index 0000000..c88c113 --- /dev/null +++ b/application/views/tools/minecraft.php @@ -0,0 +1,148 @@ + +
                +
                +

                +

                +
                +
                +
                +
                + + + + + +
                +
                +
                +
                +
                +
                +
                + +
                +
                +

                +
                + +
                +
                +

                UUID:

                +
                +
                +

                +

                +
                +
                + +
                +
                +
                +
                + +
                +
                + + + +
                +

                +
                + 16px + 32px + 64px + 128px + 256px + 512px +
                +
                + + + +
                + +
                +
                +
                + + + + + + + + + minecraftModel->getHistory($uuid); ?> + +
                +
                +
                +
                + +
                +
                +
                + +
                +
                +
                +

                +

                +
                +
                +
                +
                + + + + + +
                +
                +
                +
                +
                +
                + +
                + +
                + +
                +

                minecraftModel->getServerName($serverip); ?> minecraftModel->getMOTD($serverip); ?>

                +
                + +
                +

                : minecraftModel->getPlayers($serverip)[0]; ?> / minecraftModel->getPlayers($serverip)[1]; ?>

                +

                : minecraftModel->getPlayers($serverip)[3]; ?>ms

                +

                : minecraftModel->getPlayers($serverip)[4]; ?>

                +
                + +
                +
                +
                +
                + diff --git a/application/views/tools/twitch.php b/application/views/tools/twitch.php new file mode 100644 index 0000000..d328f3c --- /dev/null +++ b/application/views/tools/twitch.php @@ -0,0 +1,37 @@ + + +
                + + + + +
                +

                +

                +
                +
                +
                +
                + + + + + +
                +
                +
                +
                +
                + +
                +
                +
                diff --git a/application/views/tools/twitch_result.php b/application/views/tools/twitch_result.php new file mode 100644 index 0000000..43c0dec --- /dev/null +++ b/application/views/tools/twitch_result.php @@ -0,0 +1,103 @@ + +

                Error

                +

                + +

                + + +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +

                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                +
                + +
                +

                +
                + +
                + +
                +
                + +
                +
                + + +
                +

                +
                + +
                +
                + + +
                +

                Videos ()

                + + + +
                + + + +
                +
                +
                +

                +

                +
                +
                +
                +
                + + + + +
                +
                +
                +
                + +
                +
                +
                + +'; + } +?> diff --git a/application/views/under_construction.php b/application/views/under_construction.php new file mode 100644 index 0000000..4f2bd87 --- /dev/null +++ b/application/views/under_construction.php @@ -0,0 +1,13 @@ + +
                +

                This page is under construction!

                +

                Soon there will be a nice page... but currently it's empty. Like my purse. Or a new SD card. Or my mind. Or just vacuum. There's much vacuum. Just look up into the sky. A few thousand kilometres away there are quadrillion cubic metres of empty, empty vacuum.

                +

                And in this vacuum there are stars and moons and planets and asteroids and comets and black holes and neutron stars and dust and suns. Oh shit, the space is full of things. Someone should tidy his room up because it's really a mess.

                +

                But if you look up in the sky (maybe with a telescope or something like this) it's just magical. Beautiful. Impressive. Stunning. Indescribable. You definitely should take a few minutes, go away from the PC and watch the stars. The beautiful night sky.

                +

                Here on earth you are heavy because of the gravitation. But in the space, where the next planet is thousands of kilometres away, you are like a feather - lightweight!

                +

                The space is like every achievement, success, thought and experience of yours combined to one holy f*cking awesome... thing. You can't describe it. It's so huge and cool. On the one side cold and dark, on the other side hot and bright. You can't find such an experience anywhere else. Okay, there ISN'T anywhere else than the space...

                +

                It's boundless. Never ending. Infinite. Expanding. Maybe somewhere is a planet which is similar to the earth. Maybe not. Maybe one day we can travel to this planet. Maybe not. Maybe we can build a new civilization. Maybe not. Maybe we can survive on the earth even if the climate change continues. Maybe not.

                +

                I don't know WHY I write such a philosophic text on a damn "Under Construction" page but as you can see I did it.

                +
                \ No newline at end of file diff --git a/assets/admin/css/maps/jquery-jvectormap-2.0.3.css b/assets/admin/css/maps/jquery-jvectormap-2.0.3.css new file mode 100644 index 0000000..4726fd1 --- /dev/null +++ b/assets/admin/css/maps/jquery-jvectormap-2.0.3.css @@ -0,0 +1,135 @@ +svg { + touch-action: none; +} + +.jvectormap-container { + width: 100%; + height: 100%; + position: relative; + overflow: hidden; + touch-action: none; +} + +.jvectormap-tip { + position: absolute; + display: none; + border: solid 1px #CDCDCD; + border-radius: 3px; + background: #292929; + color: white; + font-family: sans-serif, Verdana; + font-size: smaller; + padding: 3px; +} + +.jvectormap-zoomin, .jvectormap-zoomout, .jvectormap-goback { + position: absolute; + left: 10px; + border-radius: 3px; + background: #292929; + padding: 3px; + color: white; + cursor: pointer; + line-height: 10px; + text-align: center; + box-sizing: content-box; +} + +.jvectormap-zoomin, .jvectormap-zoomout { + width: 10px; + height: 10px; +} + +.jvectormap-zoomin { + top: 10px; +} + +.jvectormap-zoomout { + top: 30px; +} + +.jvectormap-goback { + bottom: 10px; + z-index: 1000; + padding: 6px; +} + +.jvectormap-spinner { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + background: center no-repeat url(data:image/gif;base64,R0lGODlhIAAgAPMAAP///wAAAMbGxoSEhLa2tpqamjY2NlZWVtjY2OTk5Ly8vB4eHgQEBAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ/V/nmOM82XiHRLYKhKP1oZmADdEAAAh+QQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY/CZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB+A4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6+Ho7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq+B6QDtuetcaBPnW6+O7wDHpIiK9SaVK5GgV543tzjgGcghAgAh+QQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK++G+w48edZPK+M6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE+G+cD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm+FNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk+aV+oJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0/VNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc+XiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30/iI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE/jiuL04RGEBgwWhShRgQExHBAAh+QQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR+ipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY+Yip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd+MFCN6HAAIKgNggY0KtEBAAh+QQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1+vsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d+jYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg+ygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0+bm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h+Kr0SJ8MFihpNbx+4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX+BP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA==); +} + +.jvectormap-legend-title { + font-weight: bold; + font-size: 14px; + text-align: center; +} + +.jvectormap-legend-cnt { + position: absolute; +} + +.jvectormap-legend-cnt-h { + bottom: 0; + right: 0; +} + +.jvectormap-legend-cnt-v { + top: 0; + right: 0; +} + +.jvectormap-legend { + background: black; + color: white; + border-radius: 3px; +} + +.jvectormap-legend-cnt-h .jvectormap-legend { + float: left; + margin: 0 10px 10px 0; + padding: 3px 3px 1px 3px; +} + +.jvectormap-legend-cnt-h .jvectormap-legend .jvectormap-legend-tick { + float: left; +} + +.jvectormap-legend-cnt-v .jvectormap-legend { + margin: 10px 10px 0 0; + padding: 3px; +} + +.jvectormap-legend-cnt-h .jvectormap-legend-tick { + width: 40px; +} + +.jvectormap-legend-cnt-h .jvectormap-legend-tick-sample { + height: 15px; +} + +.jvectormap-legend-cnt-v .jvectormap-legend-tick-sample { + height: 20px; + width: 20px; + display: inline-block; + vertical-align: middle; +} + +.jvectormap-legend-tick-text { + font-size: 12px; +} + +.jvectormap-legend-cnt-h .jvectormap-legend-tick-text { + text-align: center; +} + +.jvectormap-legend-cnt-v .jvectormap-legend-tick-text { + display: inline-block; + vertical-align: middle; + line-height: 20px; + padding-left: 3px; +} diff --git a/assets/cache/cache-1522063074-231ca4dbcf0393a74c5bdbc391e88d72.javascript.gzip b/assets/cache/cache-1522063074-231ca4dbcf0393a74c5bdbc391e88d72.javascript.gzip new file mode 100644 index 0000000..256c17e Binary files /dev/null and b/assets/cache/cache-1522063074-231ca4dbcf0393a74c5bdbc391e88d72.javascript.gzip differ diff --git a/assets/cache/cache-1522063074-3647231bda3cdb4774fe4a445d76ed76.javascript.gzip b/assets/cache/cache-1522063074-3647231bda3cdb4774fe4a445d76ed76.javascript.gzip new file mode 100644 index 0000000..698649f Binary files /dev/null and b/assets/cache/cache-1522063074-3647231bda3cdb4774fe4a445d76ed76.javascript.gzip differ diff --git a/assets/cache/cache-1522063074-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip b/assets/cache/cache-1522063074-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip new file mode 100644 index 0000000..b505866 Binary files /dev/null and b/assets/cache/cache-1522063074-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip differ diff --git a/assets/cache/cache-1522063074-3e1b4f39eee8d55ba3db2abbad3b9c58.javascript.gzip b/assets/cache/cache-1522063074-3e1b4f39eee8d55ba3db2abbad3b9c58.javascript.gzip new file mode 100644 index 0000000..57afaf5 Binary files /dev/null and b/assets/cache/cache-1522063074-3e1b4f39eee8d55ba3db2abbad3b9c58.javascript.gzip differ diff --git a/assets/cache/cache-1522063074-7f8d640e427ce9bd6f17996b85a76be9.javascript.gzip b/assets/cache/cache-1522063074-7f8d640e427ce9bd6f17996b85a76be9.javascript.gzip new file mode 100644 index 0000000..cbf2fb1 Binary files /dev/null and b/assets/cache/cache-1522063074-7f8d640e427ce9bd6f17996b85a76be9.javascript.gzip differ diff --git a/assets/cache/cache-1522063074-936d4b51c9a835d803a0c44f7ff6114f.javascript.gzip b/assets/cache/cache-1522063074-936d4b51c9a835d803a0c44f7ff6114f.javascript.gzip new file mode 100644 index 0000000..d55f4c8 Binary files /dev/null and b/assets/cache/cache-1522063074-936d4b51c9a835d803a0c44f7ff6114f.javascript.gzip differ diff --git a/assets/cache/cache-1522063074-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip b/assets/cache/cache-1522063074-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip new file mode 100644 index 0000000..19d6442 Binary files /dev/null and b/assets/cache/cache-1522063074-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip differ diff --git a/assets/cache/cache-1522063074-9720986e363664dd23ee00bdc4ba13dc.javascript.gzip b/assets/cache/cache-1522063074-9720986e363664dd23ee00bdc4ba13dc.javascript.gzip new file mode 100644 index 0000000..1f5ca62 Binary files /dev/null and b/assets/cache/cache-1522063074-9720986e363664dd23ee00bdc4ba13dc.javascript.gzip differ diff --git a/assets/cache/cache-1522063074-989dd6eead2091dff4208afcf48e4657.javascript.gzip b/assets/cache/cache-1522063074-989dd6eead2091dff4208afcf48e4657.javascript.gzip new file mode 100644 index 0000000..a3db5d4 Binary files /dev/null and b/assets/cache/cache-1522063074-989dd6eead2091dff4208afcf48e4657.javascript.gzip differ diff --git a/assets/cache/cache-1522063074-9f5d1d8154d2f1d0baaa20f34186b9b1.javascript.gzip b/assets/cache/cache-1522063074-9f5d1d8154d2f1d0baaa20f34186b9b1.javascript.gzip new file mode 100644 index 0000000..d85d409 Binary files /dev/null and b/assets/cache/cache-1522063074-9f5d1d8154d2f1d0baaa20f34186b9b1.javascript.gzip differ diff --git a/assets/cache/cache-1522063074-c7d57aa6c972122e68a8fba2641568c1.javascript.gzip b/assets/cache/cache-1522063074-c7d57aa6c972122e68a8fba2641568c1.javascript.gzip new file mode 100644 index 0000000..6ab86bc Binary files /dev/null and b/assets/cache/cache-1522063074-c7d57aa6c972122e68a8fba2641568c1.javascript.gzip differ diff --git a/assets/cache/cache-1522063074-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip b/assets/cache/cache-1522063074-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip new file mode 100644 index 0000000..05b93c9 Binary files /dev/null and b/assets/cache/cache-1522063074-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip differ diff --git a/assets/cache/cache-1522063074-e1130a5a0665837f7dfe5edf9d0f1faa.javascript.gzip b/assets/cache/cache-1522063074-e1130a5a0665837f7dfe5edf9d0f1faa.javascript.gzip new file mode 100644 index 0000000..61bd5ca Binary files /dev/null and b/assets/cache/cache-1522063074-e1130a5a0665837f7dfe5edf9d0f1faa.javascript.gzip differ diff --git a/assets/cache/cache-1522063074-e1fdbc26033dabf291513337695fba60.javascript.gzip b/assets/cache/cache-1522063074-e1fdbc26033dabf291513337695fba60.javascript.gzip new file mode 100644 index 0000000..0015765 Binary files /dev/null and b/assets/cache/cache-1522063074-e1fdbc26033dabf291513337695fba60.javascript.gzip differ diff --git a/assets/cache/cache-1522085143-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip b/assets/cache/cache-1522085143-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip new file mode 100644 index 0000000..dccd489 Binary files /dev/null and b/assets/cache/cache-1522085143-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip differ diff --git a/assets/cache/cache-1522085143-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip b/assets/cache/cache-1522085143-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip new file mode 100644 index 0000000..54d8d69 Binary files /dev/null and b/assets/cache/cache-1522085143-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip differ diff --git a/assets/cache/cache-1522098228-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522098228-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..2440645 Binary files /dev/null and b/assets/cache/cache-1522098228-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522140970-0e52c0db43143ab200cbc9caa0a98970.css.gzip b/assets/cache/cache-1522140970-0e52c0db43143ab200cbc9caa0a98970.css.gzip new file mode 100644 index 0000000..a57d212 Binary files /dev/null and b/assets/cache/cache-1522140970-0e52c0db43143ab200cbc9caa0a98970.css.gzip differ diff --git a/assets/cache/cache-1522140970-140a4dbade34f47596f7664c1546959d.css.gzip b/assets/cache/cache-1522140970-140a4dbade34f47596f7664c1546959d.css.gzip new file mode 100644 index 0000000..8c08c69 Binary files /dev/null and b/assets/cache/cache-1522140970-140a4dbade34f47596f7664c1546959d.css.gzip differ diff --git a/assets/cache/cache-1522140970-c2f33931aec918b582aa3b931c92f1ad.css.gzip b/assets/cache/cache-1522140970-c2f33931aec918b582aa3b931c92f1ad.css.gzip new file mode 100644 index 0000000..90ce2db Binary files /dev/null and b/assets/cache/cache-1522140970-c2f33931aec918b582aa3b931c92f1ad.css.gzip differ diff --git a/assets/cache/cache-1522144488-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522144488-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..35c9956 Binary files /dev/null and b/assets/cache/cache-1522144488-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522144488-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522144488-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..08f45c3 Binary files /dev/null and b/assets/cache/cache-1522144488-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522144527-3aad796dfa62ff393852a3891c5fb8ee.css.gzip b/assets/cache/cache-1522144527-3aad796dfa62ff393852a3891c5fb8ee.css.gzip new file mode 100644 index 0000000..55352f4 Binary files /dev/null and b/assets/cache/cache-1522144527-3aad796dfa62ff393852a3891c5fb8ee.css.gzip differ diff --git a/assets/cache/cache-1522144527-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522144527-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..cb9c8d2 Binary files /dev/null and b/assets/cache/cache-1522144527-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522177382-4582c350b3a81d6146e779c1781bf082.css.gzip b/assets/cache/cache-1522177382-4582c350b3a81d6146e779c1781bf082.css.gzip new file mode 100644 index 0000000..1946750 Binary files /dev/null and b/assets/cache/cache-1522177382-4582c350b3a81d6146e779c1781bf082.css.gzip differ diff --git a/assets/cache/cache-1522235473-27cdef42f4dacedfd46d79027428dfc5.css.gzip b/assets/cache/cache-1522235473-27cdef42f4dacedfd46d79027428dfc5.css.gzip new file mode 100644 index 0000000..b0ce483 Binary files /dev/null and b/assets/cache/cache-1522235473-27cdef42f4dacedfd46d79027428dfc5.css.gzip differ diff --git a/assets/cache/cache-1522235473-898a785148571f9ba71f4ce1056e7225.css.gzip b/assets/cache/cache-1522235473-898a785148571f9ba71f4ce1056e7225.css.gzip new file mode 100644 index 0000000..4fe7e8d Binary files /dev/null and b/assets/cache/cache-1522235473-898a785148571f9ba71f4ce1056e7225.css.gzip differ diff --git a/assets/cache/cache-1522240501-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip b/assets/cache/cache-1522240501-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip new file mode 100644 index 0000000..f0d0766 Binary files /dev/null and b/assets/cache/cache-1522240501-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip differ diff --git a/assets/cache/cache-1522240559-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip b/assets/cache/cache-1522240559-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip new file mode 100644 index 0000000..56df095 Binary files /dev/null and b/assets/cache/cache-1522240559-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip differ diff --git a/assets/cache/cache-1522241125-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip b/assets/cache/cache-1522241125-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip new file mode 100644 index 0000000..8b86b36 Binary files /dev/null and b/assets/cache/cache-1522241125-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip differ diff --git a/assets/cache/cache-1522241449-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip b/assets/cache/cache-1522241449-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip new file mode 100644 index 0000000..989ff50 Binary files /dev/null and b/assets/cache/cache-1522241449-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip differ diff --git a/assets/cache/cache-1522241469-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip b/assets/cache/cache-1522241469-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip new file mode 100644 index 0000000..d0b726d Binary files /dev/null and b/assets/cache/cache-1522241469-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip differ diff --git a/assets/cache/cache-1522241648-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip b/assets/cache/cache-1522241648-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip new file mode 100644 index 0000000..4b2e7a0 Binary files /dev/null and b/assets/cache/cache-1522241648-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip differ diff --git a/assets/cache/cache-1522242383-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip b/assets/cache/cache-1522242383-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip new file mode 100644 index 0000000..430652e Binary files /dev/null and b/assets/cache/cache-1522242383-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip differ diff --git a/assets/cache/cache-1522242742-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip b/assets/cache/cache-1522242742-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip new file mode 100644 index 0000000..1c5e219 Binary files /dev/null and b/assets/cache/cache-1522242742-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip differ diff --git a/assets/cache/cache-1522356080-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522356080-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..c12d61c Binary files /dev/null and b/assets/cache/cache-1522356080-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522356080-c2f33931aec918b582aa3b931c92f1ad.css.gzip b/assets/cache/cache-1522356080-c2f33931aec918b582aa3b931c92f1ad.css.gzip new file mode 100644 index 0000000..03b6b05 Binary files /dev/null and b/assets/cache/cache-1522356080-c2f33931aec918b582aa3b931c92f1ad.css.gzip differ diff --git a/assets/cache/cache-1522357967-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522357967-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..ad83802 Binary files /dev/null and b/assets/cache/cache-1522357967-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522358088-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522358088-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..12575dd Binary files /dev/null and b/assets/cache/cache-1522358088-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522358134-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522358134-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..ad83802 Binary files /dev/null and b/assets/cache/cache-1522358134-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522358198-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522358198-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..da11897 Binary files /dev/null and b/assets/cache/cache-1522358198-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522358362-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522358362-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..0d68cc7 Binary files /dev/null and b/assets/cache/cache-1522358362-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522358424-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522358424-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..ed77088 Binary files /dev/null and b/assets/cache/cache-1522358424-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522358474-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522358474-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..73feb02 Binary files /dev/null and b/assets/cache/cache-1522358474-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522358809-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522358809-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..4ea65e1 Binary files /dev/null and b/assets/cache/cache-1522358809-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522358906-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522358906-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..c86b0f0 Binary files /dev/null and b/assets/cache/cache-1522358906-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522359114-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522359114-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..1761ecc Binary files /dev/null and b/assets/cache/cache-1522359114-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522359114-c2f33931aec918b582aa3b931c92f1ad.css.gzip b/assets/cache/cache-1522359114-c2f33931aec918b582aa3b931c92f1ad.css.gzip new file mode 100644 index 0000000..e766eed Binary files /dev/null and b/assets/cache/cache-1522359114-c2f33931aec918b582aa3b931c92f1ad.css.gzip differ diff --git a/assets/cache/cache-1522359122-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522359122-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..ef12da3 Binary files /dev/null and b/assets/cache/cache-1522359122-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522359168-140a4dbade34f47596f7664c1546959d.css.gzip b/assets/cache/cache-1522359168-140a4dbade34f47596f7664c1546959d.css.gzip new file mode 100644 index 0000000..c091d05 Binary files /dev/null and b/assets/cache/cache-1522359168-140a4dbade34f47596f7664c1546959d.css.gzip differ diff --git a/assets/cache/cache-1522359168-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522359168-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..44e64a5 Binary files /dev/null and b/assets/cache/cache-1522359168-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522359168-c2f33931aec918b582aa3b931c92f1ad.css.gzip b/assets/cache/cache-1522359168-c2f33931aec918b582aa3b931c92f1ad.css.gzip new file mode 100644 index 0000000..0d9a318 Binary files /dev/null and b/assets/cache/cache-1522359168-c2f33931aec918b582aa3b931c92f1ad.css.gzip differ diff --git a/assets/cache/cache-1522359188-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522359188-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..6a4b763 Binary files /dev/null and b/assets/cache/cache-1522359188-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522396997-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522396997-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..46a7b2c Binary files /dev/null and b/assets/cache/cache-1522396997-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522404604-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522404604-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..6595811 Binary files /dev/null and b/assets/cache/cache-1522404604-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522404639-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522404639-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..c470e77 Binary files /dev/null and b/assets/cache/cache-1522404639-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522404740-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522404740-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..5bf47c5 Binary files /dev/null and b/assets/cache/cache-1522404740-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522405138-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522405138-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..64418f8 Binary files /dev/null and b/assets/cache/cache-1522405138-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522405158-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522405158-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..caf9e73 Binary files /dev/null and b/assets/cache/cache-1522405158-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522405310-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522405310-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..e7a9c3f Binary files /dev/null and b/assets/cache/cache-1522405310-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522405645-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522405645-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..85e6951 Binary files /dev/null and b/assets/cache/cache-1522405645-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522405732-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522405732-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..e7a9c3f Binary files /dev/null and b/assets/cache/cache-1522405732-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522406100-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522406100-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..edad983 Binary files /dev/null and b/assets/cache/cache-1522406100-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522406248-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522406248-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..a5c880f Binary files /dev/null and b/assets/cache/cache-1522406248-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522406262-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522406262-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..fa8d6c0 Binary files /dev/null and b/assets/cache/cache-1522406262-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522406363-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip b/assets/cache/cache-1522406363-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip new file mode 100644 index 0000000..51e72b1 Binary files /dev/null and b/assets/cache/cache-1522406363-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip differ diff --git a/assets/cache/cache-1522406363-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip b/assets/cache/cache-1522406363-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip new file mode 100644 index 0000000..4f7be0a Binary files /dev/null and b/assets/cache/cache-1522406363-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip differ diff --git a/assets/cache/cache-1522406363-1302bd957c3ee703968123ec6a7340a0.javascript.gzip b/assets/cache/cache-1522406363-1302bd957c3ee703968123ec6a7340a0.javascript.gzip new file mode 100644 index 0000000..e9bccf8 Binary files /dev/null and b/assets/cache/cache-1522406363-1302bd957c3ee703968123ec6a7340a0.javascript.gzip differ diff --git a/assets/cache/cache-1522406363-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522406363-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..e3350bc Binary files /dev/null and b/assets/cache/cache-1522406363-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522406363-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522406363-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..1c20b8b Binary files /dev/null and b/assets/cache/cache-1522406363-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522406363-720143948dfefe06817d0718579c0770.javascript.gzip b/assets/cache/cache-1522406363-720143948dfefe06817d0718579c0770.javascript.gzip new file mode 100644 index 0000000..02c8e84 Binary files /dev/null and b/assets/cache/cache-1522406363-720143948dfefe06817d0718579c0770.javascript.gzip differ diff --git a/assets/cache/cache-1522406363-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522406363-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..3454b5d Binary files /dev/null and b/assets/cache/cache-1522406363-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522406363-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip b/assets/cache/cache-1522406363-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip new file mode 100644 index 0000000..1ac3beb Binary files /dev/null and b/assets/cache/cache-1522406363-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip differ diff --git a/assets/cache/cache-1522406363-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522406363-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..9ac57e6 Binary files /dev/null and b/assets/cache/cache-1522406363-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522406363-d04f5ed078bf84214f2ca732fedff21e.javascript.gzip b/assets/cache/cache-1522406363-d04f5ed078bf84214f2ca732fedff21e.javascript.gzip new file mode 100644 index 0000000..dfaf899 Binary files /dev/null and b/assets/cache/cache-1522406363-d04f5ed078bf84214f2ca732fedff21e.javascript.gzip differ diff --git a/assets/cache/cache-1522406363-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1522406363-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..8d90902 Binary files /dev/null and b/assets/cache/cache-1522406363-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1522406363-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522406363-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..8934ee9 Binary files /dev/null and b/assets/cache/cache-1522406363-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522411300-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522411300-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..9bbc909 Binary files /dev/null and b/assets/cache/cache-1522411300-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522413620-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522413620-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..13b8b2e Binary files /dev/null and b/assets/cache/cache-1522413620-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522413653-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522413653-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..510e2c3 Binary files /dev/null and b/assets/cache/cache-1522413653-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522414332-140a4dbade34f47596f7664c1546959d.css.gzip b/assets/cache/cache-1522414332-140a4dbade34f47596f7664c1546959d.css.gzip new file mode 100644 index 0000000..4912dc5 Binary files /dev/null and b/assets/cache/cache-1522414332-140a4dbade34f47596f7664c1546959d.css.gzip differ diff --git a/assets/cache/cache-1522414349-140a4dbade34f47596f7664c1546959d.css.gzip b/assets/cache/cache-1522414349-140a4dbade34f47596f7664c1546959d.css.gzip new file mode 100644 index 0000000..3233469 Binary files /dev/null and b/assets/cache/cache-1522414349-140a4dbade34f47596f7664c1546959d.css.gzip differ diff --git a/assets/cache/cache-1522414386-0e52c0db43143ab200cbc9caa0a98970.css.gzip b/assets/cache/cache-1522414386-0e52c0db43143ab200cbc9caa0a98970.css.gzip new file mode 100644 index 0000000..cb5bd64 Binary files /dev/null and b/assets/cache/cache-1522414386-0e52c0db43143ab200cbc9caa0a98970.css.gzip differ diff --git a/assets/cache/cache-1522414386-140a4dbade34f47596f7664c1546959d.css.gzip b/assets/cache/cache-1522414386-140a4dbade34f47596f7664c1546959d.css.gzip new file mode 100644 index 0000000..5353205 Binary files /dev/null and b/assets/cache/cache-1522414386-140a4dbade34f47596f7664c1546959d.css.gzip differ diff --git a/assets/cache/cache-1522414386-3aad796dfa62ff393852a3891c5fb8ee.css.gzip b/assets/cache/cache-1522414386-3aad796dfa62ff393852a3891c5fb8ee.css.gzip new file mode 100644 index 0000000..a7fb4d0 Binary files /dev/null and b/assets/cache/cache-1522414386-3aad796dfa62ff393852a3891c5fb8ee.css.gzip differ diff --git a/assets/cache/cache-1522414386-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522414386-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..0b09e29 Binary files /dev/null and b/assets/cache/cache-1522414386-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522414386-c2f33931aec918b582aa3b931c92f1ad.css.gzip b/assets/cache/cache-1522414386-c2f33931aec918b582aa3b931c92f1ad.css.gzip new file mode 100644 index 0000000..65f1b6e Binary files /dev/null and b/assets/cache/cache-1522414386-c2f33931aec918b582aa3b931c92f1ad.css.gzip differ diff --git a/assets/cache/cache-1522419794-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522419794-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..be0f32b Binary files /dev/null and b/assets/cache/cache-1522419794-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522419819-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522419819-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..9bad20d Binary files /dev/null and b/assets/cache/cache-1522419819-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522420007-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522420007-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..6255b2f Binary files /dev/null and b/assets/cache/cache-1522420007-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522420023-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522420023-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..cc0cb77 Binary files /dev/null and b/assets/cache/cache-1522420023-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522420157-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522420157-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..d079572 Binary files /dev/null and b/assets/cache/cache-1522420157-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522420313-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522420313-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..9f61dd7 Binary files /dev/null and b/assets/cache/cache-1522420313-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522420334-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522420334-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..7d92b07 Binary files /dev/null and b/assets/cache/cache-1522420334-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522420371-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522420371-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..51cc631 Binary files /dev/null and b/assets/cache/cache-1522420371-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522420397-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522420397-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..b40633d Binary files /dev/null and b/assets/cache/cache-1522420397-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522421356-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522421356-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..6a06988 Binary files /dev/null and b/assets/cache/cache-1522421356-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522421377-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522421377-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..d98b0af Binary files /dev/null and b/assets/cache/cache-1522421377-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522421392-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522421392-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..f23329d Binary files /dev/null and b/assets/cache/cache-1522421392-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522421434-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522421434-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..c5e637f Binary files /dev/null and b/assets/cache/cache-1522421434-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522421477-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522421477-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..c9fe475 Binary files /dev/null and b/assets/cache/cache-1522421477-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522421507-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522421507-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..c166d44 Binary files /dev/null and b/assets/cache/cache-1522421507-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522421548-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522421548-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..76c1665 Binary files /dev/null and b/assets/cache/cache-1522421548-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522421612-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522421612-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..41cd3ee Binary files /dev/null and b/assets/cache/cache-1522421612-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522421630-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522421630-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..9e11bd1 Binary files /dev/null and b/assets/cache/cache-1522421630-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522421711-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1522421711-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..bfcfbdf Binary files /dev/null and b/assets/cache/cache-1522421711-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1522424228-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522424228-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..55139e7 Binary files /dev/null and b/assets/cache/cache-1522424228-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522424239-82670f60322ac649e84700fc5ddac4ac.css.gzip b/assets/cache/cache-1522424239-82670f60322ac649e84700fc5ddac4ac.css.gzip new file mode 100644 index 0000000..1b61b0c Binary files /dev/null and b/assets/cache/cache-1522424239-82670f60322ac649e84700fc5ddac4ac.css.gzip differ diff --git a/assets/cache/cache-1522424351-878c1500401e1812b95f2be55381de6b.css.gzip b/assets/cache/cache-1522424351-878c1500401e1812b95f2be55381de6b.css.gzip new file mode 100644 index 0000000..cbf8f4b Binary files /dev/null and b/assets/cache/cache-1522424351-878c1500401e1812b95f2be55381de6b.css.gzip differ diff --git a/assets/cache/cache-1522424351-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522424351-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..f266648 Binary files /dev/null and b/assets/cache/cache-1522424351-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522424351-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522424351-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..e1a7fa5 Binary files /dev/null and b/assets/cache/cache-1522424351-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522426292-878c1500401e1812b95f2be55381de6b.css.gzip b/assets/cache/cache-1522426292-878c1500401e1812b95f2be55381de6b.css.gzip new file mode 100644 index 0000000..719da70 Binary files /dev/null and b/assets/cache/cache-1522426292-878c1500401e1812b95f2be55381de6b.css.gzip differ diff --git a/assets/cache/cache-1522426809-4582c350b3a81d6146e779c1781bf082.css.gzip b/assets/cache/cache-1522426809-4582c350b3a81d6146e779c1781bf082.css.gzip new file mode 100644 index 0000000..36ab4d4 Binary files /dev/null and b/assets/cache/cache-1522426809-4582c350b3a81d6146e779c1781bf082.css.gzip differ diff --git a/assets/cache/cache-1522426809-878c1500401e1812b95f2be55381de6b.css.gzip b/assets/cache/cache-1522426809-878c1500401e1812b95f2be55381de6b.css.gzip new file mode 100644 index 0000000..03d34bb Binary files /dev/null and b/assets/cache/cache-1522426809-878c1500401e1812b95f2be55381de6b.css.gzip differ diff --git a/assets/cache/cache-1522427901-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1522427901-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..26f79cc Binary files /dev/null and b/assets/cache/cache-1522427901-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1522427901-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip b/assets/cache/cache-1522427901-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip new file mode 100644 index 0000000..e2c8c9d Binary files /dev/null and b/assets/cache/cache-1522427901-950c0a42e56ff0dcd293d8afe24cabe2.javascript.gzip differ diff --git a/assets/cache/cache-1522428281-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522428281-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..1e5bea0 Binary files /dev/null and b/assets/cache/cache-1522428281-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522428299-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1522428299-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..955ce91 Binary files /dev/null and b/assets/cache/cache-1522428299-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1522428299-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522428299-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..f308603 Binary files /dev/null and b/assets/cache/cache-1522428299-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522428790-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1522428790-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..a13fa7a Binary files /dev/null and b/assets/cache/cache-1522428790-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1522429005-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1522429005-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..888bbee Binary files /dev/null and b/assets/cache/cache-1522429005-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1522429085-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1522429085-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..3c51fe7 Binary files /dev/null and b/assets/cache/cache-1522429085-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1522429295-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1522429295-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..f0370b7 Binary files /dev/null and b/assets/cache/cache-1522429295-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1522429396-65c752f35ee84e1045fad0ef3c4d9804.css.gzip b/assets/cache/cache-1522429396-65c752f35ee84e1045fad0ef3c4d9804.css.gzip new file mode 100644 index 0000000..945c7de Binary files /dev/null and b/assets/cache/cache-1522429396-65c752f35ee84e1045fad0ef3c4d9804.css.gzip differ diff --git a/assets/cache/cache-1522429396-898a785148571f9ba71f4ce1056e7225.css.gzip b/assets/cache/cache-1522429396-898a785148571f9ba71f4ce1056e7225.css.gzip new file mode 100644 index 0000000..1fdeb1a Binary files /dev/null and b/assets/cache/cache-1522429396-898a785148571f9ba71f4ce1056e7225.css.gzip differ diff --git a/assets/cache/cache-1522429396-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522429396-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..466e028 Binary files /dev/null and b/assets/cache/cache-1522429396-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522429396-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1522429396-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..fa229a9 Binary files /dev/null and b/assets/cache/cache-1522429396-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1522429396-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1522429396-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..a85130d Binary files /dev/null and b/assets/cache/cache-1522429396-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1522429396-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522429396-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..f60c86e Binary files /dev/null and b/assets/cache/cache-1522429396-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522431838-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522431838-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..d83f8c2 Binary files /dev/null and b/assets/cache/cache-1522431838-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522431882-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522431882-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..18daeac Binary files /dev/null and b/assets/cache/cache-1522431882-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522431956-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522431956-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..d93979c Binary files /dev/null and b/assets/cache/cache-1522431956-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522431975-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522431975-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..207beda Binary files /dev/null and b/assets/cache/cache-1522431975-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522432008-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522432008-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..96f0868 Binary files /dev/null and b/assets/cache/cache-1522432008-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522432142-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522432142-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..27b04b5 Binary files /dev/null and b/assets/cache/cache-1522432142-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522432150-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522432150-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..8f16fc4 Binary files /dev/null and b/assets/cache/cache-1522432150-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522432340-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522432340-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..068cd95 Binary files /dev/null and b/assets/cache/cache-1522432340-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522432366-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522432366-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..5ab3bf5 Binary files /dev/null and b/assets/cache/cache-1522432366-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522432437-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522432437-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..4f81806 Binary files /dev/null and b/assets/cache/cache-1522432437-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522432448-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522432448-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..9c7c502 Binary files /dev/null and b/assets/cache/cache-1522432448-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522432456-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522432456-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..8126ed5 Binary files /dev/null and b/assets/cache/cache-1522432456-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522432463-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522432463-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..2832577 Binary files /dev/null and b/assets/cache/cache-1522432463-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522432564-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522432564-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..18782eb Binary files /dev/null and b/assets/cache/cache-1522432564-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522432615-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522432615-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..e3e6d23 Binary files /dev/null and b/assets/cache/cache-1522432615-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522432645-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522432645-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..130fb16 Binary files /dev/null and b/assets/cache/cache-1522432645-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522432704-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522432704-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..5cefa93 Binary files /dev/null and b/assets/cache/cache-1522432704-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522432751-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522432751-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..af73d25 Binary files /dev/null and b/assets/cache/cache-1522432751-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522433125-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522433125-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..36a4f6c Binary files /dev/null and b/assets/cache/cache-1522433125-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522433192-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522433192-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..9e1d94d Binary files /dev/null and b/assets/cache/cache-1522433192-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522433206-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522433206-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..f31af45 Binary files /dev/null and b/assets/cache/cache-1522433206-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522488437-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522488437-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..7b7de74 Binary files /dev/null and b/assets/cache/cache-1522488437-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522488521-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522488521-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..48fda20 Binary files /dev/null and b/assets/cache/cache-1522488521-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522488632-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522488632-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..b35a307 Binary files /dev/null and b/assets/cache/cache-1522488632-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522488806-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522488806-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..8da51c5 Binary files /dev/null and b/assets/cache/cache-1522488806-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522489442-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522489442-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..f180137 Binary files /dev/null and b/assets/cache/cache-1522489442-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522489493-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522489493-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..e9f54d2 Binary files /dev/null and b/assets/cache/cache-1522489493-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522489698-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522489698-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..d39bc06 Binary files /dev/null and b/assets/cache/cache-1522489698-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522490125-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522490125-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..abd4850 Binary files /dev/null and b/assets/cache/cache-1522490125-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522490453-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522490453-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..c05c80d Binary files /dev/null and b/assets/cache/cache-1522490453-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522490474-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522490474-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..1f1f05f Binary files /dev/null and b/assets/cache/cache-1522490474-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522490496-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522490496-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..94ae405 Binary files /dev/null and b/assets/cache/cache-1522490496-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522490611-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522490611-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..5439826 Binary files /dev/null and b/assets/cache/cache-1522490611-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522490645-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522490645-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..1d5ed12 Binary files /dev/null and b/assets/cache/cache-1522490645-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522490675-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522490675-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..a9a7eb3 Binary files /dev/null and b/assets/cache/cache-1522490675-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522490755-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522490755-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..a4da879 Binary files /dev/null and b/assets/cache/cache-1522490755-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522500401-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522500401-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..0a3f3c6 Binary files /dev/null and b/assets/cache/cache-1522500401-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522500711-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522500711-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..c69fc96 Binary files /dev/null and b/assets/cache/cache-1522500711-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522501780-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522501780-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..09ebc06 Binary files /dev/null and b/assets/cache/cache-1522501780-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522501864-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522501864-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..b20ce62 Binary files /dev/null and b/assets/cache/cache-1522501864-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522501899-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522501899-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..b6e031d Binary files /dev/null and b/assets/cache/cache-1522501899-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522501907-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522501907-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..198547a Binary files /dev/null and b/assets/cache/cache-1522501907-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522502036-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522502036-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..21e0b0d Binary files /dev/null and b/assets/cache/cache-1522502036-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522502117-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522502117-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..f28f33b Binary files /dev/null and b/assets/cache/cache-1522502117-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522502129-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522502129-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..9d04fd1 Binary files /dev/null and b/assets/cache/cache-1522502129-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522502256-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522502256-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..c196e64 Binary files /dev/null and b/assets/cache/cache-1522502256-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522502654-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522502654-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..baf32d2 Binary files /dev/null and b/assets/cache/cache-1522502654-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522502741-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522502741-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..e886822 Binary files /dev/null and b/assets/cache/cache-1522502741-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522502892-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522502892-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..c20f25f Binary files /dev/null and b/assets/cache/cache-1522502892-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522503141-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522503141-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..9ef4c71 Binary files /dev/null and b/assets/cache/cache-1522503141-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522503151-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522503151-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..c20f25f Binary files /dev/null and b/assets/cache/cache-1522503151-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522503428-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522503428-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..68a7721 Binary files /dev/null and b/assets/cache/cache-1522503428-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522503444-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522503444-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..6609a18 Binary files /dev/null and b/assets/cache/cache-1522503444-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522503662-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522503662-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..3ee435b Binary files /dev/null and b/assets/cache/cache-1522503662-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522503771-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522503771-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..0a87641 Binary files /dev/null and b/assets/cache/cache-1522503771-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522503797-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522503797-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..b8ddf12 Binary files /dev/null and b/assets/cache/cache-1522503797-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522503804-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522503804-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..685b00d Binary files /dev/null and b/assets/cache/cache-1522503804-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522503878-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522503878-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..52ca17b Binary files /dev/null and b/assets/cache/cache-1522503878-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522503919-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522503919-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..2302110 Binary files /dev/null and b/assets/cache/cache-1522503919-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522504071-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522504071-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..845d57b Binary files /dev/null and b/assets/cache/cache-1522504071-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522504157-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522504157-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..02ca3c0 Binary files /dev/null and b/assets/cache/cache-1522504157-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522504215-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522504215-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..0b18668 Binary files /dev/null and b/assets/cache/cache-1522504215-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522504541-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522504541-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..3b6544e Binary files /dev/null and b/assets/cache/cache-1522504541-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522504630-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522504630-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..3a64b20 Binary files /dev/null and b/assets/cache/cache-1522504630-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522504826-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522504826-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..ec0017a Binary files /dev/null and b/assets/cache/cache-1522504826-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522504898-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522504898-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..c16459e Binary files /dev/null and b/assets/cache/cache-1522504898-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522505422-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522505422-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..e358df2 Binary files /dev/null and b/assets/cache/cache-1522505422-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522505725-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522505725-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..0d73726 Binary files /dev/null and b/assets/cache/cache-1522505725-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522505962-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522505962-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..8961dac Binary files /dev/null and b/assets/cache/cache-1522505962-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522506109-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522506109-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..fbc75ec Binary files /dev/null and b/assets/cache/cache-1522506109-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522506182-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522506182-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..7c2ca51 Binary files /dev/null and b/assets/cache/cache-1522506182-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522506214-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522506214-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..f69eb2d Binary files /dev/null and b/assets/cache/cache-1522506214-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522506274-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522506274-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..2b6d89d Binary files /dev/null and b/assets/cache/cache-1522506274-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522506305-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522506305-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..c65993c Binary files /dev/null and b/assets/cache/cache-1522506305-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522506449-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522506449-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..c58be55 Binary files /dev/null and b/assets/cache/cache-1522506449-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522506492-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522506492-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..4e187bc Binary files /dev/null and b/assets/cache/cache-1522506492-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522506515-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522506515-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..556f0d4 Binary files /dev/null and b/assets/cache/cache-1522506515-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522506577-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522506577-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..540b674 Binary files /dev/null and b/assets/cache/cache-1522506577-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522515328-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522515328-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..acea2d0 Binary files /dev/null and b/assets/cache/cache-1522515328-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522515455-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip b/assets/cache/cache-1522515455-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip new file mode 100644 index 0000000..2be8d40 Binary files /dev/null and b/assets/cache/cache-1522515455-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip differ diff --git a/assets/cache/cache-1522515455-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip b/assets/cache/cache-1522515455-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip new file mode 100644 index 0000000..0c111ee Binary files /dev/null and b/assets/cache/cache-1522515455-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip differ diff --git a/assets/cache/cache-1522515455-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522515455-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..410efd3 Binary files /dev/null and b/assets/cache/cache-1522515455-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522515455-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522515455-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..dee2760 Binary files /dev/null and b/assets/cache/cache-1522515455-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522515455-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522515455-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..cdbbcf2 Binary files /dev/null and b/assets/cache/cache-1522515455-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522515455-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1522515455-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..6feb5dc Binary files /dev/null and b/assets/cache/cache-1522515455-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1522515730-898a785148571f9ba71f4ce1056e7225.css.gzip b/assets/cache/cache-1522515730-898a785148571f9ba71f4ce1056e7225.css.gzip new file mode 100644 index 0000000..7b2bda6 Binary files /dev/null and b/assets/cache/cache-1522515730-898a785148571f9ba71f4ce1056e7225.css.gzip differ diff --git a/assets/cache/cache-1522515730-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522515730-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..12a8326 Binary files /dev/null and b/assets/cache/cache-1522515730-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522515730-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1522515730-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..d05004f Binary files /dev/null and b/assets/cache/cache-1522515730-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1522515730-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1522515730-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..664e3bd Binary files /dev/null and b/assets/cache/cache-1522515730-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1522527776-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522527776-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..5c06a97 Binary files /dev/null and b/assets/cache/cache-1522527776-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522527928-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522527928-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..c61b746 Binary files /dev/null and b/assets/cache/cache-1522527928-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522528059-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522528059-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..b0467f1 Binary files /dev/null and b/assets/cache/cache-1522528059-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522528091-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522528091-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..a35927a Binary files /dev/null and b/assets/cache/cache-1522528091-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522528102-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522528102-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..083cda9 Binary files /dev/null and b/assets/cache/cache-1522528102-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522528363-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522528363-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..fbdf239 Binary files /dev/null and b/assets/cache/cache-1522528363-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522528472-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522528472-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..91f140a Binary files /dev/null and b/assets/cache/cache-1522528472-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522528552-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522528552-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..07a6970 Binary files /dev/null and b/assets/cache/cache-1522528552-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522528749-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522528749-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..9c4bc96 Binary files /dev/null and b/assets/cache/cache-1522528749-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522528800-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522528800-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..2fb789b Binary files /dev/null and b/assets/cache/cache-1522528800-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522528884-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522528884-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..a67cf0e Binary files /dev/null and b/assets/cache/cache-1522528884-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522529043-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522529043-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..a205faf Binary files /dev/null and b/assets/cache/cache-1522529043-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522529208-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522529208-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..6ccc2fd Binary files /dev/null and b/assets/cache/cache-1522529208-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522529227-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522529227-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..e0c4be0 Binary files /dev/null and b/assets/cache/cache-1522529227-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522529409-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522529409-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..8b11329 Binary files /dev/null and b/assets/cache/cache-1522529409-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522529637-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522529637-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..0f55c87 Binary files /dev/null and b/assets/cache/cache-1522529637-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522529704-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522529704-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..0e89c7d Binary files /dev/null and b/assets/cache/cache-1522529704-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522529716-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522529716-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..26d3462 Binary files /dev/null and b/assets/cache/cache-1522529716-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522529771-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522529771-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..48bad97 Binary files /dev/null and b/assets/cache/cache-1522529771-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522529839-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522529839-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..fe6577d Binary files /dev/null and b/assets/cache/cache-1522529839-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522529938-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522529938-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..60bd80a Binary files /dev/null and b/assets/cache/cache-1522529938-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522529958-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522529958-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..29ad0c5 Binary files /dev/null and b/assets/cache/cache-1522529958-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522529986-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522529986-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..e98a0e3 Binary files /dev/null and b/assets/cache/cache-1522529986-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522530032-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522530032-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..fbb6bb0 Binary files /dev/null and b/assets/cache/cache-1522530032-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522530089-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522530089-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..471192d Binary files /dev/null and b/assets/cache/cache-1522530089-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522571877-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522571877-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..7731ac1 Binary files /dev/null and b/assets/cache/cache-1522571877-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522571901-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522571901-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..d86a9e8 Binary files /dev/null and b/assets/cache/cache-1522571901-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522571987-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522571987-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..b7a88b6 Binary files /dev/null and b/assets/cache/cache-1522571987-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522572113-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522572113-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..00e4cfd Binary files /dev/null and b/assets/cache/cache-1522572113-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522572178-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522572178-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..0ab7a4b Binary files /dev/null and b/assets/cache/cache-1522572178-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522572206-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522572206-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..f5fffdd Binary files /dev/null and b/assets/cache/cache-1522572206-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522572227-898a785148571f9ba71f4ce1056e7225.css.gzip b/assets/cache/cache-1522572227-898a785148571f9ba71f4ce1056e7225.css.gzip new file mode 100644 index 0000000..a43eb87 Binary files /dev/null and b/assets/cache/cache-1522572227-898a785148571f9ba71f4ce1056e7225.css.gzip differ diff --git a/assets/cache/cache-1522572227-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522572227-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..ffa2671 Binary files /dev/null and b/assets/cache/cache-1522572227-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522572227-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1522572227-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..bdc53cc Binary files /dev/null and b/assets/cache/cache-1522572227-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1522572227-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522572227-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..d71dea6 Binary files /dev/null and b/assets/cache/cache-1522572227-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522572968-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522572968-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..64453fe Binary files /dev/null and b/assets/cache/cache-1522572968-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522572968-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522572968-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..7351b25 Binary files /dev/null and b/assets/cache/cache-1522572968-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522572968-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1522572968-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..339a40f Binary files /dev/null and b/assets/cache/cache-1522572968-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1522575629-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522575629-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..5625bfc Binary files /dev/null and b/assets/cache/cache-1522575629-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522593221-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522593221-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..93cd135 Binary files /dev/null and b/assets/cache/cache-1522593221-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522593686-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522593686-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..5b22121 Binary files /dev/null and b/assets/cache/cache-1522593686-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522593730-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522593730-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..0cc99c4 Binary files /dev/null and b/assets/cache/cache-1522593730-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522593795-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522593795-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..e69d8b5 Binary files /dev/null and b/assets/cache/cache-1522593795-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522593889-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522593889-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..dd3d8a3 Binary files /dev/null and b/assets/cache/cache-1522593889-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522594143-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522594143-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..e63233a Binary files /dev/null and b/assets/cache/cache-1522594143-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522594177-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522594177-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..b019487 Binary files /dev/null and b/assets/cache/cache-1522594177-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522594271-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522594271-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..6bfb137 Binary files /dev/null and b/assets/cache/cache-1522594271-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522594288-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522594288-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..1233dc6 Binary files /dev/null and b/assets/cache/cache-1522594288-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522594358-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522594358-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..801a483 Binary files /dev/null and b/assets/cache/cache-1522594358-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522594406-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522594406-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..104c959 Binary files /dev/null and b/assets/cache/cache-1522594406-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522594652-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522594652-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..44924dd Binary files /dev/null and b/assets/cache/cache-1522594652-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522594666-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522594666-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..768062f Binary files /dev/null and b/assets/cache/cache-1522594666-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522594823-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522594823-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..dd5f44c Binary files /dev/null and b/assets/cache/cache-1522594823-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522594924-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522594924-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..4c30e01 Binary files /dev/null and b/assets/cache/cache-1522594924-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522594962-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522594962-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..5e1bfff Binary files /dev/null and b/assets/cache/cache-1522594962-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522595050-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522595050-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..45065f9 Binary files /dev/null and b/assets/cache/cache-1522595050-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522595680-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522595680-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..aebe2a7 Binary files /dev/null and b/assets/cache/cache-1522595680-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522596443-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip b/assets/cache/cache-1522596443-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip new file mode 100644 index 0000000..4535681 Binary files /dev/null and b/assets/cache/cache-1522596443-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip differ diff --git a/assets/cache/cache-1522596443-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522596443-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..5f0b0b1 Binary files /dev/null and b/assets/cache/cache-1522596443-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522596443-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522596443-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..bb424b3 Binary files /dev/null and b/assets/cache/cache-1522596443-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522596443-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip b/assets/cache/cache-1522596443-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip new file mode 100644 index 0000000..1b91ddf Binary files /dev/null and b/assets/cache/cache-1522596443-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip differ diff --git a/assets/cache/cache-1522596443-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522596443-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..93c8181 Binary files /dev/null and b/assets/cache/cache-1522596443-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522596443-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1522596443-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..1a71317 Binary files /dev/null and b/assets/cache/cache-1522596443-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1522596443-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip b/assets/cache/cache-1522596443-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip new file mode 100644 index 0000000..dc76128 Binary files /dev/null and b/assets/cache/cache-1522596443-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip differ diff --git a/assets/cache/cache-1522596550-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1522596550-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..26ed24d Binary files /dev/null and b/assets/cache/cache-1522596550-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1522596550-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522596550-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..a449b80 Binary files /dev/null and b/assets/cache/cache-1522596550-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522600964-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1522600964-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..b2bce20 Binary files /dev/null and b/assets/cache/cache-1522600964-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1522601532-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522601532-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..eeffeaf Binary files /dev/null and b/assets/cache/cache-1522601532-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522601532-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1522601532-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..35c526a Binary files /dev/null and b/assets/cache/cache-1522601532-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1522603292-898a785148571f9ba71f4ce1056e7225.css.gzip b/assets/cache/cache-1522603292-898a785148571f9ba71f4ce1056e7225.css.gzip new file mode 100644 index 0000000..9782dab Binary files /dev/null and b/assets/cache/cache-1522603292-898a785148571f9ba71f4ce1056e7225.css.gzip differ diff --git a/assets/cache/cache-1522603292-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522603292-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..f60213c Binary files /dev/null and b/assets/cache/cache-1522603292-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522603292-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1522603292-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..3924132 Binary files /dev/null and b/assets/cache/cache-1522603292-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1522603292-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522603292-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..81ef384 Binary files /dev/null and b/assets/cache/cache-1522603292-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522610970-898a785148571f9ba71f4ce1056e7225.css.gzip b/assets/cache/cache-1522610970-898a785148571f9ba71f4ce1056e7225.css.gzip new file mode 100644 index 0000000..7c21ed8 Binary files /dev/null and b/assets/cache/cache-1522610970-898a785148571f9ba71f4ce1056e7225.css.gzip differ diff --git a/assets/cache/cache-1522611013-898a785148571f9ba71f4ce1056e7225.css.gzip b/assets/cache/cache-1522611013-898a785148571f9ba71f4ce1056e7225.css.gzip new file mode 100644 index 0000000..b202142 Binary files /dev/null and b/assets/cache/cache-1522611013-898a785148571f9ba71f4ce1056e7225.css.gzip differ diff --git a/assets/cache/cache-1522611031-898a785148571f9ba71f4ce1056e7225.css.gzip b/assets/cache/cache-1522611031-898a785148571f9ba71f4ce1056e7225.css.gzip new file mode 100644 index 0000000..6c7a3cb Binary files /dev/null and b/assets/cache/cache-1522611031-898a785148571f9ba71f4ce1056e7225.css.gzip differ diff --git a/assets/cache/cache-1522611070-898a785148571f9ba71f4ce1056e7225.css.gzip b/assets/cache/cache-1522611070-898a785148571f9ba71f4ce1056e7225.css.gzip new file mode 100644 index 0000000..83e54a0 Binary files /dev/null and b/assets/cache/cache-1522611070-898a785148571f9ba71f4ce1056e7225.css.gzip differ diff --git a/assets/cache/cache-1522611089-27cdef42f4dacedfd46d79027428dfc5.css.gzip b/assets/cache/cache-1522611089-27cdef42f4dacedfd46d79027428dfc5.css.gzip new file mode 100644 index 0000000..cd4b75b Binary files /dev/null and b/assets/cache/cache-1522611089-27cdef42f4dacedfd46d79027428dfc5.css.gzip differ diff --git a/assets/cache/cache-1522611089-2c4f32acbc7f8d5b46bcb1dd7dcdf992.css.gzip b/assets/cache/cache-1522611089-2c4f32acbc7f8d5b46bcb1dd7dcdf992.css.gzip new file mode 100644 index 0000000..e3556fa Binary files /dev/null and b/assets/cache/cache-1522611089-2c4f32acbc7f8d5b46bcb1dd7dcdf992.css.gzip differ diff --git a/assets/cache/cache-1522611089-591ad317adf51a9b8179bd2316a54f82.css.gzip b/assets/cache/cache-1522611089-591ad317adf51a9b8179bd2316a54f82.css.gzip new file mode 100644 index 0000000..cd99106 Binary files /dev/null and b/assets/cache/cache-1522611089-591ad317adf51a9b8179bd2316a54f82.css.gzip differ diff --git a/assets/cache/cache-1522611089-65c752f35ee84e1045fad0ef3c4d9804.css.gzip b/assets/cache/cache-1522611089-65c752f35ee84e1045fad0ef3c4d9804.css.gzip new file mode 100644 index 0000000..f0aafda Binary files /dev/null and b/assets/cache/cache-1522611089-65c752f35ee84e1045fad0ef3c4d9804.css.gzip differ diff --git a/assets/cache/cache-1522611089-739a25536af3a0b88e34d4c6bdbd1024.css.gzip b/assets/cache/cache-1522611089-739a25536af3a0b88e34d4c6bdbd1024.css.gzip new file mode 100644 index 0000000..cad0fb5 Binary files /dev/null and b/assets/cache/cache-1522611089-739a25536af3a0b88e34d4c6bdbd1024.css.gzip differ diff --git a/assets/cache/cache-1522611089-898a785148571f9ba71f4ce1056e7225.css.gzip b/assets/cache/cache-1522611089-898a785148571f9ba71f4ce1056e7225.css.gzip new file mode 100644 index 0000000..6c7a3cb Binary files /dev/null and b/assets/cache/cache-1522611089-898a785148571f9ba71f4ce1056e7225.css.gzip differ diff --git a/assets/cache/cache-1522611089-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1522611089-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..aab6add Binary files /dev/null and b/assets/cache/cache-1522611089-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1522611089-da2fd639a568e046693ea585b40783c8.css.gzip b/assets/cache/cache-1522611089-da2fd639a568e046693ea585b40783c8.css.gzip new file mode 100644 index 0000000..ae39125 Binary files /dev/null and b/assets/cache/cache-1522611089-da2fd639a568e046693ea585b40783c8.css.gzip differ diff --git a/assets/cache/cache-1522611089-f1e5483e88f65a259899ae2362c40fb0.css.gzip b/assets/cache/cache-1522611089-f1e5483e88f65a259899ae2362c40fb0.css.gzip new file mode 100644 index 0000000..8b257b2 Binary files /dev/null and b/assets/cache/cache-1522611089-f1e5483e88f65a259899ae2362c40fb0.css.gzip differ diff --git a/assets/cache/cache-1522663811-a7409b1ad44f4315d864abb150edec77.javascript.gzip b/assets/cache/cache-1522663811-a7409b1ad44f4315d864abb150edec77.javascript.gzip new file mode 100644 index 0000000..896db12 Binary files /dev/null and b/assets/cache/cache-1522663811-a7409b1ad44f4315d864abb150edec77.javascript.gzip differ diff --git a/assets/cache/cache-1522663811-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip b/assets/cache/cache-1522663811-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip new file mode 100644 index 0000000..21544a0 Binary files /dev/null and b/assets/cache/cache-1522663811-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip differ diff --git a/assets/cache/cache-1522664114-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip b/assets/cache/cache-1522664114-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip new file mode 100644 index 0000000..8656522 Binary files /dev/null and b/assets/cache/cache-1522664114-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip differ diff --git a/assets/cache/cache-1522664168-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip b/assets/cache/cache-1522664168-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip new file mode 100644 index 0000000..06d8e75 Binary files /dev/null and b/assets/cache/cache-1522664168-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip differ diff --git a/assets/cache/cache-1522664174-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip b/assets/cache/cache-1522664174-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip new file mode 100644 index 0000000..21544a0 Binary files /dev/null and b/assets/cache/cache-1522664174-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip differ diff --git a/assets/cache/cache-1522664197-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip b/assets/cache/cache-1522664197-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip new file mode 100644 index 0000000..c1d6b60 Binary files /dev/null and b/assets/cache/cache-1522664197-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip differ diff --git a/assets/cache/cache-1522664215-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip b/assets/cache/cache-1522664215-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip new file mode 100644 index 0000000..26f0e57 Binary files /dev/null and b/assets/cache/cache-1522664215-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip differ diff --git a/assets/cache/cache-1522664242-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip b/assets/cache/cache-1522664242-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip new file mode 100644 index 0000000..bfcb951 Binary files /dev/null and b/assets/cache/cache-1522664242-ca9e285a5e50aca400946fb7edef32f1.javascript.gzip differ diff --git a/assets/cache/cache-1522666023-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1522666023-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..28e3999 Binary files /dev/null and b/assets/cache/cache-1522666023-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1522666153-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1522666153-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..5eb3124 Binary files /dev/null and b/assets/cache/cache-1522666153-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1522666624-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522666624-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..c8a5017 Binary files /dev/null and b/assets/cache/cache-1522666624-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522666729-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522666729-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..ddbbcfa Binary files /dev/null and b/assets/cache/cache-1522666729-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522666808-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522666808-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..c8a5017 Binary files /dev/null and b/assets/cache/cache-1522666808-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522666833-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522666833-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..8f37b44 Binary files /dev/null and b/assets/cache/cache-1522666833-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522666955-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522666955-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..a5a3ab2 Binary files /dev/null and b/assets/cache/cache-1522666955-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522666999-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522666999-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..b7e1301 Binary files /dev/null and b/assets/cache/cache-1522666999-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522667023-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522667023-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..6b5f4b9 Binary files /dev/null and b/assets/cache/cache-1522667023-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522667168-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522667168-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..0b042c3 Binary files /dev/null and b/assets/cache/cache-1522667168-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522667201-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522667201-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..6e44f3c Binary files /dev/null and b/assets/cache/cache-1522667201-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522667225-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522667225-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..7ec36ff Binary files /dev/null and b/assets/cache/cache-1522667225-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522667266-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522667266-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..a2bc21b Binary files /dev/null and b/assets/cache/cache-1522667266-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522667288-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522667288-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..7e7de07 Binary files /dev/null and b/assets/cache/cache-1522667288-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522667309-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522667309-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..0b2a4da Binary files /dev/null and b/assets/cache/cache-1522667309-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522667489-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522667489-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..d88e27d Binary files /dev/null and b/assets/cache/cache-1522667489-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522667727-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522667727-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..b0dc837 Binary files /dev/null and b/assets/cache/cache-1522667727-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522667812-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522667812-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..0c41526 Binary files /dev/null and b/assets/cache/cache-1522667812-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522669262-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522669262-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..228bbb0 Binary files /dev/null and b/assets/cache/cache-1522669262-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522669297-4b5fbb6b4a90f1e2098a7ca11272fad5.css.gzip b/assets/cache/cache-1522669297-4b5fbb6b4a90f1e2098a7ca11272fad5.css.gzip new file mode 100644 index 0000000..20dfc2f Binary files /dev/null and b/assets/cache/cache-1522669297-4b5fbb6b4a90f1e2098a7ca11272fad5.css.gzip differ diff --git a/assets/cache/cache-1522669297-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1522669297-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..0f99c98 Binary files /dev/null and b/assets/cache/cache-1522669297-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1522669297-a212b4a951b74a504ee27f411fec933c.css.gzip b/assets/cache/cache-1522669297-a212b4a951b74a504ee27f411fec933c.css.gzip new file mode 100644 index 0000000..7662ef6 Binary files /dev/null and b/assets/cache/cache-1522669297-a212b4a951b74a504ee27f411fec933c.css.gzip differ diff --git a/assets/cache/cache-1522669687-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522669687-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..fe62f99 Binary files /dev/null and b/assets/cache/cache-1522669687-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522669760-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522669760-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..21cd33c Binary files /dev/null and b/assets/cache/cache-1522669760-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522669803-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522669803-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..ee40476 Binary files /dev/null and b/assets/cache/cache-1522669803-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522669824-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1522669824-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..d32db59 Binary files /dev/null and b/assets/cache/cache-1522669824-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1522676101-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522676101-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..69c3a54 Binary files /dev/null and b/assets/cache/cache-1522676101-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522676101-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522676101-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..a73b130 Binary files /dev/null and b/assets/cache/cache-1522676101-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522676269-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522676269-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..fa9cad9 Binary files /dev/null and b/assets/cache/cache-1522676269-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522676434-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522676434-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..6809401 Binary files /dev/null and b/assets/cache/cache-1522676434-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522676626-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522676626-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..1729072 Binary files /dev/null and b/assets/cache/cache-1522676626-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522687412-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522687412-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..22b1b1c Binary files /dev/null and b/assets/cache/cache-1522687412-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522687702-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522687702-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..6f7747b Binary files /dev/null and b/assets/cache/cache-1522687702-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522690677-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522690677-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..08ec393 Binary files /dev/null and b/assets/cache/cache-1522690677-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522690701-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522690701-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..8a2368b Binary files /dev/null and b/assets/cache/cache-1522690701-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522690736-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522690736-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..c56b3d0 Binary files /dev/null and b/assets/cache/cache-1522690736-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522690939-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522690939-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..32693e8 Binary files /dev/null and b/assets/cache/cache-1522690939-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522690961-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522690961-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..474fc7b Binary files /dev/null and b/assets/cache/cache-1522690961-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522691004-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522691004-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..5db608b Binary files /dev/null and b/assets/cache/cache-1522691004-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522691021-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522691021-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..cc09109 Binary files /dev/null and b/assets/cache/cache-1522691021-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522691067-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522691067-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..5d63409 Binary files /dev/null and b/assets/cache/cache-1522691067-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522691302-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522691302-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..2136fb4 Binary files /dev/null and b/assets/cache/cache-1522691302-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522691331-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522691331-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..743fb51 Binary files /dev/null and b/assets/cache/cache-1522691331-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522691341-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522691341-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..a565d5b Binary files /dev/null and b/assets/cache/cache-1522691341-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522691356-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522691356-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..bb6b128 Binary files /dev/null and b/assets/cache/cache-1522691356-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522691394-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522691394-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..eec51e0 Binary files /dev/null and b/assets/cache/cache-1522691394-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522691425-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522691425-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..f9c835b Binary files /dev/null and b/assets/cache/cache-1522691425-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522691471-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522691471-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..50baaac Binary files /dev/null and b/assets/cache/cache-1522691471-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522691492-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522691492-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..68fedac Binary files /dev/null and b/assets/cache/cache-1522691492-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522691634-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522691634-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..08b11c4 Binary files /dev/null and b/assets/cache/cache-1522691634-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522691742-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522691742-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..2d83ccb Binary files /dev/null and b/assets/cache/cache-1522691742-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522691769-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522691769-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..9b2cbe5 Binary files /dev/null and b/assets/cache/cache-1522691769-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522692127-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522692127-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..4343203 Binary files /dev/null and b/assets/cache/cache-1522692127-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522692146-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522692146-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..89c2a33 Binary files /dev/null and b/assets/cache/cache-1522692146-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522692167-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522692167-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..3b70a96 Binary files /dev/null and b/assets/cache/cache-1522692167-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522692409-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522692409-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..b4a0c67 Binary files /dev/null and b/assets/cache/cache-1522692409-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522692427-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522692427-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..000f64d Binary files /dev/null and b/assets/cache/cache-1522692427-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522692481-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522692481-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..330b95f Binary files /dev/null and b/assets/cache/cache-1522692481-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522692544-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522692544-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..ae6849d Binary files /dev/null and b/assets/cache/cache-1522692544-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522752050-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522752050-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..6f18129 Binary files /dev/null and b/assets/cache/cache-1522752050-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522752481-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522752481-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..bc4ab3a Binary files /dev/null and b/assets/cache/cache-1522752481-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522752642-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522752642-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..8feb228 Binary files /dev/null and b/assets/cache/cache-1522752642-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522753783-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522753783-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..647f961 Binary files /dev/null and b/assets/cache/cache-1522753783-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522753821-5e5a3bd9cae76bd6cee2caca8288e323.css.gzip b/assets/cache/cache-1522753821-5e5a3bd9cae76bd6cee2caca8288e323.css.gzip new file mode 100644 index 0000000..c6eb6b6 Binary files /dev/null and b/assets/cache/cache-1522753821-5e5a3bd9cae76bd6cee2caca8288e323.css.gzip differ diff --git a/assets/cache/cache-1522753821-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522753821-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..a25dae4 Binary files /dev/null and b/assets/cache/cache-1522753821-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522753821-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1522753821-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..830de9b Binary files /dev/null and b/assets/cache/cache-1522753821-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1522753821-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1522753821-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..00f506b Binary files /dev/null and b/assets/cache/cache-1522753821-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1522753821-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522753821-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..a8cbabb Binary files /dev/null and b/assets/cache/cache-1522753821-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522759386-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522759386-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..2e3fc0c Binary files /dev/null and b/assets/cache/cache-1522759386-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522759477-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522759477-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..4c2ebf6 Binary files /dev/null and b/assets/cache/cache-1522759477-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522759512-2c4f32acbc7f8d5b46bcb1dd7dcdf992.css.gzip b/assets/cache/cache-1522759512-2c4f32acbc7f8d5b46bcb1dd7dcdf992.css.gzip new file mode 100644 index 0000000..d476f6f Binary files /dev/null and b/assets/cache/cache-1522759512-2c4f32acbc7f8d5b46bcb1dd7dcdf992.css.gzip differ diff --git a/assets/cache/cache-1522759512-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1522759512-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..bf3e1e4 Binary files /dev/null and b/assets/cache/cache-1522759512-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1522759512-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1522759512-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..312825d Binary files /dev/null and b/assets/cache/cache-1522759512-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1522759512-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1522759512-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..81ee680 Binary files /dev/null and b/assets/cache/cache-1522759512-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1522759512-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1522759512-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..ff3e2ec Binary files /dev/null and b/assets/cache/cache-1522759512-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1522759512-a212b4a951b74a504ee27f411fec933c.css.gzip b/assets/cache/cache-1522759512-a212b4a951b74a504ee27f411fec933c.css.gzip new file mode 100644 index 0000000..664165e Binary files /dev/null and b/assets/cache/cache-1522759512-a212b4a951b74a504ee27f411fec933c.css.gzip differ diff --git a/assets/cache/cache-1522759512-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1522759512-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..7872c66 Binary files /dev/null and b/assets/cache/cache-1522759512-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1522759915-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522759915-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..e665b5d Binary files /dev/null and b/assets/cache/cache-1522759915-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522759935-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522759935-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..3f8a943 Binary files /dev/null and b/assets/cache/cache-1522759935-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522761463-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522761463-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..732f903 Binary files /dev/null and b/assets/cache/cache-1522761463-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522761472-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522761472-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..9f5e9ea Binary files /dev/null and b/assets/cache/cache-1522761472-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522761520-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522761520-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..5e66bc9 Binary files /dev/null and b/assets/cache/cache-1522761520-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522761633-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522761633-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..6ba412c Binary files /dev/null and b/assets/cache/cache-1522761633-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522765467-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522765467-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..82fb925 Binary files /dev/null and b/assets/cache/cache-1522765467-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522765605-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip b/assets/cache/cache-1522765605-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip new file mode 100644 index 0000000..bf33ffc Binary files /dev/null and b/assets/cache/cache-1522765605-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip differ diff --git a/assets/cache/cache-1522765605-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip b/assets/cache/cache-1522765605-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip new file mode 100644 index 0000000..40f4231 Binary files /dev/null and b/assets/cache/cache-1522765605-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip differ diff --git a/assets/cache/cache-1522765605-1302bd957c3ee703968123ec6a7340a0.javascript.gzip b/assets/cache/cache-1522765605-1302bd957c3ee703968123ec6a7340a0.javascript.gzip new file mode 100644 index 0000000..e8694f4 Binary files /dev/null and b/assets/cache/cache-1522765605-1302bd957c3ee703968123ec6a7340a0.javascript.gzip differ diff --git a/assets/cache/cache-1522765605-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1522765605-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..24bccda Binary files /dev/null and b/assets/cache/cache-1522765605-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1522765605-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1522765605-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..8d0f67c Binary files /dev/null and b/assets/cache/cache-1522765605-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1522765605-720143948dfefe06817d0718579c0770.javascript.gzip b/assets/cache/cache-1522765605-720143948dfefe06817d0718579c0770.javascript.gzip new file mode 100644 index 0000000..c43551a Binary files /dev/null and b/assets/cache/cache-1522765605-720143948dfefe06817d0718579c0770.javascript.gzip differ diff --git a/assets/cache/cache-1522765605-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1522765605-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..83350bf Binary files /dev/null and b/assets/cache/cache-1522765605-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1522765605-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip b/assets/cache/cache-1522765605-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip new file mode 100644 index 0000000..8ef609c Binary files /dev/null and b/assets/cache/cache-1522765605-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip differ diff --git a/assets/cache/cache-1522765605-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1522765605-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..322b750 Binary files /dev/null and b/assets/cache/cache-1522765605-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1522765605-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1522765605-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..1ebc6e8 Binary files /dev/null and b/assets/cache/cache-1522765605-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1522765605-d04f5ed078bf84214f2ca732fedff21e.javascript.gzip b/assets/cache/cache-1522765605-d04f5ed078bf84214f2ca732fedff21e.javascript.gzip new file mode 100644 index 0000000..1e3f18f Binary files /dev/null and b/assets/cache/cache-1522765605-d04f5ed078bf84214f2ca732fedff21e.javascript.gzip differ diff --git a/assets/cache/cache-1522765605-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1522765605-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..af9c881 Binary files /dev/null and b/assets/cache/cache-1522765605-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1522765605-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip b/assets/cache/cache-1522765605-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip new file mode 100644 index 0000000..198f50d Binary files /dev/null and b/assets/cache/cache-1522765605-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip differ diff --git a/assets/cache/cache-1522833673-323500f453ddd860cc4cb3b05e1aefdd.javascript.gzip b/assets/cache/cache-1522833673-323500f453ddd860cc4cb3b05e1aefdd.javascript.gzip new file mode 100644 index 0000000..8b5cc15 Binary files /dev/null and b/assets/cache/cache-1522833673-323500f453ddd860cc4cb3b05e1aefdd.javascript.gzip differ diff --git a/assets/cache/cache-1522833839-323500f453ddd860cc4cb3b05e1aefdd.javascript.gzip b/assets/cache/cache-1522833839-323500f453ddd860cc4cb3b05e1aefdd.javascript.gzip new file mode 100644 index 0000000..d8c7de8 Binary files /dev/null and b/assets/cache/cache-1522833839-323500f453ddd860cc4cb3b05e1aefdd.javascript.gzip differ diff --git a/assets/cache/cache-1522833969-323500f453ddd860cc4cb3b05e1aefdd.javascript.gzip b/assets/cache/cache-1522833969-323500f453ddd860cc4cb3b05e1aefdd.javascript.gzip new file mode 100644 index 0000000..3b6a882 Binary files /dev/null and b/assets/cache/cache-1522833969-323500f453ddd860cc4cb3b05e1aefdd.javascript.gzip differ diff --git a/assets/cache/cache-1526231147-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526231147-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..36f656b Binary files /dev/null and b/assets/cache/cache-1526231147-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526231147-a212b4a951b74a504ee27f411fec933c.css.gzip b/assets/cache/cache-1526231147-a212b4a951b74a504ee27f411fec933c.css.gzip new file mode 100644 index 0000000..679a263 Binary files /dev/null and b/assets/cache/cache-1526231147-a212b4a951b74a504ee27f411fec933c.css.gzip differ diff --git a/assets/cache/cache-1526231322-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526231322-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..322908a Binary files /dev/null and b/assets/cache/cache-1526231322-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526231329-2c4f32acbc7f8d5b46bcb1dd7dcdf992.css.gzip b/assets/cache/cache-1526231329-2c4f32acbc7f8d5b46bcb1dd7dcdf992.css.gzip new file mode 100644 index 0000000..8b7a8b9 Binary files /dev/null and b/assets/cache/cache-1526231329-2c4f32acbc7f8d5b46bcb1dd7dcdf992.css.gzip differ diff --git a/assets/cache/cache-1526231329-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1526231329-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..e303b61 Binary files /dev/null and b/assets/cache/cache-1526231329-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1526231329-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1526231329-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..84957d5 Binary files /dev/null and b/assets/cache/cache-1526231329-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1526231329-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526231329-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..6d17f6b Binary files /dev/null and b/assets/cache/cache-1526231329-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526231329-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1526231329-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..08817cc Binary files /dev/null and b/assets/cache/cache-1526231329-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1526231329-a212b4a951b74a504ee27f411fec933c.css.gzip b/assets/cache/cache-1526231329-a212b4a951b74a504ee27f411fec933c.css.gzip new file mode 100644 index 0000000..3ea2ddb Binary files /dev/null and b/assets/cache/cache-1526231329-a212b4a951b74a504ee27f411fec933c.css.gzip differ diff --git a/assets/cache/cache-1526231329-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526231329-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..1c9119c Binary files /dev/null and b/assets/cache/cache-1526231329-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526471476-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526471476-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..48c20f8 Binary files /dev/null and b/assets/cache/cache-1526471476-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526471706-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526471706-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..7c6663f Binary files /dev/null and b/assets/cache/cache-1526471706-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526471726-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526471726-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..abdd96b Binary files /dev/null and b/assets/cache/cache-1526471726-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526471745-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526471745-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..14063e6 Binary files /dev/null and b/assets/cache/cache-1526471745-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526471770-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526471770-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..b3dbabc Binary files /dev/null and b/assets/cache/cache-1526471770-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526471801-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526471801-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..66eaad3 Binary files /dev/null and b/assets/cache/cache-1526471801-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526471921-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526471921-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..985bc02 Binary files /dev/null and b/assets/cache/cache-1526471921-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526472068-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526472068-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..8d94878 Binary files /dev/null and b/assets/cache/cache-1526472068-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526472167-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526472167-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..1f6f6bb Binary files /dev/null and b/assets/cache/cache-1526472167-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526472256-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526472256-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..36a3316 Binary files /dev/null and b/assets/cache/cache-1526472256-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526472283-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526472283-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..1e549aa Binary files /dev/null and b/assets/cache/cache-1526472283-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526472297-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526472297-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..1334b3f Binary files /dev/null and b/assets/cache/cache-1526472297-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526472382-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526472382-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..805e4f7 Binary files /dev/null and b/assets/cache/cache-1526472382-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526472387-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526472387-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..c836182 Binary files /dev/null and b/assets/cache/cache-1526472387-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526472397-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526472397-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..37913d5 Binary files /dev/null and b/assets/cache/cache-1526472397-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526472535-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526472535-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..927ca04 Binary files /dev/null and b/assets/cache/cache-1526472535-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526473167-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526473167-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..8c4bc65 Binary files /dev/null and b/assets/cache/cache-1526473167-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526473291-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526473291-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..ee4abdb Binary files /dev/null and b/assets/cache/cache-1526473291-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526473786-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526473786-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..388d787 Binary files /dev/null and b/assets/cache/cache-1526473786-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526474426-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip b/assets/cache/cache-1526474426-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip new file mode 100644 index 0000000..da28a8c Binary files /dev/null and b/assets/cache/cache-1526474426-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip differ diff --git a/assets/cache/cache-1526474451-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip b/assets/cache/cache-1526474451-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip new file mode 100644 index 0000000..8268c3f Binary files /dev/null and b/assets/cache/cache-1526474451-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip differ diff --git a/assets/cache/cache-1526487877-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526487877-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..0b9489d Binary files /dev/null and b/assets/cache/cache-1526487877-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526488170-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1526488170-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..c4463af Binary files /dev/null and b/assets/cache/cache-1526488170-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1526488170-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1526488170-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..7411a05 Binary files /dev/null and b/assets/cache/cache-1526488170-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1526488170-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526488170-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..e35c8e0 Binary files /dev/null and b/assets/cache/cache-1526488170-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526489482-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526489482-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..17ff2d9 Binary files /dev/null and b/assets/cache/cache-1526489482-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526489506-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526489506-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..32a06ee Binary files /dev/null and b/assets/cache/cache-1526489506-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526489567-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1526489567-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..d18fa9e Binary files /dev/null and b/assets/cache/cache-1526489567-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1526489567-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1526489567-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..7f32943 Binary files /dev/null and b/assets/cache/cache-1526489567-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1526489567-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526489567-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..3958316 Binary files /dev/null and b/assets/cache/cache-1526489567-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526489567-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1526489567-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..eba43a2 Binary files /dev/null and b/assets/cache/cache-1526489567-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1526489567-a212b4a951b74a504ee27f411fec933c.css.gzip b/assets/cache/cache-1526489567-a212b4a951b74a504ee27f411fec933c.css.gzip new file mode 100644 index 0000000..37753b4 Binary files /dev/null and b/assets/cache/cache-1526489567-a212b4a951b74a504ee27f411fec933c.css.gzip differ diff --git a/assets/cache/cache-1526496612-720143948dfefe06817d0718579c0770.javascript.gzip b/assets/cache/cache-1526496612-720143948dfefe06817d0718579c0770.javascript.gzip new file mode 100644 index 0000000..882bef2 Binary files /dev/null and b/assets/cache/cache-1526496612-720143948dfefe06817d0718579c0770.javascript.gzip differ diff --git a/assets/cache/cache-1526496768-720143948dfefe06817d0718579c0770.javascript.gzip b/assets/cache/cache-1526496768-720143948dfefe06817d0718579c0770.javascript.gzip new file mode 100644 index 0000000..414e23c Binary files /dev/null and b/assets/cache/cache-1526496768-720143948dfefe06817d0718579c0770.javascript.gzip differ diff --git a/assets/cache/cache-1526496859-720143948dfefe06817d0718579c0770.javascript.gzip b/assets/cache/cache-1526496859-720143948dfefe06817d0718579c0770.javascript.gzip new file mode 100644 index 0000000..46a5b0e Binary files /dev/null and b/assets/cache/cache-1526496859-720143948dfefe06817d0718579c0770.javascript.gzip differ diff --git a/assets/cache/cache-1526496876-720143948dfefe06817d0718579c0770.javascript.gzip b/assets/cache/cache-1526496876-720143948dfefe06817d0718579c0770.javascript.gzip new file mode 100644 index 0000000..f4e2d40 Binary files /dev/null and b/assets/cache/cache-1526496876-720143948dfefe06817d0718579c0770.javascript.gzip differ diff --git a/assets/cache/cache-1526497097-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526497097-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..8a14969 Binary files /dev/null and b/assets/cache/cache-1526497097-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526497321-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526497321-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..728ada1 Binary files /dev/null and b/assets/cache/cache-1526497321-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526497334-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526497334-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..e3f1cc0 Binary files /dev/null and b/assets/cache/cache-1526497334-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526497352-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526497352-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..743631d Binary files /dev/null and b/assets/cache/cache-1526497352-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526497363-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526497363-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..26807d7 Binary files /dev/null and b/assets/cache/cache-1526497363-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526497424-720143948dfefe06817d0718579c0770.javascript.gzip b/assets/cache/cache-1526497424-720143948dfefe06817d0718579c0770.javascript.gzip new file mode 100644 index 0000000..2916438 Binary files /dev/null and b/assets/cache/cache-1526497424-720143948dfefe06817d0718579c0770.javascript.gzip differ diff --git a/assets/cache/cache-1526497440-720143948dfefe06817d0718579c0770.javascript.gzip b/assets/cache/cache-1526497440-720143948dfefe06817d0718579c0770.javascript.gzip new file mode 100644 index 0000000..707c927 Binary files /dev/null and b/assets/cache/cache-1526497440-720143948dfefe06817d0718579c0770.javascript.gzip differ diff --git a/assets/cache/cache-1526497454-720143948dfefe06817d0718579c0770.javascript.gzip b/assets/cache/cache-1526497454-720143948dfefe06817d0718579c0770.javascript.gzip new file mode 100644 index 0000000..a7a10be Binary files /dev/null and b/assets/cache/cache-1526497454-720143948dfefe06817d0718579c0770.javascript.gzip differ diff --git a/assets/cache/cache-1526497614-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526497614-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..6211eff Binary files /dev/null and b/assets/cache/cache-1526497614-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526497657-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526497657-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..e84af74 Binary files /dev/null and b/assets/cache/cache-1526497657-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526497714-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526497714-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..82de30c Binary files /dev/null and b/assets/cache/cache-1526497714-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526498116-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526498116-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..bbc57f0 Binary files /dev/null and b/assets/cache/cache-1526498116-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526498170-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1526498170-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..a7c7398 Binary files /dev/null and b/assets/cache/cache-1526498170-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1526498170-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1526498170-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..6706b84 Binary files /dev/null and b/assets/cache/cache-1526498170-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1526498170-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526498170-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..155586b Binary files /dev/null and b/assets/cache/cache-1526498170-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526498170-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1526498170-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..dd47015 Binary files /dev/null and b/assets/cache/cache-1526498170-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1526498170-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526498170-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..e4efb50 Binary files /dev/null and b/assets/cache/cache-1526498170-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526578559-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526578559-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..4373e95 Binary files /dev/null and b/assets/cache/cache-1526578559-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526578573-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526578573-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..d2dcaea Binary files /dev/null and b/assets/cache/cache-1526578573-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526578573-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1526578573-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..cfb2bba Binary files /dev/null and b/assets/cache/cache-1526578573-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1526585665-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526585665-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..c014de3 Binary files /dev/null and b/assets/cache/cache-1526585665-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526585698-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526585698-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..a498070 Binary files /dev/null and b/assets/cache/cache-1526585698-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526585706-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526585706-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..c014de3 Binary files /dev/null and b/assets/cache/cache-1526585706-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526585720-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526585720-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..d05f925 Binary files /dev/null and b/assets/cache/cache-1526585720-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526585740-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526585740-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..a7a5001 Binary files /dev/null and b/assets/cache/cache-1526585740-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526585759-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526585759-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..7099887 Binary files /dev/null and b/assets/cache/cache-1526585759-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526585816-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526585816-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..b8abc7f Binary files /dev/null and b/assets/cache/cache-1526585816-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526585859-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526585859-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..3e51133 Binary files /dev/null and b/assets/cache/cache-1526585859-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526585884-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526585884-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..2a08315 Binary files /dev/null and b/assets/cache/cache-1526585884-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526585895-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526585895-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..e62a45c Binary files /dev/null and b/assets/cache/cache-1526585895-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526585913-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526585913-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..3e51133 Binary files /dev/null and b/assets/cache/cache-1526585913-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526585949-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526585949-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..5a7953f Binary files /dev/null and b/assets/cache/cache-1526585949-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526585949-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526585949-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..bbb7be9 Binary files /dev/null and b/assets/cache/cache-1526585949-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526586067-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526586067-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..3ef8ed7 Binary files /dev/null and b/assets/cache/cache-1526586067-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526586140-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526586140-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..3cfbaf1 Binary files /dev/null and b/assets/cache/cache-1526586140-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526586150-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526586150-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..a469447 Binary files /dev/null and b/assets/cache/cache-1526586150-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526586498-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526586498-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..3f29ab9 Binary files /dev/null and b/assets/cache/cache-1526586498-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526586529-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526586529-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..af5a2e0 Binary files /dev/null and b/assets/cache/cache-1526586529-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526586583-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526586583-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..40418e0 Binary files /dev/null and b/assets/cache/cache-1526586583-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526586594-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526586594-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..92c1841 Binary files /dev/null and b/assets/cache/cache-1526586594-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526586655-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526586655-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..6f421a8 Binary files /dev/null and b/assets/cache/cache-1526586655-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526586677-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526586677-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..f31f1fd Binary files /dev/null and b/assets/cache/cache-1526586677-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526586710-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526586710-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..40b1c00 Binary files /dev/null and b/assets/cache/cache-1526586710-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526586803-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526586803-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..1d68e0f Binary files /dev/null and b/assets/cache/cache-1526586803-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526586825-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526586825-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..ccea341 Binary files /dev/null and b/assets/cache/cache-1526586825-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526586844-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526586844-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..ffb7ac4 Binary files /dev/null and b/assets/cache/cache-1526586844-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526586844-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526586844-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..9da10f1 Binary files /dev/null and b/assets/cache/cache-1526586844-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526587523-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526587523-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..e8422aa Binary files /dev/null and b/assets/cache/cache-1526587523-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526587709-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526587709-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..bc0be60 Binary files /dev/null and b/assets/cache/cache-1526587709-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526587759-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526587759-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..1886efb Binary files /dev/null and b/assets/cache/cache-1526587759-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526587804-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526587804-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..930f7a2 Binary files /dev/null and b/assets/cache/cache-1526587804-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526587815-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526587815-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..4f71ca2 Binary files /dev/null and b/assets/cache/cache-1526587815-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526587815-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526587815-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..d49b7b8 Binary files /dev/null and b/assets/cache/cache-1526587815-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526652515-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526652515-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..1e694ed Binary files /dev/null and b/assets/cache/cache-1526652515-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526652601-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526652601-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..a40bb19 Binary files /dev/null and b/assets/cache/cache-1526652601-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526652624-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526652624-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..31f0fa8 Binary files /dev/null and b/assets/cache/cache-1526652624-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526652678-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526652678-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..476f679 Binary files /dev/null and b/assets/cache/cache-1526652678-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526653124-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526653124-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..6156ff2 Binary files /dev/null and b/assets/cache/cache-1526653124-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526653521-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526653521-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..df1157d Binary files /dev/null and b/assets/cache/cache-1526653521-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526653547-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526653547-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..6389102 Binary files /dev/null and b/assets/cache/cache-1526653547-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526653568-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526653568-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..1b87232 Binary files /dev/null and b/assets/cache/cache-1526653568-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526653617-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526653617-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..756c804 Binary files /dev/null and b/assets/cache/cache-1526653617-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526653829-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526653829-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..056a746 Binary files /dev/null and b/assets/cache/cache-1526653829-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526653842-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1526653842-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..7a2805f Binary files /dev/null and b/assets/cache/cache-1526653842-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1526653842-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1526653842-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..ff59c14 Binary files /dev/null and b/assets/cache/cache-1526653842-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1526653842-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526653842-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..0219a5c Binary files /dev/null and b/assets/cache/cache-1526653842-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526653842-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1526653842-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..94991db Binary files /dev/null and b/assets/cache/cache-1526653842-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1526721621-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526721621-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..6264074 Binary files /dev/null and b/assets/cache/cache-1526721621-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526721656-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526721656-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..888ac7f Binary files /dev/null and b/assets/cache/cache-1526721656-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526721688-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526721688-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..7a18f64 Binary files /dev/null and b/assets/cache/cache-1526721688-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526721726-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526721726-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..efb018f Binary files /dev/null and b/assets/cache/cache-1526721726-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526721749-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526721749-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..8439f54 Binary files /dev/null and b/assets/cache/cache-1526721749-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526721767-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526721767-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..bab3dbc Binary files /dev/null and b/assets/cache/cache-1526721767-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526721892-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526721892-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..68c02c8 Binary files /dev/null and b/assets/cache/cache-1526721892-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526722091-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526722091-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..53a7e0d Binary files /dev/null and b/assets/cache/cache-1526722091-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526722133-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526722133-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..0c47264 Binary files /dev/null and b/assets/cache/cache-1526722133-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526722166-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526722166-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..7fa3735 Binary files /dev/null and b/assets/cache/cache-1526722166-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526722186-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526722186-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..eeed2ee Binary files /dev/null and b/assets/cache/cache-1526722186-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526722289-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526722289-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..1d57225 Binary files /dev/null and b/assets/cache/cache-1526722289-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526722457-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526722457-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..9b66945 Binary files /dev/null and b/assets/cache/cache-1526722457-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526722478-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526722478-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..1d57225 Binary files /dev/null and b/assets/cache/cache-1526722478-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526722526-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526722526-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..a62af3a Binary files /dev/null and b/assets/cache/cache-1526722526-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526722565-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526722565-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..b213310 Binary files /dev/null and b/assets/cache/cache-1526722565-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526722580-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526722580-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..1ff14ff Binary files /dev/null and b/assets/cache/cache-1526722580-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526722597-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526722597-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..69dbd6c Binary files /dev/null and b/assets/cache/cache-1526722597-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526722611-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526722611-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..5ec03e9 Binary files /dev/null and b/assets/cache/cache-1526722611-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526722639-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526722639-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..4920b6f Binary files /dev/null and b/assets/cache/cache-1526722639-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526726426-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526726426-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..5340e7d Binary files /dev/null and b/assets/cache/cache-1526726426-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526726855-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526726855-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..6d532b6 Binary files /dev/null and b/assets/cache/cache-1526726855-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526726915-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526726915-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..b0d8318 Binary files /dev/null and b/assets/cache/cache-1526726915-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526726979-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526726979-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..09e99e3 Binary files /dev/null and b/assets/cache/cache-1526726979-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526727013-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526727013-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..776ecc8 Binary files /dev/null and b/assets/cache/cache-1526727013-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526727021-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526727021-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..4f977ab Binary files /dev/null and b/assets/cache/cache-1526727021-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526727058-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526727058-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..2215d68 Binary files /dev/null and b/assets/cache/cache-1526727058-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526727151-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526727151-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..4c81c86 Binary files /dev/null and b/assets/cache/cache-1526727151-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526727174-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526727174-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..80ca81a Binary files /dev/null and b/assets/cache/cache-1526727174-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526727195-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526727195-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..61449da Binary files /dev/null and b/assets/cache/cache-1526727195-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526727213-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526727213-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..4c506a0 Binary files /dev/null and b/assets/cache/cache-1526727213-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526727242-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1526727242-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..dc94fcd Binary files /dev/null and b/assets/cache/cache-1526727242-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1526731270-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1526731270-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..862dae9 Binary files /dev/null and b/assets/cache/cache-1526731270-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1526731270-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1526731270-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..507a9ad Binary files /dev/null and b/assets/cache/cache-1526731270-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1526731270-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526731270-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..15043a9 Binary files /dev/null and b/assets/cache/cache-1526731270-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526731270-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1526731270-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..dfbf559 Binary files /dev/null and b/assets/cache/cache-1526731270-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1526731270-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526731270-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..14012df Binary files /dev/null and b/assets/cache/cache-1526731270-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526808083-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526808083-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..b8866e8 Binary files /dev/null and b/assets/cache/cache-1526808083-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526808097-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526808097-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..78e9e82 Binary files /dev/null and b/assets/cache/cache-1526808097-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526808115-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526808115-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..c820e2e Binary files /dev/null and b/assets/cache/cache-1526808115-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526808227-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526808227-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..7603271 Binary files /dev/null and b/assets/cache/cache-1526808227-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526808373-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526808373-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..4058037 Binary files /dev/null and b/assets/cache/cache-1526808373-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526808433-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526808433-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..d93ad1e Binary files /dev/null and b/assets/cache/cache-1526808433-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526808522-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526808522-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..d36faa3 Binary files /dev/null and b/assets/cache/cache-1526808522-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526808522-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1526808522-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..b21edd9 Binary files /dev/null and b/assets/cache/cache-1526808522-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1526809890-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526809890-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..e984c78 Binary files /dev/null and b/assets/cache/cache-1526809890-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526810002-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526810002-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..0d7955b Binary files /dev/null and b/assets/cache/cache-1526810002-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526810009-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526810009-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..cf87320 Binary files /dev/null and b/assets/cache/cache-1526810009-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526811615-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526811615-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..75cb6f2 Binary files /dev/null and b/assets/cache/cache-1526811615-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526811850-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526811850-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..67a5248 Binary files /dev/null and b/assets/cache/cache-1526811850-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526812108-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526812108-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..e87d2cc Binary files /dev/null and b/assets/cache/cache-1526812108-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526812447-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526812447-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..a0b7320 Binary files /dev/null and b/assets/cache/cache-1526812447-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526812531-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526812531-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..1ef9e64 Binary files /dev/null and b/assets/cache/cache-1526812531-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526812554-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526812554-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..79eb1a2 Binary files /dev/null and b/assets/cache/cache-1526812554-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526812554-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526812554-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..9e8eac3 Binary files /dev/null and b/assets/cache/cache-1526812554-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526812777-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526812777-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..43837c7 Binary files /dev/null and b/assets/cache/cache-1526812777-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526812798-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526812798-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..fc01b71 Binary files /dev/null and b/assets/cache/cache-1526812798-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526812798-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526812798-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..080f87e Binary files /dev/null and b/assets/cache/cache-1526812798-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526828725-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526828725-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..bf3604a Binary files /dev/null and b/assets/cache/cache-1526828725-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526828767-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526828767-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..083897b Binary files /dev/null and b/assets/cache/cache-1526828767-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526828818-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526828818-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..1bd5e27 Binary files /dev/null and b/assets/cache/cache-1526828818-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526828894-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526828894-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..cf23d44 Binary files /dev/null and b/assets/cache/cache-1526828894-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526829015-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526829015-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..aad2b42 Binary files /dev/null and b/assets/cache/cache-1526829015-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526829255-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1526829255-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..2e7a6fa Binary files /dev/null and b/assets/cache/cache-1526829255-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1526829255-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526829255-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..96af732 Binary files /dev/null and b/assets/cache/cache-1526829255-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526829255-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526829255-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..363b840 Binary files /dev/null and b/assets/cache/cache-1526829255-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526835428-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526835428-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..b2698d7 Binary files /dev/null and b/assets/cache/cache-1526835428-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526835436-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526835436-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..0f0b852 Binary files /dev/null and b/assets/cache/cache-1526835436-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526836788-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526836788-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..55d6eb9 Binary files /dev/null and b/assets/cache/cache-1526836788-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526836918-a212b4a951b74a504ee27f411fec933c.css.gzip b/assets/cache/cache-1526836918-a212b4a951b74a504ee27f411fec933c.css.gzip new file mode 100644 index 0000000..ff9110b Binary files /dev/null and b/assets/cache/cache-1526836918-a212b4a951b74a504ee27f411fec933c.css.gzip differ diff --git a/assets/cache/cache-1526836918-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526836918-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..5ae89d9 Binary files /dev/null and b/assets/cache/cache-1526836918-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1526837567-2c4f32acbc7f8d5b46bcb1dd7dcdf992.css.gzip b/assets/cache/cache-1526837567-2c4f32acbc7f8d5b46bcb1dd7dcdf992.css.gzip new file mode 100644 index 0000000..3c975b1 Binary files /dev/null and b/assets/cache/cache-1526837567-2c4f32acbc7f8d5b46bcb1dd7dcdf992.css.gzip differ diff --git a/assets/cache/cache-1526837567-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1526837567-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..b9194be Binary files /dev/null and b/assets/cache/cache-1526837567-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1526837567-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1526837567-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..bcd2dc0 Binary files /dev/null and b/assets/cache/cache-1526837567-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1526837567-a212b4a951b74a504ee27f411fec933c.css.gzip b/assets/cache/cache-1526837567-a212b4a951b74a504ee27f411fec933c.css.gzip new file mode 100644 index 0000000..6d754de Binary files /dev/null and b/assets/cache/cache-1526837567-a212b4a951b74a504ee27f411fec933c.css.gzip differ diff --git a/assets/cache/cache-1526837567-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1526837567-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..c411fe6 Binary files /dev/null and b/assets/cache/cache-1526837567-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1527003503-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527003503-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..0e4adb4 Binary files /dev/null and b/assets/cache/cache-1527003503-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527003503-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1527003503-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..ca6c0d7 Binary files /dev/null and b/assets/cache/cache-1527003503-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1527003503-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1527003503-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..44e60bb Binary files /dev/null and b/assets/cache/cache-1527003503-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1527004859-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip b/assets/cache/cache-1527004859-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip new file mode 100644 index 0000000..2c4bd6d Binary files /dev/null and b/assets/cache/cache-1527004859-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip differ diff --git a/assets/cache/cache-1527005817-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip b/assets/cache/cache-1527005817-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip new file mode 100644 index 0000000..c7bf606 Binary files /dev/null and b/assets/cache/cache-1527005817-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip differ diff --git a/assets/cache/cache-1527006009-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip b/assets/cache/cache-1527006009-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip new file mode 100644 index 0000000..eb7438a Binary files /dev/null and b/assets/cache/cache-1527006009-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip differ diff --git a/assets/cache/cache-1527006430-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip b/assets/cache/cache-1527006430-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip new file mode 100644 index 0000000..d22337b Binary files /dev/null and b/assets/cache/cache-1527006430-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip differ diff --git a/assets/cache/cache-1527006967-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip b/assets/cache/cache-1527006967-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip new file mode 100644 index 0000000..410abf6 Binary files /dev/null and b/assets/cache/cache-1527006967-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip differ diff --git a/assets/cache/cache-1527006985-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip b/assets/cache/cache-1527006985-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip new file mode 100644 index 0000000..06b06d1 Binary files /dev/null and b/assets/cache/cache-1527006985-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip differ diff --git a/assets/cache/cache-1527007014-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip b/assets/cache/cache-1527007014-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip new file mode 100644 index 0000000..db580b1 Binary files /dev/null and b/assets/cache/cache-1527007014-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip differ diff --git a/assets/cache/cache-1527007041-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip b/assets/cache/cache-1527007041-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip new file mode 100644 index 0000000..06b06d1 Binary files /dev/null and b/assets/cache/cache-1527007041-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip differ diff --git a/assets/cache/cache-1527016949-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1527016949-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..8b11032 Binary files /dev/null and b/assets/cache/cache-1527016949-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1527016949-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip b/assets/cache/cache-1527016949-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip new file mode 100644 index 0000000..70e5168 Binary files /dev/null and b/assets/cache/cache-1527016949-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip differ diff --git a/assets/cache/cache-1527017004-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1527017004-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..db7d2c2 Binary files /dev/null and b/assets/cache/cache-1527017004-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1527017004-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip b/assets/cache/cache-1527017004-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip new file mode 100644 index 0000000..e504a4e Binary files /dev/null and b/assets/cache/cache-1527017004-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip differ diff --git a/assets/cache/cache-1527017150-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1527017150-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..db7d2c2 Binary files /dev/null and b/assets/cache/cache-1527017150-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1527017173-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip b/assets/cache/cache-1527017173-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip new file mode 100644 index 0000000..ca09562 Binary files /dev/null and b/assets/cache/cache-1527017173-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip differ diff --git a/assets/cache/cache-1527017173-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1527017173-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..c47520f Binary files /dev/null and b/assets/cache/cache-1527017173-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1527063612-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527063612-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..598ea08 Binary files /dev/null and b/assets/cache/cache-1527063612-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527063612-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1527063612-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..903d848 Binary files /dev/null and b/assets/cache/cache-1527063612-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1527063612-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip b/assets/cache/cache-1527063612-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip new file mode 100644 index 0000000..7af9237 Binary files /dev/null and b/assets/cache/cache-1527063612-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip differ diff --git a/assets/cache/cache-1527108073-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1527108073-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..6b9afd7 Binary files /dev/null and b/assets/cache/cache-1527108073-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1527108220-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527108220-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..26d0cd1 Binary files /dev/null and b/assets/cache/cache-1527108220-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527108251-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527108251-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..b7bb9b5 Binary files /dev/null and b/assets/cache/cache-1527108251-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527108319-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527108319-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..461b798 Binary files /dev/null and b/assets/cache/cache-1527108319-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527108333-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527108333-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..9648aaa Binary files /dev/null and b/assets/cache/cache-1527108333-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527108345-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527108345-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..c30e762 Binary files /dev/null and b/assets/cache/cache-1527108345-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527108354-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527108354-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..4d0c335 Binary files /dev/null and b/assets/cache/cache-1527108354-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527108375-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527108375-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..863ffbc Binary files /dev/null and b/assets/cache/cache-1527108375-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527108393-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527108393-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..e13c969 Binary files /dev/null and b/assets/cache/cache-1527108393-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527108402-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527108402-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..4e24463 Binary files /dev/null and b/assets/cache/cache-1527108402-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527108534-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527108534-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..2d8649b Binary files /dev/null and b/assets/cache/cache-1527108534-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527108940-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527108940-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..5e0dbdd Binary files /dev/null and b/assets/cache/cache-1527108940-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527108990-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527108990-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..ba04554 Binary files /dev/null and b/assets/cache/cache-1527108990-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527109070-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527109070-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..7bbc693 Binary files /dev/null and b/assets/cache/cache-1527109070-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527109140-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527109140-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..d3e1149 Binary files /dev/null and b/assets/cache/cache-1527109140-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527109186-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527109186-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..5906b85 Binary files /dev/null and b/assets/cache/cache-1527109186-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527109445-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1527109445-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..939dc54 Binary files /dev/null and b/assets/cache/cache-1527109445-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1527109499-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527109499-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..7482683 Binary files /dev/null and b/assets/cache/cache-1527109499-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527109859-0c53d1289df2dc0b1d38a2eff8c2410e.css.gzip b/assets/cache/cache-1527109859-0c53d1289df2dc0b1d38a2eff8c2410e.css.gzip new file mode 100644 index 0000000..e2d2ef1 Binary files /dev/null and b/assets/cache/cache-1527109859-0c53d1289df2dc0b1d38a2eff8c2410e.css.gzip differ diff --git a/assets/cache/cache-1527109859-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip b/assets/cache/cache-1527109859-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip new file mode 100644 index 0000000..77aa337 Binary files /dev/null and b/assets/cache/cache-1527109859-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip differ diff --git a/assets/cache/cache-1527109859-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527109859-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..53ca287 Binary files /dev/null and b/assets/cache/cache-1527109859-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527109859-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1527109859-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..67a1ea7 Binary files /dev/null and b/assets/cache/cache-1527109859-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1527109859-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1527109859-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..cc65018 Binary files /dev/null and b/assets/cache/cache-1527109859-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1527109859-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1527109859-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..b268185 Binary files /dev/null and b/assets/cache/cache-1527109859-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1527109859-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip b/assets/cache/cache-1527109859-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip new file mode 100644 index 0000000..ac4ec5d Binary files /dev/null and b/assets/cache/cache-1527109859-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip differ diff --git a/assets/cache/cache-1527109859-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1527109859-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..e0b15a6 Binary files /dev/null and b/assets/cache/cache-1527109859-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1527109859-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1527109859-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..eaf4637 Binary files /dev/null and b/assets/cache/cache-1527109859-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1527109859-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1527109859-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..4813bbe Binary files /dev/null and b/assets/cache/cache-1527109859-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1527109859-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip b/assets/cache/cache-1527109859-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip new file mode 100644 index 0000000..c6769ef Binary files /dev/null and b/assets/cache/cache-1527109859-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip differ diff --git a/assets/cache/cache-1527610290-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1527610290-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..a0bbd9a Binary files /dev/null and b/assets/cache/cache-1527610290-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1527610290-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1527610290-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..8c209b7 Binary files /dev/null and b/assets/cache/cache-1527610290-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1527610290-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1527610290-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..e3b55be Binary files /dev/null and b/assets/cache/cache-1527610290-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1527611515-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1527611515-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..a38deba Binary files /dev/null and b/assets/cache/cache-1527611515-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1527611543-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1527611543-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..d8c054f Binary files /dev/null and b/assets/cache/cache-1527611543-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1527611816-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1527611816-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..65316e7 Binary files /dev/null and b/assets/cache/cache-1527611816-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1527612052-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1527612052-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..eb48646 Binary files /dev/null and b/assets/cache/cache-1527612052-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1527612731-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1527612731-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..04129f1 Binary files /dev/null and b/assets/cache/cache-1527612731-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1527612731-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1527612731-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..c892f16 Binary files /dev/null and b/assets/cache/cache-1527612731-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1527612731-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1527612731-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..1885d2d Binary files /dev/null and b/assets/cache/cache-1527612731-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1527612731-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1527612731-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..cec80b0 Binary files /dev/null and b/assets/cache/cache-1527612731-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1527715125-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1527715125-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..2fc4179 Binary files /dev/null and b/assets/cache/cache-1527715125-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1527715125-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1527715125-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..da965fa Binary files /dev/null and b/assets/cache/cache-1527715125-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1527758372-016a80981538d36261c3134aa4ef373f.css.gzip b/assets/cache/cache-1527758372-016a80981538d36261c3134aa4ef373f.css.gzip new file mode 100644 index 0000000..6f7411f Binary files /dev/null and b/assets/cache/cache-1527758372-016a80981538d36261c3134aa4ef373f.css.gzip differ diff --git a/assets/cache/cache-1527758372-5efd7d9a85b1b61d57c2a86cc208fcaa.css.gzip b/assets/cache/cache-1527758372-5efd7d9a85b1b61d57c2a86cc208fcaa.css.gzip new file mode 100644 index 0000000..ed207ab Binary files /dev/null and b/assets/cache/cache-1527758372-5efd7d9a85b1b61d57c2a86cc208fcaa.css.gzip differ diff --git a/assets/cache/cache-1527758372-8582e7c9f14ea8d7087caf89df6bdfa5.css.gzip b/assets/cache/cache-1527758372-8582e7c9f14ea8d7087caf89df6bdfa5.css.gzip new file mode 100644 index 0000000..b83dc91 Binary files /dev/null and b/assets/cache/cache-1527758372-8582e7c9f14ea8d7087caf89df6bdfa5.css.gzip differ diff --git a/assets/cache/cache-1527758372-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1527758372-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..3c094be Binary files /dev/null and b/assets/cache/cache-1527758372-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1527758372-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1527758372-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..26fa272 Binary files /dev/null and b/assets/cache/cache-1527758372-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1527758372-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1527758372-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..b604d02 Binary files /dev/null and b/assets/cache/cache-1527758372-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1527758372-a0bb08798701f075be78a92da268f8b0.css.gzip b/assets/cache/cache-1527758372-a0bb08798701f075be78a92da268f8b0.css.gzip new file mode 100644 index 0000000..9e064a6 Binary files /dev/null and b/assets/cache/cache-1527758372-a0bb08798701f075be78a92da268f8b0.css.gzip differ diff --git a/assets/cache/cache-1527758372-bf5bf8c4910330de23a300f42ff777df.css.gzip b/assets/cache/cache-1527758372-bf5bf8c4910330de23a300f42ff777df.css.gzip new file mode 100644 index 0000000..5d052e6 Binary files /dev/null and b/assets/cache/cache-1527758372-bf5bf8c4910330de23a300f42ff777df.css.gzip differ diff --git a/assets/cache/cache-1527758372-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1527758372-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..56ab9b7 Binary files /dev/null and b/assets/cache/cache-1527758372-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1527759512-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip b/assets/cache/cache-1527759512-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip new file mode 100644 index 0000000..4b93f38 Binary files /dev/null and b/assets/cache/cache-1527759512-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip differ diff --git a/assets/cache/cache-1527760135-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip b/assets/cache/cache-1527760135-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip new file mode 100644 index 0000000..073561a Binary files /dev/null and b/assets/cache/cache-1527760135-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip differ diff --git a/assets/cache/cache-1527760135-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip b/assets/cache/cache-1527760135-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip new file mode 100644 index 0000000..b6fbb47 Binary files /dev/null and b/assets/cache/cache-1527760135-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip differ diff --git a/assets/cache/cache-1527760135-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1527760135-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..4ef405a Binary files /dev/null and b/assets/cache/cache-1527760135-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1527760135-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1527760135-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..3610620 Binary files /dev/null and b/assets/cache/cache-1527760135-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1527760135-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1527760135-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..55a5188 Binary files /dev/null and b/assets/cache/cache-1527760135-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1527760135-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip b/assets/cache/cache-1527760135-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip new file mode 100644 index 0000000..c74cf2b Binary files /dev/null and b/assets/cache/cache-1527760135-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip differ diff --git a/assets/cache/cache-1527760135-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1527760135-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..b11ac79 Binary files /dev/null and b/assets/cache/cache-1527760135-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1527760135-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1527760135-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..68ab892 Binary files /dev/null and b/assets/cache/cache-1527760135-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1527760135-d04f5ed078bf84214f2ca732fedff21e.javascript.gzip b/assets/cache/cache-1527760135-d04f5ed078bf84214f2ca732fedff21e.javascript.gzip new file mode 100644 index 0000000..14b68a4 Binary files /dev/null and b/assets/cache/cache-1527760135-d04f5ed078bf84214f2ca732fedff21e.javascript.gzip differ diff --git a/assets/cache/cache-1527760135-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1527760135-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..0bdfff6 Binary files /dev/null and b/assets/cache/cache-1527760135-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1527760135-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip b/assets/cache/cache-1527760135-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip new file mode 100644 index 0000000..85e2c45 Binary files /dev/null and b/assets/cache/cache-1527760135-f0066fc8b2cb784c5c38eb9d598f9e72.javascript.gzip differ diff --git a/assets/cache/cache-1527760135-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip b/assets/cache/cache-1527760135-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip new file mode 100644 index 0000000..193b856 Binary files /dev/null and b/assets/cache/cache-1527760135-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip differ diff --git a/assets/cache/cache-1527760239-6fdec1b9b000e043529fe574fcf6ed83.css.gzip b/assets/cache/cache-1527760239-6fdec1b9b000e043529fe574fcf6ed83.css.gzip new file mode 100644 index 0000000..f42c174 Binary files /dev/null and b/assets/cache/cache-1527760239-6fdec1b9b000e043529fe574fcf6ed83.css.gzip differ diff --git a/assets/cache/cache-1527760239-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip b/assets/cache/cache-1527760239-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip new file mode 100644 index 0000000..b20b9d1 Binary files /dev/null and b/assets/cache/cache-1527760239-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip differ diff --git a/assets/cache/cache-1527773439-6fdec1b9b000e043529fe574fcf6ed83.css.gzip b/assets/cache/cache-1527773439-6fdec1b9b000e043529fe574fcf6ed83.css.gzip new file mode 100644 index 0000000..2f186a0 Binary files /dev/null and b/assets/cache/cache-1527773439-6fdec1b9b000e043529fe574fcf6ed83.css.gzip differ diff --git a/assets/cache/cache-1527781199-5efd7d9a85b1b61d57c2a86cc208fcaa.css.gzip b/assets/cache/cache-1527781199-5efd7d9a85b1b61d57c2a86cc208fcaa.css.gzip new file mode 100644 index 0000000..a5b2a6c Binary files /dev/null and b/assets/cache/cache-1527781199-5efd7d9a85b1b61d57c2a86cc208fcaa.css.gzip differ diff --git a/assets/cache/cache-1527869250-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1527869250-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..44b29a4 Binary files /dev/null and b/assets/cache/cache-1527869250-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1527869271-6fdec1b9b000e043529fe574fcf6ed83.css.gzip b/assets/cache/cache-1527869271-6fdec1b9b000e043529fe574fcf6ed83.css.gzip new file mode 100644 index 0000000..572074a Binary files /dev/null and b/assets/cache/cache-1527869271-6fdec1b9b000e043529fe574fcf6ed83.css.gzip differ diff --git a/assets/cache/cache-1527869271-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1527869271-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..f1ce3d6 Binary files /dev/null and b/assets/cache/cache-1527869271-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1527884737-41a21b03c4245892762d8d2caab7b205.css.gzip b/assets/cache/cache-1527884737-41a21b03c4245892762d8d2caab7b205.css.gzip new file mode 100644 index 0000000..0d9241c Binary files /dev/null and b/assets/cache/cache-1527884737-41a21b03c4245892762d8d2caab7b205.css.gzip differ diff --git a/assets/cache/cache-1527884737-5efd7d9a85b1b61d57c2a86cc208fcaa.css.gzip b/assets/cache/cache-1527884737-5efd7d9a85b1b61d57c2a86cc208fcaa.css.gzip new file mode 100644 index 0000000..d8ee5e2 Binary files /dev/null and b/assets/cache/cache-1527884737-5efd7d9a85b1b61d57c2a86cc208fcaa.css.gzip differ diff --git a/assets/cache/cache-1527884737-6fdec1b9b000e043529fe574fcf6ed83.css.gzip b/assets/cache/cache-1527884737-6fdec1b9b000e043529fe574fcf6ed83.css.gzip new file mode 100644 index 0000000..5281fc2 Binary files /dev/null and b/assets/cache/cache-1527884737-6fdec1b9b000e043529fe574fcf6ed83.css.gzip differ diff --git a/assets/cache/cache-1527884737-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1527884737-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..2d4f9a9 Binary files /dev/null and b/assets/cache/cache-1527884737-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1527884737-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1527884737-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..6d22f89 Binary files /dev/null and b/assets/cache/cache-1527884737-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1527884737-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1527884737-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..e92e418 Binary files /dev/null and b/assets/cache/cache-1527884737-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1527884737-9a824f9643d6fd8b3b5520cfef6a3d9a.css.gzip b/assets/cache/cache-1527884737-9a824f9643d6fd8b3b5520cfef6a3d9a.css.gzip new file mode 100644 index 0000000..8337b64 Binary files /dev/null and b/assets/cache/cache-1527884737-9a824f9643d6fd8b3b5520cfef6a3d9a.css.gzip differ diff --git a/assets/cache/cache-1527884737-bf5bf8c4910330de23a300f42ff777df.css.gzip b/assets/cache/cache-1527884737-bf5bf8c4910330de23a300f42ff777df.css.gzip new file mode 100644 index 0000000..5d48240 Binary files /dev/null and b/assets/cache/cache-1527884737-bf5bf8c4910330de23a300f42ff777df.css.gzip differ diff --git a/assets/cache/cache-1527884737-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1527884737-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..e35a819 Binary files /dev/null and b/assets/cache/cache-1527884737-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1527884737-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip b/assets/cache/cache-1527884737-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip new file mode 100644 index 0000000..b7be214 Binary files /dev/null and b/assets/cache/cache-1527884737-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip differ diff --git a/assets/cache/cache-1527961638-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527961638-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..688ec26 Binary files /dev/null and b/assets/cache/cache-1527961638-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527961762-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527961762-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..fc663d5 Binary files /dev/null and b/assets/cache/cache-1527961762-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527962016-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527962016-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..5180cc6 Binary files /dev/null and b/assets/cache/cache-1527962016-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527963418-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527963418-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..836f2c1 Binary files /dev/null and b/assets/cache/cache-1527963418-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527966436-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527966436-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..a86e361 Binary files /dev/null and b/assets/cache/cache-1527966436-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527966563-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527966563-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..cfe5e6f Binary files /dev/null and b/assets/cache/cache-1527966563-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527966853-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527966853-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..12e6487 Binary files /dev/null and b/assets/cache/cache-1527966853-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527967599-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527967599-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..d3bda1f Binary files /dev/null and b/assets/cache/cache-1527967599-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527967623-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527967623-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..e615fd0 Binary files /dev/null and b/assets/cache/cache-1527967623-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527967899-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527967899-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..25eb4cf Binary files /dev/null and b/assets/cache/cache-1527967899-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527968030-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527968030-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..a0be25f Binary files /dev/null and b/assets/cache/cache-1527968030-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527968069-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527968069-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..d2ec76d Binary files /dev/null and b/assets/cache/cache-1527968069-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527968309-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527968309-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..875540e Binary files /dev/null and b/assets/cache/cache-1527968309-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527968390-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527968390-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..d2ec76d Binary files /dev/null and b/assets/cache/cache-1527968390-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527968810-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527968810-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..102afd4 Binary files /dev/null and b/assets/cache/cache-1527968810-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527975963-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527975963-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..9e0b1ec Binary files /dev/null and b/assets/cache/cache-1527975963-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527976089-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527976089-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..7b0c705 Binary files /dev/null and b/assets/cache/cache-1527976089-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527976089-930ece89f30c1f8137d5fd4773e3eeee.javascript.gzip b/assets/cache/cache-1527976089-930ece89f30c1f8137d5fd4773e3eeee.javascript.gzip new file mode 100644 index 0000000..57f7b43 Binary files /dev/null and b/assets/cache/cache-1527976089-930ece89f30c1f8137d5fd4773e3eeee.javascript.gzip differ diff --git a/assets/cache/cache-1527976667-88a93bcb37cc0dc53862405d420fcc3f.css.gzip b/assets/cache/cache-1527976667-88a93bcb37cc0dc53862405d420fcc3f.css.gzip new file mode 100644 index 0000000..0765773 Binary files /dev/null and b/assets/cache/cache-1527976667-88a93bcb37cc0dc53862405d420fcc3f.css.gzip differ diff --git a/assets/cache/cache-1527976760-930ece89f30c1f8137d5fd4773e3eeee.javascript.gzip b/assets/cache/cache-1527976760-930ece89f30c1f8137d5fd4773e3eeee.javascript.gzip new file mode 100644 index 0000000..00af591 Binary files /dev/null and b/assets/cache/cache-1527976760-930ece89f30c1f8137d5fd4773e3eeee.javascript.gzip differ diff --git a/assets/cache/cache-1527976802-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1527976802-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..22a0de8 Binary files /dev/null and b/assets/cache/cache-1527976802-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1527976802-930ece89f30c1f8137d5fd4773e3eeee.javascript.gzip b/assets/cache/cache-1527976802-930ece89f30c1f8137d5fd4773e3eeee.javascript.gzip new file mode 100644 index 0000000..6078d86 Binary files /dev/null and b/assets/cache/cache-1527976802-930ece89f30c1f8137d5fd4773e3eeee.javascript.gzip differ diff --git a/assets/cache/cache-1528015139-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528015139-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..a3a668f Binary files /dev/null and b/assets/cache/cache-1528015139-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528015523-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528015523-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..bd72a09 Binary files /dev/null and b/assets/cache/cache-1528015523-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528016802-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528016802-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..59861b0 Binary files /dev/null and b/assets/cache/cache-1528016802-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528017455-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528017455-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..a91f4bf Binary files /dev/null and b/assets/cache/cache-1528017455-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528017726-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528017726-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..7d83f25 Binary files /dev/null and b/assets/cache/cache-1528017726-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528017744-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528017744-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..cfec5a7 Binary files /dev/null and b/assets/cache/cache-1528017744-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528017796-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528017796-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..eafb5b5 Binary files /dev/null and b/assets/cache/cache-1528017796-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528017822-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528017822-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..3d08476 Binary files /dev/null and b/assets/cache/cache-1528017822-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528017841-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528017841-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..9b9ee58 Binary files /dev/null and b/assets/cache/cache-1528017841-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528017865-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528017865-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..61719bf Binary files /dev/null and b/assets/cache/cache-1528017865-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528018205-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528018205-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..915e395 Binary files /dev/null and b/assets/cache/cache-1528018205-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528018274-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528018274-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..890c10c Binary files /dev/null and b/assets/cache/cache-1528018274-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528018345-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528018345-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..39020d3 Binary files /dev/null and b/assets/cache/cache-1528018345-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528018500-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528018500-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..4fc5e7d Binary files /dev/null and b/assets/cache/cache-1528018500-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528018558-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528018558-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..31f3f48 Binary files /dev/null and b/assets/cache/cache-1528018558-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528019233-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528019233-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..167213b Binary files /dev/null and b/assets/cache/cache-1528019233-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528033088-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528033088-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..bd98fea Binary files /dev/null and b/assets/cache/cache-1528033088-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528033744-6136c98b84edacbc4ab499fdc65e6c41.css.gzip b/assets/cache/cache-1528033744-6136c98b84edacbc4ab499fdc65e6c41.css.gzip new file mode 100644 index 0000000..fb579dd Binary files /dev/null and b/assets/cache/cache-1528033744-6136c98b84edacbc4ab499fdc65e6c41.css.gzip differ diff --git a/assets/cache/cache-1528033744-6fdec1b9b000e043529fe574fcf6ed83.css.gzip b/assets/cache/cache-1528033744-6fdec1b9b000e043529fe574fcf6ed83.css.gzip new file mode 100644 index 0000000..89cde58 Binary files /dev/null and b/assets/cache/cache-1528033744-6fdec1b9b000e043529fe574fcf6ed83.css.gzip differ diff --git a/assets/cache/cache-1528033744-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1528033744-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..846990e Binary files /dev/null and b/assets/cache/cache-1528033744-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1528033744-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1528033744-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..6484a83 Binary files /dev/null and b/assets/cache/cache-1528033744-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1528033744-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1528033744-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..0d42271 Binary files /dev/null and b/assets/cache/cache-1528033744-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1528033744-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1528033744-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..b758b5d Binary files /dev/null and b/assets/cache/cache-1528033744-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1528033744-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip b/assets/cache/cache-1528033744-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip new file mode 100644 index 0000000..9ca8c2d Binary files /dev/null and b/assets/cache/cache-1528033744-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip differ diff --git a/assets/cache/cache-1528034323-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528034323-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..0614ef0 Binary files /dev/null and b/assets/cache/cache-1528034323-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528034591-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528034591-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..6891bdb Binary files /dev/null and b/assets/cache/cache-1528034591-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528034613-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528034613-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..912f547 Binary files /dev/null and b/assets/cache/cache-1528034613-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528034684-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528034684-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..db415a3 Binary files /dev/null and b/assets/cache/cache-1528034684-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528034845-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528034845-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..ad1daad Binary files /dev/null and b/assets/cache/cache-1528034845-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528034860-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528034860-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..4f2c15e Binary files /dev/null and b/assets/cache/cache-1528034860-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528034881-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528034881-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..8bb2391 Binary files /dev/null and b/assets/cache/cache-1528034881-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528034944-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528034944-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..25c8c01 Binary files /dev/null and b/assets/cache/cache-1528034944-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528035086-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528035086-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..17918b4 Binary files /dev/null and b/assets/cache/cache-1528035086-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528035244-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528035244-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..b328762 Binary files /dev/null and b/assets/cache/cache-1528035244-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528035290-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528035290-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..ba3c64e Binary files /dev/null and b/assets/cache/cache-1528035290-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528035311-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528035311-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..7f29b98 Binary files /dev/null and b/assets/cache/cache-1528035311-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528035392-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528035392-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..6a53da6 Binary files /dev/null and b/assets/cache/cache-1528035392-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528035425-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528035425-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..4e0742e Binary files /dev/null and b/assets/cache/cache-1528035425-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528035498-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528035498-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..a1b1eaf Binary files /dev/null and b/assets/cache/cache-1528035498-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528035532-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528035532-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..e810f99 Binary files /dev/null and b/assets/cache/cache-1528035532-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528035542-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528035542-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..61d7ab6 Binary files /dev/null and b/assets/cache/cache-1528035542-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528035548-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528035548-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..772f99e Binary files /dev/null and b/assets/cache/cache-1528035548-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528035602-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528035602-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..14c86cb Binary files /dev/null and b/assets/cache/cache-1528035602-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528045289-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528045289-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..2ce167f Binary files /dev/null and b/assets/cache/cache-1528045289-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528045388-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528045388-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..288ab33 Binary files /dev/null and b/assets/cache/cache-1528045388-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528045447-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528045447-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..6fe0576 Binary files /dev/null and b/assets/cache/cache-1528045447-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528045474-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528045474-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..33adc70 Binary files /dev/null and b/assets/cache/cache-1528045474-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528045617-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528045617-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..499d7d7 Binary files /dev/null and b/assets/cache/cache-1528045617-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528045642-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528045642-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..902a14d Binary files /dev/null and b/assets/cache/cache-1528045642-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528045654-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528045654-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..00ccfb4 Binary files /dev/null and b/assets/cache/cache-1528045654-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528045883-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528045883-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..657c00a Binary files /dev/null and b/assets/cache/cache-1528045883-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528045904-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528045904-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..18391f7 Binary files /dev/null and b/assets/cache/cache-1528045904-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528045929-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528045929-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..c8f76a8 Binary files /dev/null and b/assets/cache/cache-1528045929-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528045980-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528045980-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..36c630b Binary files /dev/null and b/assets/cache/cache-1528045980-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528046522-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528046522-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..75692da Binary files /dev/null and b/assets/cache/cache-1528046522-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528046564-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528046564-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..bc3ed7e Binary files /dev/null and b/assets/cache/cache-1528046564-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528046582-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528046582-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..675089a Binary files /dev/null and b/assets/cache/cache-1528046582-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528046635-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528046635-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..bbcb3c8 Binary files /dev/null and b/assets/cache/cache-1528046635-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528046707-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528046707-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..eb54016 Binary files /dev/null and b/assets/cache/cache-1528046707-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528046726-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528046726-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..478845d Binary files /dev/null and b/assets/cache/cache-1528046726-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528046763-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528046763-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..c5fe94d Binary files /dev/null and b/assets/cache/cache-1528046763-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528046835-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528046835-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..075c912 Binary files /dev/null and b/assets/cache/cache-1528046835-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528046880-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528046880-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..f2622af Binary files /dev/null and b/assets/cache/cache-1528046880-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528046933-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528046933-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..bb928c5 Binary files /dev/null and b/assets/cache/cache-1528046933-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528047278-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528047278-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..48ae66a Binary files /dev/null and b/assets/cache/cache-1528047278-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528047301-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528047301-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..70a81b5 Binary files /dev/null and b/assets/cache/cache-1528047301-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528047348-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528047348-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..62cf32e Binary files /dev/null and b/assets/cache/cache-1528047348-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528047361-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528047361-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..1198a23 Binary files /dev/null and b/assets/cache/cache-1528047361-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528047436-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528047436-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..d29bea5 Binary files /dev/null and b/assets/cache/cache-1528047436-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528047450-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528047450-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..70bdb1b Binary files /dev/null and b/assets/cache/cache-1528047450-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528047545-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528047545-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..37f189f Binary files /dev/null and b/assets/cache/cache-1528047545-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528047706-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528047706-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..70bdb1b Binary files /dev/null and b/assets/cache/cache-1528047706-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528051910-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528051910-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..9460d2f Binary files /dev/null and b/assets/cache/cache-1528051910-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528052055-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528052055-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..29798d8 Binary files /dev/null and b/assets/cache/cache-1528052055-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528052068-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528052068-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..00abf5b Binary files /dev/null and b/assets/cache/cache-1528052068-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528052229-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528052229-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..29b397f Binary files /dev/null and b/assets/cache/cache-1528052229-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528052263-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528052263-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..fe30d42 Binary files /dev/null and b/assets/cache/cache-1528052263-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528052301-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528052301-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..023df89 Binary files /dev/null and b/assets/cache/cache-1528052301-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528052319-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528052319-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..86f0ac9 Binary files /dev/null and b/assets/cache/cache-1528052319-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528052326-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528052326-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..80cabf7 Binary files /dev/null and b/assets/cache/cache-1528052326-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528052335-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528052335-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..73fc363 Binary files /dev/null and b/assets/cache/cache-1528052335-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528052335-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip b/assets/cache/cache-1528052335-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip new file mode 100644 index 0000000..afd4f97 Binary files /dev/null and b/assets/cache/cache-1528052335-8739c4de3237f4ed81e2c4b60297889d.javascript.gzip differ diff --git a/assets/cache/cache-1528052681-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528052681-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..df15270 Binary files /dev/null and b/assets/cache/cache-1528052681-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528052706-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528052706-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..173d330 Binary files /dev/null and b/assets/cache/cache-1528052706-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528052833-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528052833-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..e0da39f Binary files /dev/null and b/assets/cache/cache-1528052833-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528052856-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528052856-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..a70b957 Binary files /dev/null and b/assets/cache/cache-1528052856-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528052913-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528052913-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..11f3261 Binary files /dev/null and b/assets/cache/cache-1528052913-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528052923-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528052923-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..6f32b74 Binary files /dev/null and b/assets/cache/cache-1528052923-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528053327-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528053327-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..12c589a Binary files /dev/null and b/assets/cache/cache-1528053327-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528053371-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528053371-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..63b2f24 Binary files /dev/null and b/assets/cache/cache-1528053371-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528053384-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528053384-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..63b2f24 Binary files /dev/null and b/assets/cache/cache-1528053384-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528393956-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528393956-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..83b790d Binary files /dev/null and b/assets/cache/cache-1528393956-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528394304-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528394304-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..ff63fa1 Binary files /dev/null and b/assets/cache/cache-1528394304-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528394502-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528394502-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..e819977 Binary files /dev/null and b/assets/cache/cache-1528394502-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528467132-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528467132-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..7e276fa Binary files /dev/null and b/assets/cache/cache-1528467132-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528467254-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528467254-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..23f3419 Binary files /dev/null and b/assets/cache/cache-1528467254-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528467455-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528467455-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..8468ce1 Binary files /dev/null and b/assets/cache/cache-1528467455-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528467614-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528467614-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..3b58652 Binary files /dev/null and b/assets/cache/cache-1528467614-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528467693-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528467693-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..736457b Binary files /dev/null and b/assets/cache/cache-1528467693-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528467701-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528467701-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..ac0c67b Binary files /dev/null and b/assets/cache/cache-1528467701-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528467723-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528467723-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..764a3e7 Binary files /dev/null and b/assets/cache/cache-1528467723-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528467815-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528467815-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..5fb8f70 Binary files /dev/null and b/assets/cache/cache-1528467815-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528467931-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528467931-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..1c830e8 Binary files /dev/null and b/assets/cache/cache-1528467931-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528468257-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528468257-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..f837bd1 Binary files /dev/null and b/assets/cache/cache-1528468257-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528468858-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528468858-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..8861d30 Binary files /dev/null and b/assets/cache/cache-1528468858-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528472615-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528472615-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..85cf931 Binary files /dev/null and b/assets/cache/cache-1528472615-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528472661-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528472661-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..f166ccc Binary files /dev/null and b/assets/cache/cache-1528472661-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528472747-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528472747-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..de918dd Binary files /dev/null and b/assets/cache/cache-1528472747-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528472851-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528472851-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..54b1dd6 Binary files /dev/null and b/assets/cache/cache-1528472851-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528473150-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528473150-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..30cf66b Binary files /dev/null and b/assets/cache/cache-1528473150-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528473174-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528473174-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..59005d4 Binary files /dev/null and b/assets/cache/cache-1528473174-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528473333-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528473333-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..1af7703 Binary files /dev/null and b/assets/cache/cache-1528473333-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528473558-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528473558-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..d178631 Binary files /dev/null and b/assets/cache/cache-1528473558-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528473640-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528473640-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..e686f0a Binary files /dev/null and b/assets/cache/cache-1528473640-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528530797-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1528530797-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..3c0e0b3 Binary files /dev/null and b/assets/cache/cache-1528530797-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1528533020-6fdec1b9b000e043529fe574fcf6ed83.css.gzip b/assets/cache/cache-1528533020-6fdec1b9b000e043529fe574fcf6ed83.css.gzip new file mode 100644 index 0000000..7f21bba Binary files /dev/null and b/assets/cache/cache-1528533020-6fdec1b9b000e043529fe574fcf6ed83.css.gzip differ diff --git a/assets/cache/cache-1528533020-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1528533020-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..2bbc418 Binary files /dev/null and b/assets/cache/cache-1528533020-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1528537089-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1528537089-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..936939b Binary files /dev/null and b/assets/cache/cache-1528537089-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1528537629-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1528537629-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..b2eddec Binary files /dev/null and b/assets/cache/cache-1528537629-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1528540356-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1528540356-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..2d9f9e3 Binary files /dev/null and b/assets/cache/cache-1528540356-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1528540411-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1528540411-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..b6fc6f7 Binary files /dev/null and b/assets/cache/cache-1528540411-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1528540954-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1528540954-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..1710abc Binary files /dev/null and b/assets/cache/cache-1528540954-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1528540975-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1528540975-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..956f6ab Binary files /dev/null and b/assets/cache/cache-1528540975-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1528553069-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1528553069-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..15231d8 Binary files /dev/null and b/assets/cache/cache-1528553069-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1528553106-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1528553106-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..bc2746d Binary files /dev/null and b/assets/cache/cache-1528553106-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1528553179-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1528553179-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..e5a55b8 Binary files /dev/null and b/assets/cache/cache-1528553179-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1528553226-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1528553226-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..8a0ef70 Binary files /dev/null and b/assets/cache/cache-1528553226-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1528553241-6136c98b84edacbc4ab499fdc65e6c41.css.gzip b/assets/cache/cache-1528553241-6136c98b84edacbc4ab499fdc65e6c41.css.gzip new file mode 100644 index 0000000..197ab60 Binary files /dev/null and b/assets/cache/cache-1528553241-6136c98b84edacbc4ab499fdc65e6c41.css.gzip differ diff --git a/assets/cache/cache-1528553241-6fdec1b9b000e043529fe574fcf6ed83.css.gzip b/assets/cache/cache-1528553241-6fdec1b9b000e043529fe574fcf6ed83.css.gzip new file mode 100644 index 0000000..9a0565f Binary files /dev/null and b/assets/cache/cache-1528553241-6fdec1b9b000e043529fe574fcf6ed83.css.gzip differ diff --git a/assets/cache/cache-1528553241-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1528553241-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..4123edc Binary files /dev/null and b/assets/cache/cache-1528553241-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1528553241-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1528553241-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..96c31ec Binary files /dev/null and b/assets/cache/cache-1528553241-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1528553630-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip b/assets/cache/cache-1528553630-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip new file mode 100644 index 0000000..af66754 Binary files /dev/null and b/assets/cache/cache-1528553630-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip differ diff --git a/assets/cache/cache-1528553630-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1528553630-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..5b29196 Binary files /dev/null and b/assets/cache/cache-1528553630-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1528553630-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528553630-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..7c5d564 Binary files /dev/null and b/assets/cache/cache-1528553630-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528553630-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip b/assets/cache/cache-1528553630-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip new file mode 100644 index 0000000..a970851 Binary files /dev/null and b/assets/cache/cache-1528553630-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip differ diff --git a/assets/cache/cache-1528553630-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1528553630-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..3fcf0d5 Binary files /dev/null and b/assets/cache/cache-1528553630-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1528553630-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1528553630-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..0b962f2 Binary files /dev/null and b/assets/cache/cache-1528553630-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1528553630-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip b/assets/cache/cache-1528553630-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip new file mode 100644 index 0000000..12b8a94 Binary files /dev/null and b/assets/cache/cache-1528553630-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip differ diff --git a/assets/cache/cache-1528557066-6136c98b84edacbc4ab499fdc65e6c41.css.gzip b/assets/cache/cache-1528557066-6136c98b84edacbc4ab499fdc65e6c41.css.gzip new file mode 100644 index 0000000..9837617 Binary files /dev/null and b/assets/cache/cache-1528557066-6136c98b84edacbc4ab499fdc65e6c41.css.gzip differ diff --git a/assets/cache/cache-1528557066-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1528557066-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..e007b7c Binary files /dev/null and b/assets/cache/cache-1528557066-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1528557066-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1528557066-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..452b784 Binary files /dev/null and b/assets/cache/cache-1528557066-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1528557066-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1528557066-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..edac5c7 Binary files /dev/null and b/assets/cache/cache-1528557066-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1528557066-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1528557066-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..816d57e Binary files /dev/null and b/assets/cache/cache-1528557066-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1528557066-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip b/assets/cache/cache-1528557066-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip new file mode 100644 index 0000000..5993343 Binary files /dev/null and b/assets/cache/cache-1528557066-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip differ diff --git a/assets/cache/cache-1528558136-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip b/assets/cache/cache-1528558136-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip new file mode 100644 index 0000000..e1bf928 Binary files /dev/null and b/assets/cache/cache-1528558136-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip differ diff --git a/assets/cache/cache-1528558159-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip b/assets/cache/cache-1528558159-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip new file mode 100644 index 0000000..b8bc3f8 Binary files /dev/null and b/assets/cache/cache-1528558159-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip differ diff --git a/assets/cache/cache-1528558168-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip b/assets/cache/cache-1528558168-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip new file mode 100644 index 0000000..39438b4 Binary files /dev/null and b/assets/cache/cache-1528558168-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip differ diff --git a/assets/cache/cache-1528558174-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip b/assets/cache/cache-1528558174-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip new file mode 100644 index 0000000..305c217 Binary files /dev/null and b/assets/cache/cache-1528558174-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip differ diff --git a/assets/cache/cache-1528558747-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip b/assets/cache/cache-1528558747-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip new file mode 100644 index 0000000..e58bb35 Binary files /dev/null and b/assets/cache/cache-1528558747-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip differ diff --git a/assets/cache/cache-1528558773-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip b/assets/cache/cache-1528558773-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip new file mode 100644 index 0000000..abe0bad Binary files /dev/null and b/assets/cache/cache-1528558773-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip differ diff --git a/assets/cache/cache-1528558794-6136c98b84edacbc4ab499fdc65e6c41.css.gzip b/assets/cache/cache-1528558794-6136c98b84edacbc4ab499fdc65e6c41.css.gzip new file mode 100644 index 0000000..d4ef0ad Binary files /dev/null and b/assets/cache/cache-1528558794-6136c98b84edacbc4ab499fdc65e6c41.css.gzip differ diff --git a/assets/cache/cache-1528558794-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip b/assets/cache/cache-1528558794-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip new file mode 100644 index 0000000..1184523 Binary files /dev/null and b/assets/cache/cache-1528558794-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip differ diff --git a/assets/cache/cache-1528558874-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip b/assets/cache/cache-1528558874-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip new file mode 100644 index 0000000..9c4d4f6 Binary files /dev/null and b/assets/cache/cache-1528558874-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip differ diff --git a/assets/cache/cache-1528558896-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip b/assets/cache/cache-1528558896-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip new file mode 100644 index 0000000..dbfd46e Binary files /dev/null and b/assets/cache/cache-1528558896-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip differ diff --git a/assets/cache/cache-1528558999-6136c98b84edacbc4ab499fdc65e6c41.css.gzip b/assets/cache/cache-1528558999-6136c98b84edacbc4ab499fdc65e6c41.css.gzip new file mode 100644 index 0000000..d7c3b44 Binary files /dev/null and b/assets/cache/cache-1528558999-6136c98b84edacbc4ab499fdc65e6c41.css.gzip differ diff --git a/assets/cache/cache-1528558999-a9bd460f50d94c3de82110def3556c6a.css.gzip b/assets/cache/cache-1528558999-a9bd460f50d94c3de82110def3556c6a.css.gzip new file mode 100644 index 0000000..2ad2aac Binary files /dev/null and b/assets/cache/cache-1528558999-a9bd460f50d94c3de82110def3556c6a.css.gzip differ diff --git a/assets/cache/cache-1528558999-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip b/assets/cache/cache-1528558999-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip new file mode 100644 index 0000000..dd195fd Binary files /dev/null and b/assets/cache/cache-1528558999-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip differ diff --git a/assets/cache/cache-1528562146-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562146-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..8662473 Binary files /dev/null and b/assets/cache/cache-1528562146-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562215-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562215-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..b658b41 Binary files /dev/null and b/assets/cache/cache-1528562215-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562248-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562248-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..c3c2379 Binary files /dev/null and b/assets/cache/cache-1528562248-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562313-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562313-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..84d2465 Binary files /dev/null and b/assets/cache/cache-1528562313-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562365-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562365-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..17468f6 Binary files /dev/null and b/assets/cache/cache-1528562365-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562490-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562490-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..3fa1503 Binary files /dev/null and b/assets/cache/cache-1528562490-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562509-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562509-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..fea405d Binary files /dev/null and b/assets/cache/cache-1528562509-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562527-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562527-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..fe8e789 Binary files /dev/null and b/assets/cache/cache-1528562527-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562548-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562548-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..c2afad0 Binary files /dev/null and b/assets/cache/cache-1528562548-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562620-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562620-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..8259317 Binary files /dev/null and b/assets/cache/cache-1528562620-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562629-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562629-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..9e99b61 Binary files /dev/null and b/assets/cache/cache-1528562629-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562645-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562645-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..1be693a Binary files /dev/null and b/assets/cache/cache-1528562645-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562681-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562681-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..6d7494b Binary files /dev/null and b/assets/cache/cache-1528562681-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562692-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562692-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..7e5a193 Binary files /dev/null and b/assets/cache/cache-1528562692-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562715-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562715-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..a234a1a Binary files /dev/null and b/assets/cache/cache-1528562715-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562751-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562751-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..b82f1fb Binary files /dev/null and b/assets/cache/cache-1528562751-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562774-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562774-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..573e151 Binary files /dev/null and b/assets/cache/cache-1528562774-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562837-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562837-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..0e4e885 Binary files /dev/null and b/assets/cache/cache-1528562837-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562860-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562860-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..6ef4bc9 Binary files /dev/null and b/assets/cache/cache-1528562860-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562884-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562884-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..f5baa71 Binary files /dev/null and b/assets/cache/cache-1528562884-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562902-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562902-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..2a52260 Binary files /dev/null and b/assets/cache/cache-1528562902-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528562962-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528562962-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..c5130ed Binary files /dev/null and b/assets/cache/cache-1528562962-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528563057-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528563057-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..bc8abbc Binary files /dev/null and b/assets/cache/cache-1528563057-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528563093-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528563093-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..0e96f2d Binary files /dev/null and b/assets/cache/cache-1528563093-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528563181-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528563181-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..9080edd Binary files /dev/null and b/assets/cache/cache-1528563181-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528563470-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528563470-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..a7107f9 Binary files /dev/null and b/assets/cache/cache-1528563470-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528563676-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528563676-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..24874c2 Binary files /dev/null and b/assets/cache/cache-1528563676-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528563796-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528563796-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..0efc056 Binary files /dev/null and b/assets/cache/cache-1528563796-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528563806-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528563806-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..882ce67 Binary files /dev/null and b/assets/cache/cache-1528563806-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528563831-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528563831-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..d342d54 Binary files /dev/null and b/assets/cache/cache-1528563831-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528563851-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528563851-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..e3dccd4 Binary files /dev/null and b/assets/cache/cache-1528563851-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528564362-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528564362-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..3b1e2a2 Binary files /dev/null and b/assets/cache/cache-1528564362-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528565223-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528565223-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..ee3951d Binary files /dev/null and b/assets/cache/cache-1528565223-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528565237-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528565237-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..9a296f7 Binary files /dev/null and b/assets/cache/cache-1528565237-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528565274-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528565274-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..ee3951d Binary files /dev/null and b/assets/cache/cache-1528565274-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528565352-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1528565352-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..9a296f7 Binary files /dev/null and b/assets/cache/cache-1528565352-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1528635244-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1528635244-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..2960621 Binary files /dev/null and b/assets/cache/cache-1528635244-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1528638270-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1528638270-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..083ab38 Binary files /dev/null and b/assets/cache/cache-1528638270-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1528638402-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528638402-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..2453a08 Binary files /dev/null and b/assets/cache/cache-1528638402-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528638482-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528638482-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..26f016f Binary files /dev/null and b/assets/cache/cache-1528638482-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528638556-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528638556-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..072abaa Binary files /dev/null and b/assets/cache/cache-1528638556-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528638572-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528638572-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..8d3172e Binary files /dev/null and b/assets/cache/cache-1528638572-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528638638-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528638638-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..ebb7c94 Binary files /dev/null and b/assets/cache/cache-1528638638-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528638659-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528638659-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..598019f Binary files /dev/null and b/assets/cache/cache-1528638659-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528638882-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1528638882-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..79fbd20 Binary files /dev/null and b/assets/cache/cache-1528638882-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1528638882-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1528638882-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..8eb9fcd Binary files /dev/null and b/assets/cache/cache-1528638882-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1528638882-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1528638882-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..8f5d991 Binary files /dev/null and b/assets/cache/cache-1528638882-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1528639124-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528639124-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..124c825 Binary files /dev/null and b/assets/cache/cache-1528639124-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528639433-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528639433-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..f4659ad Binary files /dev/null and b/assets/cache/cache-1528639433-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528639588-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528639588-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..b8e8578 Binary files /dev/null and b/assets/cache/cache-1528639588-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528639588-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1528639588-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..6bded06 Binary files /dev/null and b/assets/cache/cache-1528639588-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1528639633-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528639633-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..402e600 Binary files /dev/null and b/assets/cache/cache-1528639633-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528639651-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip b/assets/cache/cache-1528639651-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip new file mode 100644 index 0000000..8df5733 Binary files /dev/null and b/assets/cache/cache-1528639651-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip differ diff --git a/assets/cache/cache-1528639651-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528639651-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..009d2ad Binary files /dev/null and b/assets/cache/cache-1528639651-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528639651-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1528639651-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..3be64b7 Binary files /dev/null and b/assets/cache/cache-1528639651-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1528641270-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528641270-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..86ef06e Binary files /dev/null and b/assets/cache/cache-1528641270-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528641270-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1528641270-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..76b081b Binary files /dev/null and b/assets/cache/cache-1528641270-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1528642311-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1528642311-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..bab1c75 Binary files /dev/null and b/assets/cache/cache-1528642311-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1528642311-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1528642311-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..9d5f8fb Binary files /dev/null and b/assets/cache/cache-1528642311-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1528642563-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1528642563-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..32d530c Binary files /dev/null and b/assets/cache/cache-1528642563-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1528642580-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1528642580-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..9cc18ff Binary files /dev/null and b/assets/cache/cache-1528642580-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1528642603-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1528642603-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..9d5f8fb Binary files /dev/null and b/assets/cache/cache-1528642603-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1528642641-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1528642641-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..40694c7 Binary files /dev/null and b/assets/cache/cache-1528642641-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1528642713-6fdec1b9b000e043529fe574fcf6ed83.css.gzip b/assets/cache/cache-1528642713-6fdec1b9b000e043529fe574fcf6ed83.css.gzip new file mode 100644 index 0000000..2967772 Binary files /dev/null and b/assets/cache/cache-1528642713-6fdec1b9b000e043529fe574fcf6ed83.css.gzip differ diff --git a/assets/cache/cache-1528642713-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1528642713-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..efe08bf Binary files /dev/null and b/assets/cache/cache-1528642713-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1528642713-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1528642713-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..c168308 Binary files /dev/null and b/assets/cache/cache-1528642713-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1528642910-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip b/assets/cache/cache-1528642910-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip new file mode 100644 index 0000000..a0d67c9 Binary files /dev/null and b/assets/cache/cache-1528642910-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip differ diff --git a/assets/cache/cache-1528642910-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip b/assets/cache/cache-1528642910-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip new file mode 100644 index 0000000..fc92b64 Binary files /dev/null and b/assets/cache/cache-1528642910-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip differ diff --git a/assets/cache/cache-1528642910-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1528642910-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..4512f8a Binary files /dev/null and b/assets/cache/cache-1528642910-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1528642910-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528642910-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..11c2cee Binary files /dev/null and b/assets/cache/cache-1528642910-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528642910-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1528642910-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..5a98115 Binary files /dev/null and b/assets/cache/cache-1528642910-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1528642910-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip b/assets/cache/cache-1528642910-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip new file mode 100644 index 0000000..f8d5689 Binary files /dev/null and b/assets/cache/cache-1528642910-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip differ diff --git a/assets/cache/cache-1528642910-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1528642910-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..46ca0d6 Binary files /dev/null and b/assets/cache/cache-1528642910-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1528642910-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1528642910-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..33bad97 Binary files /dev/null and b/assets/cache/cache-1528642910-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1528642910-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip b/assets/cache/cache-1528642910-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip new file mode 100644 index 0000000..a46ca77 Binary files /dev/null and b/assets/cache/cache-1528642910-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip differ diff --git a/assets/cache/cache-1528735949-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528735949-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..d9bb5ea Binary files /dev/null and b/assets/cache/cache-1528735949-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528735983-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528735983-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..b9f2b95 Binary files /dev/null and b/assets/cache/cache-1528735983-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528736031-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528736031-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..2139c29 Binary files /dev/null and b/assets/cache/cache-1528736031-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528736068-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528736068-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..072228d Binary files /dev/null and b/assets/cache/cache-1528736068-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528736120-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528736120-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..1e0cdcd Binary files /dev/null and b/assets/cache/cache-1528736120-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528736127-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528736127-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..ee83eb3 Binary files /dev/null and b/assets/cache/cache-1528736127-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528736165-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528736165-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..379b438 Binary files /dev/null and b/assets/cache/cache-1528736165-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528736300-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528736300-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..d01bd0c Binary files /dev/null and b/assets/cache/cache-1528736300-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528736320-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528736320-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..762eb71 Binary files /dev/null and b/assets/cache/cache-1528736320-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528736360-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528736360-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..69e7056 Binary files /dev/null and b/assets/cache/cache-1528736360-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528736441-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528736441-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..42bce6e Binary files /dev/null and b/assets/cache/cache-1528736441-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528736467-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528736467-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..538cc3a Binary files /dev/null and b/assets/cache/cache-1528736467-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528736481-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528736481-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..3039700 Binary files /dev/null and b/assets/cache/cache-1528736481-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528736503-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528736503-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..2010709 Binary files /dev/null and b/assets/cache/cache-1528736503-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528736518-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528736518-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..15dc4bc Binary files /dev/null and b/assets/cache/cache-1528736518-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528736590-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528736590-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..3790401 Binary files /dev/null and b/assets/cache/cache-1528736590-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1528736624-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1528736624-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..5f7930e Binary files /dev/null and b/assets/cache/cache-1528736624-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1534087181-6136c98b84edacbc4ab499fdc65e6c41.css.gzip b/assets/cache/cache-1534087181-6136c98b84edacbc4ab499fdc65e6c41.css.gzip new file mode 100644 index 0000000..a3beb89 Binary files /dev/null and b/assets/cache/cache-1534087181-6136c98b84edacbc4ab499fdc65e6c41.css.gzip differ diff --git a/assets/cache/cache-1534087181-6fdec1b9b000e043529fe574fcf6ed83.css.gzip b/assets/cache/cache-1534087181-6fdec1b9b000e043529fe574fcf6ed83.css.gzip new file mode 100644 index 0000000..035cff7 Binary files /dev/null and b/assets/cache/cache-1534087181-6fdec1b9b000e043529fe574fcf6ed83.css.gzip differ diff --git a/assets/cache/cache-1534087181-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1534087181-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..47b5661 Binary files /dev/null and b/assets/cache/cache-1534087181-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1534087181-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip b/assets/cache/cache-1534087181-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip new file mode 100644 index 0000000..c69c48c Binary files /dev/null and b/assets/cache/cache-1534087181-94ae93a3dd838793f0c1cf10bdff6e14.css.gzip differ diff --git a/assets/cache/cache-1534087181-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1534087181-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..d26b19b Binary files /dev/null and b/assets/cache/cache-1534087181-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1534087181-a9bd460f50d94c3de82110def3556c6a.css.gzip b/assets/cache/cache-1534087181-a9bd460f50d94c3de82110def3556c6a.css.gzip new file mode 100644 index 0000000..aa75dad Binary files /dev/null and b/assets/cache/cache-1534087181-a9bd460f50d94c3de82110def3556c6a.css.gzip differ diff --git a/assets/cache/cache-1534087181-e238b7aadc885c8d0dac9e6875582558.css.gzip b/assets/cache/cache-1534087181-e238b7aadc885c8d0dac9e6875582558.css.gzip new file mode 100644 index 0000000..3768eb2 Binary files /dev/null and b/assets/cache/cache-1534087181-e238b7aadc885c8d0dac9e6875582558.css.gzip differ diff --git a/assets/cache/cache-1534087181-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip b/assets/cache/cache-1534087181-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip new file mode 100644 index 0000000..0a40fa4 Binary files /dev/null and b/assets/cache/cache-1534087181-e99d39bee3802a7a7ea6e9dff915c80f.css.gzip differ diff --git a/assets/cache/cache-1534088088-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1534088088-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..7e3b967 Binary files /dev/null and b/assets/cache/cache-1534088088-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1534088647-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1534088647-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..6255fb8 Binary files /dev/null and b/assets/cache/cache-1534088647-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1534088666-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1534088666-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..a6ae159 Binary files /dev/null and b/assets/cache/cache-1534088666-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1534088746-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1534088746-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..1de581b Binary files /dev/null and b/assets/cache/cache-1534088746-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1534089181-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip b/assets/cache/cache-1534089181-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip new file mode 100644 index 0000000..89778ab Binary files /dev/null and b/assets/cache/cache-1534089181-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip differ diff --git a/assets/cache/cache-1534089181-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip b/assets/cache/cache-1534089181-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip new file mode 100644 index 0000000..8a2ea1a Binary files /dev/null and b/assets/cache/cache-1534089181-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip differ diff --git a/assets/cache/cache-1534089181-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1534089181-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..96398dc Binary files /dev/null and b/assets/cache/cache-1534089181-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1534089181-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1534089181-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..8addf2e Binary files /dev/null and b/assets/cache/cache-1534089181-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1534089181-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1534089181-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..911af9f Binary files /dev/null and b/assets/cache/cache-1534089181-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1534089181-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip b/assets/cache/cache-1534089181-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip new file mode 100644 index 0000000..337185d Binary files /dev/null and b/assets/cache/cache-1534089181-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip differ diff --git a/assets/cache/cache-1534089181-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1534089181-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..6bcbdf7 Binary files /dev/null and b/assets/cache/cache-1534089181-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1534089181-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1534089181-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..a74eba7 Binary files /dev/null and b/assets/cache/cache-1534089181-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1534089181-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip b/assets/cache/cache-1534089181-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip new file mode 100644 index 0000000..cd77c75 Binary files /dev/null and b/assets/cache/cache-1534089181-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip differ diff --git a/assets/cache/cache-1534150433-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1534150433-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..b0c94c7 Binary files /dev/null and b/assets/cache/cache-1534150433-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1534153752-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip b/assets/cache/cache-1534153752-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip new file mode 100644 index 0000000..234f12c Binary files /dev/null and b/assets/cache/cache-1534153752-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip differ diff --git a/assets/cache/cache-1534153752-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1534153752-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..c9e7488 Binary files /dev/null and b/assets/cache/cache-1534153752-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1534153752-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1534153752-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..89e5651 Binary files /dev/null and b/assets/cache/cache-1534153752-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1534153752-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1534153752-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..bf4088d Binary files /dev/null and b/assets/cache/cache-1534153752-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1534157629-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1534157629-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..65a9a0f Binary files /dev/null and b/assets/cache/cache-1534157629-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1534157629-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1534157629-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..9a80005 Binary files /dev/null and b/assets/cache/cache-1534157629-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1534157731-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1534157731-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..c639238 Binary files /dev/null and b/assets/cache/cache-1534157731-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1534157731-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1534157731-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..520f1b1 Binary files /dev/null and b/assets/cache/cache-1534157731-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1534157755-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1534157755-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..523e748 Binary files /dev/null and b/assets/cache/cache-1534157755-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1534157755-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1534157755-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..b844ab8 Binary files /dev/null and b/assets/cache/cache-1534157755-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1534157755-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1534157755-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..475d7df Binary files /dev/null and b/assets/cache/cache-1534157755-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1534157755-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip b/assets/cache/cache-1534157755-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip new file mode 100644 index 0000000..9b96c5f Binary files /dev/null and b/assets/cache/cache-1534157755-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip differ diff --git a/assets/cache/cache-1534158089-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1534158089-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..7f62f9f Binary files /dev/null and b/assets/cache/cache-1534158089-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1534158089-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1534158089-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..4cb92d7 Binary files /dev/null and b/assets/cache/cache-1534158089-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1534158089-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip b/assets/cache/cache-1534158089-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip new file mode 100644 index 0000000..a088727 Binary files /dev/null and b/assets/cache/cache-1534158089-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip differ diff --git a/assets/cache/cache-1534158416-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1534158416-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..4c4b5a2 Binary files /dev/null and b/assets/cache/cache-1534158416-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1534158416-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1534158416-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..8c48356 Binary files /dev/null and b/assets/cache/cache-1534158416-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1534158416-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip b/assets/cache/cache-1534158416-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip new file mode 100644 index 0000000..15cab97 Binary files /dev/null and b/assets/cache/cache-1534158416-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip differ diff --git a/assets/cache/cache-1534158464-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip b/assets/cache/cache-1534158464-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip new file mode 100644 index 0000000..107082f Binary files /dev/null and b/assets/cache/cache-1534158464-0dc41018c9e93d4d11e11f8953b2ab38.javascript.gzip differ diff --git a/assets/cache/cache-1534158464-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip b/assets/cache/cache-1534158464-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip new file mode 100644 index 0000000..1275ec3 Binary files /dev/null and b/assets/cache/cache-1534158464-0dcfa623e12ad2fb4ea762cd4bc8558b.javascript.gzip differ diff --git a/assets/cache/cache-1534158464-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1534158464-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..ba01776 Binary files /dev/null and b/assets/cache/cache-1534158464-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1534158464-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip b/assets/cache/cache-1534158464-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip new file mode 100644 index 0000000..779c159 Binary files /dev/null and b/assets/cache/cache-1534158464-2b84f6840d5facee5fe4c41772b5214f.javascript.gzip differ diff --git a/assets/cache/cache-1534158464-3fcc08c2867bd79e7b5ca501c6e4c2a6.javascript.gzip b/assets/cache/cache-1534158464-3fcc08c2867bd79e7b5ca501c6e4c2a6.javascript.gzip new file mode 100644 index 0000000..37fc3aa Binary files /dev/null and b/assets/cache/cache-1534158464-3fcc08c2867bd79e7b5ca501c6e4c2a6.javascript.gzip differ diff --git a/assets/cache/cache-1534158464-581a6c16390510a37c897b4909e439c8.javascript.gzip b/assets/cache/cache-1534158464-581a6c16390510a37c897b4909e439c8.javascript.gzip new file mode 100644 index 0000000..0469f35 Binary files /dev/null and b/assets/cache/cache-1534158464-581a6c16390510a37c897b4909e439c8.javascript.gzip differ diff --git a/assets/cache/cache-1534158464-8fda546a739be61bcc16c78aaca891da.javascript.gzip b/assets/cache/cache-1534158464-8fda546a739be61bcc16c78aaca891da.javascript.gzip new file mode 100644 index 0000000..b0c635a Binary files /dev/null and b/assets/cache/cache-1534158464-8fda546a739be61bcc16c78aaca891da.javascript.gzip differ diff --git a/assets/cache/cache-1534158464-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip b/assets/cache/cache-1534158464-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip new file mode 100644 index 0000000..7469b81 Binary files /dev/null and b/assets/cache/cache-1534158464-a3dc5f83c7763dc3c1b61c2541d49112.javascript.gzip differ diff --git a/assets/cache/cache-1534158464-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1534158464-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..b605cbf Binary files /dev/null and b/assets/cache/cache-1534158464-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1534158464-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip b/assets/cache/cache-1534158464-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip new file mode 100644 index 0000000..ceea0fa Binary files /dev/null and b/assets/cache/cache-1534158464-b44aca0275e56ed0fa2566b1049d2ae9.javascript.gzip differ diff --git a/assets/cache/cache-1534158464-c7a411f46445d02862156be0a49d338c.javascript.gzip b/assets/cache/cache-1534158464-c7a411f46445d02862156be0a49d338c.javascript.gzip new file mode 100644 index 0000000..22c4403 Binary files /dev/null and b/assets/cache/cache-1534158464-c7a411f46445d02862156be0a49d338c.javascript.gzip differ diff --git a/assets/cache/cache-1534158464-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip b/assets/cache/cache-1534158464-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip new file mode 100644 index 0000000..6bf3c71 Binary files /dev/null and b/assets/cache/cache-1534158464-eb78bd92dda8875bbe4b236fe48407d8.javascript.gzip differ diff --git a/assets/cache/cache-1534158464-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip b/assets/cache/cache-1534158464-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip new file mode 100644 index 0000000..f13256b Binary files /dev/null and b/assets/cache/cache-1534158464-ede189e5ca2d7dc7433d1446f1a6c43d.javascript.gzip differ diff --git a/assets/cache/cache-1534158464-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip b/assets/cache/cache-1534158464-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip new file mode 100644 index 0000000..5ab6682 Binary files /dev/null and b/assets/cache/cache-1534158464-ff2df294d97f3fd8f7da2b474606bf9d.javascript.gzip differ diff --git a/assets/cache/cache-1534164784-d0686f57fa4b8f6ef09a63b494e3bfa6.css.gzip b/assets/cache/cache-1534164784-d0686f57fa4b8f6ef09a63b494e3bfa6.css.gzip new file mode 100644 index 0000000..899c8cb Binary files /dev/null and b/assets/cache/cache-1534164784-d0686f57fa4b8f6ef09a63b494e3bfa6.css.gzip differ diff --git a/assets/cache/cache-1534165017-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip b/assets/cache/cache-1534165017-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip new file mode 100644 index 0000000..bdc3fff Binary files /dev/null and b/assets/cache/cache-1534165017-192c99ed95bb9c30bde13ba0ee2d577c.javascript.gzip differ diff --git a/assets/cache/cache-1534170439-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1534170439-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..fcf8953 Binary files /dev/null and b/assets/cache/cache-1534170439-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1534170473-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1534170473-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..3c0e0b3 Binary files /dev/null and b/assets/cache/cache-1534170473-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1534170930-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1534170930-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..431f3d1 Binary files /dev/null and b/assets/cache/cache-1534170930-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1534171050-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1534171050-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..a8d6d2f Binary files /dev/null and b/assets/cache/cache-1534171050-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1534171275-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1534171275-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..0b6312e Binary files /dev/null and b/assets/cache/cache-1534171275-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1534171389-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1534171389-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..d98dcc6 Binary files /dev/null and b/assets/cache/cache-1534171389-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1534171612-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1534171612-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..df3a38a Binary files /dev/null and b/assets/cache/cache-1534171612-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1534171661-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1534171661-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..d1a04dc Binary files /dev/null and b/assets/cache/cache-1534171661-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1534171739-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1534171739-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..e3ecd85 Binary files /dev/null and b/assets/cache/cache-1534171739-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1534172769-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1534172769-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..bfb270d Binary files /dev/null and b/assets/cache/cache-1534172769-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1534172946-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1534172946-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..658fd12 Binary files /dev/null and b/assets/cache/cache-1534172946-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1534253713-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip b/assets/cache/cache-1534253713-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip new file mode 100644 index 0000000..f15e92f Binary files /dev/null and b/assets/cache/cache-1534253713-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip differ diff --git a/assets/cache/cache-1534253782-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip b/assets/cache/cache-1534253782-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip new file mode 100644 index 0000000..f0711fd Binary files /dev/null and b/assets/cache/cache-1534253782-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip differ diff --git a/assets/cache/cache-1534254362-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip b/assets/cache/cache-1534254362-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip new file mode 100644 index 0000000..aadb9c4 Binary files /dev/null and b/assets/cache/cache-1534254362-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip differ diff --git a/assets/cache/cache-1534254430-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip b/assets/cache/cache-1534254430-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip new file mode 100644 index 0000000..b1a8647 Binary files /dev/null and b/assets/cache/cache-1534254430-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip differ diff --git a/assets/cache/cache-1534254446-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip b/assets/cache/cache-1534254446-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip new file mode 100644 index 0000000..7192004 Binary files /dev/null and b/assets/cache/cache-1534254446-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip differ diff --git a/assets/cache/cache-1534254467-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip b/assets/cache/cache-1534254467-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip new file mode 100644 index 0000000..e9c93de Binary files /dev/null and b/assets/cache/cache-1534254467-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip differ diff --git a/assets/cache/cache-1534343532-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip b/assets/cache/cache-1534343532-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip new file mode 100644 index 0000000..1c44a8e Binary files /dev/null and b/assets/cache/cache-1534343532-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip differ diff --git a/assets/cache/cache-1534343565-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip b/assets/cache/cache-1534343565-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip new file mode 100644 index 0000000..50969fe Binary files /dev/null and b/assets/cache/cache-1534343565-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip differ diff --git a/assets/cache/cache-1534347477-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip b/assets/cache/cache-1534347477-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip new file mode 100644 index 0000000..095c7fb Binary files /dev/null and b/assets/cache/cache-1534347477-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip differ diff --git a/assets/cache/cache-1534347477-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1534347477-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..4415615 Binary files /dev/null and b/assets/cache/cache-1534347477-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1534348320-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1534348320-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..4b5599d Binary files /dev/null and b/assets/cache/cache-1534348320-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1534348339-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1534348339-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..2344b37 Binary files /dev/null and b/assets/cache/cache-1534348339-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1534424937-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip b/assets/cache/cache-1534424937-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip new file mode 100644 index 0000000..433454e Binary files /dev/null and b/assets/cache/cache-1534424937-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip differ diff --git a/assets/cache/cache-1534429172-323500f453ddd860cc4cb3b05e1aefdd.javascript.gzip b/assets/cache/cache-1534429172-323500f453ddd860cc4cb3b05e1aefdd.javascript.gzip new file mode 100644 index 0000000..f481ab7 Binary files /dev/null and b/assets/cache/cache-1534429172-323500f453ddd860cc4cb3b05e1aefdd.javascript.gzip differ diff --git a/assets/cache/cache-1534429172-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip b/assets/cache/cache-1534429172-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip new file mode 100644 index 0000000..da4e1f1 Binary files /dev/null and b/assets/cache/cache-1534429172-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip differ diff --git a/assets/cache/cache-1534429172-3e1b4f39eee8d55ba3db2abbad3b9c58.javascript.gzip b/assets/cache/cache-1534429172-3e1b4f39eee8d55ba3db2abbad3b9c58.javascript.gzip new file mode 100644 index 0000000..39e046e Binary files /dev/null and b/assets/cache/cache-1534429172-3e1b4f39eee8d55ba3db2abbad3b9c58.javascript.gzip differ diff --git a/assets/cache/cache-1534429172-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip b/assets/cache/cache-1534429172-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip new file mode 100644 index 0000000..c4fa680 Binary files /dev/null and b/assets/cache/cache-1534429172-41fc8ce1de758d22e39a6390c3cb4efa.javascript.gzip differ diff --git a/assets/cache/cache-1534429172-53710c5a90081912bff40bda47789500.javascript.gzip b/assets/cache/cache-1534429172-53710c5a90081912bff40bda47789500.javascript.gzip new file mode 100644 index 0000000..68d21e3 Binary files /dev/null and b/assets/cache/cache-1534429172-53710c5a90081912bff40bda47789500.javascript.gzip differ diff --git a/assets/cache/cache-1534438053-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1534438053-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..b33004d Binary files /dev/null and b/assets/cache/cache-1534438053-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1534438053-a447eca05da65bf3590d9c501fda8b20.javascript.gzip b/assets/cache/cache-1534438053-a447eca05da65bf3590d9c501fda8b20.javascript.gzip new file mode 100644 index 0000000..1b25bd1 Binary files /dev/null and b/assets/cache/cache-1534438053-a447eca05da65bf3590d9c501fda8b20.javascript.gzip differ diff --git a/assets/cache/cache-1534438120-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1534438120-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..d085bc3 Binary files /dev/null and b/assets/cache/cache-1534438120-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1534438201-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1534438201-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..c4b71a6 Binary files /dev/null and b/assets/cache/cache-1534438201-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1534438223-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1534438223-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..d085bc3 Binary files /dev/null and b/assets/cache/cache-1534438223-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1534438302-91244317688e1cf107773e76d9c014b1.css.gzip b/assets/cache/cache-1534438302-91244317688e1cf107773e76d9c014b1.css.gzip new file mode 100644 index 0000000..d673ca4 Binary files /dev/null and b/assets/cache/cache-1534438302-91244317688e1cf107773e76d9c014b1.css.gzip differ diff --git a/assets/cache/cache-1534520286-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1534520286-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..bfeb1a3 Binary files /dev/null and b/assets/cache/cache-1534520286-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1534520300-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1534520300-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..5fff389 Binary files /dev/null and b/assets/cache/cache-1534520300-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1534520305-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1534520305-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..19de426 Binary files /dev/null and b/assets/cache/cache-1534520305-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1534520312-585700901690fad940ac35a3f8984797.css.gzip b/assets/cache/cache-1534520312-585700901690fad940ac35a3f8984797.css.gzip new file mode 100644 index 0000000..aea0abd Binary files /dev/null and b/assets/cache/cache-1534520312-585700901690fad940ac35a3f8984797.css.gzip differ diff --git a/assets/cache/cache-1534520312-9635b9afb447007a7e382389ba45a031.css.gzip b/assets/cache/cache-1534520312-9635b9afb447007a7e382389ba45a031.css.gzip new file mode 100644 index 0000000..72cb3a4 Binary files /dev/null and b/assets/cache/cache-1534520312-9635b9afb447007a7e382389ba45a031.css.gzip differ diff --git a/assets/cache/cache-1534520478-89be828eb31b9db882cd65ef9cd46328.css.gzip b/assets/cache/cache-1534520478-89be828eb31b9db882cd65ef9cd46328.css.gzip new file mode 100644 index 0000000..3cdea9e Binary files /dev/null and b/assets/cache/cache-1534520478-89be828eb31b9db882cd65ef9cd46328.css.gzip differ diff --git a/assets/cache/cache-1534520478-a6a5027da86b635c3289f0fa8d5fec4b.css.gzip b/assets/cache/cache-1534520478-a6a5027da86b635c3289f0fa8d5fec4b.css.gzip new file mode 100644 index 0000000..787ee69 Binary files /dev/null and b/assets/cache/cache-1534520478-a6a5027da86b635c3289f0fa8d5fec4b.css.gzip differ diff --git a/assets/cache/cache-1534520700-89be828eb31b9db882cd65ef9cd46328.css.gzip b/assets/cache/cache-1534520700-89be828eb31b9db882cd65ef9cd46328.css.gzip new file mode 100644 index 0000000..631142c Binary files /dev/null and b/assets/cache/cache-1534520700-89be828eb31b9db882cd65ef9cd46328.css.gzip differ diff --git a/assets/cache/cache-1534520775-89be828eb31b9db882cd65ef9cd46328.css.gzip b/assets/cache/cache-1534520775-89be828eb31b9db882cd65ef9cd46328.css.gzip new file mode 100644 index 0000000..38bfa5e Binary files /dev/null and b/assets/cache/cache-1534520775-89be828eb31b9db882cd65ef9cd46328.css.gzip differ diff --git a/assets/cache/cache-1534520947-946ea78c46fb39fd108c4b7d1802f24b.css.gzip b/assets/cache/cache-1534520947-946ea78c46fb39fd108c4b7d1802f24b.css.gzip new file mode 100644 index 0000000..79e9c14 Binary files /dev/null and b/assets/cache/cache-1534520947-946ea78c46fb39fd108c4b7d1802f24b.css.gzip differ diff --git a/assets/cache/cache-1534520947-950940b5891978317cea344ca57ddc5f.css.gzip b/assets/cache/cache-1534520947-950940b5891978317cea344ca57ddc5f.css.gzip new file mode 100644 index 0000000..79e9c14 Binary files /dev/null and b/assets/cache/cache-1534520947-950940b5891978317cea344ca57ddc5f.css.gzip differ diff --git a/assets/cache/cache-1534520947-df4e4d50309792db9b0dedc2ef3369ff.css.gzip b/assets/cache/cache-1534520947-df4e4d50309792db9b0dedc2ef3369ff.css.gzip new file mode 100644 index 0000000..79e9c14 Binary files /dev/null and b/assets/cache/cache-1534520947-df4e4d50309792db9b0dedc2ef3369ff.css.gzip differ diff --git a/assets/cache/cache-1534521423-b776084dfb27221e46be4401831790f2.css.gzip b/assets/cache/cache-1534521423-b776084dfb27221e46be4401831790f2.css.gzip new file mode 100644 index 0000000..e15dc29 Binary files /dev/null and b/assets/cache/cache-1534521423-b776084dfb27221e46be4401831790f2.css.gzip differ diff --git a/assets/cache/cache-1534528778-b776084dfb27221e46be4401831790f2.css.gzip b/assets/cache/cache-1534528778-b776084dfb27221e46be4401831790f2.css.gzip new file mode 100644 index 0000000..4d907be Binary files /dev/null and b/assets/cache/cache-1534528778-b776084dfb27221e46be4401831790f2.css.gzip differ diff --git a/assets/cache/cache-1534528934-b776084dfb27221e46be4401831790f2.css.gzip b/assets/cache/cache-1534528934-b776084dfb27221e46be4401831790f2.css.gzip new file mode 100644 index 0000000..f17fb37 Binary files /dev/null and b/assets/cache/cache-1534528934-b776084dfb27221e46be4401831790f2.css.gzip differ diff --git a/assets/cache/cache-1534529010-b776084dfb27221e46be4401831790f2.css.gzip b/assets/cache/cache-1534529010-b776084dfb27221e46be4401831790f2.css.gzip new file mode 100644 index 0000000..4d907be Binary files /dev/null and b/assets/cache/cache-1534529010-b776084dfb27221e46be4401831790f2.css.gzip differ diff --git a/assets/cache/cache-1534529162-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1534529162-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..8c1a269 Binary files /dev/null and b/assets/cache/cache-1534529162-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1534529162-b776084dfb27221e46be4401831790f2.css.gzip b/assets/cache/cache-1534529162-b776084dfb27221e46be4401831790f2.css.gzip new file mode 100644 index 0000000..d4fee9c Binary files /dev/null and b/assets/cache/cache-1534529162-b776084dfb27221e46be4401831790f2.css.gzip differ diff --git a/assets/cache/cache-1534529639-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1534529639-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..b6ca43e Binary files /dev/null and b/assets/cache/cache-1534529639-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1534529639-c1bd1c175138c803585a611dd71d9b42.css.gzip b/assets/cache/cache-1534529639-c1bd1c175138c803585a611dd71d9b42.css.gzip new file mode 100644 index 0000000..0a4391c Binary files /dev/null and b/assets/cache/cache-1534529639-c1bd1c175138c803585a611dd71d9b42.css.gzip differ diff --git a/assets/cache/cache-1534587401-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1534587401-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..cc31347 Binary files /dev/null and b/assets/cache/cache-1534587401-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1534587403-c1bd1c175138c803585a611dd71d9b42.css.gzip b/assets/cache/cache-1534587403-c1bd1c175138c803585a611dd71d9b42.css.gzip new file mode 100644 index 0000000..ad814a3 Binary files /dev/null and b/assets/cache/cache-1534587403-c1bd1c175138c803585a611dd71d9b42.css.gzip differ diff --git a/assets/cache/cache-1534588127-049347b5d071cdf340bc8b9696cd5e8b.javascript.gzip b/assets/cache/cache-1534588127-049347b5d071cdf340bc8b9696cd5e8b.javascript.gzip new file mode 100644 index 0000000..e70ca5a Binary files /dev/null and b/assets/cache/cache-1534588127-049347b5d071cdf340bc8b9696cd5e8b.javascript.gzip differ diff --git a/assets/cache/cache-1534588127-311b4cb7fa2d45e39dc4f3f1fd38e380.javascript.gzip b/assets/cache/cache-1534588127-311b4cb7fa2d45e39dc4f3f1fd38e380.javascript.gzip new file mode 100644 index 0000000..fd42fd6 Binary files /dev/null and b/assets/cache/cache-1534588127-311b4cb7fa2d45e39dc4f3f1fd38e380.javascript.gzip differ diff --git a/assets/cache/cache-1534588127-581a6c16390510a37c897b4909e439c8.javascript.gzip b/assets/cache/cache-1534588127-581a6c16390510a37c897b4909e439c8.javascript.gzip new file mode 100644 index 0000000..02e3e94 Binary files /dev/null and b/assets/cache/cache-1534588127-581a6c16390510a37c897b4909e439c8.javascript.gzip differ diff --git a/assets/cache/cache-1534588127-7ec10d79c5b513366ca854919ee0f686.javascript.gzip b/assets/cache/cache-1534588127-7ec10d79c5b513366ca854919ee0f686.javascript.gzip new file mode 100644 index 0000000..ee14b20 Binary files /dev/null and b/assets/cache/cache-1534588127-7ec10d79c5b513366ca854919ee0f686.javascript.gzip differ diff --git a/assets/cache/cache-1534588127-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534588127-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..6c5ca8a Binary files /dev/null and b/assets/cache/cache-1534588127-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534588127-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip b/assets/cache/cache-1534588127-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip new file mode 100644 index 0000000..d088e0f Binary files /dev/null and b/assets/cache/cache-1534588127-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip differ diff --git a/assets/cache/cache-1534588127-a7b08d08f52901c50a2866ff37a1565c.javascript.gzip b/assets/cache/cache-1534588127-a7b08d08f52901c50a2866ff37a1565c.javascript.gzip new file mode 100644 index 0000000..539e3a3 Binary files /dev/null and b/assets/cache/cache-1534588127-a7b08d08f52901c50a2866ff37a1565c.javascript.gzip differ diff --git a/assets/cache/cache-1534588127-c1b0e896c04fd545a5d21b721c703ab6.javascript.gzip b/assets/cache/cache-1534588127-c1b0e896c04fd545a5d21b721c703ab6.javascript.gzip new file mode 100644 index 0000000..5c7e5e2 Binary files /dev/null and b/assets/cache/cache-1534588127-c1b0e896c04fd545a5d21b721c703ab6.javascript.gzip differ diff --git a/assets/cache/cache-1534588127-deb0f010407477413cc6d70e9d02b488.javascript.gzip b/assets/cache/cache-1534588127-deb0f010407477413cc6d70e9d02b488.javascript.gzip new file mode 100644 index 0000000..8f2f951 Binary files /dev/null and b/assets/cache/cache-1534588127-deb0f010407477413cc6d70e9d02b488.javascript.gzip differ diff --git a/assets/cache/cache-1534588555-ea39118353bed28cac4ac17e68519dcb.css.gzip b/assets/cache/cache-1534588555-ea39118353bed28cac4ac17e68519dcb.css.gzip new file mode 100644 index 0000000..9b660f2 Binary files /dev/null and b/assets/cache/cache-1534588555-ea39118353bed28cac4ac17e68519dcb.css.gzip differ diff --git a/assets/cache/cache-1534588844-ea39118353bed28cac4ac17e68519dcb.css.gzip b/assets/cache/cache-1534588844-ea39118353bed28cac4ac17e68519dcb.css.gzip new file mode 100644 index 0000000..60a9cd0 Binary files /dev/null and b/assets/cache/cache-1534588844-ea39118353bed28cac4ac17e68519dcb.css.gzip differ diff --git a/assets/cache/cache-1534588987-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1534588987-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..3814136 Binary files /dev/null and b/assets/cache/cache-1534588987-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1534588987-b776084dfb27221e46be4401831790f2.css.gzip b/assets/cache/cache-1534588987-b776084dfb27221e46be4401831790f2.css.gzip new file mode 100644 index 0000000..3174d81 Binary files /dev/null and b/assets/cache/cache-1534588987-b776084dfb27221e46be4401831790f2.css.gzip differ diff --git a/assets/cache/cache-1534588987-ea39118353bed28cac4ac17e68519dcb.css.gzip b/assets/cache/cache-1534588987-ea39118353bed28cac4ac17e68519dcb.css.gzip new file mode 100644 index 0000000..f73b393 Binary files /dev/null and b/assets/cache/cache-1534588987-ea39118353bed28cac4ac17e68519dcb.css.gzip differ diff --git a/assets/cache/cache-1534588991-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534588991-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..b0a4c5e Binary files /dev/null and b/assets/cache/cache-1534588991-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534589038-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534589038-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..ebc838d Binary files /dev/null and b/assets/cache/cache-1534589038-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534589062-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534589062-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..c115288 Binary files /dev/null and b/assets/cache/cache-1534589062-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534589116-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534589116-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..8908252 Binary files /dev/null and b/assets/cache/cache-1534589116-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534589844-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534589844-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..7368bfd Binary files /dev/null and b/assets/cache/cache-1534589844-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534589887-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534589887-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..cb73776 Binary files /dev/null and b/assets/cache/cache-1534589887-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534589941-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534589941-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..c3c27bb Binary files /dev/null and b/assets/cache/cache-1534589941-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534589970-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534589970-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..e1946e1 Binary files /dev/null and b/assets/cache/cache-1534589970-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534589986-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534589986-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..b7dc9b4 Binary files /dev/null and b/assets/cache/cache-1534589986-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534590056-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534590056-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..85efc25 Binary files /dev/null and b/assets/cache/cache-1534590056-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534590184-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534590184-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..cbcb946 Binary files /dev/null and b/assets/cache/cache-1534590184-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534590232-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534590232-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..12485e4 Binary files /dev/null and b/assets/cache/cache-1534590232-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534590259-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534590259-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..9555cd6 Binary files /dev/null and b/assets/cache/cache-1534590259-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534590266-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534590266-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..1b1dd6c Binary files /dev/null and b/assets/cache/cache-1534590266-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534590340-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534590340-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..30341d5 Binary files /dev/null and b/assets/cache/cache-1534590340-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534590366-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534590366-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..dd481e9 Binary files /dev/null and b/assets/cache/cache-1534590366-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534590389-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534590389-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..6f2b4d7 Binary files /dev/null and b/assets/cache/cache-1534590389-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534590780-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534590780-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..d6f0670 Binary files /dev/null and b/assets/cache/cache-1534590780-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534591206-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534591206-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..d4a3c0a Binary files /dev/null and b/assets/cache/cache-1534591206-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534591248-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534591248-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..58beecb Binary files /dev/null and b/assets/cache/cache-1534591248-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534591622-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534591622-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..7951a0d Binary files /dev/null and b/assets/cache/cache-1534591622-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534591671-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534591671-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..087cce5 Binary files /dev/null and b/assets/cache/cache-1534591671-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534591696-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534591696-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..e210227 Binary files /dev/null and b/assets/cache/cache-1534591696-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534591707-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534591707-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..e038bf9 Binary files /dev/null and b/assets/cache/cache-1534591707-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534591713-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534591713-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..2c4a595 Binary files /dev/null and b/assets/cache/cache-1534591713-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534591747-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534591747-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..ca0fa01 Binary files /dev/null and b/assets/cache/cache-1534591747-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534592106-8e056e097ea370b6d1dadce3664cd9c6.css.gzip b/assets/cache/cache-1534592106-8e056e097ea370b6d1dadce3664cd9c6.css.gzip new file mode 100644 index 0000000..f131a48 Binary files /dev/null and b/assets/cache/cache-1534592106-8e056e097ea370b6d1dadce3664cd9c6.css.gzip differ diff --git a/assets/cache/cache-1534592541-8e056e097ea370b6d1dadce3664cd9c6.css.gzip b/assets/cache/cache-1534592541-8e056e097ea370b6d1dadce3664cd9c6.css.gzip new file mode 100644 index 0000000..dce94f0 Binary files /dev/null and b/assets/cache/cache-1534592541-8e056e097ea370b6d1dadce3664cd9c6.css.gzip differ diff --git a/assets/cache/cache-1534592647-9a69208371738ab419855bc932b89182.css.gzip b/assets/cache/cache-1534592647-9a69208371738ab419855bc932b89182.css.gzip new file mode 100644 index 0000000..6c954fc Binary files /dev/null and b/assets/cache/cache-1534592647-9a69208371738ab419855bc932b89182.css.gzip differ diff --git a/assets/cache/cache-1534593463-9a69208371738ab419855bc932b89182.css.gzip b/assets/cache/cache-1534593463-9a69208371738ab419855bc932b89182.css.gzip new file mode 100644 index 0000000..27a74a4 Binary files /dev/null and b/assets/cache/cache-1534593463-9a69208371738ab419855bc932b89182.css.gzip differ diff --git a/assets/cache/cache-1534594405-9a69208371738ab419855bc932b89182.css.gzip b/assets/cache/cache-1534594405-9a69208371738ab419855bc932b89182.css.gzip new file mode 100644 index 0000000..cf2ad8b Binary files /dev/null and b/assets/cache/cache-1534594405-9a69208371738ab419855bc932b89182.css.gzip differ diff --git a/assets/cache/cache-1534594479-9a69208371738ab419855bc932b89182.css.gzip b/assets/cache/cache-1534594479-9a69208371738ab419855bc932b89182.css.gzip new file mode 100644 index 0000000..ed75f7e Binary files /dev/null and b/assets/cache/cache-1534594479-9a69208371738ab419855bc932b89182.css.gzip differ diff --git a/assets/cache/cache-1534594956-9a69208371738ab419855bc932b89182.css.gzip b/assets/cache/cache-1534594956-9a69208371738ab419855bc932b89182.css.gzip new file mode 100644 index 0000000..e987502 Binary files /dev/null and b/assets/cache/cache-1534594956-9a69208371738ab419855bc932b89182.css.gzip differ diff --git a/assets/cache/cache-1534595856-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1534595856-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..64a28da Binary files /dev/null and b/assets/cache/cache-1534595856-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1534596174-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1534596174-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..c947b33 Binary files /dev/null and b/assets/cache/cache-1534596174-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1534596174-9a69208371738ab419855bc932b89182.css.gzip b/assets/cache/cache-1534596174-9a69208371738ab419855bc932b89182.css.gzip new file mode 100644 index 0000000..ebc1e2b Binary files /dev/null and b/assets/cache/cache-1534596174-9a69208371738ab419855bc932b89182.css.gzip differ diff --git a/assets/cache/cache-1534596174-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1534596174-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..9c7b40c Binary files /dev/null and b/assets/cache/cache-1534596174-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1534602210-9a69208371738ab419855bc932b89182.css.gzip b/assets/cache/cache-1534602210-9a69208371738ab419855bc932b89182.css.gzip new file mode 100644 index 0000000..d9f4b61 Binary files /dev/null and b/assets/cache/cache-1534602210-9a69208371738ab419855bc932b89182.css.gzip differ diff --git a/assets/cache/cache-1534602414-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1534602414-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..ed69708 Binary files /dev/null and b/assets/cache/cache-1534602414-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1534602414-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534602414-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..58b2266 Binary files /dev/null and b/assets/cache/cache-1534602414-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534602414-9a69208371738ab419855bc932b89182.css.gzip b/assets/cache/cache-1534602414-9a69208371738ab419855bc932b89182.css.gzip new file mode 100644 index 0000000..93f8020 Binary files /dev/null and b/assets/cache/cache-1534602414-9a69208371738ab419855bc932b89182.css.gzip differ diff --git a/assets/cache/cache-1534602414-a367b92f1f155dbe8a34d781647a5e56.css.gzip b/assets/cache/cache-1534602414-a367b92f1f155dbe8a34d781647a5e56.css.gzip new file mode 100644 index 0000000..6016e76 Binary files /dev/null and b/assets/cache/cache-1534602414-a367b92f1f155dbe8a34d781647a5e56.css.gzip differ diff --git a/assets/cache/cache-1534602414-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1534602414-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..138c721 Binary files /dev/null and b/assets/cache/cache-1534602414-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1534604064-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip b/assets/cache/cache-1534604064-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip new file mode 100644 index 0000000..1f04995 Binary files /dev/null and b/assets/cache/cache-1534604064-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip differ diff --git a/assets/cache/cache-1534621818-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip b/assets/cache/cache-1534621818-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip new file mode 100644 index 0000000..164b998 Binary files /dev/null and b/assets/cache/cache-1534621818-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip differ diff --git a/assets/cache/cache-1534622005-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip b/assets/cache/cache-1534622005-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip new file mode 100644 index 0000000..b2d6687 Binary files /dev/null and b/assets/cache/cache-1534622005-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip differ diff --git a/assets/cache/cache-1534622037-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip b/assets/cache/cache-1534622037-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip new file mode 100644 index 0000000..d72a8cf Binary files /dev/null and b/assets/cache/cache-1534622037-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip differ diff --git a/assets/cache/cache-1534622348-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip b/assets/cache/cache-1534622348-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip new file mode 100644 index 0000000..4fb499b Binary files /dev/null and b/assets/cache/cache-1534622348-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip differ diff --git a/assets/cache/cache-1534622541-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip b/assets/cache/cache-1534622541-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip new file mode 100644 index 0000000..fed409a Binary files /dev/null and b/assets/cache/cache-1534622541-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip differ diff --git a/assets/cache/cache-1534672625-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip b/assets/cache/cache-1534672625-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip new file mode 100644 index 0000000..e1a39cc Binary files /dev/null and b/assets/cache/cache-1534672625-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip differ diff --git a/assets/cache/cache-1534672634-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip b/assets/cache/cache-1534672634-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip new file mode 100644 index 0000000..0cb8b35 Binary files /dev/null and b/assets/cache/cache-1534672634-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip differ diff --git a/assets/cache/cache-1534672650-01b2fb24003e5cde06115868c3d3fc63.javascript.gzip b/assets/cache/cache-1534672650-01b2fb24003e5cde06115868c3d3fc63.javascript.gzip new file mode 100644 index 0000000..bcf3a85 Binary files /dev/null and b/assets/cache/cache-1534672650-01b2fb24003e5cde06115868c3d3fc63.javascript.gzip differ diff --git a/assets/cache/cache-1534672650-2493468535f79dae27c3228f86b5a76f.javascript.gzip b/assets/cache/cache-1534672650-2493468535f79dae27c3228f86b5a76f.javascript.gzip new file mode 100644 index 0000000..eb34b6e Binary files /dev/null and b/assets/cache/cache-1534672650-2493468535f79dae27c3228f86b5a76f.javascript.gzip differ diff --git a/assets/cache/cache-1534672650-3a43e98462743f56bfc6ffd0a4930e68.javascript.gzip b/assets/cache/cache-1534672650-3a43e98462743f56bfc6ffd0a4930e68.javascript.gzip new file mode 100644 index 0000000..f7e5fd4 Binary files /dev/null and b/assets/cache/cache-1534672650-3a43e98462743f56bfc6ffd0a4930e68.javascript.gzip differ diff --git a/assets/cache/cache-1534672650-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip b/assets/cache/cache-1534672650-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip new file mode 100644 index 0000000..99856f8 Binary files /dev/null and b/assets/cache/cache-1534672650-3c8d09db0eecf940ba1c3379e4f2712d.javascript.gzip differ diff --git a/assets/cache/cache-1534672650-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1534672650-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..1edcaf9 Binary files /dev/null and b/assets/cache/cache-1534672650-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1534672650-50c003b83c73171e4f99068ecacb95ce.javascript.gzip b/assets/cache/cache-1534672650-50c003b83c73171e4f99068ecacb95ce.javascript.gzip new file mode 100644 index 0000000..b3c50c9 Binary files /dev/null and b/assets/cache/cache-1534672650-50c003b83c73171e4f99068ecacb95ce.javascript.gzip differ diff --git a/assets/cache/cache-1534672650-6129f1f123fb62a1507f677cdee8d7e6.javascript.gzip b/assets/cache/cache-1534672650-6129f1f123fb62a1507f677cdee8d7e6.javascript.gzip new file mode 100644 index 0000000..530d851 Binary files /dev/null and b/assets/cache/cache-1534672650-6129f1f123fb62a1507f677cdee8d7e6.javascript.gzip differ diff --git a/assets/cache/cache-1534672650-63a278a46201f5995b1d9e8b3ea381ec.javascript.gzip b/assets/cache/cache-1534672650-63a278a46201f5995b1d9e8b3ea381ec.javascript.gzip new file mode 100644 index 0000000..2b9d6d3 Binary files /dev/null and b/assets/cache/cache-1534672650-63a278a46201f5995b1d9e8b3ea381ec.javascript.gzip differ diff --git a/assets/cache/cache-1534672650-70ae27ec137016258a73934e9c19f123.javascript.gzip b/assets/cache/cache-1534672650-70ae27ec137016258a73934e9c19f123.javascript.gzip new file mode 100644 index 0000000..10536f0 Binary files /dev/null and b/assets/cache/cache-1534672650-70ae27ec137016258a73934e9c19f123.javascript.gzip differ diff --git a/assets/cache/cache-1534672650-b2a0e69b71a7b3c3a8cc20b8bad08fa6.javascript.gzip b/assets/cache/cache-1534672650-b2a0e69b71a7b3c3a8cc20b8bad08fa6.javascript.gzip new file mode 100644 index 0000000..4b9f5ed Binary files /dev/null and b/assets/cache/cache-1534672650-b2a0e69b71a7b3c3a8cc20b8bad08fa6.javascript.gzip differ diff --git a/assets/cache/cache-1534672650-bff1d2ed5ec05b491bd946c0bf5db431.javascript.gzip b/assets/cache/cache-1534672650-bff1d2ed5ec05b491bd946c0bf5db431.javascript.gzip new file mode 100644 index 0000000..38a5105 Binary files /dev/null and b/assets/cache/cache-1534672650-bff1d2ed5ec05b491bd946c0bf5db431.javascript.gzip differ diff --git a/assets/cache/cache-1534672650-c1527d10a83781c07ac9e1963dffe69c.javascript.gzip b/assets/cache/cache-1534672650-c1527d10a83781c07ac9e1963dffe69c.javascript.gzip new file mode 100644 index 0000000..43f72de Binary files /dev/null and b/assets/cache/cache-1534672650-c1527d10a83781c07ac9e1963dffe69c.javascript.gzip differ diff --git a/assets/cache/cache-1534672650-d11e8fb902a1b54b43104b1e6b7493f1.javascript.gzip b/assets/cache/cache-1534672650-d11e8fb902a1b54b43104b1e6b7493f1.javascript.gzip new file mode 100644 index 0000000..b16566b Binary files /dev/null and b/assets/cache/cache-1534672650-d11e8fb902a1b54b43104b1e6b7493f1.javascript.gzip differ diff --git a/assets/cache/cache-1534672650-e3e8d76002aa6f3783bd9662c0dfea13.javascript.gzip b/assets/cache/cache-1534672650-e3e8d76002aa6f3783bd9662c0dfea13.javascript.gzip new file mode 100644 index 0000000..c5ae4e2 Binary files /dev/null and b/assets/cache/cache-1534672650-e3e8d76002aa6f3783bd9662c0dfea13.javascript.gzip differ diff --git a/assets/cache/cache-1534672650-efa5a9677a31ac8f625f5790bc412397.javascript.gzip b/assets/cache/cache-1534672650-efa5a9677a31ac8f625f5790bc412397.javascript.gzip new file mode 100644 index 0000000..99856f8 Binary files /dev/null and b/assets/cache/cache-1534672650-efa5a9677a31ac8f625f5790bc412397.javascript.gzip differ diff --git a/assets/cache/cache-1534676349-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534676349-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..adad826 Binary files /dev/null and b/assets/cache/cache-1534676349-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534676474-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534676474-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..fd0cde7 Binary files /dev/null and b/assets/cache/cache-1534676474-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534676721-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534676721-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..73f3a0d Binary files /dev/null and b/assets/cache/cache-1534676721-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534676830-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534676830-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..3675d73 Binary files /dev/null and b/assets/cache/cache-1534676830-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534676895-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534676895-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..bb2836b Binary files /dev/null and b/assets/cache/cache-1534676895-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534676941-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534676941-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..a6a4740 Binary files /dev/null and b/assets/cache/cache-1534676941-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534677137-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534677137-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..8fa3a95 Binary files /dev/null and b/assets/cache/cache-1534677137-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534677426-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534677426-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..6076d33 Binary files /dev/null and b/assets/cache/cache-1534677426-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534677554-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534677554-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..bfba921 Binary files /dev/null and b/assets/cache/cache-1534677554-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534677572-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534677572-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..f4dee1b Binary files /dev/null and b/assets/cache/cache-1534677572-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534677617-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534677617-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..2adf999 Binary files /dev/null and b/assets/cache/cache-1534677617-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534677627-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534677627-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..588aa16 Binary files /dev/null and b/assets/cache/cache-1534677627-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534677653-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534677653-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..4da0f61 Binary files /dev/null and b/assets/cache/cache-1534677653-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534677739-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534677739-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..e1820c9 Binary files /dev/null and b/assets/cache/cache-1534677739-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534677780-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534677780-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..7e007b9 Binary files /dev/null and b/assets/cache/cache-1534677780-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534677818-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534677818-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..d31c555 Binary files /dev/null and b/assets/cache/cache-1534677818-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534677922-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534677922-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..a05283e Binary files /dev/null and b/assets/cache/cache-1534677922-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534677970-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534677970-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..94d3bd7 Binary files /dev/null and b/assets/cache/cache-1534677970-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534677998-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534677998-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..a05283e Binary files /dev/null and b/assets/cache/cache-1534677998-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678110-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678110-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..813eaed Binary files /dev/null and b/assets/cache/cache-1534678110-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678276-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678276-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..f2228c7 Binary files /dev/null and b/assets/cache/cache-1534678276-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678313-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678313-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..4f24dc6 Binary files /dev/null and b/assets/cache/cache-1534678313-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678424-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678424-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..da8f179 Binary files /dev/null and b/assets/cache/cache-1534678424-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678445-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678445-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..de8293d Binary files /dev/null and b/assets/cache/cache-1534678445-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678475-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678475-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..bed495b Binary files /dev/null and b/assets/cache/cache-1534678475-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678482-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678482-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..ee1bbb4 Binary files /dev/null and b/assets/cache/cache-1534678482-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678588-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678588-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..322218b Binary files /dev/null and b/assets/cache/cache-1534678588-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678639-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678639-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..2ef158e Binary files /dev/null and b/assets/cache/cache-1534678639-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678705-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678705-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..19e7ccc Binary files /dev/null and b/assets/cache/cache-1534678705-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678714-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678714-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..b5c539b Binary files /dev/null and b/assets/cache/cache-1534678714-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678739-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678739-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..7709e65 Binary files /dev/null and b/assets/cache/cache-1534678739-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678756-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678756-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..d68f05c Binary files /dev/null and b/assets/cache/cache-1534678756-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678806-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678806-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..98ea232 Binary files /dev/null and b/assets/cache/cache-1534678806-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678879-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678879-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..7d6ea3b Binary files /dev/null and b/assets/cache/cache-1534678879-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534678964-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534678964-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..407baea Binary files /dev/null and b/assets/cache/cache-1534678964-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534679078-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534679078-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..6399b4b Binary files /dev/null and b/assets/cache/cache-1534679078-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534679194-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534679194-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..43537dd Binary files /dev/null and b/assets/cache/cache-1534679194-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534679219-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534679219-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..10b19d1 Binary files /dev/null and b/assets/cache/cache-1534679219-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534679228-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534679228-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..32e649e Binary files /dev/null and b/assets/cache/cache-1534679228-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534679245-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534679245-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..217e0d5 Binary files /dev/null and b/assets/cache/cache-1534679245-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534679278-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534679278-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..70ac696 Binary files /dev/null and b/assets/cache/cache-1534679278-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534679558-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534679558-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..921b8f1 Binary files /dev/null and b/assets/cache/cache-1534679558-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534679566-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534679566-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..1627924 Binary files /dev/null and b/assets/cache/cache-1534679566-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534679718-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534679718-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..02e2b94 Binary files /dev/null and b/assets/cache/cache-1534679718-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534679757-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534679757-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..96e569c Binary files /dev/null and b/assets/cache/cache-1534679757-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534682984-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534682984-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..3afd76e Binary files /dev/null and b/assets/cache/cache-1534682984-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534683642-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534683642-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..c9f6141 Binary files /dev/null and b/assets/cache/cache-1534683642-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534684247-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534684247-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..c89292a Binary files /dev/null and b/assets/cache/cache-1534684247-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534684520-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534684520-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..123c499 Binary files /dev/null and b/assets/cache/cache-1534684520-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534684536-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534684536-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..95b4113 Binary files /dev/null and b/assets/cache/cache-1534684536-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534684667-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534684667-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..2e3f65d Binary files /dev/null and b/assets/cache/cache-1534684667-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534684971-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534684971-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..1c46597 Binary files /dev/null and b/assets/cache/cache-1534684971-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534684981-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534684981-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..8973825 Binary files /dev/null and b/assets/cache/cache-1534684981-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534685279-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534685279-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..4fc19ff Binary files /dev/null and b/assets/cache/cache-1534685279-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534689013-311b4cb7fa2d45e39dc4f3f1fd38e380.javascript.gzip b/assets/cache/cache-1534689013-311b4cb7fa2d45e39dc4f3f1fd38e380.javascript.gzip new file mode 100644 index 0000000..19ea74d Binary files /dev/null and b/assets/cache/cache-1534689013-311b4cb7fa2d45e39dc4f3f1fd38e380.javascript.gzip differ diff --git a/assets/cache/cache-1534689013-4a01e31d25a62d93db01045a46a7a0dd.javascript.gzip b/assets/cache/cache-1534689013-4a01e31d25a62d93db01045a46a7a0dd.javascript.gzip new file mode 100644 index 0000000..98f3050 Binary files /dev/null and b/assets/cache/cache-1534689013-4a01e31d25a62d93db01045a46a7a0dd.javascript.gzip differ diff --git a/assets/cache/cache-1534689013-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534689013-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..1cfdab2 Binary files /dev/null and b/assets/cache/cache-1534689013-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534689013-c1b0e896c04fd545a5d21b721c703ab6.javascript.gzip b/assets/cache/cache-1534689013-c1b0e896c04fd545a5d21b721c703ab6.javascript.gzip new file mode 100644 index 0000000..7de61e0 Binary files /dev/null and b/assets/cache/cache-1534689013-c1b0e896c04fd545a5d21b721c703ab6.javascript.gzip differ diff --git a/assets/cache/cache-1534696158-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1534696158-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..e15d8f9 Binary files /dev/null and b/assets/cache/cache-1534696158-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1534696171-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1534696171-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..ed6d003 Binary files /dev/null and b/assets/cache/cache-1534696171-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1534696198-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1534696198-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..bce8aa6 Binary files /dev/null and b/assets/cache/cache-1534696198-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1534696239-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534696239-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..86d4769 Binary files /dev/null and b/assets/cache/cache-1534696239-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534696239-a367b92f1f155dbe8a34d781647a5e56.css.gzip b/assets/cache/cache-1534696239-a367b92f1f155dbe8a34d781647a5e56.css.gzip new file mode 100644 index 0000000..ef93575 Binary files /dev/null and b/assets/cache/cache-1534696239-a367b92f1f155dbe8a34d781647a5e56.css.gzip differ diff --git a/assets/cache/cache-1534696239-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1534696239-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..6729cef Binary files /dev/null and b/assets/cache/cache-1534696239-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1534698128-4a01e31d25a62d93db01045a46a7a0dd.javascript.gzip b/assets/cache/cache-1534698128-4a01e31d25a62d93db01045a46a7a0dd.javascript.gzip new file mode 100644 index 0000000..d105d6c Binary files /dev/null and b/assets/cache/cache-1534698128-4a01e31d25a62d93db01045a46a7a0dd.javascript.gzip differ diff --git a/assets/cache/cache-1534698128-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534698128-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..6d4c8e6 Binary files /dev/null and b/assets/cache/cache-1534698128-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534698128-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip b/assets/cache/cache-1534698128-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip new file mode 100644 index 0000000..4c35d69 Binary files /dev/null and b/assets/cache/cache-1534698128-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip differ diff --git a/assets/cache/cache-1534764971-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534764971-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..a759bd2 Binary files /dev/null and b/assets/cache/cache-1534764971-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534765009-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534765009-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..a8ac244 Binary files /dev/null and b/assets/cache/cache-1534765009-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534765256-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534765256-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..dcf13d6 Binary files /dev/null and b/assets/cache/cache-1534765256-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-049347b5d071cdf340bc8b9696cd5e8b.javascript.gzip b/assets/cache/cache-1534765288-049347b5d071cdf340bc8b9696cd5e8b.javascript.gzip new file mode 100644 index 0000000..26d8477 Binary files /dev/null and b/assets/cache/cache-1534765288-049347b5d071cdf340bc8b9696cd5e8b.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-26b1b85cd46b4fb518ac4cea1f8a9391.javascript.gzip b/assets/cache/cache-1534765288-26b1b85cd46b4fb518ac4cea1f8a9391.javascript.gzip new file mode 100644 index 0000000..d950f5f Binary files /dev/null and b/assets/cache/cache-1534765288-26b1b85cd46b4fb518ac4cea1f8a9391.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1534765288-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..ad8d20a Binary files /dev/null and b/assets/cache/cache-1534765288-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-311b4cb7fa2d45e39dc4f3f1fd38e380.javascript.gzip b/assets/cache/cache-1534765288-311b4cb7fa2d45e39dc4f3f1fd38e380.javascript.gzip new file mode 100644 index 0000000..6eec4a0 Binary files /dev/null and b/assets/cache/cache-1534765288-311b4cb7fa2d45e39dc4f3f1fd38e380.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-3a657983ac5b760373f4402f078967b7.javascript.gzip b/assets/cache/cache-1534765288-3a657983ac5b760373f4402f078967b7.javascript.gzip new file mode 100644 index 0000000..c6b8c01 Binary files /dev/null and b/assets/cache/cache-1534765288-3a657983ac5b760373f4402f078967b7.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-4a01e31d25a62d93db01045a46a7a0dd.javascript.gzip b/assets/cache/cache-1534765288-4a01e31d25a62d93db01045a46a7a0dd.javascript.gzip new file mode 100644 index 0000000..e689f00 Binary files /dev/null and b/assets/cache/cache-1534765288-4a01e31d25a62d93db01045a46a7a0dd.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-581a6c16390510a37c897b4909e439c8.javascript.gzip b/assets/cache/cache-1534765288-581a6c16390510a37c897b4909e439c8.javascript.gzip new file mode 100644 index 0000000..b5ca5e8 Binary files /dev/null and b/assets/cache/cache-1534765288-581a6c16390510a37c897b4909e439c8.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-5f1d83dc0efc3809f8cc13088ee4d7cd.javascript.gzip b/assets/cache/cache-1534765288-5f1d83dc0efc3809f8cc13088ee4d7cd.javascript.gzip new file mode 100644 index 0000000..c6b8c01 Binary files /dev/null and b/assets/cache/cache-1534765288-5f1d83dc0efc3809f8cc13088ee4d7cd.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-64d013c8d0fd9b3d11c7ca48bcb34d59.javascript.gzip b/assets/cache/cache-1534765288-64d013c8d0fd9b3d11c7ca48bcb34d59.javascript.gzip new file mode 100644 index 0000000..f0ba294 Binary files /dev/null and b/assets/cache/cache-1534765288-64d013c8d0fd9b3d11c7ca48bcb34d59.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-737334a4413af73731769267522c0c65.javascript.gzip b/assets/cache/cache-1534765288-737334a4413af73731769267522c0c65.javascript.gzip new file mode 100644 index 0000000..d05cbef Binary files /dev/null and b/assets/cache/cache-1534765288-737334a4413af73731769267522c0c65.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-7a9076d6d94e62c13d641aa71f19ae8e.javascript.gzip b/assets/cache/cache-1534765288-7a9076d6d94e62c13d641aa71f19ae8e.javascript.gzip new file mode 100644 index 0000000..aa252c2 Binary files /dev/null and b/assets/cache/cache-1534765288-7a9076d6d94e62c13d641aa71f19ae8e.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-7ec10d79c5b513366ca854919ee0f686.javascript.gzip b/assets/cache/cache-1534765288-7ec10d79c5b513366ca854919ee0f686.javascript.gzip new file mode 100644 index 0000000..91b096b Binary files /dev/null and b/assets/cache/cache-1534765288-7ec10d79c5b513366ca854919ee0f686.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip b/assets/cache/cache-1534765288-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip new file mode 100644 index 0000000..ad8d20a Binary files /dev/null and b/assets/cache/cache-1534765288-86c306cd1179f8ab8c1dd6f7773ea4c4.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip b/assets/cache/cache-1534765288-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip new file mode 100644 index 0000000..5569440 Binary files /dev/null and b/assets/cache/cache-1534765288-8e0acf9afa8f76bb262737263e971ccc.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-91f9fdb805d757a76c41c6d243d59798.javascript.gzip b/assets/cache/cache-1534765288-91f9fdb805d757a76c41c6d243d59798.javascript.gzip new file mode 100644 index 0000000..d05cbef Binary files /dev/null and b/assets/cache/cache-1534765288-91f9fdb805d757a76c41c6d243d59798.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-9a1355a2197033a6bb4ba66836b87de0.javascript.gzip b/assets/cache/cache-1534765288-9a1355a2197033a6bb4ba66836b87de0.javascript.gzip new file mode 100644 index 0000000..025edf3 Binary files /dev/null and b/assets/cache/cache-1534765288-9a1355a2197033a6bb4ba66836b87de0.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-a7b08d08f52901c50a2866ff37a1565c.javascript.gzip b/assets/cache/cache-1534765288-a7b08d08f52901c50a2866ff37a1565c.javascript.gzip new file mode 100644 index 0000000..3055547 Binary files /dev/null and b/assets/cache/cache-1534765288-a7b08d08f52901c50a2866ff37a1565c.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-c1b0e896c04fd545a5d21b721c703ab6.javascript.gzip b/assets/cache/cache-1534765288-c1b0e896c04fd545a5d21b721c703ab6.javascript.gzip new file mode 100644 index 0000000..f0ba294 Binary files /dev/null and b/assets/cache/cache-1534765288-c1b0e896c04fd545a5d21b721c703ab6.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1534765288-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..5569440 Binary files /dev/null and b/assets/cache/cache-1534765288-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip b/assets/cache/cache-1534765288-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip new file mode 100644 index 0000000..14fd0d3 Binary files /dev/null and b/assets/cache/cache-1534765288-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-deb0f010407477413cc6d70e9d02b488.javascript.gzip b/assets/cache/cache-1534765288-deb0f010407477413cc6d70e9d02b488.javascript.gzip new file mode 100644 index 0000000..14fd0d3 Binary files /dev/null and b/assets/cache/cache-1534765288-deb0f010407477413cc6d70e9d02b488.javascript.gzip differ diff --git a/assets/cache/cache-1534765288-e56c8fbf37b0fbec2834c048397fb2af.javascript.gzip b/assets/cache/cache-1534765288-e56c8fbf37b0fbec2834c048397fb2af.javascript.gzip new file mode 100644 index 0000000..31cd01c Binary files /dev/null and b/assets/cache/cache-1534765288-e56c8fbf37b0fbec2834c048397fb2af.javascript.gzip differ diff --git a/assets/cache/cache-1534765514-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534765514-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..8d6c8d7 Binary files /dev/null and b/assets/cache/cache-1534765514-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534765541-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534765541-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..73ef365 Binary files /dev/null and b/assets/cache/cache-1534765541-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534765618-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534765618-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..1aac4f0 Binary files /dev/null and b/assets/cache/cache-1534765618-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534765656-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534765656-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..bab126e Binary files /dev/null and b/assets/cache/cache-1534765656-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534765713-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534765713-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..c6726ef Binary files /dev/null and b/assets/cache/cache-1534765713-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534765769-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534765769-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..d0e8fac Binary files /dev/null and b/assets/cache/cache-1534765769-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534765865-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534765865-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..bbf1acd Binary files /dev/null and b/assets/cache/cache-1534765865-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534766060-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534766060-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..21643c2 Binary files /dev/null and b/assets/cache/cache-1534766060-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534766101-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534766101-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..6db7d7a Binary files /dev/null and b/assets/cache/cache-1534766101-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534766131-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534766131-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..48c7bd6 Binary files /dev/null and b/assets/cache/cache-1534766131-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534766192-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534766192-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..1329996 Binary files /dev/null and b/assets/cache/cache-1534766192-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534768408-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534768408-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..145baf5 Binary files /dev/null and b/assets/cache/cache-1534768408-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534768859-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534768859-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..f83fb52 Binary files /dev/null and b/assets/cache/cache-1534768859-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534768991-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1534768991-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..a842e99 Binary files /dev/null and b/assets/cache/cache-1534768991-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1534768991-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534768991-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..ba66a3b Binary files /dev/null and b/assets/cache/cache-1534768991-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534768991-8e056e097ea370b6d1dadce3664cd9c6.css.gzip b/assets/cache/cache-1534768991-8e056e097ea370b6d1dadce3664cd9c6.css.gzip new file mode 100644 index 0000000..7ff047b Binary files /dev/null and b/assets/cache/cache-1534768991-8e056e097ea370b6d1dadce3664cd9c6.css.gzip differ diff --git a/assets/cache/cache-1534768991-9a69208371738ab419855bc932b89182.css.gzip b/assets/cache/cache-1534768991-9a69208371738ab419855bc932b89182.css.gzip new file mode 100644 index 0000000..6d34162 Binary files /dev/null and b/assets/cache/cache-1534768991-9a69208371738ab419855bc932b89182.css.gzip differ diff --git a/assets/cache/cache-1534768991-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip b/assets/cache/cache-1534768991-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip new file mode 100644 index 0000000..e6300c4 Binary files /dev/null and b/assets/cache/cache-1534768991-9aae4f67455b2243c95abc8f63bdd0f2.css.gzip differ diff --git a/assets/cache/cache-1534768991-a367b92f1f155dbe8a34d781647a5e56.css.gzip b/assets/cache/cache-1534768991-a367b92f1f155dbe8a34d781647a5e56.css.gzip new file mode 100644 index 0000000..0e827f1 Binary files /dev/null and b/assets/cache/cache-1534768991-a367b92f1f155dbe8a34d781647a5e56.css.gzip differ diff --git a/assets/cache/cache-1534768991-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1534768991-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..f6ba0d3 Binary files /dev/null and b/assets/cache/cache-1534768991-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1534768991-c1bd1c175138c803585a611dd71d9b42.css.gzip b/assets/cache/cache-1534768991-c1bd1c175138c803585a611dd71d9b42.css.gzip new file mode 100644 index 0000000..8c477a3 Binary files /dev/null and b/assets/cache/cache-1534768991-c1bd1c175138c803585a611dd71d9b42.css.gzip differ diff --git a/assets/cache/cache-1534775222-4a01e31d25a62d93db01045a46a7a0dd.javascript.gzip b/assets/cache/cache-1534775222-4a01e31d25a62d93db01045a46a7a0dd.javascript.gzip new file mode 100644 index 0000000..6dc275e Binary files /dev/null and b/assets/cache/cache-1534775222-4a01e31d25a62d93db01045a46a7a0dd.javascript.gzip differ diff --git a/assets/cache/cache-1534776208-4a01e31d25a62d93db01045a46a7a0dd.javascript.gzip b/assets/cache/cache-1534776208-4a01e31d25a62d93db01045a46a7a0dd.javascript.gzip new file mode 100644 index 0000000..3c4fb3f Binary files /dev/null and b/assets/cache/cache-1534776208-4a01e31d25a62d93db01045a46a7a0dd.javascript.gzip differ diff --git a/assets/cache/cache-1534776761-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1534776761-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..1ddc06a Binary files /dev/null and b/assets/cache/cache-1534776761-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1534794074-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534794074-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..4b9f100 Binary files /dev/null and b/assets/cache/cache-1534794074-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534794931-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534794931-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..3845d70 Binary files /dev/null and b/assets/cache/cache-1534794931-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534795680-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534795680-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..cdd4e5f Binary files /dev/null and b/assets/cache/cache-1534795680-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534795700-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534795700-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..c0dc70d Binary files /dev/null and b/assets/cache/cache-1534795700-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534795761-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534795761-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..7d4119f Binary files /dev/null and b/assets/cache/cache-1534795761-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534795884-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534795884-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..496f31b Binary files /dev/null and b/assets/cache/cache-1534795884-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534795906-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534795906-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..98a0b26 Binary files /dev/null and b/assets/cache/cache-1534795906-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534796090-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534796090-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..cb34e91 Binary files /dev/null and b/assets/cache/cache-1534796090-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534796177-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534796177-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..d0fd1b4 Binary files /dev/null and b/assets/cache/cache-1534796177-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534796237-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534796237-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..5863567 Binary files /dev/null and b/assets/cache/cache-1534796237-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534796418-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534796418-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..1b4beb4 Binary files /dev/null and b/assets/cache/cache-1534796418-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534796472-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534796472-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..0fda04c Binary files /dev/null and b/assets/cache/cache-1534796472-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534796494-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534796494-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..feb7203 Binary files /dev/null and b/assets/cache/cache-1534796494-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534796592-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534796592-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..c350d82 Binary files /dev/null and b/assets/cache/cache-1534796592-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534796720-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534796720-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..d262c17 Binary files /dev/null and b/assets/cache/cache-1534796720-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534796763-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534796763-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..56e6e41 Binary files /dev/null and b/assets/cache/cache-1534796763-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534796836-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534796836-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..74d635b Binary files /dev/null and b/assets/cache/cache-1534796836-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534796846-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534796846-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..a003e74 Binary files /dev/null and b/assets/cache/cache-1534796846-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534796890-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534796890-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..eeb521f Binary files /dev/null and b/assets/cache/cache-1534796890-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534796890-3577182bce308ed0409e50dc74cae06d.javascript.gzip b/assets/cache/cache-1534796890-3577182bce308ed0409e50dc74cae06d.javascript.gzip new file mode 100644 index 0000000..0e41f0b Binary files /dev/null and b/assets/cache/cache-1534796890-3577182bce308ed0409e50dc74cae06d.javascript.gzip differ diff --git a/assets/cache/cache-1534797448-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534797448-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..d1f2e07 Binary files /dev/null and b/assets/cache/cache-1534797448-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534797468-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534797468-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..b541ca1 Binary files /dev/null and b/assets/cache/cache-1534797468-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534797499-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534797499-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..2cbc848 Binary files /dev/null and b/assets/cache/cache-1534797499-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534797800-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534797800-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..d4fc061 Binary files /dev/null and b/assets/cache/cache-1534797800-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534797946-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534797946-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..c96484b Binary files /dev/null and b/assets/cache/cache-1534797946-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534797999-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534797999-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..41ce0d7 Binary files /dev/null and b/assets/cache/cache-1534797999-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534798026-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534798026-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..0755dae Binary files /dev/null and b/assets/cache/cache-1534798026-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534798049-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534798049-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..2609407 Binary files /dev/null and b/assets/cache/cache-1534798049-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534798332-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534798332-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..e8b6dc1 Binary files /dev/null and b/assets/cache/cache-1534798332-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534798363-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534798363-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..061ef80 Binary files /dev/null and b/assets/cache/cache-1534798363-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534798393-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534798393-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..df89380 Binary files /dev/null and b/assets/cache/cache-1534798393-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534798467-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534798467-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..394a70e Binary files /dev/null and b/assets/cache/cache-1534798467-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534798467-3577182bce308ed0409e50dc74cae06d.javascript.gzip b/assets/cache/cache-1534798467-3577182bce308ed0409e50dc74cae06d.javascript.gzip new file mode 100644 index 0000000..021444d Binary files /dev/null and b/assets/cache/cache-1534798467-3577182bce308ed0409e50dc74cae06d.javascript.gzip differ diff --git a/assets/cache/cache-1534799161-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534799161-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..7acc4a9 Binary files /dev/null and b/assets/cache/cache-1534799161-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534799440-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534799440-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..3683e1a Binary files /dev/null and b/assets/cache/cache-1534799440-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534850268-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1534850268-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..506628d Binary files /dev/null and b/assets/cache/cache-1534850268-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1534851311-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534851311-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..a4a0a30 Binary files /dev/null and b/assets/cache/cache-1534851311-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534851375-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1534851375-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..cd1cf52 Binary files /dev/null and b/assets/cache/cache-1534851375-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1534851501-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534851501-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..4ab834c Binary files /dev/null and b/assets/cache/cache-1534851501-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534851665-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534851665-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..672e40d Binary files /dev/null and b/assets/cache/cache-1534851665-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534851687-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534851687-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..f266dcb Binary files /dev/null and b/assets/cache/cache-1534851687-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534851779-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534851779-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..c372d51 Binary files /dev/null and b/assets/cache/cache-1534851779-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534851895-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1534851895-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..6af4a4d Binary files /dev/null and b/assets/cache/cache-1534851895-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1534851895-16658922875510e094b46dd67f1ca664.javascript.gzip b/assets/cache/cache-1534851895-16658922875510e094b46dd67f1ca664.javascript.gzip new file mode 100644 index 0000000..6af4a4d Binary files /dev/null and b/assets/cache/cache-1534851895-16658922875510e094b46dd67f1ca664.javascript.gzip differ diff --git a/assets/cache/cache-1534853468-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1534853468-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..26d5543 Binary files /dev/null and b/assets/cache/cache-1534853468-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1534853506-87a05ef581a33c9408a95b4ccdc10f50.css.gzip b/assets/cache/cache-1534853506-87a05ef581a33c9408a95b4ccdc10f50.css.gzip new file mode 100644 index 0000000..6bcc1a4 Binary files /dev/null and b/assets/cache/cache-1534853506-87a05ef581a33c9408a95b4ccdc10f50.css.gzip differ diff --git a/assets/cache/cache-1534855111-e56c8fbf37b0fbec2834c048397fb2af.javascript.gzip b/assets/cache/cache-1534855111-e56c8fbf37b0fbec2834c048397fb2af.javascript.gzip new file mode 100644 index 0000000..6d53ccc Binary files /dev/null and b/assets/cache/cache-1534855111-e56c8fbf37b0fbec2834c048397fb2af.javascript.gzip differ diff --git a/assets/cache/cache-1534855140-e56c8fbf37b0fbec2834c048397fb2af.javascript.gzip b/assets/cache/cache-1534855140-e56c8fbf37b0fbec2834c048397fb2af.javascript.gzip new file mode 100644 index 0000000..6b21e53 Binary files /dev/null and b/assets/cache/cache-1534855140-e56c8fbf37b0fbec2834c048397fb2af.javascript.gzip differ diff --git a/assets/cache/cache-1534855155-e56c8fbf37b0fbec2834c048397fb2af.javascript.gzip b/assets/cache/cache-1534855155-e56c8fbf37b0fbec2834c048397fb2af.javascript.gzip new file mode 100644 index 0000000..b8c6486 Binary files /dev/null and b/assets/cache/cache-1534855155-e56c8fbf37b0fbec2834c048397fb2af.javascript.gzip differ diff --git a/assets/cache/cache-1534855155-f3fcad2cd713b5694d8b050310e47a60.javascript.gzip b/assets/cache/cache-1534855155-f3fcad2cd713b5694d8b050310e47a60.javascript.gzip new file mode 100644 index 0000000..a972bd7 Binary files /dev/null and b/assets/cache/cache-1534855155-f3fcad2cd713b5694d8b050310e47a60.javascript.gzip differ diff --git a/assets/cache/cache-1534864041-87a05ef581a33c9408a95b4ccdc10f50.css.gzip b/assets/cache/cache-1534864041-87a05ef581a33c9408a95b4ccdc10f50.css.gzip new file mode 100644 index 0000000..4268b37 Binary files /dev/null and b/assets/cache/cache-1534864041-87a05ef581a33c9408a95b4ccdc10f50.css.gzip differ diff --git a/assets/cache/cache-1534864196-87a05ef581a33c9408a95b4ccdc10f50.css.gzip b/assets/cache/cache-1534864196-87a05ef581a33c9408a95b4ccdc10f50.css.gzip new file mode 100644 index 0000000..ce0fd9f Binary files /dev/null and b/assets/cache/cache-1534864196-87a05ef581a33c9408a95b4ccdc10f50.css.gzip differ diff --git a/assets/cache/cache-1534864196-c1bd1c175138c803585a611dd71d9b42.css.gzip b/assets/cache/cache-1534864196-c1bd1c175138c803585a611dd71d9b42.css.gzip new file mode 100644 index 0000000..e9d6240 Binary files /dev/null and b/assets/cache/cache-1534864196-c1bd1c175138c803585a611dd71d9b42.css.gzip differ diff --git a/assets/cache/cache-1534864755-581a6c16390510a37c897b4909e439c8.javascript.gzip b/assets/cache/cache-1534864755-581a6c16390510a37c897b4909e439c8.javascript.gzip new file mode 100644 index 0000000..f2a4a75 Binary files /dev/null and b/assets/cache/cache-1534864755-581a6c16390510a37c897b4909e439c8.javascript.gzip differ diff --git a/assets/cache/cache-1534865548-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip b/assets/cache/cache-1534865548-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip new file mode 100644 index 0000000..0b1ba9f Binary files /dev/null and b/assets/cache/cache-1534865548-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip differ diff --git a/assets/cache/cache-1534865548-581a6c16390510a37c897b4909e439c8.javascript.gzip b/assets/cache/cache-1534865548-581a6c16390510a37c897b4909e439c8.javascript.gzip new file mode 100644 index 0000000..0b1ba9f Binary files /dev/null and b/assets/cache/cache-1534865548-581a6c16390510a37c897b4909e439c8.javascript.gzip differ diff --git a/assets/cache/cache-1534865600-87a05ef581a33c9408a95b4ccdc10f50.css.gzip b/assets/cache/cache-1534865600-87a05ef581a33c9408a95b4ccdc10f50.css.gzip new file mode 100644 index 0000000..423a180 Binary files /dev/null and b/assets/cache/cache-1534865600-87a05ef581a33c9408a95b4ccdc10f50.css.gzip differ diff --git a/assets/cache/cache-1534865636-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534865636-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..cf91842 Binary files /dev/null and b/assets/cache/cache-1534865636-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534865636-87a05ef581a33c9408a95b4ccdc10f50.css.gzip b/assets/cache/cache-1534865636-87a05ef581a33c9408a95b4ccdc10f50.css.gzip new file mode 100644 index 0000000..1e5933e Binary files /dev/null and b/assets/cache/cache-1534865636-87a05ef581a33c9408a95b4ccdc10f50.css.gzip differ diff --git a/assets/cache/cache-1534865872-87a05ef581a33c9408a95b4ccdc10f50.css.gzip b/assets/cache/cache-1534865872-87a05ef581a33c9408a95b4ccdc10f50.css.gzip new file mode 100644 index 0000000..fd36d39 Binary files /dev/null and b/assets/cache/cache-1534865872-87a05ef581a33c9408a95b4ccdc10f50.css.gzip differ diff --git a/assets/cache/cache-1534865951-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1534865951-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..a34804a Binary files /dev/null and b/assets/cache/cache-1534865951-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1534865951-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534865951-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..a3264d6 Binary files /dev/null and b/assets/cache/cache-1534865951-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534865951-87a05ef581a33c9408a95b4ccdc10f50.css.gzip b/assets/cache/cache-1534865951-87a05ef581a33c9408a95b4ccdc10f50.css.gzip new file mode 100644 index 0000000..09b8511 Binary files /dev/null and b/assets/cache/cache-1534865951-87a05ef581a33c9408a95b4ccdc10f50.css.gzip differ diff --git a/assets/cache/cache-1534865951-9a69208371738ab419855bc932b89182.css.gzip b/assets/cache/cache-1534865951-9a69208371738ab419855bc932b89182.css.gzip new file mode 100644 index 0000000..496af81 Binary files /dev/null and b/assets/cache/cache-1534865951-9a69208371738ab419855bc932b89182.css.gzip differ diff --git a/assets/cache/cache-1534865951-a367b92f1f155dbe8a34d781647a5e56.css.gzip b/assets/cache/cache-1534865951-a367b92f1f155dbe8a34d781647a5e56.css.gzip new file mode 100644 index 0000000..8e739c3 Binary files /dev/null and b/assets/cache/cache-1534865951-a367b92f1f155dbe8a34d781647a5e56.css.gzip differ diff --git a/assets/cache/cache-1534865951-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1534865951-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..f142760 Binary files /dev/null and b/assets/cache/cache-1534865951-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1534865951-c1bd1c175138c803585a611dd71d9b42.css.gzip b/assets/cache/cache-1534865951-c1bd1c175138c803585a611dd71d9b42.css.gzip new file mode 100644 index 0000000..44d1485 Binary files /dev/null and b/assets/cache/cache-1534865951-c1bd1c175138c803585a611dd71d9b42.css.gzip differ diff --git a/assets/cache/cache-1534936298-9a1355a2197033a6bb4ba66836b87de0.javascript.gzip b/assets/cache/cache-1534936298-9a1355a2197033a6bb4ba66836b87de0.javascript.gzip new file mode 100644 index 0000000..610631a Binary files /dev/null and b/assets/cache/cache-1534936298-9a1355a2197033a6bb4ba66836b87de0.javascript.gzip differ diff --git a/assets/cache/cache-1534937187-e20a2b4f972d6202d4d68e0e8d8bdc56.javascript.gzip b/assets/cache/cache-1534937187-e20a2b4f972d6202d4d68e0e8d8bdc56.javascript.gzip new file mode 100644 index 0000000..4b26c21 Binary files /dev/null and b/assets/cache/cache-1534937187-e20a2b4f972d6202d4d68e0e8d8bdc56.javascript.gzip differ diff --git a/assets/cache/cache-1534937257-e20a2b4f972d6202d4d68e0e8d8bdc56.javascript.gzip b/assets/cache/cache-1534937257-e20a2b4f972d6202d4d68e0e8d8bdc56.javascript.gzip new file mode 100644 index 0000000..418a298 Binary files /dev/null and b/assets/cache/cache-1534937257-e20a2b4f972d6202d4d68e0e8d8bdc56.javascript.gzip differ diff --git a/assets/cache/cache-1534946784-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1534946784-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..aa9722d Binary files /dev/null and b/assets/cache/cache-1534946784-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1534946822-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1534946822-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..2c5c1a8 Binary files /dev/null and b/assets/cache/cache-1534946822-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1534946841-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1534946841-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..dface9d Binary files /dev/null and b/assets/cache/cache-1534946841-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1534946874-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1534946874-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..91cc516 Binary files /dev/null and b/assets/cache/cache-1534946874-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1534946900-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1534946900-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..319e204 Binary files /dev/null and b/assets/cache/cache-1534946900-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1534946900-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1534946900-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..2f6e7e1 Binary files /dev/null and b/assets/cache/cache-1534946900-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1534954610-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip b/assets/cache/cache-1534954610-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip new file mode 100644 index 0000000..d7814b9 Binary files /dev/null and b/assets/cache/cache-1534954610-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip differ diff --git a/assets/cache/cache-1534954643-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip b/assets/cache/cache-1534954643-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip new file mode 100644 index 0000000..251b9eb Binary files /dev/null and b/assets/cache/cache-1534954643-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip differ diff --git a/assets/cache/cache-1534955417-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip b/assets/cache/cache-1534955417-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip new file mode 100644 index 0000000..9b9aef7 Binary files /dev/null and b/assets/cache/cache-1534955417-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip differ diff --git a/assets/cache/cache-1534965232-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip b/assets/cache/cache-1534965232-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip new file mode 100644 index 0000000..eb2b86a Binary files /dev/null and b/assets/cache/cache-1534965232-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip differ diff --git a/assets/cache/cache-1534965447-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1534965447-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..4ca4c4a Binary files /dev/null and b/assets/cache/cache-1534965447-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1534965447-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534965447-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..9db7de6 Binary files /dev/null and b/assets/cache/cache-1534965447-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534965447-87a05ef581a33c9408a95b4ccdc10f50.css.gzip b/assets/cache/cache-1534965447-87a05ef581a33c9408a95b4ccdc10f50.css.gzip new file mode 100644 index 0000000..6366610 Binary files /dev/null and b/assets/cache/cache-1534965447-87a05ef581a33c9408a95b4ccdc10f50.css.gzip differ diff --git a/assets/cache/cache-1534967799-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip b/assets/cache/cache-1534967799-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip new file mode 100644 index 0000000..52c7e52 Binary files /dev/null and b/assets/cache/cache-1534967799-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip differ diff --git a/assets/cache/cache-1534968162-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1534968162-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..f52caf6 Binary files /dev/null and b/assets/cache/cache-1534968162-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1534968162-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip b/assets/cache/cache-1534968162-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip new file mode 100644 index 0000000..a70465e Binary files /dev/null and b/assets/cache/cache-1534968162-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip differ diff --git a/assets/cache/cache-1534968162-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1534968162-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..0ed58ce Binary files /dev/null and b/assets/cache/cache-1534968162-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1534968162-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1534968162-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..2db1e00 Binary files /dev/null and b/assets/cache/cache-1534968162-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1534976076-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534976076-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..a0a0c3b Binary files /dev/null and b/assets/cache/cache-1534976076-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534976096-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534976096-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..95a2c87 Binary files /dev/null and b/assets/cache/cache-1534976096-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534976131-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1534976131-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..2131aee Binary files /dev/null and b/assets/cache/cache-1534976131-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1534976359-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1534976359-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..3156849 Binary files /dev/null and b/assets/cache/cache-1534976359-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1535014435-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535014435-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..ab9bada Binary files /dev/null and b/assets/cache/cache-1535014435-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535014532-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535014532-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..2943b1c Binary files /dev/null and b/assets/cache/cache-1535014532-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535015032-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535015032-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..a62d40f Binary files /dev/null and b/assets/cache/cache-1535015032-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535015174-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1535015174-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..a267953 Binary files /dev/null and b/assets/cache/cache-1535015174-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1535015210-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535015210-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..ebe89e0 Binary files /dev/null and b/assets/cache/cache-1535015210-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535015841-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1535015841-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..71c42e1 Binary files /dev/null and b/assets/cache/cache-1535015841-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1535016036-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1535016036-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..eb20dfc Binary files /dev/null and b/assets/cache/cache-1535016036-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1535016055-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1535016055-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..cf91ba5 Binary files /dev/null and b/assets/cache/cache-1535016055-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1535016169-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1535016169-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..72298b5 Binary files /dev/null and b/assets/cache/cache-1535016169-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1535016169-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1535016169-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..cf6917b Binary files /dev/null and b/assets/cache/cache-1535016169-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1535016457-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535016457-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..951d02a Binary files /dev/null and b/assets/cache/cache-1535016457-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535016672-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535016672-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..95d9241 Binary files /dev/null and b/assets/cache/cache-1535016672-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535016723-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535016723-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..62a01e6 Binary files /dev/null and b/assets/cache/cache-1535016723-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535016749-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535016749-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..c934b46 Binary files /dev/null and b/assets/cache/cache-1535016749-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535016871-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535016871-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..845acc6 Binary files /dev/null and b/assets/cache/cache-1535016871-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535016871-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535016871-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..2f23a3f Binary files /dev/null and b/assets/cache/cache-1535016871-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535016871-64d013c8d0fd9b3d11c7ca48bcb34d59.javascript.gzip b/assets/cache/cache-1535016871-64d013c8d0fd9b3d11c7ca48bcb34d59.javascript.gzip new file mode 100644 index 0000000..424b4d9 Binary files /dev/null and b/assets/cache/cache-1535016871-64d013c8d0fd9b3d11c7ca48bcb34d59.javascript.gzip differ diff --git a/assets/cache/cache-1535016871-91f9fdb805d757a76c41c6d243d59798.javascript.gzip b/assets/cache/cache-1535016871-91f9fdb805d757a76c41c6d243d59798.javascript.gzip new file mode 100644 index 0000000..4d07be2 Binary files /dev/null and b/assets/cache/cache-1535016871-91f9fdb805d757a76c41c6d243d59798.javascript.gzip differ diff --git a/assets/cache/cache-1535016871-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535016871-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..eb99fd0 Binary files /dev/null and b/assets/cache/cache-1535016871-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535016871-c77eb8b2b409365b2a51b2e43ff9f25a.javascript.gzip b/assets/cache/cache-1535016871-c77eb8b2b409365b2a51b2e43ff9f25a.javascript.gzip new file mode 100644 index 0000000..ad458d5 Binary files /dev/null and b/assets/cache/cache-1535016871-c77eb8b2b409365b2a51b2e43ff9f25a.javascript.gzip differ diff --git a/assets/cache/cache-1535016871-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip b/assets/cache/cache-1535016871-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip new file mode 100644 index 0000000..c8d8be5 Binary files /dev/null and b/assets/cache/cache-1535016871-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip differ diff --git a/assets/cache/cache-1535023676-c77eb8b2b409365b2a51b2e43ff9f25a.javascript.gzip b/assets/cache/cache-1535023676-c77eb8b2b409365b2a51b2e43ff9f25a.javascript.gzip new file mode 100644 index 0000000..a70e535 Binary files /dev/null and b/assets/cache/cache-1535023676-c77eb8b2b409365b2a51b2e43ff9f25a.javascript.gzip differ diff --git a/assets/cache/cache-1535023899-974de500e4258eaa94a2f0f34e28c21b.css.gzip b/assets/cache/cache-1535023899-974de500e4258eaa94a2f0f34e28c21b.css.gzip new file mode 100644 index 0000000..c9767db Binary files /dev/null and b/assets/cache/cache-1535023899-974de500e4258eaa94a2f0f34e28c21b.css.gzip differ diff --git a/assets/cache/cache-1535023899-9a69208371738ab419855bc932b89182.css.gzip b/assets/cache/cache-1535023899-9a69208371738ab419855bc932b89182.css.gzip new file mode 100644 index 0000000..c3c16f1 Binary files /dev/null and b/assets/cache/cache-1535023899-9a69208371738ab419855bc932b89182.css.gzip differ diff --git a/assets/cache/cache-1535023899-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1535023899-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..d2bd058 Binary files /dev/null and b/assets/cache/cache-1535023899-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1535024208-974de500e4258eaa94a2f0f34e28c21b.css.gzip b/assets/cache/cache-1535024208-974de500e4258eaa94a2f0f34e28c21b.css.gzip new file mode 100644 index 0000000..40b8d1c Binary files /dev/null and b/assets/cache/cache-1535024208-974de500e4258eaa94a2f0f34e28c21b.css.gzip differ diff --git a/assets/cache/cache-1535025375-974de500e4258eaa94a2f0f34e28c21b.css.gzip b/assets/cache/cache-1535025375-974de500e4258eaa94a2f0f34e28c21b.css.gzip new file mode 100644 index 0000000..525d8c0 Binary files /dev/null and b/assets/cache/cache-1535025375-974de500e4258eaa94a2f0f34e28c21b.css.gzip differ diff --git a/assets/cache/cache-1535025414-974de500e4258eaa94a2f0f34e28c21b.css.gzip b/assets/cache/cache-1535025414-974de500e4258eaa94a2f0f34e28c21b.css.gzip new file mode 100644 index 0000000..94ae424 Binary files /dev/null and b/assets/cache/cache-1535025414-974de500e4258eaa94a2f0f34e28c21b.css.gzip differ diff --git a/assets/cache/cache-1535025458-974de500e4258eaa94a2f0f34e28c21b.css.gzip b/assets/cache/cache-1535025458-974de500e4258eaa94a2f0f34e28c21b.css.gzip new file mode 100644 index 0000000..6155e0c Binary files /dev/null and b/assets/cache/cache-1535025458-974de500e4258eaa94a2f0f34e28c21b.css.gzip differ diff --git a/assets/cache/cache-1535038606-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1535038606-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..f00a65f Binary files /dev/null and b/assets/cache/cache-1535038606-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1535038606-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1535038606-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..fa79d4f Binary files /dev/null and b/assets/cache/cache-1535038606-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1535038606-9a69208371738ab419855bc932b89182.css.gzip b/assets/cache/cache-1535038606-9a69208371738ab419855bc932b89182.css.gzip new file mode 100644 index 0000000..df3ea02 Binary files /dev/null and b/assets/cache/cache-1535038606-9a69208371738ab419855bc932b89182.css.gzip differ diff --git a/assets/cache/cache-1535038606-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1535038606-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..5b16b6e Binary files /dev/null and b/assets/cache/cache-1535038606-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1535042403-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535042403-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..830de59 Binary files /dev/null and b/assets/cache/cache-1535042403-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535042442-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535042442-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..28c5275 Binary files /dev/null and b/assets/cache/cache-1535042442-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535042489-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535042489-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..c29d665 Binary files /dev/null and b/assets/cache/cache-1535042489-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535042553-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535042553-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..3b0cbeb Binary files /dev/null and b/assets/cache/cache-1535042553-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535043191-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535043191-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..3172fd0 Binary files /dev/null and b/assets/cache/cache-1535043191-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535043253-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535043253-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..270b092 Binary files /dev/null and b/assets/cache/cache-1535043253-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535043324-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535043324-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..a673254 Binary files /dev/null and b/assets/cache/cache-1535043324-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535043350-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535043350-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..f5e32f5 Binary files /dev/null and b/assets/cache/cache-1535043350-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535043373-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535043373-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..2ff97e4 Binary files /dev/null and b/assets/cache/cache-1535043373-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535043414-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535043414-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..fc538d8 Binary files /dev/null and b/assets/cache/cache-1535043414-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535043501-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535043501-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..3d92f83 Binary files /dev/null and b/assets/cache/cache-1535043501-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535043780-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1535043780-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..2f3673e Binary files /dev/null and b/assets/cache/cache-1535043780-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1535043935-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1535043935-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..f04a57e Binary files /dev/null and b/assets/cache/cache-1535043935-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1535043967-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535043967-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..1bf5bc8 Binary files /dev/null and b/assets/cache/cache-1535043967-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535044015-10fbaf38e4acbe1d371b37473c216504.css.gzip b/assets/cache/cache-1535044015-10fbaf38e4acbe1d371b37473c216504.css.gzip new file mode 100644 index 0000000..7601b99 Binary files /dev/null and b/assets/cache/cache-1535044015-10fbaf38e4acbe1d371b37473c216504.css.gzip differ diff --git a/assets/cache/cache-1535044015-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535044015-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..952f671 Binary files /dev/null and b/assets/cache/cache-1535044015-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535044015-6489e99c6c96822d1f82c6943119f9e0.css.gzip b/assets/cache/cache-1535044015-6489e99c6c96822d1f82c6943119f9e0.css.gzip new file mode 100644 index 0000000..5a7651f Binary files /dev/null and b/assets/cache/cache-1535044015-6489e99c6c96822d1f82c6943119f9e0.css.gzip differ diff --git a/assets/cache/cache-1535044015-9a69208371738ab419855bc932b89182.css.gzip b/assets/cache/cache-1535044015-9a69208371738ab419855bc932b89182.css.gzip new file mode 100644 index 0000000..f23402d Binary files /dev/null and b/assets/cache/cache-1535044015-9a69208371738ab419855bc932b89182.css.gzip differ diff --git a/assets/cache/cache-1535044015-a367b92f1f155dbe8a34d781647a5e56.css.gzip b/assets/cache/cache-1535044015-a367b92f1f155dbe8a34d781647a5e56.css.gzip new file mode 100644 index 0000000..18284b9 Binary files /dev/null and b/assets/cache/cache-1535044015-a367b92f1f155dbe8a34d781647a5e56.css.gzip differ diff --git a/assets/cache/cache-1535044015-b31dbb1183a326705851ea6ee4665ec5.css.gzip b/assets/cache/cache-1535044015-b31dbb1183a326705851ea6ee4665ec5.css.gzip new file mode 100644 index 0000000..4fbb3f6 Binary files /dev/null and b/assets/cache/cache-1535044015-b31dbb1183a326705851ea6ee4665ec5.css.gzip differ diff --git a/assets/cache/cache-1535044098-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535044098-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..8949816 Binary files /dev/null and b/assets/cache/cache-1535044098-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535044221-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535044221-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..795a4d8 Binary files /dev/null and b/assets/cache/cache-1535044221-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535044399-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535044399-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..8478049 Binary files /dev/null and b/assets/cache/cache-1535044399-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535044528-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535044528-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..2e168e8 Binary files /dev/null and b/assets/cache/cache-1535044528-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535044573-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535044573-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..90293da Binary files /dev/null and b/assets/cache/cache-1535044573-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535044703-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535044703-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..47b4b9f Binary files /dev/null and b/assets/cache/cache-1535044703-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535044809-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535044809-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..11e82f7 Binary files /dev/null and b/assets/cache/cache-1535044809-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535044869-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535044869-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..2b65bc9 Binary files /dev/null and b/assets/cache/cache-1535044869-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535045275-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535045275-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..a06450a Binary files /dev/null and b/assets/cache/cache-1535045275-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535045359-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535045359-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..d00f181 Binary files /dev/null and b/assets/cache/cache-1535045359-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535045389-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535045389-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..8d05581 Binary files /dev/null and b/assets/cache/cache-1535045389-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535045397-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535045397-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..c911fbc Binary files /dev/null and b/assets/cache/cache-1535045397-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535045413-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535045413-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..0cd764a Binary files /dev/null and b/assets/cache/cache-1535045413-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535045438-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535045438-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..da7df30 Binary files /dev/null and b/assets/cache/cache-1535045438-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535045814-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535045814-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..0e61619 Binary files /dev/null and b/assets/cache/cache-1535045814-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535046040-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535046040-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..2136c2f Binary files /dev/null and b/assets/cache/cache-1535046040-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535046184-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535046184-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..71aa344 Binary files /dev/null and b/assets/cache/cache-1535046184-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535046649-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535046649-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..7bfed13 Binary files /dev/null and b/assets/cache/cache-1535046649-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535046861-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535046861-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..4bb969b Binary files /dev/null and b/assets/cache/cache-1535046861-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535046882-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535046882-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..18a8369 Binary files /dev/null and b/assets/cache/cache-1535046882-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535047097-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip b/assets/cache/cache-1535047097-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip new file mode 100644 index 0000000..07a56f4 Binary files /dev/null and b/assets/cache/cache-1535047097-12a0521ee1fc49d21eb53e6b0b9ead91.javascript.gzip differ diff --git a/assets/cache/cache-1535047097-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535047097-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..8ac6a5b Binary files /dev/null and b/assets/cache/cache-1535047097-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535060314-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535060314-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..d96dfc7 Binary files /dev/null and b/assets/cache/cache-1535060314-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535060314-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535060314-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..7501271 Binary files /dev/null and b/assets/cache/cache-1535060314-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535060314-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip b/assets/cache/cache-1535060314-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip new file mode 100644 index 0000000..8ea8070 Binary files /dev/null and b/assets/cache/cache-1535060314-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip differ diff --git a/assets/cache/cache-1535109217-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535109217-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..6a4787f Binary files /dev/null and b/assets/cache/cache-1535109217-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535109349-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535109349-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..3435d37 Binary files /dev/null and b/assets/cache/cache-1535109349-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535109632-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535109632-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..e61e4c1 Binary files /dev/null and b/assets/cache/cache-1535109632-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535109695-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535109695-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..a9324af Binary files /dev/null and b/assets/cache/cache-1535109695-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535109927-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535109927-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..1df67fc Binary files /dev/null and b/assets/cache/cache-1535109927-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535109957-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535109957-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..1540f57 Binary files /dev/null and b/assets/cache/cache-1535109957-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535109985-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535109985-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..c7cacf0 Binary files /dev/null and b/assets/cache/cache-1535109985-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535110045-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535110045-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..fd957c4 Binary files /dev/null and b/assets/cache/cache-1535110045-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535110058-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535110058-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..1af7fcb Binary files /dev/null and b/assets/cache/cache-1535110058-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535110222-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535110222-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..612b2c3 Binary files /dev/null and b/assets/cache/cache-1535110222-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535110283-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535110283-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..3a55d65 Binary files /dev/null and b/assets/cache/cache-1535110283-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535110343-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535110343-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..9c6f2c5 Binary files /dev/null and b/assets/cache/cache-1535110343-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535110387-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535110387-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..1bee033 Binary files /dev/null and b/assets/cache/cache-1535110387-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535110404-0e17d909bba81796775284c76b7afd70.javascript.gzip b/assets/cache/cache-1535110404-0e17d909bba81796775284c76b7afd70.javascript.gzip new file mode 100644 index 0000000..2b01448 Binary files /dev/null and b/assets/cache/cache-1535110404-0e17d909bba81796775284c76b7afd70.javascript.gzip differ diff --git a/assets/cache/cache-1535110404-0efd056ba3fe97b53d017508683078e0.javascript.gzip b/assets/cache/cache-1535110404-0efd056ba3fe97b53d017508683078e0.javascript.gzip new file mode 100644 index 0000000..0016a4c Binary files /dev/null and b/assets/cache/cache-1535110404-0efd056ba3fe97b53d017508683078e0.javascript.gzip differ diff --git a/assets/cache/cache-1535110404-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip b/assets/cache/cache-1535110404-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip new file mode 100644 index 0000000..230dd67 Binary files /dev/null and b/assets/cache/cache-1535110404-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip differ diff --git a/assets/cache/cache-1535110404-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535110404-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..fe8ffd3 Binary files /dev/null and b/assets/cache/cache-1535110404-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535110404-3a657983ac5b760373f4402f078967b7.javascript.gzip b/assets/cache/cache-1535110404-3a657983ac5b760373f4402f078967b7.javascript.gzip new file mode 100644 index 0000000..5fdc49f Binary files /dev/null and b/assets/cache/cache-1535110404-3a657983ac5b760373f4402f078967b7.javascript.gzip differ diff --git a/assets/cache/cache-1535110404-64d013c8d0fd9b3d11c7ca48bcb34d59.javascript.gzip b/assets/cache/cache-1535110404-64d013c8d0fd9b3d11c7ca48bcb34d59.javascript.gzip new file mode 100644 index 0000000..6918267 Binary files /dev/null and b/assets/cache/cache-1535110404-64d013c8d0fd9b3d11c7ca48bcb34d59.javascript.gzip differ diff --git a/assets/cache/cache-1535110404-91f9fdb805d757a76c41c6d243d59798.javascript.gzip b/assets/cache/cache-1535110404-91f9fdb805d757a76c41c6d243d59798.javascript.gzip new file mode 100644 index 0000000..4867729 Binary files /dev/null and b/assets/cache/cache-1535110404-91f9fdb805d757a76c41c6d243d59798.javascript.gzip differ diff --git a/assets/cache/cache-1535110404-ab8a565758c78729388e0004df90d49c.javascript.gzip b/assets/cache/cache-1535110404-ab8a565758c78729388e0004df90d49c.javascript.gzip new file mode 100644 index 0000000..dfe0035 Binary files /dev/null and b/assets/cache/cache-1535110404-ab8a565758c78729388e0004df90d49c.javascript.gzip differ diff --git a/assets/cache/cache-1535110404-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535110404-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..acf17b7 Binary files /dev/null and b/assets/cache/cache-1535110404-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535110404-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip b/assets/cache/cache-1535110404-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip new file mode 100644 index 0000000..6655597 Binary files /dev/null and b/assets/cache/cache-1535110404-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip differ diff --git a/assets/cache/cache-1535110404-ef08aae333c6f27498dc9c7e07371e3f.javascript.gzip b/assets/cache/cache-1535110404-ef08aae333c6f27498dc9c7e07371e3f.javascript.gzip new file mode 100644 index 0000000..92a6312 Binary files /dev/null and b/assets/cache/cache-1535110404-ef08aae333c6f27498dc9c7e07371e3f.javascript.gzip differ diff --git a/assets/cache/cache-1535121644-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535121644-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..c8f9a9f Binary files /dev/null and b/assets/cache/cache-1535121644-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535121644-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip b/assets/cache/cache-1535121644-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip new file mode 100644 index 0000000..49634e4 Binary files /dev/null and b/assets/cache/cache-1535121644-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip differ diff --git a/assets/cache/cache-1535121644-8a28dcee01743ed42bbd3dfe49ade0d6.css.gzip b/assets/cache/cache-1535121644-8a28dcee01743ed42bbd3dfe49ade0d6.css.gzip new file mode 100644 index 0000000..91afc14 Binary files /dev/null and b/assets/cache/cache-1535121644-8a28dcee01743ed42bbd3dfe49ade0d6.css.gzip differ diff --git a/assets/cache/cache-1535121933-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535121933-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..9f33192 Binary files /dev/null and b/assets/cache/cache-1535121933-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535121933-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip b/assets/cache/cache-1535121933-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip new file mode 100644 index 0000000..3a1de2e Binary files /dev/null and b/assets/cache/cache-1535121933-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip differ diff --git a/assets/cache/cache-1535121933-8a28dcee01743ed42bbd3dfe49ade0d6.css.gzip b/assets/cache/cache-1535121933-8a28dcee01743ed42bbd3dfe49ade0d6.css.gzip new file mode 100644 index 0000000..7cabfeb Binary files /dev/null and b/assets/cache/cache-1535121933-8a28dcee01743ed42bbd3dfe49ade0d6.css.gzip differ diff --git a/assets/cache/cache-1535122171-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip b/assets/cache/cache-1535122171-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip new file mode 100644 index 0000000..5811c77 Binary files /dev/null and b/assets/cache/cache-1535122171-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip differ diff --git a/assets/cache/cache-1535122532-103d2d2419ad94e3dcb34a561c22d024.css.gzip b/assets/cache/cache-1535122532-103d2d2419ad94e3dcb34a561c22d024.css.gzip new file mode 100644 index 0000000..43f1e95 Binary files /dev/null and b/assets/cache/cache-1535122532-103d2d2419ad94e3dcb34a561c22d024.css.gzip differ diff --git a/assets/cache/cache-1535122532-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535122532-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..3f188e5 Binary files /dev/null and b/assets/cache/cache-1535122532-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535122532-367b5e35e6bf0828bc18341b621e625f.css.gzip b/assets/cache/cache-1535122532-367b5e35e6bf0828bc18341b621e625f.css.gzip new file mode 100644 index 0000000..575ff81 Binary files /dev/null and b/assets/cache/cache-1535122532-367b5e35e6bf0828bc18341b621e625f.css.gzip differ diff --git a/assets/cache/cache-1535122532-50019838f334c0722fed81b6c2bf89ce.css.gzip b/assets/cache/cache-1535122532-50019838f334c0722fed81b6c2bf89ce.css.gzip new file mode 100644 index 0000000..d7e2547 Binary files /dev/null and b/assets/cache/cache-1535122532-50019838f334c0722fed81b6c2bf89ce.css.gzip differ diff --git a/assets/cache/cache-1535122532-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535122532-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..9ed44e1 Binary files /dev/null and b/assets/cache/cache-1535122532-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535122532-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip b/assets/cache/cache-1535122532-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip new file mode 100644 index 0000000..e2608f2 Binary files /dev/null and b/assets/cache/cache-1535122532-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip differ diff --git a/assets/cache/cache-1535122532-73f24cb0a00d3dbf24b5e9c280282cd1.css.gzip b/assets/cache/cache-1535122532-73f24cb0a00d3dbf24b5e9c280282cd1.css.gzip new file mode 100644 index 0000000..0bb81cc Binary files /dev/null and b/assets/cache/cache-1535122532-73f24cb0a00d3dbf24b5e9c280282cd1.css.gzip differ diff --git a/assets/cache/cache-1535122532-7b28133ebc7b655a27b4abbfe27823a3.css.gzip b/assets/cache/cache-1535122532-7b28133ebc7b655a27b4abbfe27823a3.css.gzip new file mode 100644 index 0000000..5136c86 Binary files /dev/null and b/assets/cache/cache-1535122532-7b28133ebc7b655a27b4abbfe27823a3.css.gzip differ diff --git a/assets/cache/cache-1535122532-b4b0cf5472a89976a4af9c577761c4ce.css.gzip b/assets/cache/cache-1535122532-b4b0cf5472a89976a4af9c577761c4ce.css.gzip new file mode 100644 index 0000000..25b5c3c Binary files /dev/null and b/assets/cache/cache-1535122532-b4b0cf5472a89976a4af9c577761c4ce.css.gzip differ diff --git a/assets/cache/cache-1535122532-d412e2f8a351e34fc3127f1f1416811b.css.gzip b/assets/cache/cache-1535122532-d412e2f8a351e34fc3127f1f1416811b.css.gzip new file mode 100644 index 0000000..bc39921 Binary files /dev/null and b/assets/cache/cache-1535122532-d412e2f8a351e34fc3127f1f1416811b.css.gzip differ diff --git a/assets/cache/cache-1535220635-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535220635-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..15431d4 Binary files /dev/null and b/assets/cache/cache-1535220635-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535220774-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535220774-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..15431d4 Binary files /dev/null and b/assets/cache/cache-1535220774-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535220877-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535220877-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..d23e7e9 Binary files /dev/null and b/assets/cache/cache-1535220877-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535223739-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535223739-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..cf75693 Binary files /dev/null and b/assets/cache/cache-1535223739-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535230208-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535230208-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..2e1f626 Binary files /dev/null and b/assets/cache/cache-1535230208-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535231240-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535231240-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..9b72a24 Binary files /dev/null and b/assets/cache/cache-1535231240-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535231317-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535231317-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..ca1a253 Binary files /dev/null and b/assets/cache/cache-1535231317-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535231406-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535231406-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..07f7195 Binary files /dev/null and b/assets/cache/cache-1535231406-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535231935-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535231935-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..beb8ef5 Binary files /dev/null and b/assets/cache/cache-1535231935-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535232014-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535232014-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..6b0feeb Binary files /dev/null and b/assets/cache/cache-1535232014-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535232065-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535232065-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..40742a9 Binary files /dev/null and b/assets/cache/cache-1535232065-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535232151-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535232151-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..8335a3a Binary files /dev/null and b/assets/cache/cache-1535232151-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535232292-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535232292-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..c08fecc Binary files /dev/null and b/assets/cache/cache-1535232292-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535232304-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535232304-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..8e6e227 Binary files /dev/null and b/assets/cache/cache-1535232304-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535233001-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535233001-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..403e600 Binary files /dev/null and b/assets/cache/cache-1535233001-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535233048-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535233048-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..485811c Binary files /dev/null and b/assets/cache/cache-1535233048-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535233101-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535233101-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..5427faf Binary files /dev/null and b/assets/cache/cache-1535233101-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535233292-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535233292-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..d11f5ae Binary files /dev/null and b/assets/cache/cache-1535233292-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535233435-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535233435-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..2ae629e Binary files /dev/null and b/assets/cache/cache-1535233435-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535233457-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535233457-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..96f3a04 Binary files /dev/null and b/assets/cache/cache-1535233457-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535233485-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535233485-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..07d3b5c Binary files /dev/null and b/assets/cache/cache-1535233485-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535234488-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535234488-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..fc26308 Binary files /dev/null and b/assets/cache/cache-1535234488-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535236647-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535236647-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..1ce9799 Binary files /dev/null and b/assets/cache/cache-1535236647-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535237016-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535237016-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..60af44b Binary files /dev/null and b/assets/cache/cache-1535237016-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535237102-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535237102-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..9d2fcbf Binary files /dev/null and b/assets/cache/cache-1535237102-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535237439-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535237439-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..b87c5a5 Binary files /dev/null and b/assets/cache/cache-1535237439-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535238050-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535238050-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..b17caeb Binary files /dev/null and b/assets/cache/cache-1535238050-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535271857-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535271857-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..de8d3b5 Binary files /dev/null and b/assets/cache/cache-1535271857-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535271873-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535271873-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..a0a4cb5 Binary files /dev/null and b/assets/cache/cache-1535271873-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535272488-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535272488-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..e2195fa Binary files /dev/null and b/assets/cache/cache-1535272488-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535272533-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535272533-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..f897979 Binary files /dev/null and b/assets/cache/cache-1535272533-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535272619-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535272619-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..76abc98 Binary files /dev/null and b/assets/cache/cache-1535272619-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535272694-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535272694-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..5d59b1d Binary files /dev/null and b/assets/cache/cache-1535272694-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535274075-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535274075-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..6b9eaeb Binary files /dev/null and b/assets/cache/cache-1535274075-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535274090-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535274090-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..f333664 Binary files /dev/null and b/assets/cache/cache-1535274090-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535274149-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535274149-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..122aea9 Binary files /dev/null and b/assets/cache/cache-1535274149-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535274172-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535274172-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..7fc98c9 Binary files /dev/null and b/assets/cache/cache-1535274172-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535274207-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535274207-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..ee25d04 Binary files /dev/null and b/assets/cache/cache-1535274207-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535274236-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535274236-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..7d1aec1 Binary files /dev/null and b/assets/cache/cache-1535274236-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535274302-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535274302-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..b180325 Binary files /dev/null and b/assets/cache/cache-1535274302-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535275198-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535275198-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..a0d85f2 Binary files /dev/null and b/assets/cache/cache-1535275198-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535276425-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535276425-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..112a500 Binary files /dev/null and b/assets/cache/cache-1535276425-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535276436-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535276436-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..1359717 Binary files /dev/null and b/assets/cache/cache-1535276436-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535276502-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535276502-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..f50db00 Binary files /dev/null and b/assets/cache/cache-1535276502-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535276518-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535276518-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..0eed624 Binary files /dev/null and b/assets/cache/cache-1535276518-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535276832-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535276832-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..2d9422f Binary files /dev/null and b/assets/cache/cache-1535276832-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535276896-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535276896-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..0e65c90 Binary files /dev/null and b/assets/cache/cache-1535276896-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535276932-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535276932-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..ee00e9c Binary files /dev/null and b/assets/cache/cache-1535276932-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535277036-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535277036-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..187f5d6 Binary files /dev/null and b/assets/cache/cache-1535277036-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535277096-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535277096-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..ff308fe Binary files /dev/null and b/assets/cache/cache-1535277096-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535277096-b4b0cf5472a89976a4af9c577761c4ce.css.gzip b/assets/cache/cache-1535277096-b4b0cf5472a89976a4af9c577761c4ce.css.gzip new file mode 100644 index 0000000..69f783b Binary files /dev/null and b/assets/cache/cache-1535277096-b4b0cf5472a89976a4af9c577761c4ce.css.gzip differ diff --git a/assets/cache/cache-1535280672-91f9fdb805d757a76c41c6d243d59798.javascript.gzip b/assets/cache/cache-1535280672-91f9fdb805d757a76c41c6d243d59798.javascript.gzip new file mode 100644 index 0000000..c565e67 Binary files /dev/null and b/assets/cache/cache-1535280672-91f9fdb805d757a76c41c6d243d59798.javascript.gzip differ diff --git a/assets/cache/cache-1535280696-91f9fdb805d757a76c41c6d243d59798.javascript.gzip b/assets/cache/cache-1535280696-91f9fdb805d757a76c41c6d243d59798.javascript.gzip new file mode 100644 index 0000000..cd0a12e Binary files /dev/null and b/assets/cache/cache-1535280696-91f9fdb805d757a76c41c6d243d59798.javascript.gzip differ diff --git a/assets/cache/cache-1535280710-91f9fdb805d757a76c41c6d243d59798.javascript.gzip b/assets/cache/cache-1535280710-91f9fdb805d757a76c41c6d243d59798.javascript.gzip new file mode 100644 index 0000000..07961d2 Binary files /dev/null and b/assets/cache/cache-1535280710-91f9fdb805d757a76c41c6d243d59798.javascript.gzip differ diff --git a/assets/cache/cache-1535289486-91f9fdb805d757a76c41c6d243d59798.javascript.gzip b/assets/cache/cache-1535289486-91f9fdb805d757a76c41c6d243d59798.javascript.gzip new file mode 100644 index 0000000..6c67bd9 Binary files /dev/null and b/assets/cache/cache-1535289486-91f9fdb805d757a76c41c6d243d59798.javascript.gzip differ diff --git a/assets/cache/cache-1535289574-91f9fdb805d757a76c41c6d243d59798.javascript.gzip b/assets/cache/cache-1535289574-91f9fdb805d757a76c41c6d243d59798.javascript.gzip new file mode 100644 index 0000000..2b0aebc Binary files /dev/null and b/assets/cache/cache-1535289574-91f9fdb805d757a76c41c6d243d59798.javascript.gzip differ diff --git a/assets/cache/cache-1535289584-91f9fdb805d757a76c41c6d243d59798.javascript.gzip b/assets/cache/cache-1535289584-91f9fdb805d757a76c41c6d243d59798.javascript.gzip new file mode 100644 index 0000000..ef292aa Binary files /dev/null and b/assets/cache/cache-1535289584-91f9fdb805d757a76c41c6d243d59798.javascript.gzip differ diff --git a/assets/cache/cache-1535289637-91f9fdb805d757a76c41c6d243d59798.javascript.gzip b/assets/cache/cache-1535289637-91f9fdb805d757a76c41c6d243d59798.javascript.gzip new file mode 100644 index 0000000..10ecbf6 Binary files /dev/null and b/assets/cache/cache-1535289637-91f9fdb805d757a76c41c6d243d59798.javascript.gzip differ diff --git a/assets/cache/cache-1535290203-91f9fdb805d757a76c41c6d243d59798.javascript.gzip b/assets/cache/cache-1535290203-91f9fdb805d757a76c41c6d243d59798.javascript.gzip new file mode 100644 index 0000000..e021c2b Binary files /dev/null and b/assets/cache/cache-1535290203-91f9fdb805d757a76c41c6d243d59798.javascript.gzip differ diff --git a/assets/cache/cache-1535290492-91f9fdb805d757a76c41c6d243d59798.javascript.gzip b/assets/cache/cache-1535290492-91f9fdb805d757a76c41c6d243d59798.javascript.gzip new file mode 100644 index 0000000..6e6bf44 Binary files /dev/null and b/assets/cache/cache-1535290492-91f9fdb805d757a76c41c6d243d59798.javascript.gzip differ diff --git a/assets/cache/cache-1535291213-91f9fdb805d757a76c41c6d243d59798.javascript.gzip b/assets/cache/cache-1535291213-91f9fdb805d757a76c41c6d243d59798.javascript.gzip new file mode 100644 index 0000000..86514d1 Binary files /dev/null and b/assets/cache/cache-1535291213-91f9fdb805d757a76c41c6d243d59798.javascript.gzip differ diff --git a/assets/cache/cache-1535368933-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535368933-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..497ae53 Binary files /dev/null and b/assets/cache/cache-1535368933-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535369114-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535369114-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..31626ba Binary files /dev/null and b/assets/cache/cache-1535369114-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535369163-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535369163-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..ba1577f Binary files /dev/null and b/assets/cache/cache-1535369163-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535369370-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535369370-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..3f456f3 Binary files /dev/null and b/assets/cache/cache-1535369370-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535369393-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535369393-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..0a4d233 Binary files /dev/null and b/assets/cache/cache-1535369393-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535369511-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535369511-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..95dd90e Binary files /dev/null and b/assets/cache/cache-1535369511-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535369519-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535369519-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..23a43d0 Binary files /dev/null and b/assets/cache/cache-1535369519-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535369558-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535369558-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..2594ec6 Binary files /dev/null and b/assets/cache/cache-1535369558-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535371342-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535371342-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..be02476 Binary files /dev/null and b/assets/cache/cache-1535371342-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535371482-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535371482-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..a395567 Binary files /dev/null and b/assets/cache/cache-1535371482-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535371846-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535371846-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..2d248bb Binary files /dev/null and b/assets/cache/cache-1535371846-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535371866-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535371866-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..371040f Binary files /dev/null and b/assets/cache/cache-1535371866-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535371895-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535371895-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..9054a4f Binary files /dev/null and b/assets/cache/cache-1535371895-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535371940-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535371940-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..0d3fe2c Binary files /dev/null and b/assets/cache/cache-1535371940-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535372168-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535372168-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..26b02dd Binary files /dev/null and b/assets/cache/cache-1535372168-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535372188-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535372188-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..33bd0c9 Binary files /dev/null and b/assets/cache/cache-1535372188-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535372196-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535372196-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..1972b18 Binary files /dev/null and b/assets/cache/cache-1535372196-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535372196-b4b0cf5472a89976a4af9c577761c4ce.css.gzip b/assets/cache/cache-1535372196-b4b0cf5472a89976a4af9c577761c4ce.css.gzip new file mode 100644 index 0000000..ca54865 Binary files /dev/null and b/assets/cache/cache-1535372196-b4b0cf5472a89976a4af9c577761c4ce.css.gzip differ diff --git a/assets/cache/cache-1535372265-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535372265-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..fad93e8 Binary files /dev/null and b/assets/cache/cache-1535372265-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535372302-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535372302-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..09b9f45 Binary files /dev/null and b/assets/cache/cache-1535372302-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535372499-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535372499-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..adb5861 Binary files /dev/null and b/assets/cache/cache-1535372499-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535372714-3d201165baccb9415c8de740c361d5cc.javascript.gzip b/assets/cache/cache-1535372714-3d201165baccb9415c8de740c361d5cc.javascript.gzip new file mode 100644 index 0000000..826850c Binary files /dev/null and b/assets/cache/cache-1535372714-3d201165baccb9415c8de740c361d5cc.javascript.gzip differ diff --git a/assets/cache/cache-1535376859-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535376859-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..e77c22c Binary files /dev/null and b/assets/cache/cache-1535376859-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535376859-b4b0cf5472a89976a4af9c577761c4ce.css.gzip b/assets/cache/cache-1535376859-b4b0cf5472a89976a4af9c577761c4ce.css.gzip new file mode 100644 index 0000000..cdf732b Binary files /dev/null and b/assets/cache/cache-1535376859-b4b0cf5472a89976a4af9c577761c4ce.css.gzip differ diff --git a/assets/cache/cache-1535376913-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535376913-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..56910c0 Binary files /dev/null and b/assets/cache/cache-1535376913-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535377444-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535377444-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..3c5da08 Binary files /dev/null and b/assets/cache/cache-1535377444-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535377444-d412e2f8a351e34fc3127f1f1416811b.css.gzip b/assets/cache/cache-1535377444-d412e2f8a351e34fc3127f1f1416811b.css.gzip new file mode 100644 index 0000000..e8b4dc5 Binary files /dev/null and b/assets/cache/cache-1535377444-d412e2f8a351e34fc3127f1f1416811b.css.gzip differ diff --git a/assets/cache/cache-1535377753-d412e2f8a351e34fc3127f1f1416811b.css.gzip b/assets/cache/cache-1535377753-d412e2f8a351e34fc3127f1f1416811b.css.gzip new file mode 100644 index 0000000..1c390cb Binary files /dev/null and b/assets/cache/cache-1535377753-d412e2f8a351e34fc3127f1f1416811b.css.gzip differ diff --git a/assets/cache/cache-1535377890-d412e2f8a351e34fc3127f1f1416811b.css.gzip b/assets/cache/cache-1535377890-d412e2f8a351e34fc3127f1f1416811b.css.gzip new file mode 100644 index 0000000..df4a156 Binary files /dev/null and b/assets/cache/cache-1535377890-d412e2f8a351e34fc3127f1f1416811b.css.gzip differ diff --git a/assets/cache/cache-1535377929-d412e2f8a351e34fc3127f1f1416811b.css.gzip b/assets/cache/cache-1535377929-d412e2f8a351e34fc3127f1f1416811b.css.gzip new file mode 100644 index 0000000..11dac7a Binary files /dev/null and b/assets/cache/cache-1535377929-d412e2f8a351e34fc3127f1f1416811b.css.gzip differ diff --git a/assets/cache/cache-1535377970-d412e2f8a351e34fc3127f1f1416811b.css.gzip b/assets/cache/cache-1535377970-d412e2f8a351e34fc3127f1f1416811b.css.gzip new file mode 100644 index 0000000..1e3c290 Binary files /dev/null and b/assets/cache/cache-1535377970-d412e2f8a351e34fc3127f1f1416811b.css.gzip differ diff --git a/assets/cache/cache-1535378016-d412e2f8a351e34fc3127f1f1416811b.css.gzip b/assets/cache/cache-1535378016-d412e2f8a351e34fc3127f1f1416811b.css.gzip new file mode 100644 index 0000000..30612b7 Binary files /dev/null and b/assets/cache/cache-1535378016-d412e2f8a351e34fc3127f1f1416811b.css.gzip differ diff --git a/assets/cache/cache-1535378039-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip b/assets/cache/cache-1535378039-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip new file mode 100644 index 0000000..906c274 Binary files /dev/null and b/assets/cache/cache-1535378039-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip differ diff --git a/assets/cache/cache-1535378039-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535378039-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..35b3989 Binary files /dev/null and b/assets/cache/cache-1535378039-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535378039-3a657983ac5b760373f4402f078967b7.javascript.gzip b/assets/cache/cache-1535378039-3a657983ac5b760373f4402f078967b7.javascript.gzip new file mode 100644 index 0000000..41d6d1b Binary files /dev/null and b/assets/cache/cache-1535378039-3a657983ac5b760373f4402f078967b7.javascript.gzip differ diff --git a/assets/cache/cache-1535378039-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535378039-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..8f4af8d Binary files /dev/null and b/assets/cache/cache-1535378039-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535378039-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip b/assets/cache/cache-1535378039-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip new file mode 100644 index 0000000..0fef5e9 Binary files /dev/null and b/assets/cache/cache-1535378039-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip differ diff --git a/assets/cache/cache-1535378605-d412e2f8a351e34fc3127f1f1416811b.css.gzip b/assets/cache/cache-1535378605-d412e2f8a351e34fc3127f1f1416811b.css.gzip new file mode 100644 index 0000000..5853475 Binary files /dev/null and b/assets/cache/cache-1535378605-d412e2f8a351e34fc3127f1f1416811b.css.gzip differ diff --git a/assets/cache/cache-1535378668-367b5e35e6bf0828bc18341b621e625f.css.gzip b/assets/cache/cache-1535378668-367b5e35e6bf0828bc18341b621e625f.css.gzip new file mode 100644 index 0000000..631cc7b Binary files /dev/null and b/assets/cache/cache-1535378668-367b5e35e6bf0828bc18341b621e625f.css.gzip differ diff --git a/assets/cache/cache-1535378668-50019838f334c0722fed81b6c2bf89ce.css.gzip b/assets/cache/cache-1535378668-50019838f334c0722fed81b6c2bf89ce.css.gzip new file mode 100644 index 0000000..e92c04c Binary files /dev/null and b/assets/cache/cache-1535378668-50019838f334c0722fed81b6c2bf89ce.css.gzip differ diff --git a/assets/cache/cache-1535378668-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535378668-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..bd29980 Binary files /dev/null and b/assets/cache/cache-1535378668-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535378668-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip b/assets/cache/cache-1535378668-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip new file mode 100644 index 0000000..d9329ce Binary files /dev/null and b/assets/cache/cache-1535378668-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip differ diff --git a/assets/cache/cache-1535378668-d412e2f8a351e34fc3127f1f1416811b.css.gzip b/assets/cache/cache-1535378668-d412e2f8a351e34fc3127f1f1416811b.css.gzip new file mode 100644 index 0000000..df55151 Binary files /dev/null and b/assets/cache/cache-1535378668-d412e2f8a351e34fc3127f1f1416811b.css.gzip differ diff --git a/assets/cache/cache-1535379091-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535379091-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..5aaa1d6 Binary files /dev/null and b/assets/cache/cache-1535379091-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535379182-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535379182-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..d8462c6 Binary files /dev/null and b/assets/cache/cache-1535379182-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535379456-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535379456-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..5e2d47b Binary files /dev/null and b/assets/cache/cache-1535379456-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535379508-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535379508-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..3357bf1 Binary files /dev/null and b/assets/cache/cache-1535379508-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535379948-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535379948-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..31ee834 Binary files /dev/null and b/assets/cache/cache-1535379948-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535379991-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535379991-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..c18cd10 Binary files /dev/null and b/assets/cache/cache-1535379991-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535380195-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535380195-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..cbc247c Binary files /dev/null and b/assets/cache/cache-1535380195-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535380249-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535380249-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..5faa9a2 Binary files /dev/null and b/assets/cache/cache-1535380249-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535380585-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535380585-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..6ccc6ba Binary files /dev/null and b/assets/cache/cache-1535380585-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535380673-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535380673-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..b66f481 Binary files /dev/null and b/assets/cache/cache-1535380673-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535380710-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535380710-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..65e8115 Binary files /dev/null and b/assets/cache/cache-1535380710-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535380841-50019838f334c0722fed81b6c2bf89ce.css.gzip b/assets/cache/cache-1535380841-50019838f334c0722fed81b6c2bf89ce.css.gzip new file mode 100644 index 0000000..2b77773 Binary files /dev/null and b/assets/cache/cache-1535380841-50019838f334c0722fed81b6c2bf89ce.css.gzip differ diff --git a/assets/cache/cache-1535380841-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535380841-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..d42fb45 Binary files /dev/null and b/assets/cache/cache-1535380841-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535395669-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535395669-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..699e567 Binary files /dev/null and b/assets/cache/cache-1535395669-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535395754-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535395754-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..05febbc Binary files /dev/null and b/assets/cache/cache-1535395754-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535395775-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535395775-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..02a531a Binary files /dev/null and b/assets/cache/cache-1535395775-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535395835-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535395835-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..400279d Binary files /dev/null and b/assets/cache/cache-1535395835-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535395921-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535395921-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..09f9941 Binary files /dev/null and b/assets/cache/cache-1535395921-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535395943-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535395943-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..2443465 Binary files /dev/null and b/assets/cache/cache-1535395943-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535395958-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535395958-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..c273237 Binary files /dev/null and b/assets/cache/cache-1535395958-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535396014-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535396014-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..76122ee Binary files /dev/null and b/assets/cache/cache-1535396014-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535396039-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535396039-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..2a62303 Binary files /dev/null and b/assets/cache/cache-1535396039-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535396119-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535396119-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..9bdcae0 Binary files /dev/null and b/assets/cache/cache-1535396119-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535396382-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535396382-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..70e4d72 Binary files /dev/null and b/assets/cache/cache-1535396382-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535396431-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535396431-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..13ff173 Binary files /dev/null and b/assets/cache/cache-1535396431-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535396509-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535396509-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..44bb395 Binary files /dev/null and b/assets/cache/cache-1535396509-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535396529-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535396529-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..f89e60a Binary files /dev/null and b/assets/cache/cache-1535396529-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535396576-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535396576-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..903e92f Binary files /dev/null and b/assets/cache/cache-1535396576-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535396603-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535396603-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..70e4d72 Binary files /dev/null and b/assets/cache/cache-1535396603-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535396603-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535396603-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..182550e Binary files /dev/null and b/assets/cache/cache-1535396603-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535396603-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip b/assets/cache/cache-1535396603-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip new file mode 100644 index 0000000..2ca62ae Binary files /dev/null and b/assets/cache/cache-1535396603-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip differ diff --git a/assets/cache/cache-1535396629-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535396629-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..44bb395 Binary files /dev/null and b/assets/cache/cache-1535396629-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535396684-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535396684-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..cae8612 Binary files /dev/null and b/assets/cache/cache-1535396684-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535396698-50019838f334c0722fed81b6c2bf89ce.css.gzip b/assets/cache/cache-1535396698-50019838f334c0722fed81b6c2bf89ce.css.gzip new file mode 100644 index 0000000..547604d Binary files /dev/null and b/assets/cache/cache-1535396698-50019838f334c0722fed81b6c2bf89ce.css.gzip differ diff --git a/assets/cache/cache-1535396698-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535396698-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..b3e08ff Binary files /dev/null and b/assets/cache/cache-1535396698-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535396698-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip b/assets/cache/cache-1535396698-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip new file mode 100644 index 0000000..d305ada Binary files /dev/null and b/assets/cache/cache-1535396698-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip differ diff --git a/assets/cache/cache-1535396981-4969bd9c408d7899f213efeed75af19a.css.gzip b/assets/cache/cache-1535396981-4969bd9c408d7899f213efeed75af19a.css.gzip new file mode 100644 index 0000000..d8a8f9f Binary files /dev/null and b/assets/cache/cache-1535396981-4969bd9c408d7899f213efeed75af19a.css.gzip differ diff --git a/assets/cache/cache-1535396981-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535396981-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..4f4bf6b Binary files /dev/null and b/assets/cache/cache-1535396981-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535397076-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535397076-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..6543803 Binary files /dev/null and b/assets/cache/cache-1535397076-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535397740-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535397740-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..a48eb78 Binary files /dev/null and b/assets/cache/cache-1535397740-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535397777-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535397777-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..cb76d54 Binary files /dev/null and b/assets/cache/cache-1535397777-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535398275-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535398275-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..19d5744 Binary files /dev/null and b/assets/cache/cache-1535398275-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535398275-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535398275-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..0a0fe85 Binary files /dev/null and b/assets/cache/cache-1535398275-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535399060-4969bd9c408d7899f213efeed75af19a.css.gzip b/assets/cache/cache-1535399060-4969bd9c408d7899f213efeed75af19a.css.gzip new file mode 100644 index 0000000..1207445 Binary files /dev/null and b/assets/cache/cache-1535399060-4969bd9c408d7899f213efeed75af19a.css.gzip differ diff --git a/assets/cache/cache-1535399158-4969bd9c408d7899f213efeed75af19a.css.gzip b/assets/cache/cache-1535399158-4969bd9c408d7899f213efeed75af19a.css.gzip new file mode 100644 index 0000000..e08b249 Binary files /dev/null and b/assets/cache/cache-1535399158-4969bd9c408d7899f213efeed75af19a.css.gzip differ diff --git a/assets/cache/cache-1535399158-50019838f334c0722fed81b6c2bf89ce.css.gzip b/assets/cache/cache-1535399158-50019838f334c0722fed81b6c2bf89ce.css.gzip new file mode 100644 index 0000000..e029465 Binary files /dev/null and b/assets/cache/cache-1535399158-50019838f334c0722fed81b6c2bf89ce.css.gzip differ diff --git a/assets/cache/cache-1535399158-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535399158-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..9c005f8 Binary files /dev/null and b/assets/cache/cache-1535399158-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535399158-7b28133ebc7b655a27b4abbfe27823a3.css.gzip b/assets/cache/cache-1535399158-7b28133ebc7b655a27b4abbfe27823a3.css.gzip new file mode 100644 index 0000000..605aa98 Binary files /dev/null and b/assets/cache/cache-1535399158-7b28133ebc7b655a27b4abbfe27823a3.css.gzip differ diff --git a/assets/cache/cache-1535399158-d412e2f8a351e34fc3127f1f1416811b.css.gzip b/assets/cache/cache-1535399158-d412e2f8a351e34fc3127f1f1416811b.css.gzip new file mode 100644 index 0000000..64fb3b8 Binary files /dev/null and b/assets/cache/cache-1535399158-d412e2f8a351e34fc3127f1f1416811b.css.gzip differ diff --git a/assets/cache/cache-1535399279-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535399279-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..e49199a Binary files /dev/null and b/assets/cache/cache-1535399279-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535399359-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535399359-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..7dbecf0 Binary files /dev/null and b/assets/cache/cache-1535399359-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535399359-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535399359-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..94f17b7 Binary files /dev/null and b/assets/cache/cache-1535399359-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535399531-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535399531-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..43f44e8 Binary files /dev/null and b/assets/cache/cache-1535399531-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535399597-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535399597-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..8c9e6e1 Binary files /dev/null and b/assets/cache/cache-1535399597-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535399679-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535399679-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..0f0c8de Binary files /dev/null and b/assets/cache/cache-1535399679-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535399701-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535399701-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..f17ffa2 Binary files /dev/null and b/assets/cache/cache-1535399701-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535399760-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535399760-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..12b95ce Binary files /dev/null and b/assets/cache/cache-1535399760-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535399781-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535399781-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..121e049 Binary files /dev/null and b/assets/cache/cache-1535399781-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535399817-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535399817-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..7aa5814 Binary files /dev/null and b/assets/cache/cache-1535399817-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535399837-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip b/assets/cache/cache-1535399837-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip new file mode 100644 index 0000000..86ec615 Binary files /dev/null and b/assets/cache/cache-1535399837-3c3aae6fcb776f3da75ee58992fd412b.javascript.gzip differ diff --git a/assets/cache/cache-1535399927-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip b/assets/cache/cache-1535399927-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip new file mode 100644 index 0000000..aaf3a35 Binary files /dev/null and b/assets/cache/cache-1535399927-26bf89a41bec1ee5ed926a10518c04d2.javascript.gzip differ diff --git a/assets/cache/cache-1535399927-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535399927-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..2a46e32 Binary files /dev/null and b/assets/cache/cache-1535399927-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535399927-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535399927-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..00b7b08 Binary files /dev/null and b/assets/cache/cache-1535399927-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535399927-f3359686e813f16150ad34e3dc8efcad.javascript.gzip b/assets/cache/cache-1535399927-f3359686e813f16150ad34e3dc8efcad.javascript.gzip new file mode 100644 index 0000000..7d71dc7 Binary files /dev/null and b/assets/cache/cache-1535399927-f3359686e813f16150ad34e3dc8efcad.javascript.gzip differ diff --git a/assets/cache/cache-1535450962-d412e2f8a351e34fc3127f1f1416811b.css.gzip b/assets/cache/cache-1535450962-d412e2f8a351e34fc3127f1f1416811b.css.gzip new file mode 100644 index 0000000..0b8385e Binary files /dev/null and b/assets/cache/cache-1535450962-d412e2f8a351e34fc3127f1f1416811b.css.gzip differ diff --git a/assets/cache/cache-1535450981-d412e2f8a351e34fc3127f1f1416811b.css.gzip b/assets/cache/cache-1535450981-d412e2f8a351e34fc3127f1f1416811b.css.gzip new file mode 100644 index 0000000..10361a6 Binary files /dev/null and b/assets/cache/cache-1535450981-d412e2f8a351e34fc3127f1f1416811b.css.gzip differ diff --git a/assets/cache/cache-1535451006-50019838f334c0722fed81b6c2bf89ce.css.gzip b/assets/cache/cache-1535451006-50019838f334c0722fed81b6c2bf89ce.css.gzip new file mode 100644 index 0000000..d2448a5 Binary files /dev/null and b/assets/cache/cache-1535451006-50019838f334c0722fed81b6c2bf89ce.css.gzip differ diff --git a/assets/cache/cache-1535451006-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535451006-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..5e990e2 Binary files /dev/null and b/assets/cache/cache-1535451006-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535451006-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip b/assets/cache/cache-1535451006-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip new file mode 100644 index 0000000..ba3e736 Binary files /dev/null and b/assets/cache/cache-1535451006-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip differ diff --git a/assets/cache/cache-1535451006-7b28133ebc7b655a27b4abbfe27823a3.css.gzip b/assets/cache/cache-1535451006-7b28133ebc7b655a27b4abbfe27823a3.css.gzip new file mode 100644 index 0000000..7a15995 Binary files /dev/null and b/assets/cache/cache-1535451006-7b28133ebc7b655a27b4abbfe27823a3.css.gzip differ diff --git a/assets/cache/cache-1535451006-d412e2f8a351e34fc3127f1f1416811b.css.gzip b/assets/cache/cache-1535451006-d412e2f8a351e34fc3127f1f1416811b.css.gzip new file mode 100644 index 0000000..29f3fbb Binary files /dev/null and b/assets/cache/cache-1535451006-d412e2f8a351e34fc3127f1f1416811b.css.gzip differ diff --git a/assets/cache/cache-1535455324-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535455324-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..741151a Binary files /dev/null and b/assets/cache/cache-1535455324-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535455358-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535455358-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..9499936 Binary files /dev/null and b/assets/cache/cache-1535455358-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535455461-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535455461-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..cc0c87b Binary files /dev/null and b/assets/cache/cache-1535455461-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535455519-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535455519-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..c6e3607 Binary files /dev/null and b/assets/cache/cache-1535455519-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535455742-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535455742-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..d5389f7 Binary files /dev/null and b/assets/cache/cache-1535455742-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535455784-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535455784-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..c6e3607 Binary files /dev/null and b/assets/cache/cache-1535455784-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535455805-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535455805-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..1ed3cab Binary files /dev/null and b/assets/cache/cache-1535455805-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535455805-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip b/assets/cache/cache-1535455805-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip new file mode 100644 index 0000000..bae92b0 Binary files /dev/null and b/assets/cache/cache-1535455805-c9e0a5c27c2d1a89c7b5162466c57582.javascript.gzip differ diff --git a/assets/cache/cache-1535455805-f3359686e813f16150ad34e3dc8efcad.javascript.gzip b/assets/cache/cache-1535455805-f3359686e813f16150ad34e3dc8efcad.javascript.gzip new file mode 100644 index 0000000..612006b Binary files /dev/null and b/assets/cache/cache-1535455805-f3359686e813f16150ad34e3dc8efcad.javascript.gzip differ diff --git a/assets/cache/cache-1535455975-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535455975-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..0074646 Binary files /dev/null and b/assets/cache/cache-1535455975-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535455975-c515cd4458e091edc3109e8a129b558d.javascript.gzip b/assets/cache/cache-1535455975-c515cd4458e091edc3109e8a129b558d.javascript.gzip new file mode 100644 index 0000000..2217db4 Binary files /dev/null and b/assets/cache/cache-1535455975-c515cd4458e091edc3109e8a129b558d.javascript.gzip differ diff --git a/assets/cache/cache-1535456086-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535456086-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..7da8d7a Binary files /dev/null and b/assets/cache/cache-1535456086-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535456086-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535456086-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..d21827e Binary files /dev/null and b/assets/cache/cache-1535456086-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535456110-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535456110-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..7991643 Binary files /dev/null and b/assets/cache/cache-1535456110-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535456126-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535456126-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..9123883 Binary files /dev/null and b/assets/cache/cache-1535456126-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535456126-7b28133ebc7b655a27b4abbfe27823a3.css.gzip b/assets/cache/cache-1535456126-7b28133ebc7b655a27b4abbfe27823a3.css.gzip new file mode 100644 index 0000000..6ce54a2 Binary files /dev/null and b/assets/cache/cache-1535456126-7b28133ebc7b655a27b4abbfe27823a3.css.gzip differ diff --git a/assets/cache/cache-1535456280-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535456280-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..bf43d93 Binary files /dev/null and b/assets/cache/cache-1535456280-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535456301-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535456301-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..2bfc1e7 Binary files /dev/null and b/assets/cache/cache-1535456301-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535456344-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535456344-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..1cee851 Binary files /dev/null and b/assets/cache/cache-1535456344-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535456460-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535456460-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..2d1b71a Binary files /dev/null and b/assets/cache/cache-1535456460-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535456537-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535456537-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..a8ccc0c Binary files /dev/null and b/assets/cache/cache-1535456537-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535456617-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535456617-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..7b6ffb5 Binary files /dev/null and b/assets/cache/cache-1535456617-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535456700-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535456700-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..b148954 Binary files /dev/null and b/assets/cache/cache-1535456700-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535456732-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535456732-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..1a0ef80 Binary files /dev/null and b/assets/cache/cache-1535456732-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535456764-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip b/assets/cache/cache-1535456764-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip new file mode 100644 index 0000000..88fcc21 Binary files /dev/null and b/assets/cache/cache-1535456764-3100ae524d2c92e023c11b4e860e40ca.javascript.gzip differ diff --git a/assets/cache/cache-1535456764-64d013c8d0fd9b3d11c7ca48bcb34d59.javascript.gzip b/assets/cache/cache-1535456764-64d013c8d0fd9b3d11c7ca48bcb34d59.javascript.gzip new file mode 100644 index 0000000..912e8ee Binary files /dev/null and b/assets/cache/cache-1535456764-64d013c8d0fd9b3d11c7ca48bcb34d59.javascript.gzip differ diff --git a/assets/cache/cache-1535459451-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip b/assets/cache/cache-1535459451-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip new file mode 100644 index 0000000..9698377 Binary files /dev/null and b/assets/cache/cache-1535459451-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip differ diff --git a/assets/cache/cache-1535459451-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip b/assets/cache/cache-1535459451-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip new file mode 100644 index 0000000..8092cfe Binary files /dev/null and b/assets/cache/cache-1535459451-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip differ diff --git a/assets/cache/cache-1535460206-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535460206-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..d060b61 Binary files /dev/null and b/assets/cache/cache-1535460206-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535460223-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535460223-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..26ece8d Binary files /dev/null and b/assets/cache/cache-1535460223-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535460223-7b28133ebc7b655a27b4abbfe27823a3.css.gzip b/assets/cache/cache-1535460223-7b28133ebc7b655a27b4abbfe27823a3.css.gzip new file mode 100644 index 0000000..b6cf5a5 Binary files /dev/null and b/assets/cache/cache-1535460223-7b28133ebc7b655a27b4abbfe27823a3.css.gzip differ diff --git a/assets/cache/cache-1535460318-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip b/assets/cache/cache-1535460318-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip new file mode 100644 index 0000000..64d5914 Binary files /dev/null and b/assets/cache/cache-1535460318-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip differ diff --git a/assets/cache/cache-1535460318-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip b/assets/cache/cache-1535460318-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip new file mode 100644 index 0000000..5c39977 Binary files /dev/null and b/assets/cache/cache-1535460318-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip differ diff --git a/assets/cache/cache-1535460372-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip b/assets/cache/cache-1535460372-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip new file mode 100644 index 0000000..dfc1476 Binary files /dev/null and b/assets/cache/cache-1535460372-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip differ diff --git a/assets/cache/cache-1535460372-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip b/assets/cache/cache-1535460372-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip new file mode 100644 index 0000000..6878158 Binary files /dev/null and b/assets/cache/cache-1535460372-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip differ diff --git a/assets/cache/cache-1535460411-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip b/assets/cache/cache-1535460411-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip new file mode 100644 index 0000000..48e0fa8 Binary files /dev/null and b/assets/cache/cache-1535460411-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip differ diff --git a/assets/cache/cache-1535460411-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip b/assets/cache/cache-1535460411-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip new file mode 100644 index 0000000..9032b53 Binary files /dev/null and b/assets/cache/cache-1535460411-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip differ diff --git a/assets/cache/cache-1535460503-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip b/assets/cache/cache-1535460503-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip new file mode 100644 index 0000000..ace3011 Binary files /dev/null and b/assets/cache/cache-1535460503-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip differ diff --git a/assets/cache/cache-1535460503-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip b/assets/cache/cache-1535460503-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip new file mode 100644 index 0000000..5d70f5f Binary files /dev/null and b/assets/cache/cache-1535460503-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip differ diff --git a/assets/cache/cache-1535460580-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip b/assets/cache/cache-1535460580-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip new file mode 100644 index 0000000..79eae70 Binary files /dev/null and b/assets/cache/cache-1535460580-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip differ diff --git a/assets/cache/cache-1535460580-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip b/assets/cache/cache-1535460580-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip new file mode 100644 index 0000000..9c4ef37 Binary files /dev/null and b/assets/cache/cache-1535460580-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip differ diff --git a/assets/cache/cache-1535460621-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip b/assets/cache/cache-1535460621-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip new file mode 100644 index 0000000..b4d5c27 Binary files /dev/null and b/assets/cache/cache-1535460621-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip differ diff --git a/assets/cache/cache-1535460621-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip b/assets/cache/cache-1535460621-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip new file mode 100644 index 0000000..8cc2c56 Binary files /dev/null and b/assets/cache/cache-1535460621-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip differ diff --git a/assets/cache/cache-1535460670-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip b/assets/cache/cache-1535460670-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip new file mode 100644 index 0000000..654c194 Binary files /dev/null and b/assets/cache/cache-1535460670-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip differ diff --git a/assets/cache/cache-1535460670-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip b/assets/cache/cache-1535460670-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip new file mode 100644 index 0000000..0c519fc Binary files /dev/null and b/assets/cache/cache-1535460670-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip differ diff --git a/assets/cache/cache-1535460716-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip b/assets/cache/cache-1535460716-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip new file mode 100644 index 0000000..46660b1 Binary files /dev/null and b/assets/cache/cache-1535460716-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip differ diff --git a/assets/cache/cache-1535460735-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip b/assets/cache/cache-1535460735-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip new file mode 100644 index 0000000..654c194 Binary files /dev/null and b/assets/cache/cache-1535460735-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip differ diff --git a/assets/cache/cache-1535460832-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip b/assets/cache/cache-1535460832-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip new file mode 100644 index 0000000..b43567c Binary files /dev/null and b/assets/cache/cache-1535460832-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip differ diff --git a/assets/cache/cache-1535460846-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip b/assets/cache/cache-1535460846-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip new file mode 100644 index 0000000..1e4e04c Binary files /dev/null and b/assets/cache/cache-1535460846-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip differ diff --git a/assets/cache/cache-1535460981-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip b/assets/cache/cache-1535460981-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip new file mode 100644 index 0000000..90d9f88 Binary files /dev/null and b/assets/cache/cache-1535460981-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip differ diff --git a/assets/cache/cache-1535461015-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip b/assets/cache/cache-1535461015-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip new file mode 100644 index 0000000..287a02a Binary files /dev/null and b/assets/cache/cache-1535461015-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip differ diff --git a/assets/cache/cache-1535462027-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535462027-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..2ef18db Binary files /dev/null and b/assets/cache/cache-1535462027-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535462027-367b5e35e6bf0828bc18341b621e625f.css.gzip b/assets/cache/cache-1535462027-367b5e35e6bf0828bc18341b621e625f.css.gzip new file mode 100644 index 0000000..9db6be9 Binary files /dev/null and b/assets/cache/cache-1535462027-367b5e35e6bf0828bc18341b621e625f.css.gzip differ diff --git a/assets/cache/cache-1535462027-4969bd9c408d7899f213efeed75af19a.css.gzip b/assets/cache/cache-1535462027-4969bd9c408d7899f213efeed75af19a.css.gzip new file mode 100644 index 0000000..7b4a70d Binary files /dev/null and b/assets/cache/cache-1535462027-4969bd9c408d7899f213efeed75af19a.css.gzip differ diff --git a/assets/cache/cache-1535462027-50019838f334c0722fed81b6c2bf89ce.css.gzip b/assets/cache/cache-1535462027-50019838f334c0722fed81b6c2bf89ce.css.gzip new file mode 100644 index 0000000..0e60ed9 Binary files /dev/null and b/assets/cache/cache-1535462027-50019838f334c0722fed81b6c2bf89ce.css.gzip differ diff --git a/assets/cache/cache-1535462027-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535462027-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..1370dbc Binary files /dev/null and b/assets/cache/cache-1535462027-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535462027-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip b/assets/cache/cache-1535462027-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip new file mode 100644 index 0000000..2a392a5 Binary files /dev/null and b/assets/cache/cache-1535462027-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip differ diff --git a/assets/cache/cache-1535462027-7b28133ebc7b655a27b4abbfe27823a3.css.gzip b/assets/cache/cache-1535462027-7b28133ebc7b655a27b4abbfe27823a3.css.gzip new file mode 100644 index 0000000..43cf7ef Binary files /dev/null and b/assets/cache/cache-1535462027-7b28133ebc7b655a27b4abbfe27823a3.css.gzip differ diff --git a/assets/cache/cache-1535462027-b4b0cf5472a89976a4af9c577761c4ce.css.gzip b/assets/cache/cache-1535462027-b4b0cf5472a89976a4af9c577761c4ce.css.gzip new file mode 100644 index 0000000..c8755b7 Binary files /dev/null and b/assets/cache/cache-1535462027-b4b0cf5472a89976a4af9c577761c4ce.css.gzip differ diff --git a/assets/cache/cache-1535462027-d412e2f8a351e34fc3127f1f1416811b.css.gzip b/assets/cache/cache-1535462027-d412e2f8a351e34fc3127f1f1416811b.css.gzip new file mode 100644 index 0000000..bd10e1d Binary files /dev/null and b/assets/cache/cache-1535462027-d412e2f8a351e34fc3127f1f1416811b.css.gzip differ diff --git a/assets/cache/cache-1535462076-9b26f1d86bc419d2c922eaff01329f4f.javascript.gzip b/assets/cache/cache-1535462076-9b26f1d86bc419d2c922eaff01329f4f.javascript.gzip new file mode 100644 index 0000000..db71257 Binary files /dev/null and b/assets/cache/cache-1535462076-9b26f1d86bc419d2c922eaff01329f4f.javascript.gzip differ diff --git a/assets/cache/cache-1535462076-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip b/assets/cache/cache-1535462076-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip new file mode 100644 index 0000000..4a917a5 Binary files /dev/null and b/assets/cache/cache-1535462076-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip differ diff --git a/assets/cache/cache-1535462149-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip b/assets/cache/cache-1535462149-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip new file mode 100644 index 0000000..32e567d Binary files /dev/null and b/assets/cache/cache-1535462149-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip differ diff --git a/assets/cache/cache-1535462922-9b26f1d86bc419d2c922eaff01329f4f.javascript.gzip b/assets/cache/cache-1535462922-9b26f1d86bc419d2c922eaff01329f4f.javascript.gzip new file mode 100644 index 0000000..45070db Binary files /dev/null and b/assets/cache/cache-1535462922-9b26f1d86bc419d2c922eaff01329f4f.javascript.gzip differ diff --git a/assets/cache/cache-1535462967-9b26f1d86bc419d2c922eaff01329f4f.javascript.gzip b/assets/cache/cache-1535462967-9b26f1d86bc419d2c922eaff01329f4f.javascript.gzip new file mode 100644 index 0000000..a489df1 Binary files /dev/null and b/assets/cache/cache-1535462967-9b26f1d86bc419d2c922eaff01329f4f.javascript.gzip differ diff --git a/assets/cache/cache-1535463067-45fe999fbfa2c2a81442bb0a8dc5830a.javascript.gzip b/assets/cache/cache-1535463067-45fe999fbfa2c2a81442bb0a8dc5830a.javascript.gzip new file mode 100644 index 0000000..149b3b6 Binary files /dev/null and b/assets/cache/cache-1535463067-45fe999fbfa2c2a81442bb0a8dc5830a.javascript.gzip differ diff --git a/assets/cache/cache-1535463067-9b26f1d86bc419d2c922eaff01329f4f.javascript.gzip b/assets/cache/cache-1535463067-9b26f1d86bc419d2c922eaff01329f4f.javascript.gzip new file mode 100644 index 0000000..525ded0 Binary files /dev/null and b/assets/cache/cache-1535463067-9b26f1d86bc419d2c922eaff01329f4f.javascript.gzip differ diff --git a/assets/cache/cache-1535463067-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip b/assets/cache/cache-1535463067-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip new file mode 100644 index 0000000..08b5b78 Binary files /dev/null and b/assets/cache/cache-1535463067-b67c1090ffd63db1028fd4ffbede3fc6.javascript.gzip differ diff --git a/assets/cache/cache-1535463067-bc6b9e642152c34e0a6270516ebb96ef.javascript.gzip b/assets/cache/cache-1535463067-bc6b9e642152c34e0a6270516ebb96ef.javascript.gzip new file mode 100644 index 0000000..a7a846a Binary files /dev/null and b/assets/cache/cache-1535463067-bc6b9e642152c34e0a6270516ebb96ef.javascript.gzip differ diff --git a/assets/cache/cache-1535463067-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip b/assets/cache/cache-1535463067-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip new file mode 100644 index 0000000..8acc111 Binary files /dev/null and b/assets/cache/cache-1535463067-eb3c6679575d18b4c1569f64a4d59742.javascript.gzip differ diff --git a/assets/cache/cache-1535560379-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip b/assets/cache/cache-1535560379-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip new file mode 100644 index 0000000..49c9080 Binary files /dev/null and b/assets/cache/cache-1535560379-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip differ diff --git a/assets/cache/cache-1535560409-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip b/assets/cache/cache-1535560409-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip new file mode 100644 index 0000000..a876a08 Binary files /dev/null and b/assets/cache/cache-1535560409-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip differ diff --git a/assets/cache/cache-1535561692-bc6b9e642152c34e0a6270516ebb96ef.javascript.gzip b/assets/cache/cache-1535561692-bc6b9e642152c34e0a6270516ebb96ef.javascript.gzip new file mode 100644 index 0000000..c218598 Binary files /dev/null and b/assets/cache/cache-1535561692-bc6b9e642152c34e0a6270516ebb96ef.javascript.gzip differ diff --git a/assets/cache/cache-1535561844-baad5f4b9398adc2ddf69ff18cb05a9c.javascript.gzip b/assets/cache/cache-1535561844-baad5f4b9398adc2ddf69ff18cb05a9c.javascript.gzip new file mode 100644 index 0000000..6c5ee33 Binary files /dev/null and b/assets/cache/cache-1535561844-baad5f4b9398adc2ddf69ff18cb05a9c.javascript.gzip differ diff --git a/assets/cache/cache-1535564299-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip b/assets/cache/cache-1535564299-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip new file mode 100644 index 0000000..a7ec713 Binary files /dev/null and b/assets/cache/cache-1535564299-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip differ diff --git a/assets/cache/cache-1535564299-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1535564299-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..fe745a2 Binary files /dev/null and b/assets/cache/cache-1535564299-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1535564412-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1535564412-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..6cfc2c9 Binary files /dev/null and b/assets/cache/cache-1535564412-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1535564541-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1535564541-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..8742105 Binary files /dev/null and b/assets/cache/cache-1535564541-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1535564578-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1535564578-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..e0131d8 Binary files /dev/null and b/assets/cache/cache-1535564578-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1535564589-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1535564589-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..e10a6ef Binary files /dev/null and b/assets/cache/cache-1535564589-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1535564962-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1535564962-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..a951110 Binary files /dev/null and b/assets/cache/cache-1535564962-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1535565092-373ff8c5c2b57eb5fea09a17e5b73dcb.javascript.gzip b/assets/cache/cache-1535565092-373ff8c5c2b57eb5fea09a17e5b73dcb.javascript.gzip new file mode 100644 index 0000000..f14239d Binary files /dev/null and b/assets/cache/cache-1535565092-373ff8c5c2b57eb5fea09a17e5b73dcb.javascript.gzip differ diff --git a/assets/cache/cache-1535565092-39f366a9e093b5ece6067825131532c0.javascript.gzip b/assets/cache/cache-1535565092-39f366a9e093b5ece6067825131532c0.javascript.gzip new file mode 100644 index 0000000..0d32112 Binary files /dev/null and b/assets/cache/cache-1535565092-39f366a9e093b5ece6067825131532c0.javascript.gzip differ diff --git a/assets/cache/cache-1535565092-449817ed53db71aa9820b2044f217260.javascript.gzip b/assets/cache/cache-1535565092-449817ed53db71aa9820b2044f217260.javascript.gzip new file mode 100644 index 0000000..6d399a1 Binary files /dev/null and b/assets/cache/cache-1535565092-449817ed53db71aa9820b2044f217260.javascript.gzip differ diff --git a/assets/cache/cache-1535565092-baad5f4b9398adc2ddf69ff18cb05a9c.javascript.gzip b/assets/cache/cache-1535565092-baad5f4b9398adc2ddf69ff18cb05a9c.javascript.gzip new file mode 100644 index 0000000..8ccc60b Binary files /dev/null and b/assets/cache/cache-1535565092-baad5f4b9398adc2ddf69ff18cb05a9c.javascript.gzip differ diff --git a/assets/cache/cache-1535565092-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip b/assets/cache/cache-1535565092-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip new file mode 100644 index 0000000..e2baeea Binary files /dev/null and b/assets/cache/cache-1535565092-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip differ diff --git a/assets/cache/cache-1535565092-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1535565092-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..29df936 Binary files /dev/null and b/assets/cache/cache-1535565092-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1535565092-eef91deb6c662460dc2c594a93364434.javascript.gzip b/assets/cache/cache-1535565092-eef91deb6c662460dc2c594a93364434.javascript.gzip new file mode 100644 index 0000000..17b4afa Binary files /dev/null and b/assets/cache/cache-1535565092-eef91deb6c662460dc2c594a93364434.javascript.gzip differ diff --git a/assets/cache/cache-1535649917-d4a0ee432180c28341a6841c5cee5207.javascript.gzip b/assets/cache/cache-1535649917-d4a0ee432180c28341a6841c5cee5207.javascript.gzip new file mode 100644 index 0000000..3a6ce3c Binary files /dev/null and b/assets/cache/cache-1535649917-d4a0ee432180c28341a6841c5cee5207.javascript.gzip differ diff --git a/assets/cache/cache-1535660512-39f366a9e093b5ece6067825131532c0.javascript.gzip b/assets/cache/cache-1535660512-39f366a9e093b5ece6067825131532c0.javascript.gzip new file mode 100644 index 0000000..1741fea Binary files /dev/null and b/assets/cache/cache-1535660512-39f366a9e093b5ece6067825131532c0.javascript.gzip differ diff --git a/assets/cache/cache-1535660512-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1535660512-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..13e57b7 Binary files /dev/null and b/assets/cache/cache-1535660512-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1535660562-39f366a9e093b5ece6067825131532c0.javascript.gzip b/assets/cache/cache-1535660562-39f366a9e093b5ece6067825131532c0.javascript.gzip new file mode 100644 index 0000000..d391ec6 Binary files /dev/null and b/assets/cache/cache-1535660562-39f366a9e093b5ece6067825131532c0.javascript.gzip differ diff --git a/assets/cache/cache-1535660562-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1535660562-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..5f1ab19 Binary files /dev/null and b/assets/cache/cache-1535660562-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1535660707-39f366a9e093b5ece6067825131532c0.javascript.gzip b/assets/cache/cache-1535660707-39f366a9e093b5ece6067825131532c0.javascript.gzip new file mode 100644 index 0000000..09c37de Binary files /dev/null and b/assets/cache/cache-1535660707-39f366a9e093b5ece6067825131532c0.javascript.gzip differ diff --git a/assets/cache/cache-1535660707-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip b/assets/cache/cache-1535660707-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip new file mode 100644 index 0000000..bff4c97 Binary files /dev/null and b/assets/cache/cache-1535660707-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip differ diff --git a/assets/cache/cache-1535660707-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1535660707-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..bd76e8e Binary files /dev/null and b/assets/cache/cache-1535660707-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1535725787-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535725787-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..563e1f3 Binary files /dev/null and b/assets/cache/cache-1535725787-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535725808-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535725808-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..12bf022 Binary files /dev/null and b/assets/cache/cache-1535725808-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535725823-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535725823-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..9c4586b Binary files /dev/null and b/assets/cache/cache-1535725823-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535725837-103d2d2419ad94e3dcb34a561c22d024.css.gzip b/assets/cache/cache-1535725837-103d2d2419ad94e3dcb34a561c22d024.css.gzip new file mode 100644 index 0000000..66a744e Binary files /dev/null and b/assets/cache/cache-1535725837-103d2d2419ad94e3dcb34a561c22d024.css.gzip differ diff --git a/assets/cache/cache-1535725837-2c9a7b4037360a25ebf4312e29d0ec3d.css.gzip b/assets/cache/cache-1535725837-2c9a7b4037360a25ebf4312e29d0ec3d.css.gzip new file mode 100644 index 0000000..3659bf1 Binary files /dev/null and b/assets/cache/cache-1535725837-2c9a7b4037360a25ebf4312e29d0ec3d.css.gzip differ diff --git a/assets/cache/cache-1535725837-2f607fd2d8967151cda85ac477ef1569.css.gzip b/assets/cache/cache-1535725837-2f607fd2d8967151cda85ac477ef1569.css.gzip new file mode 100644 index 0000000..77bc8c0 Binary files /dev/null and b/assets/cache/cache-1535725837-2f607fd2d8967151cda85ac477ef1569.css.gzip differ diff --git a/assets/cache/cache-1535725837-367b5e35e6bf0828bc18341b621e625f.css.gzip b/assets/cache/cache-1535725837-367b5e35e6bf0828bc18341b621e625f.css.gzip new file mode 100644 index 0000000..a2725a4 Binary files /dev/null and b/assets/cache/cache-1535725837-367b5e35e6bf0828bc18341b621e625f.css.gzip differ diff --git a/assets/cache/cache-1535725837-4969bd9c408d7899f213efeed75af19a.css.gzip b/assets/cache/cache-1535725837-4969bd9c408d7899f213efeed75af19a.css.gzip new file mode 100644 index 0000000..73297af Binary files /dev/null and b/assets/cache/cache-1535725837-4969bd9c408d7899f213efeed75af19a.css.gzip differ diff --git a/assets/cache/cache-1535725837-50019838f334c0722fed81b6c2bf89ce.css.gzip b/assets/cache/cache-1535725837-50019838f334c0722fed81b6c2bf89ce.css.gzip new file mode 100644 index 0000000..c5ce1e3 Binary files /dev/null and b/assets/cache/cache-1535725837-50019838f334c0722fed81b6c2bf89ce.css.gzip differ diff --git a/assets/cache/cache-1535725837-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535725837-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..9e3dd55 Binary files /dev/null and b/assets/cache/cache-1535725837-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535725837-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip b/assets/cache/cache-1535725837-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip new file mode 100644 index 0000000..9f88dfb Binary files /dev/null and b/assets/cache/cache-1535725837-664ddfc32ea77da9a3b4871c81b4bda5.css.gzip differ diff --git a/assets/cache/cache-1535725837-73f24cb0a00d3dbf24b5e9c280282cd1.css.gzip b/assets/cache/cache-1535725837-73f24cb0a00d3dbf24b5e9c280282cd1.css.gzip new file mode 100644 index 0000000..02b6665 Binary files /dev/null and b/assets/cache/cache-1535725837-73f24cb0a00d3dbf24b5e9c280282cd1.css.gzip differ diff --git a/assets/cache/cache-1535725837-7b28133ebc7b655a27b4abbfe27823a3.css.gzip b/assets/cache/cache-1535725837-7b28133ebc7b655a27b4abbfe27823a3.css.gzip new file mode 100644 index 0000000..30c76be Binary files /dev/null and b/assets/cache/cache-1535725837-7b28133ebc7b655a27b4abbfe27823a3.css.gzip differ diff --git a/assets/cache/cache-1535725837-b4b0cf5472a89976a4af9c577761c4ce.css.gzip b/assets/cache/cache-1535725837-b4b0cf5472a89976a4af9c577761c4ce.css.gzip new file mode 100644 index 0000000..7c386e8 Binary files /dev/null and b/assets/cache/cache-1535725837-b4b0cf5472a89976a4af9c577761c4ce.css.gzip differ diff --git a/assets/cache/cache-1535725837-bdfb9fe466f411ff23f3388dd77fc57d.css.gzip b/assets/cache/cache-1535725837-bdfb9fe466f411ff23f3388dd77fc57d.css.gzip new file mode 100644 index 0000000..2606e79 Binary files /dev/null and b/assets/cache/cache-1535725837-bdfb9fe466f411ff23f3388dd77fc57d.css.gzip differ diff --git a/assets/cache/cache-1535725837-d6183650a7c4605db87128d0e8f12765.css.gzip b/assets/cache/cache-1535725837-d6183650a7c4605db87128d0e8f12765.css.gzip new file mode 100644 index 0000000..0b7375e Binary files /dev/null and b/assets/cache/cache-1535725837-d6183650a7c4605db87128d0e8f12765.css.gzip differ diff --git a/assets/cache/cache-1535795126-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip b/assets/cache/cache-1535795126-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip new file mode 100644 index 0000000..20f4e09 Binary files /dev/null and b/assets/cache/cache-1535795126-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip differ diff --git a/assets/cache/cache-1535795126-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1535795126-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..3628ad4 Binary files /dev/null and b/assets/cache/cache-1535795126-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1535799154-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535799154-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..fb2328d Binary files /dev/null and b/assets/cache/cache-1535799154-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535799382-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535799382-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..89d26ca Binary files /dev/null and b/assets/cache/cache-1535799382-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535799412-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535799412-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..3d7d392 Binary files /dev/null and b/assets/cache/cache-1535799412-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535799487-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535799487-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..4355194 Binary files /dev/null and b/assets/cache/cache-1535799487-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535799499-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535799499-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..ed71bd1 Binary files /dev/null and b/assets/cache/cache-1535799499-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535799506-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1535799506-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..e9c0362 Binary files /dev/null and b/assets/cache/cache-1535799506-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1535801329-449817ed53db71aa9820b2044f217260.javascript.gzip b/assets/cache/cache-1535801329-449817ed53db71aa9820b2044f217260.javascript.gzip new file mode 100644 index 0000000..343114e Binary files /dev/null and b/assets/cache/cache-1535801329-449817ed53db71aa9820b2044f217260.javascript.gzip differ diff --git a/assets/cache/cache-1535801329-594549a61322abb75122d36544ec2a2d.javascript.gzip b/assets/cache/cache-1535801329-594549a61322abb75122d36544ec2a2d.javascript.gzip new file mode 100644 index 0000000..7c03eb6 Binary files /dev/null and b/assets/cache/cache-1535801329-594549a61322abb75122d36544ec2a2d.javascript.gzip differ diff --git a/assets/cache/cache-1535801329-60d71806ed5ecf54bbbbf613621e5a17.javascript.gzip b/assets/cache/cache-1535801329-60d71806ed5ecf54bbbbf613621e5a17.javascript.gzip new file mode 100644 index 0000000..d90365a Binary files /dev/null and b/assets/cache/cache-1535801329-60d71806ed5ecf54bbbbf613621e5a17.javascript.gzip differ diff --git a/assets/cache/cache-1535801329-7e73f5a0ef62f932968e6d0ecfcd67b8.javascript.gzip b/assets/cache/cache-1535801329-7e73f5a0ef62f932968e6d0ecfcd67b8.javascript.gzip new file mode 100644 index 0000000..aaca99f Binary files /dev/null and b/assets/cache/cache-1535801329-7e73f5a0ef62f932968e6d0ecfcd67b8.javascript.gzip differ diff --git a/assets/cache/cache-1535801329-baad5f4b9398adc2ddf69ff18cb05a9c.javascript.gzip b/assets/cache/cache-1535801329-baad5f4b9398adc2ddf69ff18cb05a9c.javascript.gzip new file mode 100644 index 0000000..5a7d398 Binary files /dev/null and b/assets/cache/cache-1535801329-baad5f4b9398adc2ddf69ff18cb05a9c.javascript.gzip differ diff --git a/assets/cache/cache-1535801329-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip b/assets/cache/cache-1535801329-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip new file mode 100644 index 0000000..99b9c7b Binary files /dev/null and b/assets/cache/cache-1535801329-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip differ diff --git a/assets/cache/cache-1535801329-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1535801329-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..44ab108 Binary files /dev/null and b/assets/cache/cache-1535801329-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1535801329-eef91deb6c662460dc2c594a93364434.javascript.gzip b/assets/cache/cache-1535801329-eef91deb6c662460dc2c594a93364434.javascript.gzip new file mode 100644 index 0000000..e6a52b9 Binary files /dev/null and b/assets/cache/cache-1535801329-eef91deb6c662460dc2c594a93364434.javascript.gzip differ diff --git a/assets/cache/cache-1535807822-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535807822-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..55a2a4c Binary files /dev/null and b/assets/cache/cache-1535807822-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535808284-33495986ac270464a1003fc99e93b0cf.javascript.gzip b/assets/cache/cache-1535808284-33495986ac270464a1003fc99e93b0cf.javascript.gzip new file mode 100644 index 0000000..da3346d Binary files /dev/null and b/assets/cache/cache-1535808284-33495986ac270464a1003fc99e93b0cf.javascript.gzip differ diff --git a/assets/cache/cache-1535808284-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535808284-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..731c69b Binary files /dev/null and b/assets/cache/cache-1535808284-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535808284-c1527d10a83781c07ac9e1963dffe69c.javascript.gzip b/assets/cache/cache-1535808284-c1527d10a83781c07ac9e1963dffe69c.javascript.gzip new file mode 100644 index 0000000..5851e37 Binary files /dev/null and b/assets/cache/cache-1535808284-c1527d10a83781c07ac9e1963dffe69c.javascript.gzip differ diff --git a/assets/cache/cache-1535808284-f99806565fbb2b9d5ed54c8ac02ff75a.javascript.gzip b/assets/cache/cache-1535808284-f99806565fbb2b9d5ed54c8ac02ff75a.javascript.gzip new file mode 100644 index 0000000..07a8a55 Binary files /dev/null and b/assets/cache/cache-1535808284-f99806565fbb2b9d5ed54c8ac02ff75a.javascript.gzip differ diff --git a/assets/cache/cache-1535818343-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535818343-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..274aaa5 Binary files /dev/null and b/assets/cache/cache-1535818343-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535818589-2c9a7b4037360a25ebf4312e29d0ec3d.css.gzip b/assets/cache/cache-1535818589-2c9a7b4037360a25ebf4312e29d0ec3d.css.gzip new file mode 100644 index 0000000..0dd94c5 Binary files /dev/null and b/assets/cache/cache-1535818589-2c9a7b4037360a25ebf4312e29d0ec3d.css.gzip differ diff --git a/assets/cache/cache-1535818662-2c9a7b4037360a25ebf4312e29d0ec3d.css.gzip b/assets/cache/cache-1535818662-2c9a7b4037360a25ebf4312e29d0ec3d.css.gzip new file mode 100644 index 0000000..c474d56 Binary files /dev/null and b/assets/cache/cache-1535818662-2c9a7b4037360a25ebf4312e29d0ec3d.css.gzip differ diff --git a/assets/cache/cache-1535818662-7edafa94c6aeaba9892040a31e2f1e0a.css.gzip b/assets/cache/cache-1535818662-7edafa94c6aeaba9892040a31e2f1e0a.css.gzip new file mode 100644 index 0000000..e481ebe Binary files /dev/null and b/assets/cache/cache-1535818662-7edafa94c6aeaba9892040a31e2f1e0a.css.gzip differ diff --git a/assets/cache/cache-1535819012-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535819012-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..b69805b Binary files /dev/null and b/assets/cache/cache-1535819012-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535819119-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535819119-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..91d5509 Binary files /dev/null and b/assets/cache/cache-1535819119-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535819142-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535819142-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..40ca9fb Binary files /dev/null and b/assets/cache/cache-1535819142-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535819147-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535819147-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..f1b9190 Binary files /dev/null and b/assets/cache/cache-1535819147-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535819152-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535819152-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..40ca9fb Binary files /dev/null and b/assets/cache/cache-1535819152-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535819192-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535819192-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..e4fb590 Binary files /dev/null and b/assets/cache/cache-1535819192-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535830862-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535830862-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..7e27237 Binary files /dev/null and b/assets/cache/cache-1535830862-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535830973-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535830973-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..36bfa23 Binary files /dev/null and b/assets/cache/cache-1535830973-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535831050-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535831050-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..ae28fa7 Binary files /dev/null and b/assets/cache/cache-1535831050-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535831498-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535831498-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..a3dd8a4 Binary files /dev/null and b/assets/cache/cache-1535831498-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535832392-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535832392-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..f139959 Binary files /dev/null and b/assets/cache/cache-1535832392-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535832456-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535832456-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..371774e Binary files /dev/null and b/assets/cache/cache-1535832456-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535832637-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535832637-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..7944055 Binary files /dev/null and b/assets/cache/cache-1535832637-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535832679-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535832679-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..76d6bc0 Binary files /dev/null and b/assets/cache/cache-1535832679-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535832792-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535832792-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..9a7dd35 Binary files /dev/null and b/assets/cache/cache-1535832792-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535880495-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535880495-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..19aa74e Binary files /dev/null and b/assets/cache/cache-1535880495-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535881117-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535881117-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..1383094 Binary files /dev/null and b/assets/cache/cache-1535881117-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535883974-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535883974-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..e01accd Binary files /dev/null and b/assets/cache/cache-1535883974-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535883974-c1527d10a83781c07ac9e1963dffe69c.javascript.gzip b/assets/cache/cache-1535883974-c1527d10a83781c07ac9e1963dffe69c.javascript.gzip new file mode 100644 index 0000000..d76dfec Binary files /dev/null and b/assets/cache/cache-1535883974-c1527d10a83781c07ac9e1963dffe69c.javascript.gzip differ diff --git a/assets/cache/cache-1535902684-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535902684-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..7a26f4f Binary files /dev/null and b/assets/cache/cache-1535902684-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535902741-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535902741-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..f086b89 Binary files /dev/null and b/assets/cache/cache-1535902741-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535902784-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535902784-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..742ec79 Binary files /dev/null and b/assets/cache/cache-1535902784-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535902847-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535902847-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..fbfb34e Binary files /dev/null and b/assets/cache/cache-1535902847-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535902856-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535902856-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..9ccd93c Binary files /dev/null and b/assets/cache/cache-1535902856-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535903795-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535903795-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..c0139e5 Binary files /dev/null and b/assets/cache/cache-1535903795-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535903835-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535903835-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..f154686 Binary files /dev/null and b/assets/cache/cache-1535903835-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535903844-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535903844-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..1c13158 Binary files /dev/null and b/assets/cache/cache-1535903844-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535903914-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535903914-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..55fe3ba Binary files /dev/null and b/assets/cache/cache-1535903914-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535904075-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535904075-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..70a5ad8 Binary files /dev/null and b/assets/cache/cache-1535904075-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535904088-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535904088-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..58bc8b1 Binary files /dev/null and b/assets/cache/cache-1535904088-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535904108-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535904108-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..ba48133 Binary files /dev/null and b/assets/cache/cache-1535904108-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535904124-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535904124-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..ae898a8 Binary files /dev/null and b/assets/cache/cache-1535904124-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535904977-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535904977-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..de64a7f Binary files /dev/null and b/assets/cache/cache-1535904977-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535905705-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535905705-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..728fc6e Binary files /dev/null and b/assets/cache/cache-1535905705-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535906094-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535906094-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..8a8f414 Binary files /dev/null and b/assets/cache/cache-1535906094-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535906557-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535906557-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..a5b0dc1 Binary files /dev/null and b/assets/cache/cache-1535906557-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535906579-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535906579-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..b1c7a87 Binary files /dev/null and b/assets/cache/cache-1535906579-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535906590-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535906590-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..3c397cb Binary files /dev/null and b/assets/cache/cache-1535906590-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535906631-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535906631-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..68269e5 Binary files /dev/null and b/assets/cache/cache-1535906631-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535906656-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535906656-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..845f898 Binary files /dev/null and b/assets/cache/cache-1535906656-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535906695-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535906695-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..b0fbff4 Binary files /dev/null and b/assets/cache/cache-1535906695-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535906866-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535906866-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..3233f51 Binary files /dev/null and b/assets/cache/cache-1535906866-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535907043-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535907043-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..f5f091b Binary files /dev/null and b/assets/cache/cache-1535907043-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535907063-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535907063-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..47b78d5 Binary files /dev/null and b/assets/cache/cache-1535907063-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535907103-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535907103-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..4160611 Binary files /dev/null and b/assets/cache/cache-1535907103-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535907259-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535907259-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..ed10ecc Binary files /dev/null and b/assets/cache/cache-1535907259-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535907279-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535907279-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..8fb217f Binary files /dev/null and b/assets/cache/cache-1535907279-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535907366-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535907366-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..ee7264e Binary files /dev/null and b/assets/cache/cache-1535907366-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535907500-4e84dc8aa47a1d0e44aa78ebcc068893.css.gzip b/assets/cache/cache-1535907500-4e84dc8aa47a1d0e44aa78ebcc068893.css.gzip new file mode 100644 index 0000000..9ec8e53 Binary files /dev/null and b/assets/cache/cache-1535907500-4e84dc8aa47a1d0e44aa78ebcc068893.css.gzip differ diff --git a/assets/cache/cache-1535907500-7edafa94c6aeaba9892040a31e2f1e0a.css.gzip b/assets/cache/cache-1535907500-7edafa94c6aeaba9892040a31e2f1e0a.css.gzip new file mode 100644 index 0000000..037ea48 Binary files /dev/null and b/assets/cache/cache-1535907500-7edafa94c6aeaba9892040a31e2f1e0a.css.gzip differ diff --git a/assets/cache/cache-1535907815-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535907815-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..d4abab5 Binary files /dev/null and b/assets/cache/cache-1535907815-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535907858-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535907858-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..caf4cab Binary files /dev/null and b/assets/cache/cache-1535907858-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535907892-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535907892-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..fea5c17 Binary files /dev/null and b/assets/cache/cache-1535907892-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535914734-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535914734-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..30604a7 Binary files /dev/null and b/assets/cache/cache-1535914734-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535914966-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535914966-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..33a4a39 Binary files /dev/null and b/assets/cache/cache-1535914966-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535914991-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535914991-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..3c0f302 Binary files /dev/null and b/assets/cache/cache-1535914991-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535915019-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535915019-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..898688a Binary files /dev/null and b/assets/cache/cache-1535915019-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535915032-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535915032-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..dc10c57 Binary files /dev/null and b/assets/cache/cache-1535915032-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535915158-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535915158-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..b243630 Binary files /dev/null and b/assets/cache/cache-1535915158-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535915190-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535915190-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..90fe6e0 Binary files /dev/null and b/assets/cache/cache-1535915190-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535915442-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535915442-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..22f4b47 Binary files /dev/null and b/assets/cache/cache-1535915442-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535915460-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535915460-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..267bc17 Binary files /dev/null and b/assets/cache/cache-1535915460-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535915470-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535915470-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..b1f5f40 Binary files /dev/null and b/assets/cache/cache-1535915470-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535915554-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535915554-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..4c1fe76 Binary files /dev/null and b/assets/cache/cache-1535915554-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535915574-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535915574-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..67d4dfd Binary files /dev/null and b/assets/cache/cache-1535915574-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1535915600-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip b/assets/cache/cache-1535915600-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip new file mode 100644 index 0000000..632afca Binary files /dev/null and b/assets/cache/cache-1535915600-9a3b1cc1396fd446da651cb278b165c9.javascript.gzip differ diff --git a/assets/cache/cache-1536055846-32a316b0cd52992da4e9e8634c0f5039.css.gzip b/assets/cache/cache-1536055846-32a316b0cd52992da4e9e8634c0f5039.css.gzip new file mode 100644 index 0000000..ac0712b Binary files /dev/null and b/assets/cache/cache-1536055846-32a316b0cd52992da4e9e8634c0f5039.css.gzip differ diff --git a/assets/cache/cache-1536056438-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536056438-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..0cf02f1 Binary files /dev/null and b/assets/cache/cache-1536056438-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536076462-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip b/assets/cache/cache-1536076462-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip new file mode 100644 index 0000000..73d8401 Binary files /dev/null and b/assets/cache/cache-1536076462-e69eedaeb77f0681590e689c4a3bb4b1.javascript.gzip differ diff --git a/assets/cache/cache-1536076462-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536076462-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..7bb4fbe Binary files /dev/null and b/assets/cache/cache-1536076462-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536236313-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536236313-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..bae8d20 Binary files /dev/null and b/assets/cache/cache-1536236313-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536236334-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536236334-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..7d83340 Binary files /dev/null and b/assets/cache/cache-1536236334-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536236457-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536236457-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..fe4f57b Binary files /dev/null and b/assets/cache/cache-1536236457-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536248499-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536248499-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..386b853 Binary files /dev/null and b/assets/cache/cache-1536248499-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536248561-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536248561-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..245b1ae Binary files /dev/null and b/assets/cache/cache-1536248561-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536248631-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536248631-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..fcdc8fe Binary files /dev/null and b/assets/cache/cache-1536248631-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536248665-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536248665-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..061cb1e Binary files /dev/null and b/assets/cache/cache-1536248665-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536248740-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536248740-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..add7493 Binary files /dev/null and b/assets/cache/cache-1536248740-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536248796-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536248796-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..47538a5 Binary files /dev/null and b/assets/cache/cache-1536248796-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536248824-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536248824-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..b1e9f6f Binary files /dev/null and b/assets/cache/cache-1536248824-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536248949-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536248949-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..07e92aa Binary files /dev/null and b/assets/cache/cache-1536248949-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536249123-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536249123-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..0cde78a Binary files /dev/null and b/assets/cache/cache-1536249123-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536249174-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536249174-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..f44f7cf Binary files /dev/null and b/assets/cache/cache-1536249174-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536412005-39f366a9e093b5ece6067825131532c0.javascript.gzip b/assets/cache/cache-1536412005-39f366a9e093b5ece6067825131532c0.javascript.gzip new file mode 100644 index 0000000..4b7d63d Binary files /dev/null and b/assets/cache/cache-1536412005-39f366a9e093b5ece6067825131532c0.javascript.gzip differ diff --git a/assets/cache/cache-1536412005-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536412005-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..aefe640 Binary files /dev/null and b/assets/cache/cache-1536412005-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536412296-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536412296-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..e0cd8cf Binary files /dev/null and b/assets/cache/cache-1536412296-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536412306-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536412306-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..9d66932 Binary files /dev/null and b/assets/cache/cache-1536412306-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536412406-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1536412406-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..5074b02 Binary files /dev/null and b/assets/cache/cache-1536412406-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1536412415-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536412415-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..0e71002 Binary files /dev/null and b/assets/cache/cache-1536412415-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536412651-5122e73a4e7efb13a3114eb065d02315.css.gzip b/assets/cache/cache-1536412651-5122e73a4e7efb13a3114eb065d02315.css.gzip new file mode 100644 index 0000000..d93ded6 Binary files /dev/null and b/assets/cache/cache-1536412651-5122e73a4e7efb13a3114eb065d02315.css.gzip differ diff --git a/assets/cache/cache-1536412775-6dce9af017fa26eb393566c174b6985c.css.gzip b/assets/cache/cache-1536412775-6dce9af017fa26eb393566c174b6985c.css.gzip new file mode 100644 index 0000000..d45a6f8 Binary files /dev/null and b/assets/cache/cache-1536412775-6dce9af017fa26eb393566c174b6985c.css.gzip differ diff --git a/assets/cache/cache-1536412922-6dce9af017fa26eb393566c174b6985c.css.gzip b/assets/cache/cache-1536412922-6dce9af017fa26eb393566c174b6985c.css.gzip new file mode 100644 index 0000000..d6201cb Binary files /dev/null and b/assets/cache/cache-1536412922-6dce9af017fa26eb393566c174b6985c.css.gzip differ diff --git a/assets/cache/cache-1536412938-baad5f4b9398adc2ddf69ff18cb05a9c.javascript.gzip b/assets/cache/cache-1536412938-baad5f4b9398adc2ddf69ff18cb05a9c.javascript.gzip new file mode 100644 index 0000000..0734a8e Binary files /dev/null and b/assets/cache/cache-1536412938-baad5f4b9398adc2ddf69ff18cb05a9c.javascript.gzip differ diff --git a/assets/cache/cache-1536412938-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip b/assets/cache/cache-1536412938-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip new file mode 100644 index 0000000..63ed0da Binary files /dev/null and b/assets/cache/cache-1536412938-ee3c4e57bae0bc0c115dc01857056bed.javascript.gzip differ diff --git a/assets/cache/cache-1536413031-87110d9498d51f6dd11e6dd239e64810.css.gzip b/assets/cache/cache-1536413031-87110d9498d51f6dd11e6dd239e64810.css.gzip new file mode 100644 index 0000000..0c71bb9 Binary files /dev/null and b/assets/cache/cache-1536413031-87110d9498d51f6dd11e6dd239e64810.css.gzip differ diff --git a/assets/cache/cache-1536846867-87110d9498d51f6dd11e6dd239e64810.css.gzip b/assets/cache/cache-1536846867-87110d9498d51f6dd11e6dd239e64810.css.gzip new file mode 100644 index 0000000..2629b84 Binary files /dev/null and b/assets/cache/cache-1536846867-87110d9498d51f6dd11e6dd239e64810.css.gzip differ diff --git a/assets/cache/cache-1537095891-84eef44de8f4863a60ef7cb52e1e0d84.javascript.gzip b/assets/cache/cache-1537095891-84eef44de8f4863a60ef7cb52e1e0d84.javascript.gzip new file mode 100644 index 0000000..862c05a Binary files /dev/null and b/assets/cache/cache-1537095891-84eef44de8f4863a60ef7cb52e1e0d84.javascript.gzip differ diff --git a/assets/css/blog.css b/assets/css/blog.css new file mode 100644 index 0000000..37c673b --- /dev/null +++ b/assets/css/blog.css @@ -0,0 +1,197 @@ +.like-toggle-icon-container.floating { + position: fixed; + transform: translateX(-100%); + padding: 5px 15px; +} + +.like-toggle-icon-container.floating .like-count { + display: block; + margin: 15px auto; + text-align: center; + font-size: 24px; + font-weight: 600; + border-radius: 10px; + background-color: #fff; + height: 34px; +} + +.like-toggle-icon { + width: 35pt; + height: 35pt; + font-size: 35pt; + position: relative; + color: gray; + cursor: pointer; + border: none; + background-color: transparent; +} + +.like-toggle-icon:before, .like-toggle-icon:after { + position: absolute; + top: 0; + left: 0; + transition: all .3s ease-out; + content: ""; + font-family: fontawesome; +} + +.like-toggle-icon:hover:before { + transform: scale(1.2); +} + +.like-toggle-icon:active:before { + transition: none; + transform: scale(1); +} + +.like-toggle-icon:after { + opacity: 0; +} + +.like-toggle-icon.-checked { + color: #A12C2C; +} + +.like-toggle-icon.-checked:before { + content: ""; +} + +.like-toggle-icon.-checked:after { + content: ""; + animation: likeFly .6s ease-in; +} + +@keyframes heartbeat { + from { + opacity: 1; + } + to { + transform: scale(3); + opacity: 0; + } +} + +@keyframes likeFly { + from { + opacity: 1; + } + to { + transform: scale(3) rotate(45deg) translateY(-90px); + opacity: 0; + } +} + +.blog .blog-item { + background-color: #fff; + border-radius: 10px; + margin-bottom: 40px; +} + +.blog .blog-item .img-blog-entry { + width: 100%; + border-radius: 10px 10px 0 0; + height: 350px; + background-position: center; + background-size: cover; +} + +.blog .blog-item .blog-content .row div { + margin-bottom: 0; +} + +.img-rounded-top { + width: 100%; + border-radius: 10px 10px 0 0; +} + +.blog .blog-item .blog-content { + padding: 40px; +} + +.blog .blog-content .post-title { + margin-top: 10px; + margin-bottom: 15px; + text-align: center; +} + +.blog .blog-content .post-subtitle { + line-height: 1.22; + letter-spacing: -.022em; + margin-bottom: 22px; + font-size: 24px; + font-weight: 500; +} + +.blog .blog-content .blog-post { + text-align: justify; + hyphens: auto; + font-size: 22px; +} + +.blog .blog-post h1, +.blog .blog-post h2, +.blog .blog-post h3, +.blog .blog-post h4, +.blog .blog-post h5, +.blog .blog-post h6 { + margin-top: 1em; + margin-bottom: .5em; +} + +.categories li { + display: inline; + padding-left: 0; + hyphens: auto; +} + +.categories li:first-child { + margin-left: 0; +} + +.categories li:after { + content: "∙"; +} + +.categories li:last-child:after { + content: ""; +} + +.widget { + margin-bottom: 30px; +} + +.widget.filled-background { + background-color: #FAFAFA; + padding: 5px 20px; + border-radius: 10px; +} + +.widget.filled-background .media { + margin-top: 0; + padding: 10px 0; + border-bottom: 1px solid rgba(0,0,0,.3); + transition: transform .2s; +} + +.widget.filled-background .media:hover { + transform: scale(1.05); +} + +.widget.filled-background .media:last-child { + border: none; +} + +.widget.filled-background .media .post-image { + margin-bottom: 10px; +} + +#blog > .container > .row > .col-sm-4.col-sm-push-8 { + width: 30%; + left: 70%; +} + +#blog > .container > .row > .col-sm-8.col-sm-pull-4 { + width: 70%; + right: 30%; +} + diff --git a/assets/css/content-tools.min.css b/assets/css/content-tools.min.css new file mode 100644 index 0000000..78133a9 --- /dev/null +++ b/assets/css/content-tools.min.css @@ -0,0 +1 @@ +/*! ContentTools v1.5.4 by Anthony Blackshaw (https://github.com/anthonyjb) */.ce--dragging,.ce--resizing{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ce--dragging{cursor:move!important}.ce--resizing{cursor:nwse-resize!important}.ce-element--type-image,.ce-element--type-video{background-repeat:no-repeat;position:relative;cursor:pointer;z-index:1}.ce-element--type-image:after,.ce-element--type-image:before,.ce-element--type-video:after,.ce-element--type-video:before{background:rgba(0,0,0,.5);border-radius:2px;color:#fff;display:none;font-family:arial,sans-serif;font-size:10px;line-height:10px;padding:4px 4px 3px;position:absolute}.ce-element--type-image:before,.ce-element--type-video:before{content:attr(data-ce-size);right:10px;top:10px}.ce-element--type-image.ce-element--over:before,.ce-element--type-image.ce-element--resizing:before,.ce-element--type-video.ce-element--over:before,.ce-element--type-video.ce-element--resizing:before{display:block}.ce-element--type-image{background-position:0 0;background-size:cover}.ce-element--type-image:after{background:transparent;content:'';display:block;left:0;position:relative;top:0;height:100%;width:100%}.ce-element--type-video{background:#333 url(images/video.svg) 50%/auto 48px no-repeat}.ce-element--type-video:after{bottom:10px;content:attr(data-ce-title);display:block;left:10px}.ce-element--empty:after{content:'...';display:inline-block;font-style:italic;opacity:.5}.ce-element--empty[data-ce-placeholder]:after{content:attr(data-ce-placeholder)}.ce-element--dragging{background-color:rgba(51,51,51,.1)!important;opacity:.5;z-index:-1}.ce-element--dragging.ce-element--type-image,.ce-element--dragging.ce-element--type-video{background-color:#333!important;opacity:1;outline-color:rgba(51,51,51,.1)!important}.ce-element--drop{position:relative!important}.ce-element--drop:before{background:#f39c12 url(images/drop-vert-above.svg) 50%/auto 32px repeat;bottom:0;content:''!important;left:0;opacity:.8;position:absolute;right:0;top:0;z-index:9}.ce-element--drop-below:before{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.ce-element--drop-left:before{background-image:url(images/drop-horz.svg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}.ce-element--drop-right:before{background-image:url(images/drop-horz.svg);-webkit-transform:rotate(180deg);transform:rotate(180deg)}.ce-element--drop.ce-element--type-table-row{background:#f39c12 url(images/drop-vert-above.svg) 50%/auto 32px repeat}.ce-element--drop.ce-element--type-table-row:before{display:none}.ce-element--drop.ce-element--type-table-row.ce-element--drop-below{background:#f39c12 url(images/drop-vert-below.svg) 50%/auto 32px repeat}.ce-element--focused,.ce-element--over{background-color:rgba(243,156,18,.1);outline:none}.ce-element--focused.ce-element--type-image,.ce-element--focused.ce-element--type-image-fixture,.ce-element--focused.ce-element--type-video,.ce-element--over.ce-element--type-image,.ce-element--over.ce-element--type-image-fixture,.ce-element--over.ce-element--type-video{background-color:#333;outline:4px solid rgba(243,156,18,.35)}.ce-element--resize-top-left{cursor:nw-resize}.ce-element--resize-top-right{cursor:ne-resize}.ce-element--resize-bottom-right{cursor:se-resize}.ce-element--resize-bottom-left{cursor:sw-resize}.ce-drag-helper{background:#fff;border-radius:2px;box-shadow:0 3px 3px rgba(0,0,0,.25);color:#4e4e4e;font:arial,sans-serif;font-size:12px;height:120px;left:0;line-height:135%;margin:5px 0 0 5px;overflow:hidden;padding:15px;position:absolute;top:0;width:120px;word-wrap:break-word;z-index:9}.ce-drag-helper:before{background:#2980b9;color:#fff;content:attr(data-ce-type);display:block;font-family:arial,sans-serif;font-size:10px;line-height:10px;padding:4px 4px 3px;position:absolute;right:0;top:0}.ce-drag-helper--type-list-item-text:after,.ce-drag-helper--type-list:after,.ce-drag-helper--type-pre-text:after,.ce-drag-helper--type-table-row:after,.ce-drag-helper--type-table:after,.ce-drag-helper--type-text:after{background-image:linear-gradient(hsla(0,0%,100%,0),#fff 66%);bottom:0;content:'';display:block;height:40px;left:0;position:absolute;width:100%}.ce-drag-helper--type-image{background-repeat:no-repeat;background-size:cover}.ce-element--type-image,.ce-element--type-video{display:block;margin-left:auto;margin-right:auto}.ce-element--type-image.align-left,.ce-element--type-video.align-left{clear:none;float:left}.ce-element--type-image.align-right,.ce-element--type-video.align-right{clear:none;float:right}.ce-measure{display:block!important}@font-face{font-family:icon;src:url(images/icons.woff);font-weight:400;font-style:normal}.ct-widget,.ct-widget *{box-sizing:border-box}.ct-widget * a,.ct-widget * b,.ct-widget * caption,.ct-widget * div,.ct-widget * form,.ct-widget * i fieldset,.ct-widget * iframe,.ct-widget * label,.ct-widget * legend,.ct-widget * span,.ct-widget * table,.ct-widget * tbody,.ct-widget * td,.ct-widget * tfoot,.ct-widget * th,.ct-widget * thead,.ct-widget * tr,.ct-widget a,.ct-widget b,.ct-widget caption,.ct-widget div,.ct-widget form,.ct-widget i fieldset,.ct-widget iframe,.ct-widget label,.ct-widget legend,.ct-widget span,.ct-widget table,.ct-widget tbody,.ct-widget td,.ct-widget tfoot,.ct-widget th,.ct-widget thead,.ct-widget tr{border:0;font-size:100%;font:inherit;margin:0;padding:0;vertical-align:baseline}.ct-widget * ol,.ct-widget * ul,.ct-widget ol,.ct-widget ul{list-style:none}.ct-widget * table,.ct-widget table{border-collapse:collapse;border-spacing:0}.ct-widget{opacity:0;font-family:arial,sans-serif;font-size:14px;line-height:18px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;z-index:9999}.ct-widget,.ct-widget--active{-webkit-transition-property:opacity;transition-property:opacity;-webkit-transition-duration:.25s;transition-duration:.25s;-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}.ct-widget--active{opacity:1}.ct-widget .ct-attribute{border-bottom:1px solid #eee;height:48px;vertical-align:top}.ct-widget .ct-attribute:after{clear:both;content:"";display:table}.ct-widget .ct-attribute__name{background:#f6f6f6;border:none;color:#646464;float:left;height:47px;outline:none;padding:0 16px;font-family:arial,sans-serif;font-size:14px;line-height:48px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:25%}.ct-widget .ct-attribute__name--invalid{color:#e74c3c}.ct-widget .ct-attribute__value{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#fff;border:none;color:#646464;float:right;height:47px;outline:none;padding:0 16px;font-family:arial,sans-serif;font-size:14px;line-height:48px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:75%}.ct-widget .ct-crop-marks{height:320px;left:73px;position:absolute;top:0;width:427px}.ct-widget .ct-crop-marks__clipper{height:100%;overflow:hidden;position:relative;width:100%}.ct-widget .ct-crop-marks__ruler--top-left{position:absolute}.ct-widget .ct-crop-marks__ruler--top-left:after{border:1px solid hsla(0,0%,100%,.5);border-bottom:none;border-right:none;box-shadow:-1px -1px 1px rgba(0,0,0,.25),inset 1px 1px 1px rgba(0,0,0,.25);content:'';height:999px;left:0;position:absolute;top:0;width:999px}.ct-widget .ct-crop-marks__ruler--bottom-right{position:absolute}.ct-widget .ct-crop-marks__ruler--bottom-right:after{border:1px solid hsla(0,0%,100%,.5);border-top:none;border-left:none;bottom:0;box-shadow:1px 1px 1px rgba(0,0,0,.25),inset -1px -1px 1px rgba(0,0,0,.25);content:'';height:999px;position:absolute;right:0;width:999px}.ct-widget .ct-crop-marks__handle{background:#2980b9;border:1px solid #409ad5;border-radius:7px;cursor:pointer;height:15px;margin-left:-7px;margin-top:-7px;position:absolute;width:15px}.ct-widget .ct-crop-marks__handle--bottom-right{margin-left:-8px;margin-top:-8px}.ct-widget .ct-crop-marks__handle:hover{background:#2e8ece}@-webkit-keyframes a{0%{transform:translate(-50%,-50%) rotate(0deg);-webkit-transform:transform}to{transform:translate(-50%,-50%) rotate(359deg);-webkit-transform:transform}}@keyframes a{0%{transform:translate(-50%,-50%) rotate(0deg);-webkit-transform:transform;transform:transform}to{transform:translate(-50%,-50%) rotate(359deg);-webkit-transform:transform;transform:transform}}.ct-widget.ct-dialog{background:#fff;box-shadow:0 8px 8px rgba(0,0,0,.35);border-radius:2px;height:480px;left:50%;margin-left:-350px;margin-top:-240px;position:fixed;top:50%;width:700px;z-index:10099}.ct-widget.ct-dialog--busy .ct-dialog__busy{display:block}.ct-widget.ct-dialog--busy .ct-dialog__body{opacity:.1}.ct-widget .ct-dialog__header{color:#a4a4a4;border-bottom:1px solid #eee;height:48px;padding:0 16px;position:relative}.ct-widget .ct-dialog__caption{font-family:arial,sans-serif;font-size:18px}.ct-widget .ct-dialog__caption,.ct-widget .ct-dialog__close{line-height:48px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ct-widget .ct-dialog__close{border-left:1px solid #eee;cursor:pointer;height:48px;position:absolute;right:0;text-align:center;top:0;font-family:icon;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;width:48px}.ct-widget .ct-dialog__close:before{content:'\ea0f'}.ct-widget .ct-dialog__close:hover:before{color:#646464}.ct-widget .ct-dialog__body{margin:auto;width:572px}.ct-widget .ct-dialog__view{height:320px;margin-top:32px}.ct-widget .ct-dialog__controls{margin-top:16px}.ct-widget .ct-dialog__controls:after{clear:both;content:"";display:table}.ct-widget .ct-dialog__busy{display:none;position:absolute}.ct-widget .ct-dialog__busy:before{-webkit-animation:a 5s linear;animation:a 5s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;color:#a4a4a4;content:"\e994";left:50%;position:fixed;top:50%;font-family:icon;font-size:80px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ct-widget .ct-control-group{font-size:0}.ct-widget .ct-control-group--center{text-align:center}.ct-widget .ct-control-group--left{float:left}.ct-widget .ct-control-group--right{float:right}.ct-widget .ct-control{margin-left:16px;position:relative}.ct-widget .ct-control:first-child{margin-left:0}.ct-widget .ct-control--icon{color:#a4a4a4;cursor:pointer;display:inline-block;height:32px;line-height:32px;text-align:center;font-family:icon;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;width:32px}.ct-widget .ct-control--icon,.ct-widget .ct-control--icon:after{border-radius:2px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ct-widget .ct-control--icon:after{background:#000;color:#fff;content:attr(data-ct-tooltip);display:block;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;left:-26.5px;opacity:0;padding:0 8px;position:absolute;bottom:37px;font-family:arial,sans-serif;font-size:12px;line-height:20px;visibility:hidden;width:85px;word-break:break-word}.ct-widget .ct-control--icon:hover:after{opacity:.8;visibility:visible;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transition-duration:0s;transition-duration:0s;-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-delay:2s;transition-delay:2s}.ct-widget .ct-control--icon:before{content:''}.ct-widget .ct-control--icon:hover{background:#eee;color:#646464}.ct-widget .ct-control--active,.ct-widget .ct-control--on{background:#a4a4a4;color:#fff}.ct-widget .ct-control--active:hover,.ct-widget .ct-control--on:hover{background:#646464;color:#fff}.ct-widget .ct-control--rotate-ccw:before{content:'\e965'}.ct-widget .ct-control--rotate-cw:before{content:'\e966'}.ct-widget .ct-control--crop:before{content:'\ea57'}.ct-widget .ct-control--remove:before{content:'\e9ac'}.ct-widget .ct-control--styles:before{content:'\e90b'}.ct-widget .ct-control--attributes:before{content:'\e994'}.ct-widget .ct-control--code:before{content:'\ea80'}.ct-widget .ct-control--icon.ct-control--muted{cursor:default}.ct-widget .ct-control--icon.ct-control--muted:before{opacity:.5}.ct-widget .ct-control--icon.ct-control--muted:hover{color:#a4a4a4;background:transparent}.ct-widget .ct-control--text{background:#2980b9;border-radius:2px;color:#fff;cursor:pointer;display:inline-block;font-weight:700;height:32px;overflow:hidden;padding:0 8px;text-align:center;text-overflow:ellipsis;font-family:arial,sans-serif;font-size:14px;line-height:32px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top;width:100px}.ct-widget .ct-control--text:hover{background:#2e8ece}.ct-widget .ct-control--apply,.ct-widget .ct-control--insert,.ct-widget .ct-control--ok{background:#27ae60}.ct-widget .ct-control--apply:hover,.ct-widget .ct-control--insert:hover,.ct-widget .ct-control--ok:hover{background:#2cc36b}.ct-widget .ct-control--cancel,.ct-widget .ct-control--clear{background:#e74c3c}.ct-widget .ct-control--cancel:hover,.ct-widget .ct-control--clear:hover{background:#ea6153}.ct-widget .ct-control--text.ct-control--muted{background:#ccc;cursor:default}.ct-widget .ct-control--text.ct-control--muted:hover{background:#ccc}.ct-widget .ct-control--upload{overflow:hidden}.ct-widget.ct-image-dialog--empty .ct-control--cancel,.ct-widget.ct-image-dialog--empty .ct-control--clear,.ct-widget.ct-image-dialog--empty .ct-control--crop,.ct-widget.ct-image-dialog--empty .ct-control--insert,.ct-widget.ct-image-dialog--empty .ct-control--rotate-ccw,.ct-widget.ct-image-dialog--empty .ct-control--rotate-cw,.ct-widget.ct-image-dialog--empty .ct-progress-bar,.ct-widget.ct-image-dialog--populated .ct-control--cancel,.ct-widget.ct-image-dialog--populated .ct-control--upload,.ct-widget.ct-image-dialog--populated .ct-progress-bar,.ct-widget.ct-image-dialog--uploading .ct-control--clear,.ct-widget.ct-image-dialog--uploading .ct-control--crop,.ct-widget.ct-image-dialog--uploading .ct-control--insert,.ct-widget.ct-image-dialog--uploading .ct-control--rotate-ccw,.ct-widget.ct-image-dialog--uploading .ct-control--rotate-cw,.ct-widget.ct-image-dialog--uploading .ct-control--upload{display:none}.ct-widget .ct-image-dialog__view{background:#eee;position:relative}.ct-widget .ct-image-dialog__view:empty{font-family:icon;font-size:80px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:320px;text-align:center}.ct-widget .ct-image-dialog__view:empty:before{color:#fff;content:'\e90d'}.ct-widget .ct-image-dialog__image{background-color:transparent;background-position:50%;background-repeat:no-repeat;background-size:contain;height:100%;width:100%}.ct-widget .ct-image-dialog__file-upload{cursor:pointer;font-size:400px;left:0;opacity:0;position:absolute;top:0}.ct-widget.ct-properties-dialog--attributes .ct-properties-dialog__attributes,.ct-widget.ct-properties-dialog--styles .ct-properties-dialog__styles{display:block}.ct-widget.ct-properties-dialog--styles .ct-properties-dialog__styles:empty:before{color:#a4a4a4;content:attr(data-ct-empty);display:block;font-style:italic;margin-top:20px;text-align:center}.ct-widget.ct-properties-dialog--code .ct-properties-dialog__code{display:block}.ct-widget .ct-properties-dialog__view{border:1px solid #ddd;overflow:auto}.ct-widget .ct-properties-dialog__attributes,.ct-widget .ct-properties-dialog__code,.ct-widget .ct-properties-dialog__styles{display:none}.ct-widget .ct-properties-dialog__inner-html{border:none;display:block;font-family:courier,Bitstream Vera Sans Mono,Consolas,Courier,monospace;height:318px;padding:16px;outline:none;resize:none;width:100%}.ct-widget .ct-properties-dialog__inner-html--invalid{color:#e74c3c}.ct-widget .ct-table-dialog__view{border:1px solid #ddd;overflow:auto}.ct-widget .ct-video-dialog__preview:empty{background:#eee;font-family:icon;font-size:80px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:320px;text-align:center}.ct-widget .ct-video-dialog__preview:empty:before{color:#fff;content:'\ea98'}.ct-widget .ct-video-dialog__input{border:none;border-bottom:1px solid #eee;height:32px;line-height:32px;outline:none;padding:0 4px;font-family:arial,sans-serif;font-size:14px;line-height:18px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top;width:456px}.ct-widget .ct-video-dialog__input:focus{border-bottom:1px solid #e1e1e1}.ct-widget.ct-anchored-dialog{border-bottom:2px solid #27ae60;box-shadow:0 3px 3px rgba(0,0,0,.35);font-size:0;height:34px;left:0;margin-left:-160px;margin-top:-48px;position:absolute;top:0;width:320px;z-index:10099}.ct-widget.ct-anchored-dialog:after{border:16px solid hsla(0,0%,100%,0);border-top-color:#27ae60;content:'';left:144px;position:absolute;top:34px}.ct-widget .ct-anchored-dialog__input{border:none;color:#646464;outline:none;font-family:arial,sans-serif;font-size:14px;padding:0 8px 0 16px;vertical-align:top;width:256px}.ct-widget .ct-anchored-dialog__button,.ct-widget .ct-anchored-dialog__input{height:32px;line-height:32px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ct-widget .ct-anchored-dialog__button{background:#27ae60;cursor:pointer;display:inline-block;text-align:center;font-family:icon;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;width:32px}.ct-widget .ct-anchored-dialog__button:before{color:#fff;content:'\ea10'}.ct-widget .ct-anchored-dialog__button:hover{background:#2cc36b}.ct-widget .ct-anchored-dialog__target-button{background:#fff;cursor:pointer;display:inline-block;height:32px;line-height:32px;text-align:center;font-family:icon;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:32px}.ct-widget .ct-anchored-dialog__target-button:before{color:#a4a4a4;content:'\ea7d'}.ct-widget .ct-anchored-dialog__target-button:hover:before{color:#b1b1b1}.ct-widget .ct-anchored-dialog__target-button--active:before{color:#27ae60}.ct-widget .ct-anchored-dialog__target-button--active:hover:before{color:#2cc36b}@-webkit-keyframes b{0%{opacity:0;font-size:32px;-webkit-transform:font-size}25%{font-size:320px;opacity:1;-webkit-transform:all}50%{font-size:320px;opacity:1;-webkit-transform:all}75%{font-size:320px;opacity:1;-webkit-transform:all}to{opacity:0;-webkit-transform:all}}@keyframes b{0%{opacity:0;font-size:32px;-webkit-transform:font-size;transform:font-size}25%{font-size:320px;opacity:1;-webkit-transform:all;transform:all}50%{font-size:320px;opacity:1;-webkit-transform:all;transform:all}75%{font-size:320px;opacity:1;-webkit-transform:all;transform:all}to{opacity:0;-webkit-transform:all;transform:all}}@-webkit-keyframes c{0%{opacity:1;-webkit-transform:opacity}99%{opacity:1;-webkit-transform:opacity}to{opacity:0;-webkit-transform:opacity}}@keyframes c{0%{opacity:1;-webkit-transform:opacity;transform:opacity}99%{opacity:1;-webkit-transform:opacity;transform:opacity}to{opacity:0;-webkit-transform:opacity;transform:opacity}}.ct-widget.ct-flash{color:hsla(0,0%,100%,.9);height:0;left:0;position:fixed;font-family:icon;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;top:0;width:0;z-index:10999}.ct-widget.ct-flash:before{left:50%;opacity:0;position:fixed;text-shadow:0 0 20px rgba(0,0,0,.5);top:50%;transform:translate(-50%,-50%)}.ct-widget.ct-flash--active{-webkit-animation:c 2s ease-in;animation:c 2s ease-in;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.ct-widget.ct-flash--active:before{-webkit-animation:b 2s ease-in;animation:b 2s ease-in;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;font-size:320px;opacity:1}.ct-widget.ct-flash--ok:before{content:'\ea10'}.ct-widget.ct-flash--no:before{content:'\ea0f'}.ct-widget .ct-grip{cursor:move;font-size:0;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ct-widget .ct-grip__bump{background:rgba(70,70,70,.15);border-radius:12px;display:inline-block;height:12px;margin-left:12px;width:12px}.ct-widget .ct-grip__bump:first-child{margin-left:0}@-webkit-keyframes d{0%{transform:rotate(0deg);-webkit-transform:transform}to{transform:rotate(359deg);-webkit-transform:transform}}@keyframes d{0%{transform:rotate(0deg);-webkit-transform:transform;transform:transform}to{transform:rotate(359deg);-webkit-transform:transform;transform:transform}}.ct-widget.ct-ignition{left:16px;position:fixed;top:16px}.ct-widget.ct-ignition .ct-ignition__button{display:none}.ct-widget.ct-ignition--editing .ct-ignition__button--cancel,.ct-widget.ct-ignition--editing .ct-ignition__button--confirm,.ct-widget.ct-ignition--ready .ct-ignition__button--edit{display:block}.ct-widget.ct-ignition--busy .ct-ignition__button{display:none}.ct-widget.ct-ignition--busy .ct-ignition__button--busy{display:block}.ct-widget .ct-ignition__button{border-radius:24px;content:'';cursor:pointer;display:block;height:48px;line-height:48px;opacity:.9;position:absolute;text-align:center;font-family:icon;font-size:24px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:48px}.ct-widget .ct-ignition__button:before{color:#fff}.ct-widget .ct-ignition__button--busy{-webkit-animation:d 5s linear;animation:d 5s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;background:#646464;cursor:default}.ct-widget .ct-ignition__button--busy:before{content:'\e994'}.ct-widget .ct-ignition__button--busy:hover{background:#646464}.ct-widget .ct-ignition__button--confirm{background:#27ae60}.ct-widget .ct-ignition__button--confirm:before{content:'\ea10'}.ct-widget .ct-ignition__button--confirm:hover{background:#2cc36b}.ct-widget .ct-ignition__button--cancel{background:#e74c3c;left:64px}.ct-widget .ct-ignition__button--cancel:before{content:'\ea0f'}.ct-widget .ct-ignition__button--cancel:hover{background:#ea6153}.ct-widget .ct-ignition__button--edit{background:#2980b9}.ct-widget .ct-ignition__button--edit:before{content:'\e905';-webkit-transition-property:-webkit-transform;transition-property:transform;-webkit-transition-duration:.1s;transition-duration:.1s;-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}.ct-widget .ct-ignition__button--edit:hover{background:#2e8ece}.ct-widget .ct-ignition__button--edit:hover:before{display:inline-block;-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}.ct-widget.ct-inspector{background:hsla(0,0%,91%,.2);border-top:1px solid hsla(0,0%,100%,.1);bottom:0;height:32px;left:0;overflow:hidden;padding:3px 16px 0;position:fixed;width:100%}.ct-widget .ct-inspector__tags{width:calc(100% - 128px)}.ct-widget .ct-inspector__tags:after{clear:both;content:"";display:table}.ct-widget .ct-inspector__tags:before{color:#464646;content:'\ea80';display:block;float:left;height:24px;line-height:24px;margin-right:16px;text-align:center;font-family:icon;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:24px}.ct-widget .ct-inspector__counter{border-left:1px solid rgba(0,0,0,.1);height:24px;line-height:24px;margin-right:16px;position:absolute;right:0;text-align:right;top:3px;width:128px}.ct-widget .ct-tag{background-color:#2980b9;border-radius:2px 0 0 2px;color:#fff;cursor:pointer;float:left;font-weight:700;height:24px;line-height:24px;margin-left:24px;padding:0 8px;position:relative;text-shadow:0 1px 0 rgba(0,0,0,.35)}.ct-widget .ct-tag:after{border-style:solid;border-bottom:12px solid rgba(255,0,0,0);border-left:12px solid #2980b9;border-right:none;border-top:12px solid rgba(255,0,0,0);content:'';display:block;height:24px;bottom:0;right:-24px;position:absolute;width:24px;-moz-transform:scale(.9999)}.ct-widget .ct-tag:first-child{margin-left:0}.ct-widget .ct-tag:hover{background-color:#4aa3df}.ct-widget .ct-tag:hover:after{border-left-color:#4aa3df}.ct-widget .ct-tag:nth-child(1){background-color:#8e44ad}.ct-widget .ct-tag:nth-child(1):after{border-left-color:#8e44ad}.ct-widget .ct-tag:nth-child(1):hover{background-color:#9b50ba}.ct-widget .ct-tag:nth-child(1):hover:after{border-left-color:#9b50ba}.ct-widget .ct-tag:nth-child(2){background-color:#2980b9}.ct-widget .ct-tag:nth-child(2):after{border-left-color:#2980b9}.ct-widget .ct-tag:nth-child(2):hover{background-color:#2e8ece}.ct-widget .ct-tag:nth-child(2):hover:after{border-left-color:#2e8ece}.ct-widget .ct-tag:nth-child(3){background-color:#27ae60}.ct-widget .ct-tag:nth-child(3):after{border-left-color:#27ae60}.ct-widget .ct-tag:nth-child(3):hover{background-color:#2cc36b}.ct-widget .ct-tag:nth-child(3):hover:after{border-left-color:#2cc36b}.ct-widget .ct-tag:nth-child(4){background-color:#d35400}.ct-widget .ct-tag:nth-child(4):after{border-left-color:#d35400}.ct-widget .ct-tag:nth-child(4):hover{background-color:#ed5e00}.ct-widget .ct-tag:nth-child(4):hover:after{border-left-color:#ed5e00}.ct-widget .ct-tag:nth-child(5){background-color:#f39c12}.ct-widget .ct-tag:nth-child(5):after{border-left-color:#f39c12}.ct-widget .ct-tag:nth-child(5):hover{background-color:#f4a62a}.ct-widget .ct-tag:nth-child(5):hover:after{border-left-color:#f4a62a}.ct-widget .ct-tag:nth-child(6){background-color:#16a085}.ct-widget .ct-tag:nth-child(6):after{border-left-color:#16a085}.ct-widget .ct-tag:nth-child(6):hover{background-color:#19b698}.ct-widget .ct-tag:nth-child(6):hover:after{border-left-color:#19b698}.ct-widget.ct-modal{background:rgba(0,0,0,.7);height:0;left:0;position:fixed;top:0;width:0;z-index:10009}.ct-widget.ct-modal--transparent{background:transparent}.ct-widget--active.ct-modal{height:100%;width:100%}.ct-widget .ct-progress-bar{border:1px solid #eee;height:32px;line-height:32px;padding:1px;width:456px}.ct-widget .ct-progress-bar__progress{background:#2980b9;height:28px}.ct-widget .ct-section{border-bottom:1px solid #eee;color:#bdbdbd;cursor:pointer;font-style:italic;height:48px;padding:0 16px;font-family:arial,sans-serif;font-size:16px;line-height:48px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ct-widget .ct-section:after{clear:both;content:"";display:table}.ct-widget .ct-section:hover{background:#f6f6f6}.ct-widget .ct-section--applied{color:#646464;font-style:normal}.ct-widget .ct-section--applied .ct-section__switch{background-color:#27ae60;border:1px solid #1e8449}.ct-widget .ct-section--applied .ct-section__switch:before{left:25px;-webkit-transition-property:left;transition-property:left;-webkit-transition-duration:.1s;transition-duration:.1s;-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}.ct-widget .ct-section--contains-input .ct-section__label{width:75%}.ct-widget .ct-section__label{float:left;overflow:hidden;text-overflow:ellipsis;width:472px;white-space:nowrap}.ct-widget .ct-section__switch{background-color:#ccc;border:1px solid #b3b3b3;border-radius:12px;box-shadow:inset 0 0 2px rgba(0,0,0,.1);float:right;height:24px;margin-top:12px;position:relative;width:48px}.ct-widget .ct-section__switch:before{background:#fff;border-radius:10px;content:'';height:20px;left:1px;position:absolute;top:1px;-webkit-transition-property:left;transition-property:left;-webkit-transition-duration:.1s;transition-duration:.1s;-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;width:20px}.ct-widget .ct-section__input{background:#fff;border:none;color:#646464;float:right;height:47px;outline:none;padding:0 16px;text-align:right;font-family:arial,sans-serif;font-size:14px;line-height:48px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:25%}.ct-widget .ct-section__input--invalid{color:#e74c3c}.ct-widget.ct-toolbox{background:hsla(0,0%,91%,.9);border:1px solid hsla(0,0%,100%,.5);box-shadow:0 3px 3px rgba(0,0,0,.35);left:128px;padding:8px;position:fixed;top:128px;width:138px}.ct-widget.ct-toolbox--dragging{opacity:.5}.ct-widget .ct-toolbox__grip{padding:8px 0}.ct-widget .ct-tool-group{padding:4px 0}.ct-widget .ct-tool-group:after{clear:both;content:"";display:table}.ct-widget .ct-tool-group:first-child{padding-top:0}.ct-widget .ct-tool{color:#464646;cursor:pointer;float:left;height:32px;margin:4px;margin-right:4px;position:relative;text-align:center;font-family:icon;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;width:32px}.ct-widget .ct-tool,.ct-widget .ct-tool:after{border-radius:2px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ct-widget .ct-tool:after{background:#000;color:#fff;content:attr(data-ct-tooltip);display:block;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;left:-26.5px;opacity:0;padding:0 8px;position:absolute;bottom:37px;font-family:arial,sans-serif;font-size:12px;line-height:20px;visibility:hidden;width:85px;word-break:break-word}.ct-widget .ct-tool:hover:after{opacity:.8;visibility:visible;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transition-duration:0s;transition-duration:0s;-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-delay:2s;transition-delay:2s}.ct-widget .ct-tool:before{line-height:32px}.ct-widget .ct-tool:nth-child(3n){margin-right:0}.ct-widget .ct-tool:hover{background:hsla(0,0%,100%,.5)}.ct-widget .ct-tool--disabled{color:rgba(70,70,70,.33)}.ct-widget .ct-tool--disabled:hover{background:transparent}.ct-widget .ct-tool--down{box-shadow:inset 0 1px 3px rgba(0,0,0,.25);line-height:34px}.ct-widget .ct-tool--down,.ct-widget .ct-tool--down:hover{background:rgba(0,0,0,.025)}.ct-widget .ct-tool--applied{background:rgba(0,0,0,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.25)}.ct-widget .ct-tool--applied:hover{background:rgba(0,0,0,.15)}.ct-widget .ct-tool--bold:before{content:"\ea62"}.ct-widget .ct-tool--heading:before{content:"H";font-weight:700}.ct-widget .ct-tool--subheading:before{content:"H"}.ct-widget .ct-tool--paragraph:before{content:"P"}.ct-widget .ct-tool--preformatted:before{content:"\ea80"}.ct-widget .ct-tool--italic:before{content:"\ea64"}.ct-widget .ct-tool--link:before{content:"\e9cb"}.ct-widget .ct-tool--align-left:before{content:"\ea77"}.ct-widget .ct-tool--align-center:before{content:"\ea78"}.ct-widget .ct-tool--align-right:before{content:"\ea79"}.ct-widget .ct-tool--unordered-list:before{content:"\e9ba"}.ct-widget .ct-tool--ordered-list:before{content:"\e9b9"}.ct-widget .ct-tool--table:before{content:"\ea71"}.ct-widget .ct-tool--indent:before{content:"\ea7b"}.ct-widget .ct-tool--unindent:before{content:"\ea7c"}.ct-widget .ct-tool--line-break:before{content:"\ea6e"}.ct-widget .ct-tool--image:before{content:"\e90d"}.ct-widget .ct-tool--video:before{content:"\ea98"}.ct-widget .ct-tool--undo:before{content:"\e965"}.ct-widget .ct-tool--redo:before{content:"\e966"}.ct-widget .ct-tool--remove:before{content:"\e9ac"}@-webkit-keyframes e{0%{outline-color:hsla(0,0%,100%,0);-webkit-transform:background-color}25%{outline-color:#f39c12;-webkit-transform:background-color}50%{outline-color:#f39c12;-webkit-transform:background-color}to{outline-color:hsla(0,0%,100%,0);-webkit-transform:background-color}}@keyframes e{0%{outline-color:hsla(0,0%,100%,0);-webkit-transform:background-color;transform:background-color}25%{outline-color:#f39c12;-webkit-transform:background-color;transform:background-color}50%{outline-color:#f39c12;-webkit-transform:background-color;transform:background-color}to{outline-color:hsla(0,0%,100%,0);-webkit-transform:background-color;transform:background-color}}.ct-app,.ct-app *,.ct-app :after,.ct-app :before{box-sizing:border-box}.ct--highlight{outline:4px solid #f39c12;-webkit-animation:e .5s ease-in;animation:e .5s ease-in;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.ct--no-scroll{overflow:hidden}.ct--puesdo-select{background:rgba(0,0,0,.1)} \ No newline at end of file diff --git a/assets/css/csgo.css b/assets/css/csgo.css new file mode 100644 index 0000000..ba35c1a --- /dev/null +++ b/assets/css/csgo.css @@ -0,0 +1,581 @@ +#csgo { + background: rgba(52, 73, 94, 0.5) url('/f/d90f6dbbce56e48d8c9e4b1d653d09f3') no-repeat center top; + color: #fff; +} + +.search { + background: #fafafa; + margin-top: -50px; +} + +.search .content { + background: transparent; + padding: 25px; +} + +.stats { + background: rgba(52, 73, 94, 0.75); +} + +.player-header { + background: rgba(52, 73, 94, 0.5) url('/f/7a06618704b1868479bd1fab1a28660b') no-repeat center center; + background-size: cover; + width: 100%; +} + +#csgo h1, +#csgo h3 { + color: #fafafa; +} + +.player-header .content { + background: rgba(52, 73, 94, 0.5); + color: #fff; + padding: 25px; +} + +.player-header #player-logo img { + width: 100%; +} + +#csgo h1 { + font-weight: 100; + font-size: 64px; +} + +.player-header h3, #csgo small { + display: inline; +} + +#csgo small { + font-size: 16px; + padding-left: 10px; + line-height: 16px; +} + +#csgo a { + color: #fff; +} + +#csgo h2 { + font-size: 50px; + font-weight: 200; + padding-left: 10px; +} + +.online, .in-game { + color: rgba(46, 204, 113, 1.0); +} + +.busy, .away { + color: #e67e22; +} + +.offline { + color: rgba(231, 76, 60, 1.0); +} + +.stats { + padding: 20px; +} + +.stats ul { + list-style: none; +} + +.stats li { + line-height: 50px; + display: block; + margin-bottom: 25px; +} + +.stats li svg { + float: left; + width: 50px; + height: 50px; + fill: #0bb3d6; + left: 0; + right: auto; + margin-right: 10px; +} + +.stats h4 { + margin-bottom: 10px; + line-height: 24px; + color: #0bb3d6; + text-transform: uppercase; + white-space: nowrap; + font-weight: 400; + padding-left: 5px; +} + +.stats .value { + font-size: 36px; + display: flex; + margin-top: -15px; + font-weight: 200; +} + +.section-2 { + padding-top: 20px; +} + +.section-2 svg.heading { + height: 24px; + display: block; + position: absolute; + margin: auto; + left: 5px; + top: 25px; + fill: #fff; + width: 60px; +} + +.section-2 h3.heading { + font-weight: 200; + color: rgb(11, 179, 214); +} + +.section-2 .weapons { + margin-right: 2.5px; + background: rgba(52, 73, 94, 0.8); + background: -webkit-linear-gradient(bottom, rgba(20, 32, 41, 0), rgba(20, 32, 41, .75) 100px); + background: linear-gradient(to top, rgba(20, 32, 41, 0), rgba(20, 32, 41, .75) 100px); + padding-bottom: 50px; +} + +.section-2 .maps { + margin-left: 2.5px; + margin-right: 2.5px; + background: rgba(52, 73, 94, 0.8); + background: -webkit-linear-gradient(bottom, rgba(20, 32, 41, 0), rgba(20, 32, 41, .75) 100px); + background: linear-gradient(to top, rgba(20, 32, 41, 0), rgba(20, 32, 41, .75) 100px); + padding-bottom: 50px; +} + +.section-2 .lastmatch { + margin-left: 2.5px; + background: rgba(52, 73, 94, 0.8); + background: -webkit-linear-gradient(bottom, rgba(20, 32, 41, 0), rgba(20, 32, 41, .75) 100px); + background: linear-gradient(to top, rgba(20, 32, 41, 0), rgba(20, 32, 41, .75) 100px); + padding-bottom: 50px; +} + +.weapons .item { + display: block; + position: relative; + letter-spacing: .02em; +} + +.weapons .content { + margin: auto 10px auto -25px; +} + +.weapons .card { + height: 160px; + background: url("/f/b7cc30d080b2d6aa9d78644201414939") center top no-repeat #666; + background-size: 100%; +} + +.weapons .card .title { + left: 30px; + color: #142029; + background: rgba(255, 255, 255, .75); + font-size: 18px; + text-transform: uppercase; + position: absolute; + bottom: 5px; + z-index: 2; + padding: 0 8px; + line-height: 28px; + font-weight: 700; +} + +.weapons .card .title .number { + display: block; + position: absolute; + right: 100%; + width: 25px; + color: #fff; + background: rgba(0, 0, 0, .75); + text-align: center; +} + +.weapons .card .photo { + top: 0; + left: 0; + bottom: 0; + right: 0; + z-index: 1; + margin: auto; + max-width: calc(100% - 20px); + max-height: calc(100% - 20px); + width: auto; + height: auto; + pointer-events: none; + display: block; + position: absolute; +} + +.weapons .card .stat { + right: 5px; + color: #fff; + background: rgba(115, 46, 42, .85); + font-size: 16px; + position: absolute; + bottom: 5px; + z-index: 2; + padding: 0 8px; + line-height: 28px; + font-weight: 700; + display: block; +} + +.weapons .stat svg { + height: 28px; + display: inline-block; + width: 16px; + fill: #fff; + opacity: .9; + vertical-align: top; +} + +.weapons .line { + padding: 15px 0 14px 75px; + border-bottom: 1px solid rgba(125, 199, 255, .08); + height: 50px; +} + +.weapons .line .title { + margin-top: -2px; + font-weight: 700; + font-size: 18px; + text-transform: uppercase; +} + +.weapons .line .icon { + top: 0; + left: 5px; + bottom: 0; + margin: auto; + width: 60px; + height: 22px; + fill: #fff; + display: block; + position: absolute; +} + +.weapons .line .stat { + font-weight: 700; + top: 15px; + right: 5px; + display: block; + position: absolute; +} + +.weapons .line .stat svg { + margin-top: -4px; +} + +.maps > * { + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-box-flex: 0; + -webkit-flex-grow: 0; + -ms-flex-positive: 0; + flex-grow: 0; +} + +.maps h3:before { + counter-increment: item; + content: counter(item); +} + +.maps .item .title:before { + display: block; + position: absolute; + right: 100%; + width: 17px; + color: #fff; + background: rgba(0, 0, 0, .75); + text-align: center; +} + +.maps .item.big .title:before { + width: 25px; +} + +.maps .item { + display: block; + position: relative; + margin-bottom: 10px; + width: 140px; + height: 70px; + overflow: hidden; + letter-spacing: .02em; + padding: 0; +} + +.maps .item .title { + bottom: 5px; + padding: 0 5px; + line-height: 20px; + font-size: 12px; + font-weight: 700; + position: absolute; + left: 22px; + z-index: 2; + color: #142029; + background: rgba(255, 255, 255, .75); + text-transform: uppercase; +} + +.maps .item .stat { + bottom: 5px; + padding: 0 5px; + line-height: 20px; + font-size: 12px; + font-weight: 700; + display: block; + position: absolute; + right: 5px; + z-index: 3; + color: #fff; + background: rgba(191, 147, 41, .85); +} + +.maps .item.big { + width: 100%; + height: 160px; +} + +.maps .item.big .photo { + vertical-align: middle; + display: block; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: auto; +} + +.maps .item.big .icon { + vertical-align: middle; + display: block; + position: absolute; + top: 5px; + right: 5px; + width: 60px; + height: auto; + pointer-events: none; +} + +.maps .item.big .title { + left: 30px; + padding: 0 8px; + line-height: 28px; + font-size: 18px; +} + +.maps .item.big .stat { + padding: 0 8px; + line-height: 28px; + font-size: 16px; +} + +.lastmatch .result { + position: relative; + padding: 20px 13px 20px 15px; + color: rgba(187, 187, 187, .9); + background: rgba(187, 187, 187, .05); + background-image: -webkit-radial-gradient(100% 50%, circle farthest-side, rgba(187, 187, 187, .1), rgba(187, 187, 187, 0)); + background-image: radial-gradient(circle farthest-side at 100% 50%, rgba(187, 187, 187, .1), rgba(187, 187, 187, 0)); + font-size: 16px; + font-style: italic; + border-right: 2px solid; +} + +.lastmatch .result h3 { + font-size: 16px; + margin-top: 1px; + margin-bottom: 0; + color: inherit; +} + +.lastmatch .result.win { + color: rgba(255, 198, 40, .9); + background: rgba(255, 198, 40, .05); + background-image: -webkit-radial-gradient(100% 50%, circle farthest-side, rgba(131, 198, 72, .1), rgba(131, 198, 72, 0)); + background-image: radial-gradient(circle farthest-side at 100% 50%, rgba(131, 198, 72, .1), rgba(131, 198, 72, 0)); +} + +.lastmatch .result .outcome { + display: block; + position: absolute; + top: 20px; + right: 12px; + font-weight: 700; + font-size: 16px; + letter-spacing: .01em; + font-style: normal; + text-transform: uppercase; +} + +.lastmatch .result .outcome svg { + display: inline-block; + vertical-align: bottom; + margin-left: 2px; + width: 22px; + height: 22px; + fill: currentColor; +} + +.lastmatch .content { + font-size: 13px; +} + +.lastmatch .weapon { + position: relative; + margin: 0 15px; + padding: 10px 0 9px; + border-bottom: 1px solid rgba(125, 199, 255, .08); +} + +.lastmatch .weapon h4 { + color: rgba(11, 179, 214, .8); + letter-spacing: .01em; + font-size: 13px; +} + +.lastmatch .weapon .icon { + display: block; + margin: 5px 0; + width: 50%; + height: 45px; + fill: currentColor; +} + +.lastmatch .weapon .name { + font-size: 16px; + font-weight: 700; + text-transform: uppercase; +} + +.lastmatch .weapon .stats { + position: absolute; + bottom: -9px; + right: 0; + line-height: 0; + font-size: 0; + background: transparent; +} + +.lastmatch .weapon .stat { + display: inline-block; + margin-left: 20px; + line-height: 20px; + font-size: 16px; + font-weight: 700; +} + +.lastmatch .weapon .stat svg { + display: inline-block; + width: 16px; + height: 20px; + vertical-align: top; + fill: currentColor; +} + +.lastmatch ul.list { + padding: 15px 15px 0; + letter-spacing: .01em; +} + +.lastmatch li { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + padding-bottom: 10px; +} + +.lastmatch li b { + display: block; + color: rgba(11, 179, 214, .9); + font-weight: inherit; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + word-wrap: normal; +} + +.lastmatch li strong { + display: block; + font-weight: 700; + text-align: right; + overflow: hidden; +} + +.otherstats { + background: url('/f/c3f5a93e9aaaeb877a1d171a3be22444') no-repeat center top; + margin-bottom: -50px; +} + +.otherstats .container { + margin-top: 20px; + background: rgba(248, 80, 50, 0); + background: -moz-linear-gradient(left, rgba(248, 80, 50, 0) 0%, rgba(20, 32, 41, 0.75) 25%, rgba(20, 32, 41, 0.75) 75%, rgba(231, 56, 39, 0) 100%); + background: -webkit-gradient(left top, right top, color-stop(0%, rgba(248, 80, 50, 0)), color-stop(25%, rgba(20, 32, 41, 0.75)), color-stop(75%, rgba(20, 32, 41, 0.75)), color-stop(100%, rgba(231, 56, 39, 0))); + background: -webkit-linear-gradient(left, rgba(248, 80, 50, 0) 0%, rgba(20, 32, 41, 0.75) 25%, rgba(20, 32, 41, 0.75) 75%, rgba(231, 56, 39, 0) 100%); + background: -o-linear-gradient(left, rgba(248, 80, 50, 0) 0%, rgba(20, 32, 41, 0.75) 25%, rgba(20, 32, 41, 0.75) 75%, rgba(231, 56, 39, 0) 100%); + background: -ms-linear-gradient(left, rgba(248, 80, 50, 0) 0%, rgba(20, 32, 41, 0.75) 25%, rgba(20, 32, 41, 0.75) 75%, rgba(231, 56, 39, 0) 100%); + background: linear-gradient(to right, rgba(248, 80, 50, 0) 0%, rgba(20, 32, 41, 0.75) 25%, rgba(20, 32, 41, 0.75) 75%, rgba(231, 56, 39, 0) 100%); + font-size: 13px; + padding: 15px 15px 25px; +} + +.otherstats .list { + -webkit-column-fill: balance; + -moz-column-fill: balance; + column-fill: balance; + -webkit-columns: 4; + -moz-columns: 4; + columns: 4; + -webkit-column-gap: 60px; + -moz-column-gap: 60px; + column-gap: 60px; +} + +.otherstats li { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + padding-bottom: 10px; +} + +.otherstats li b { + color: #0bb3d6; + font-weight: 400; +} + +.otherstats li span { + float: right; + padding-right: 25px; + font-weight: 700; +} \ No newline at end of file diff --git a/assets/css/custom-alerts.css b/assets/css/custom-alerts.css new file mode 100644 index 0000000..df13004 --- /dev/null +++ b/assets/css/custom-alerts.css @@ -0,0 +1,70 @@ +.alert { + border-width: 0 1px 4px 1px; +} + +.alert .alert-link { + font-weight: normal; + color: #fff; + text-decoration: underline; +} + +.alert-success, .alert-primary, .alert-danger, .alert-secondary, .alert-warning { + color: #fff; +} + +.alert-success { + background-color: #28b62c; + border-color: #24a528; +} + +.alert-success hr { + border-top-color: #209023; +} + +.alert-success .alert-link { + color: #e6e6e6; +} + +.alert-secondary { + background-color: #ff4668; + border-color: #F72754; +} + +.alert-secondary hr { + border-top-color: #d61a46; +} + +.alert-secondary .alert-link { + color: #e6e6e6; +} + +.alert-warning { + background-color: #ff851b; + border-color: #ff7701; +} + +.alert-warning hr { + border-top-color: #e76b00; +} + +.alert-warning .alert-link { + color: #e6e6e6; +} + +.alert-danger { + background-color: #ff4136; + border-color: #ff1103; +} + +.alert-danger hr { + border-top-color: #e90d00; +} + +.alert-danger .alert-link { + color: #e6e6e6; +} + +.alert-primary { + background-color: #2272ff; + border-color: #3562c1; +} \ No newline at end of file diff --git a/assets/css/custom-buttons.css b/assets/css/custom-buttons.css new file mode 100644 index 0000000..a03b02c --- /dev/null +++ b/assets/css/custom-buttons.css @@ -0,0 +1,498 @@ +/****************************************************** + CUSTOM BTN VALUES +******************************************************/ + +.btn { + padding: 14px 24px; + border: 0 none; + font-weight: 700; + letter-spacing: 1px; + text-transform: uppercase; +} + +.btn:focus, .btn:active:focus, .btn.active:focus { + outline: 0 none; +} + +/****************************************************** + STANDARD BUTTONS +******************************************************/ + +.btn-default { + border: 2px solid #C4C4C4; + color: #737373; + padding: 12px 22px; +} + +/*noinspection SpellCheckingInspection*/ +.btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { + background: #FFFFFF; + border-color: #949494; + color: #737373; +} + +.btn-default:active, .btn-default.active { + border-color: #737373; + box-shadow: none; +} + +.btn-primary { + background: #2272FF; + color: #ffffff; +} + +/*noinspection SpellCheckingInspection*/ +.btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { + background: #418eff; +} + +.btn-primary:active, .btn-primary.active { + background: #3b7ae3; + box-shadow: none; +} + +.btn-green { + background: #08DD73; + color: #ffffff; +} + +/*noinspection SpellCheckingInspection*/ +.btn-green:hover, .btn-green:focus, .btn-green:active, .btn-green.active, .open > .dropdown-toggle.btn-green { + background: #08eb7f; +} + +.btn-green:active, .btn-green.active { + background: #008c52; + box-shadow: none; +} + +.btn-orange { + background: #FF9226; + color: #ffffff; +} + +/*noinspection SpellCheckingInspection*/ +.btn-orange:hover, .btn-orange:focus, .btn-orange:active, .btn-orange.active, .open > .dropdown-toggle.btn-orange { + background: #ff9f40; +} + +.btn-orange:active, .btn-orange.active { + background: #d77e1f; + box-shadow: none; +} + +.btn-red { + background: #F72754; + color: #ffffff; +} + +/*noinspection SpellCheckingInspection*/ +.btn-red:hover, .btn-red:focus, .btn-red:active, .btn-red.active, .open > .dropdown-toggle.btn-red { + background: #ff4668; +} + +.btn-red:active, .btn-red.active { + background: #d61a46; + box-shadow: none; +} + +/****************************************************** + OUTLINE BUTTONS +******************************************************/ + +.btn.outline { + background: none; + padding: 12px 22px; +} + +.btn-primary.outline { + border: 2px solid #2272FF; + color: #2272FF; +} + +/*noinspection SpellCheckingInspection*/ +.btn-primary.outline:hover, .btn-primary.outline:focus, .btn-primary.outline:active, .btn-primary.outline.active, .open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #2272FF; + border-color: #2272FF; +} + +.btn-primary.outline:active, .btn-primary.outline.active { + border-color: #3b7ae3; + color: #3b7ae3; + box-shadow: none; +} + +.btn-green.outline { + border: 2px solid #08DD73; + color: #08DD73; +} + +/*noinspection SpellCheckingInspection*/ +.btn-green.outline:hover, .btn-green.outline:focus, .btn-green.outline:active, .btn-green.outline.active, .open > .dropdown-toggle.btn-green { + border-color: #39bf87; + background-color: #39bf87; + color: #fff +} + +.btn-green.outline:active, .btn-green.outline.active { + border-color: #008c52; + color: #008c52; + box-shadow: none; +} + +.btn-orange.outline { + border: 2px solid #FF9226; + color: #FF9226; +} + +/*noinspection SpellCheckingInspection*/ +.btn-orange.outline:hover, .btn-orange.outline:focus, .btn-orange.outline:active, .btn-orange.outline.active, .open > .dropdown-toggle.btn-orange { + border-color: #ff9f40; + background-color: #ff9f40; + color: #fff; +} + +.btn-orange.outline:active, .btn-orange.outline.active { + border-color: #d77e1f; + color: #d77e1f; + box-shadow: none; +} + +.btn-red.outline { + border: 2px solid #F72754; + color: #F72754; +} + +/*noinspection SpellCheckingInspection*/ +.btn-red.outline:hover, .btn-red.outline:focus, .btn-red.outline:active, .btn-red.outline.active, .open > .dropdown-toggle.btn-red { + color: #fff; + border-color: #ff4668; + background-color: #ff4668; +} + +.btn-red.outline:active, .btn-red.outline.active { + border-color: #d61a46; + color: #d61a46; + box-shadow: none; +} + +/****************************************************** + GRADIENT BUTTONS +******************************************************/ + +.btn-primary.gradient { + background: -moz-linear-gradient(top, #418eff 50%, #2272FF 50%); + /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(50%, #418eff), color-stop(50%, #2272FF)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #418eff 50%, #2272FF 50%); + /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #418eff 50%, #2272FF 50%); + /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #418eff 50%, #2272FF 50%); + /* IE10+ */ + background: linear-gradient(to bottom, #418eff 50%, #2272FF 50%); + /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#418eff', endColorstr='#2272FF', GradientType=0); + /* IE6-9 */ +} + +/*noinspection SpellCheckingInspection*/ +.btn-primary.gradient:hover, .btn-primary.gradient:focus, .btn-primary.gradient:active, .btn-primary.gradient.active, .open > .dropdown-toggle.btn-primary { + background: -moz-linear-gradient(top, #5ea8ff 50%, #418eff 50%); + /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(50%, #5ea8ff), color-stop(50%, #418eff)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #5ea8ff 50%, #418eff 50%); + /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #5ea8ff 50%, #418eff 50%); + /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #5ea8ff 50%, #418eff 50%); + /* IE10+ */ + background: linear-gradient(to bottom, #5ea8ff 50%, #418eff 50%); + /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5ea8ff', endColorstr='#418eff', GradientType=0); + /* IE6-9 */ +} + +.btn-primary.gradient:active, .btn-primary.gradient.active { + background: -moz-linear-gradient(top, #3562c1 50%, #3b7ae3 50%); + /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(50%, #3562c1), color-stop(50%, #3b7ae3)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #3562c1 50%, #3b7ae3 50%); + /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #3562c1 50%, #3b7ae3 50%); + /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #3562c1 50%, #3b7ae3 50%); + /* IE10+ */ + background: linear-gradient(to bottom, #3562c1 50%, #3b7ae3 50%); + /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#3562c1', endColorstr='#3b7ae3', GradientType=0); + /* IE6-9 */ +} + +.btn-green.gradient { + background: -moz-linear-gradient(top, #39bf87 50%, #08DD73 50%); + /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(50%, #39bf87), color-stop(50%, #08DD73)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #39bf87 50%, #08DD73 50%); + /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #39bf87 50%, #08DD73 50%); + /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #39bf87 50%, #08DD73 50%); + /* IE10+ */ + background: linear-gradient(to bottom, #39bf87 50%, #08DD73 50%); + /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#39bf87', endColorstr='#08DD73', GradientType=0); + /* IE6-9 */ +} + +/*noinspection SpellCheckingInspection*/ +.btn-green.gradient:hover, .btn-green.gradient:focus, .btn-green.gradient:active, .btn-green.gradient.active, .open > .dropdown-toggle.btn-green { + background: -moz-linear-gradient(top, #73bf9f 50%, #39bf87 50%); + /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(50%, #73bf9f), color-stop(50%, #39bf87)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #73bf9f 50%, #39bf87 50%); + /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #73bf9f 50%, #39bf87 50%); + /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #73bf9f 50%, #39bf87 50%); + /* IE10+ */ + background: linear-gradient(to bottom, #73bf9f 50%, #39bf87 50%); + /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#73bf9f', endColorstr='#39bf87', GradientType=0); + /* IE6-9 */ +} + +.btn-green.gradient:active, .btn-green.gradient.active { + background: -moz-linear-gradient(top, #2a8c63 50%, #008c52 50%); + /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(50%, #2a8c63), color-stop(50%, #008c52)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #2a8c63 50%, #008c52 50%); + /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #2a8c63 50%, #008c52 50%); + /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #2a8c63 50%, #008c52 50%); + /* IE10+ */ + background: linear-gradient(to bottom, #2a8c63 50%, #008c52 50%); + /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2a8c63', endColorstr='#008c52', GradientType=0); + /* IE6-9 */ +} + +.btn-orange.gradient { + background: -moz-linear-gradient(top, #ff9f40 50%, #FF9226 50%); + /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(50%, #ff9f40), color-stop(50%, #FF9226)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #ff9f40 50%, #FF9226 50%); + /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ff9f40 50%, #FF9226 50%); + /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #ff9f40 50%, #FF9226 50%); + /* IE10+ */ + background: linear-gradient(to bottom, #ff9f40 50%, #FF9226 50%); + /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff9f40', endColorstr='#FF9226', GradientType=0); + /* IE6-9 */ +} + +/*noinspection SpellCheckingInspection*/ +.btn-orange.gradient:hover, .btn-orange.gradient:focus, .btn-orange.gradient:active, .btn-orange.gradient.active, .open > .dropdown-toggle.btn-orange { + background: -moz-linear-gradient(top, #ffbe77 50%, #ff9f40 50%); + /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(50%, #ffbe77), color-stop(50%, #ff9f40)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #ffbe77 50%, #ff9f40 50%); + /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ffbe77 50%, #ff9f40 50%); + /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #ffbe77 50%, #ff9f40 50%); + /* IE10+ */ + background: linear-gradient(to bottom, #ffbe77 50%, #ff9f40 50%); + /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffbe77', endColorstr='#ff9f40', GradientType=0); + /* IE6-9 */ +} + +.btn-orange.gradient:active, .btn-orange.gradient.active { + background: -moz-linear-gradient(top, #ba671d 50%, #d77e1f 50%); + /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(50%, #ba671d), color-stop(50%, #d77e1f)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #ba671d 50%, #d77e1f 50%); + /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ba671d 50%, #d77e1f 50%); + /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #ba671d 50%, #d77e1f 50%); + /* IE10+ */ + background: linear-gradient(to bottom, #ba671d 50%, #d77e1f 50%); + /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ba671d', endColorstr='#d77e1f', GradientType=0); + /* IE6-9 */ +} + +.btn-red.gradient { + background: -moz-linear-gradient(top, #ff4668 50%, #F72754 50%); + /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(50%, #ff4668), color-stop(50%, #F72754)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #ff4668 50%, #F72754 50%); + /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ff4668 50%, #F72754 50%); + /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #ff4668 50%, #F72754 50%); + /* IE10+ */ + background: linear-gradient(to bottom, #ff4668 50%, #F72754 50%); + /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4668', endColorstr='#F72754', GradientType=0); + /* IE6-9 */ +} + +/*noinspection SpellCheckingInspection*/ +.btn-red.gradient:hover, .btn-red.gradient:focus, .btn-red.gradient:active, .btn-red.gradient.active, .open > .dropdown-toggle.btn-red { + background: -moz-linear-gradient(top, #ff8096 50%, #ff4668 50%); + /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(50%, #ff8096), color-stop(50%, #ff4668)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #ff8096 50%, #ff4668 50%); + /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ff8096 50%, #ff4668 50%); + /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #ff8096 50%, #ff4668 50%); + /* IE10+ */ + background: linear-gradient(to bottom, #ff8096 50%, #ff4668 50%); + /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8096', endColorstr='#ff4668', GradientType=0); + /* IE6-9 */ +} + +.btn-red.gradient:active, .btn-red.gradient.active { + background: -moz-linear-gradient(top, #af1841 50%, #d61a46 50%); + /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(50%, #af1841), color-stop(50%, #d61a46)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #af1841 50%, #d61a46 50%); + /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #af1841 50%, #d61a46 50%); + /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #af1841 50%, #d61a46 50%); + /* IE10+ */ + background: linear-gradient(to bottom, #af1841 50%, #d61a46 50%); + /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#af1841', endColorstr='#d61a46', GradientType=0); + /* IE6-9 */ +} + +/****************************************************** + ROUNDED BUTTONS +******************************************************/ + +.btn.round { + border-radius: 24px; +} + +.btn-lg.round { + border-radius: 32px; +} + +.btn-sm.round { + border-radius: 14px; +} + +.btn-xs.round { + border-radius: 10px; +} + +/****************************************************** + RAISED BUTTONS +******************************************************/ + +.btn-primary.raised { + box-shadow: 0 3px 0 0 #3b7ae3; +} + +.btn-primary.raised:active, .btn-primary.raised.active { + background: #418eff; + box-shadow: none; + margin-bottom: -3px; + margin-top: 3px; +} + +.btn-green.raised { + box-shadow: 0 3px 0 0 #008c52; +} + +.btn-green.raised:active, .btn-green.raised.active { + background: #39bf87; + box-shadow: none; + margin-bottom: -3px; + margin-top: 3px; +} + +.btn-orange.raised { + box-shadow: 0 3px 0 0 #d77e1f; +} + +.btn-orange.raised:active, .btn-orange.raised.active { + background: #ff9f40; + box-shadow: none; + margin-bottom: -3px; + margin-top: 3px; +} + +.btn-red.raised { + box-shadow: 0 3px 0 0 #d61a46; +} + +.btn-red.raised:active, .btn-red.raised.active { + background: #ff4668; + box-shadow: none; + margin-bottom: -3px; + margin-top: 3px; +} + +/****************************************************** + BUTTON SIZING +******************************************************/ + +.btn-xs, .btn-group-xs > .btn { + padding: 2px 6px; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 8px 12px; +} + +.btn-lg { + padding: 20px 40px; + border-radius: 4px; +} + +.btn-xs.btn-default, .btn-xs.outline { + padding: 0 4px; +} + +.btn-sm.btn-default, .btn-sm.outline { + padding: 6px 10px; +} + +.btn-lg.btn-default, .btn-lg.outline { + padding: 18px 38px; +} + +.btn-transparent { + border: 3px solid #fff; + padding: 11px 21px; + background: transparent; + color: #fff; +} + +.btn-transparent:hover { + border-color: rgba(255, 255, 255, 0.5); +} diff --git a/assets/css/custom.css b/assets/css/custom.css new file mode 100644 index 0000000..62b5970 --- /dev/null +++ b/assets/css/custom.css @@ -0,0 +1,5107 @@ +@charset "UTF-8"; +body { + color: #555; + background: #fafafa; + font-family: 'Roboto', sans-serif; + font-weight: 300; + font-size: 18px; + overflow-x: hidden; +} + +.left_col { + background: #444; +} + +.nav-sm .container.body .col-md-3.left_col { + min-height: 100%; + width: 70px; + padding: 0; + z-index: 9999; + position: absolute; +} + +.nav-sm .container.body .col-md-3.left_col.menu_fixed { + position: fixed; + height: 100%; +} + +.nav-sm .container.body .col-md-3.left_col .mCSB_container, +.nav-sm .container.body .col-md-3.left_col .mCustomScrollBox { + overflow: visible; +} + +.nav-sm .hidden-small { + visibility: hidden; +} + +.nav-sm .container.body .right_col { + padding: 10px 20px; + margin-left: 70px; + z-index: 2; +} + +.nav-sm .navbar.nav_title { + width: 70px; +} + +.nav-sm .navbar.nav_title a span { + display: none; +} + +.nav-sm .navbar.nav_title a i { + font-size: 27px; + margin: 13px 0 0 3px; +} + +.site_title i { + border: 1px solid #EAEAEA; + padding: 5px 6px; + border-radius: 50%; +} + +.nav-sm .main_container .top_nav { + display: block; + margin-left: 70px; + z-index: 2; +} + +.nav-sm .nav.side-menu li a { + text-align: center !important; + font-weight: 400; + font-size: 10px; + padding: 10px 5px; +} + +.nav-sm .nav.child_menu li.active, +.nav-sm .nav.side-menu li.active-sm { + border-right: 5px solid #1ABB9C; +} + +.nav-sm ul.nav.child_menu ul, +.nav-sm .nav.side-menu li.active-sm ul ul { + position: static; + width: 200px; + background: none; +} + +.nav-sm > .nav.side-menu > li.active-sm > a { + color: #1ABB9C !important; +} + +.nav-sm .nav.side-menu li a i.toggle-up { + display: none !important; +} + +.nav-sm .nav.side-menu li a i { + font-size: 25px !important; + text-align: center; + width: 100% !important; + margin-bottom: 5px; +} + +.nav-sm ul.nav.child_menu { + left: 100%; + position: absolute; + top: 0; + width: 210px; + z-index: 4000; + background: #3E5367; + display: none; +} + +.nav-sm ul.nav.child_menu li { + padding: 0 10px; +} + +.nav-sm ul.nav.child_menu li a { + text-align: left !important; +} + +.nav-sm .profile { + display: none; +} + +.menu_section { + margin-bottom: 15px; +} + +.menu_section h3 { + padding-left: 23px; + color: #fff; + text-transform: uppercase; + letter-spacing: .5px; + font-weight: bold; + font-size: 11px; + margin-bottom: 0; + margin-top: 0; + text-shadow: 1px 1px #000; +} + +.menu_section > ul { + margin-top: 10px; +} + +.profile_pic { + width: 35%; + float: left; +} + +.img-circle.profile_img { + width: 70%; + background: #fff; + margin-left: 15%; + z-index: 1000; + position: inherit; + margin-top: 20px; + border: 1px solid rgba(52, 73, 94, 0.44); + padding: 4px; +} + +.profile_info { + padding: 25px 10px 10px; + width: 65%; + float: left; +} + +.profile_info span { + font-size: 13px; + line-height: 30px; + color: #BAB8B8; +} + +.profile_info h2 { + font-size: 14px; + color: #ECF0F1; + margin: 0; + font-weight: 300; +} + +.profile.img_2 { + text-align: center; +} + +.profile.img_2 .profile_pic { + width: 100%; +} + +.profile.img_2 .profile_pic .img-circle.profile_img { + width: 50%; + margin: 10px 0 0; +} + +.profile.img_2 .profile_info { + padding: 15px 10px 0; + width: 100%; + margin-bottom: 10px; + float: left; +} + +.main_menu span.fa { + float: right; + text-align: center; + margin-top: 5px; + font-size: 10px; + min-width: inherit; + color: #C4CFDA; +} + +.active a span.fa { + text-align: right !important; + margin-right: 4px; +} + +.nav-sm .menu_section { + margin: 0; +} + +.nav-sm span.fa, +.nav-sm .menu_section h3 { + display: none; +} + +.nav-sm li li span.fa { + display: inline-block; +} + +.nav_menu { + float: left; + background: rgb(245, 245, 245); + border-bottom: 0; + margin-bottom: 10px; + width: 100%; + position: relative; + box-shadow: 0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12); +} + +@media (min-width: 480px) { + .nav_menu { + position: static; + } +} + +.nav-md .container.body .col-md-3.left_col { + min-height: 100%; + width: 230px; + padding: 0; + position: absolute; + display: -ms-flexbox; + display: flex; + z-index: 1; +} + +.nav-md .container.body .col-md-3.left_col.menu_fixed { + height: 100%; + position: fixed; +} + +body .container.body .right_col { + background: #F7F7F7; +} + +.nav-md .container.body .right_col { + padding: 10px 20px 0; + margin-left: 230px; +} + +.nav_title { + width: 230px; + float: left; + background: #333; + border-radius: 0; + height: 57px; +} + +@media (max-width: 991px) { + .nav-md .container.body .right_col, .nav-md .container.body .top_nav { + width: 100%; + margin: 0; + } + + .nav-md .container.body .col-md-3.left_col { + display: none; + } + + .nav-md .container.body .right_col { + width: 100%; + padding-right: 0; + } + + .right_col { + padding: 10px !important; + } +} + +@media (max-width: 1200px) { + .x_title h2 { + width: 62%; + font-size: 17px; + } + + .tile, .graph { + zoom: 85%; + height: inherit; + } +} + +@media (max-width: 1270px) and (min-width: 192px) { + .x_title h2 small { + display: none; + } +} + +.left_col .mCSB_scrollTools { + width: 6px; +} + +.left_col .mCSB_dragger { + max-height: 400px !important; +} + +/** ------------------------------------------ **/ +.blue { + color: #3498DB; +} + +.purple { + color: #9B59B6; +} + +.green { + color: #1ABB9C; +} + +.aero { + color: #9CC2CB; +} + +.red { + color: #E74C3C; +} + +.dark { + color: #34495E; +} + +.border-blue { + border-color: #3498DB !important; +} + +.border-purple { + border-color: #9B59B6 !important; +} + +.border-green { + border-color: #1ABB9C !important; +} + +.border-aero { + border-color: #9CC2CB !important; +} + +.border-red { + border-color: #E74C3C !important; +} + +.border-dark { + border-color: #34495E !important; +} + +.bg-white { + background: #fff !important; + border: 1px solid #fff !important; + color: #73879C; +} + +.bg-green { + background: #1ABB9C !important; + border: 1px solid #1ABB9C !important; + color: #fff; +} + +.bg-red { + background: #E74C3C !important; + border: 1px solid #E74C3C !important; + color: #fff; +} + +.bg-blue { + background: #3498DB !important; + border: 1px solid #3498DB !important; + color: #fff; +} + +.bg-orange { + background: #F39C12 !important; + border: 1px solid #F39C12 !important; + color: #fff; +} + +.bg-purple { + background: #9B59B6 !important; + border: 1px solid #9B59B6 !important; + color: #fff; +} + +.bg-blue-sky { + background: #50C1CF !important; + border: 1px solid #50C1CF !important; + color: #fff; +} + +.container { + width: 100%; + padding: 0; + max-width: 100%; +} + +.navbar-nav > li > a, .navbar-brand, .navbar-nav > li > a { + color: #fff !important; +} + +.top_nav .nav > li > a:focus, .top_nav .nav > li > a:hover, .top_nav .nav .open > a, .top_nav .nav .open > a:focus, .top_nav .nav .open > a:hover { + background: #D9DEE4; +} + +.main_container .top_nav { + display: block; + margin-left: 230px; +} + +.no-padding { + padding: 0 !important; +} + +.page-title { + width: 100%; + height: 65px; + padding: 10px 0; +} + +.page-title .title_left { + width: 45%; + float: left; + display: block; +} + +.page-title .title_left h3 { + margin: 9px 0; +} + +.page-title .title_right { + width: 55%; + float: left; + display: block; +} + +.page-title .title_right .pull-right { + margin: 10px 0; +} + +.fixed_height_320 { + height: 320px; +} + +.fixed_height_390 { + height: 390px; +} + +.fixed_height_200 { + height: 200px; +} + +.overflow_hidden { + overflow: hidden; +} + +.progress-bar-dark { + background-color: #34495E !important; +} + +.progress-bar-gray { + background-color: #BDC3C7 !important; +} + +table.no-margin .progress { + margin-bottom: 0; +} + +.main_content { + padding: 10px 20px; +} + +.col-md-55 { + width: 50%; + margin-bottom: 10px; +} + +@media (min-width: 768px) { + .col-md-55 { + width: 20%; + } +} + +@media (min-width: 992px) { + .col-md-55 { + width: 20%; + } +} + +@media (min-width: 1200px) { + .col-md-55 { + width: 20%; + } +} + +@media (min-width: 192px) and (max-width: 1270px) { + table.tile_info span.right { + margin-right: 7px; + float: left; + } +} + +.center-margin { + margin: 0 auto; + float: none !important; +} + +.col-md-55, .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + float: left; + padding-right: 10px; + padding-left: 10px; +} + +.row { + margin-right: -10px; + margin-left: -10px; +} + +.grid_slider .col-md-6 { + padding: 0 40px; +} + +h1, .h1, h2, .h2, h3, .h3 { + margin-top: 10px; + margin-bottom: 10px; +} + +a { + color: #5A738E; + text-decoration: none; +} + +a, a:visited, a:focus, a:active, :visited, :focus, :active, .btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus { + outline: 0; +} + +a:hover, a:focus { + text-decoration: none; +} + +.navbar { + margin-bottom: 0; +} + +.navbar-header { + background: #34495E; +} + +.navbar-right { + margin-right: 0; +} + +.top_nav .navbar-right { + margin: 0; + width: 70%; + float: right; +} + +.top_nav .navbar-right li { + display: inline-block; + float: right; + position: static; +} + +@media (min-width: 480px) { + .top_nav .navbar-right li { + position: relative; + } +} + +.top_nav .dropdown-menu li { + width: 100%; +} + +.top_nav .dropdown-menu li a { + width: 100%; + padding: 12px 20px; + transition: all .25s; +} + +.top_nav .dropdown-menu > li > a:hover { + background-color: #2272ff; + color: #fff !important; +} + +.top_nav li a i { + font-size: 15px; +} + +.navbar-static-top { + position: fixed; + top: 0; + width: 100%; +} + +.sidebar-header { + border-bottom: 0; + margin-top: 46px; +} + +.sidebar-header:first-of-type { + margin-top: 0; +} + +.nav.side-menu > li { + position: relative; + display: block; + cursor: pointer; +} + +.nav.side-menu > li > a { + margin-bottom: 6px; +} + +.nav.side-menu > li > a:hover { + color: #F2F5F7 !important; +} + +.nav.side-menu > li > a:hover, .nav > li > a:focus { + text-decoration: none; + background: rgba(255, 255, 255, .05); +} + +.nav.child_menu { + display: none; +} + +.nav.child_menu li:hover, +.nav.child_menu li.active { + background-color: rgba(255, 255, 255, 0.06); +} + +.nav.child_menu li { + padding-left: 36px; +} + +.nav-md ul.nav.child_menu li:before { + background: #425668; + bottom: auto; + content: ""; + height: 8px; + left: 23px; + margin-top: 15px; + position: absolute; + right: auto; + width: 8px; + z-index: 1; + border-radius: 50%; +} + +.nav-md ul.nav.child_menu li:after { + border-left: 1px solid #425668; + bottom: 0; + content: ""; + left: 27px; + position: absolute; + top: 0; +} + +.nav.side-menu > li > a, .nav.child_menu > li > a { + color: #E7E7E7; + font-weight: 500; +} + +.nav.child_menu li li:hover, +.nav.child_menu li li.active { + background: none; +} + +.nav.child_menu li li a:hover, +.nav.child_menu li li a.active { + color: #fff; +} + +.nav > li > a { + position: relative; + display: block; + padding: 13px 15px 12px; +} + +.nav.side-menu > li.current-page, .nav.side-menu > li.active { + border-right: 5px solid #2272ff; +} + +.nav li.current-page { + background: rgba(255, 255, 255, 0.05); +} + +.nav li li li.current-page { + background: none; +} + +.nav li li.current-page a { + color: #fff; +} + +.nav.side-menu > li.active > a { + text-shadow: rgba(0, 0, 0, 0.25) 0 -1px 0; + background: linear-gradient(#334556, #2C4257), #2A3F54; + box-shadow: rgba(0, 0, 0, 0.25) 0 1px 0, inset rgba(255, 255, 255, 0.16) 0 1px 0; +} + +.navbar-brand, .navbar-nav > li > a { + font-weight: 500; + color: #ECF0F1 !important; + margin-left: 0 !important; + line-height: 32px; +} + +.site_title { + text-overflow: ellipsis; + overflow: hidden; + font-weight: 400; + font-size: 22px; + width: 100%; + color: #ECF0F1 !important; + margin-left: 0 !important; + line-height: 59px; + display: block; + height: 55px; + margin: 0; + padding-left: 10px; +} + +.site_title:hover, .site_title:focus { + text-decoration: none; +} + +.nav.navbar-nav > li > a { + color: #515356 !important; +} + +.nav.top_menu > li > a { + position: relative; + display: block; + padding: 10px 15px; + color: #34495E !important; +} + +.nav > li > a:hover, .nav > li > a:focus { + background-color: transparent; +} + +.top_search { + padding: 0; +} + +.top_search .form-control { + border-right: 0; + box-shadow: inset 0 1px 0px rgba(0, 0, 0, 0.075); + border-radius: 25px 0px 0px 25px; + padding-left: 20px; + border: 1px solid rgba(221, 226, 232, 0.49); +} + +.top_search .form-control:focus { + border: 1px solid rgba(221, 226, 232, 0.49); + border-right: 0; +} + +.top_search .input-group-btn button { + border-radius: 0px 25px 25px 0px; + border: 1px solid rgba(221, 226, 232, 0.49); + border-left: 0; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + color: #93A2B2; + margin-bottom: 0 !important; +} + +.toggle { + float: left; + margin: 0; + padding-top: 16px; + width: 70px; +} + +.toggle a { + padding: 15px 15px 0; + margin: 0; + cursor: pointer; + color: rgb(55, 71, 79); +} + +.toggle a:hover, .toggle a:active { + color: rgb(38, 50, 56); +} + +.toggle a i { + font-size: 26px; +} + +.nav.child_menu > li > a { + color: rgba(255, 255, 255, 0.75); + font-size: 12px; + padding: 9px; +} + +.panel_toolbox { + float: right; + min-width: 70px; +} + +.panel_toolbox > li { + float: left; + cursor: pointer; +} + +.panel_toolbox > li > a { + padding: 5px; + color: #C5C7CB; + font-size: 14px; +} + +.panel_toolbox > li > a:hover { + background: #F5F7FA; +} + +.line_30 { + line-height: 30px; +} + +.main_menu_side { + padding: 0; +} + +.bs-docs-sidebar .nav > li > a { + display: block; + padding: 4px 6px; +} + +footer { + background: #fff; + padding: 15px 20px; + display: block; +} + +.nav-sm footer { + margin-left: 70px; +} + +.footer_fixed footer { + position: fixed; + left: 0px; + bottom: 0px; + width: 100%; +} + +@media (min-width: 768px) { + .footer_fixed footer { + margin-left: 0; + } +} + +@media (min-width: 768px) { + .footer_fixed .nav-sm footer { + margin-left: 0; + } +} + +.tile-stats.sparkline { + padding: 10px; + text-align: center; +} + +.jqstooltip { + background: #34495E !important; + width: 30px !important; + height: 22px !important; + text-decoration: none; +} + +.tooltip { + display: block !important; +} + +.tiles { + border-top: 1px solid #ccc; + margin-top: 15px; + padding-top: 5px; + margin-bottom: 0; +} + +.tile { + overflow: hidden; +} + +.top_tiles { + margin-bottom: 0; +} + +.top_tiles .tile h2 { + font-size: 30px; + line-height: 30px; + margin: 3px 0 7px; + font-weight: bold; +} + +article.media { + width: 100%; +} + +/* ********* custom accordion **************************** */ +*, *:before, *:after { + box-sizing: border-box; +} + +#integration-list { + width: 100%; + margin: 0 auto; + display: table; +} + +#integration-list ul { + padding: 0; + margin: 20px 0; + color: #555; +} + +#integration-list ul > li { + list-style: none; + border-top: 1px solid #ddd; + display: block; + padding: 15px; + overflow: hidden; +} + +#integration-list ul:last-child { + border-bottom: 1px solid #ddd; +} + +#integration-list ul > li:hover { + background: #efefef; +} + +.expand { + display: block; + text-decoration: none; + color: #555; + cursor: pointer; +} + +.expand h2 { + width: 85%; + float: left; +} + +h2 { + font-size: 18px; + font-weight: 400; +} + +#left, #right { + display: table; +} + +#sup { + display: table-cell; + vertical-align: middle; + width: 80%; +} + +.detail a { + text-decoration: none; + color: #C0392B; + border: 1px solid #C0392B; + padding: 6px 10px 5px; + font-size: 13px; + margin-right: 7px; +} + +.detail { + margin: 10px 0 10px 0px; + display: none; + line-height: 22px; + height: 150px; +} + +.detail span { + margin: 0; +} + +.right-arrow { + width: 10px; + float: right; + font-weight: bold; + font-size: 20px; +} + +.accordion .panel { + margin-bottom: 5px; + border-radius: 0; + border-bottom: 1px solid #efefef; +} + +.accordion .panel-heading { + background: #F2F5F7; + padding: 13px; + width: 100%; + display: block; +} + +.accordion .panel:hover { + background: #F2F5F7; +} + +.x_panel { + position: relative; + width: 100%; + margin-bottom: 10px; + padding: 10px 17px; + display: inline-block; + background: #fff; + border-radius: 2px; + -webkit-column-break-inside: avoid; + -moz-column-break-inside: avoid; + column-break-inside: avoid; + opacity: 1; + transition: all .2s ease; + box-shadow: 0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12); +} + +.x_title { + border-bottom: 1px solid rgba(0,0,0,.1); + padding: 1px 5px 6px; + margin-bottom: 10px; +} + +.x_title .filter { + width: 40%; + float: right; +} + +.x_title h2 { + margin: 5px 0 6px; + float: left; + display: block; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + font-family: Roboto, Arial, sans-serif; + font-weight: 300; + font-size: 24px; +} + +.x_title h2 small { + margin-left: 10px; +} + +.x_title span { + color: #BDBDBD; +} + +.x_content { + padding: 0 5px 6px; + position: relative; + width: 100%; + float: left; + clear: both; + margin-top: 5px; +} + +.x_content p.text-muted.font-13.m-b-30 { + color: rgba(0,0,0,.54); + /*font-size: 14px;*/ + /*font-weight: 400;*/ + /*font-family: "Roboto", Arial, sans-serif;*/ + /*line-height: 18px;*/ +} + +.x_content h4 { + font-size: 16px; + font-weight: 500; +} + +legend { + padding-bottom: 7px; +} + +.demo-placeholder { + height: 280px; +} + +/** Contacts **/ +.profile_details:nth-child(3n) { + clear: both; +} + +.profile_details .profile_view { + display: inline-block; + padding: 10px 0 0; + background: #fff; +} + +.profile_details .profile_view .divider { + border-top: 1px solid #e5e5e5; + padding-top: 5px; + margin-top: 5px; +} + +.profile_details .profile_view .ratings { + margin-bottom: 0; +} + +.profile_details .profile_view .bottom { + background: #F2F5F7; + padding: 9px 0; + border-top: 1px solid #E6E9ED; +} + +.profile_details .profile_view .left { + margin-top: 20px; +} + +.profile_details .profile_view .left p { + margin-bottom: 3px; +} + +.profile_details .profile_view .right { + margin-top: 0px; + padding: 10px; +} + +.profile_details .profile_view .img-circle { + border: 1px solid #E6E9ED; + padding: 2px; +} + +.profile_details .profile_view h2 { + margin: 5px 0; +} + +.profile_details .profile_view .ratings { + text-align: left; + font-size: 16px; +} + +.profile_details .profile_view .brief { + margin: 0; + font-weight: 300; +} + +.profile_details .profile_left { + background: white; +} + +.pagination.pagination-split li { + display: inline-block; + margin-right: 3px; +} + +.pagination.pagination-split li a { + border-radius: 4px; + color: #768399; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; +} + +/** Contacts **/ +/* ********* /custom accordion **************************** */ +/* ********* dashboard widget **************************** */ +table.tile h3, table.tile h4, table.tile span { + font-weight: bold; + vertical-align: middle !important; +} + +table.tile th, table.tile td { + text-align: center; +} + +table.tile th { + border-bottom: 1px solid #E6ECEE; +} + +table.tile td { + padding: 5px 0; +} + +table.tile td ul { + text-align: left; + padding-left: 0; +} + +table.tile td ul li { + list-style: none; + width: 100%; +} + +table.tile td ul li a { + width: 100%; +} + +table.tile td ul li a big { + right: 0; + float: right; + margin-right: 13px; +} + +table.tile_info { + width: 100%; +} + +table.tile_info td { + text-align: left; + padding: 1px; + font-size: 15px; +} + +table.tile_info td p { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin: 0; + line-height: 28px; +} + +table.tile_info td i { + margin-right: 8px; + font-size: 17px; + float: left; + width: 18px; + line-height: 28px; +} + +table.tile_info td:first-child { + width: 83%; +} + +td span { + line-height: 28px; +} + +.sidebar-widget { + overflow: hidden; +} + +.error-number { + font-size: 90px; + line-height: 90px; + margin: 20px 0; +} + +.col-middle { + margin-top: 5%; +} + +.mid_center { + width: 370px; + margin: 0 auto; + text-align: center; + padding: 10px 20px; +} + +h3.degrees { + font-size: 22px; + font-weight: 400; + text-align: center; +} + +.degrees:after { + content: "o"; + position: relative; + top: -12px; + font-size: 13px; + font-weight: 300; +} + +.daily-weather .day { + font-size: 14px; + border-top: 2px solid rgba(115, 135, 156, 0.36); + text-align: center; + border-bottom: 2px solid rgba(115, 135, 156, 0.36); + padding: 5px 0; +} + +.weather-days .col-sm-2 { + overflow: hidden; + width: 16.66666667%; +} + +.weather .row { + margin-bottom: 0; +} + +/* ********* tables styling ******************************* */ +.bulk-actions { + display: none; +} + +table.countries_list { + width: 100%; +} + +table.countries_list td { + padding: 0 10px; + line-height: 30px; + border-top: 1px solid #eeeeee; +} + +.dataTables_paginate a { + padding: 6px 9px !important; + background: #ddd !important; + border-color: #ddd !important; +} + +.paging_full_numbers a.paginate_active { + background-color: rgba(38, 185, 154, 0.59) !important; + border-color: rgba(38, 185, 154, 0.59) !important; +} + +button.DTTT_button, div.DTTT_button, a.DTTT_button { + border: 1px solid #E7E7E7 !important; + background: #E7E7E7 !important; + box-shadow: none !important; +} + +table.jambo_table { + border: 1px solid rgba(221, 221, 221, 0.78); +} + +table.jambo_table thead { + background: rgba(52, 73, 94, 0.94); + color: #ECF0F1; +} + +table.jambo_table tbody tr:hover td { + background: rgba(38, 185, 154, 0.07); + border-top: 1px solid rgba(38, 185, 154, 0.11); + border-bottom: 1px solid rgba(38, 185, 154, 0.11); +} + +table.jambo_table tbody tr.selected { + background: rgba(38, 185, 154, 0.16); +} + +table.jambo_table tbody tr.selected td { + border-top: 1px solid rgba(38, 185, 154, 0.4); + border-bottom: 1px solid rgba(38, 185, 154, 0.4); +} + +.dataTables_paginate a { + background: #ff0000; +} + +.dataTables_wrapper { + position: relative; + clear: both; + zoom: 1; +} + +.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 250px; + height: 30px; + margin-left: -125px; + margin-top: -15px; + padding: 14px 0 2px 0; + border: 1px solid #ddd; + text-align: center; + color: #999; + font-size: 14px; + background-color: white; +} + +.dataTables_length { + width: 40%; + float: left; +} + +.dataTables_filter { + width: 50%; + float: right; + text-align: right; +} + +.dataTables_info { + width: 60%; + float: left; +} + +.dataTables_paginate { + float: right; + text-align: right; +} + +table.dataTable th.focus, +table.dataTable td.focus { + outline: 2px solid rgb(0, 187, 214) !important; + outline-offset: -1px; +} + +table.display { + margin: 0 auto; + clear: both; + width: 100%; +} + +table.display thead th { + padding: 8px 18px 8px 10px; + border-bottom: 1px solid black; + font-weight: bold; + cursor: pointer; +} + +table.display tfoot th { + padding: 3px 18px 3px 10px; + border-top: 1px solid black; + font-weight: bold; +} + +table.display tr.heading2 td { + border-bottom: 1px solid #aaa; +} + +table.display td { + padding: 3px 10px; +} + +table.display td.center { + text-align: center; +} + +table.display thead th:active, table.display thead td:active { + outline: none; +} + +.dataTables_scroll { + clear: both; +} + +.dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} + +.top .dataTables_info { + float: none; +} + +.clear { + clear: both; +} + +.dataTables_empty { + text-align: center; +} + +tfoot input { + margin: 0.5em 0; + width: 100%; + color: #444; +} + +tfoot input.search_init { + color: #999; +} + +td.group { + background-color: #d1cfd0; + border-bottom: 2px solid #A19B9E; + border-top: 2px solid #A19B9E; +} + +td.details { + background-color: #d1cfd0; + border: 2px solid #A19B9E; +} + +.example_alt_pagination div.dataTables_info { + width: 40%; +} + +.paging_full_numbers { + width: 400px; + height: 22px; + line-height: 22px; +} + +.paging_full_numbers a:active { + outline: none; +} + +.paging_full_numbers a:hover { + text-decoration: none; +} + +.paging_full_numbers a.paginate_button, .paging_full_numbers a.paginate_active { + border: 1px solid #aaa; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + padding: 2px 5px; + margin: 0 3px; + cursor: pointer; +} + +.paging_full_numbers a.paginate_button { + background-color: #ddd; +} + +.paging_full_numbers a.paginate_button:hover { + background-color: #ccc; + text-decoration: none !important; +} + +.paging_full_numbers a.paginate_active { + background-color: #99B3FF; +} + +table.display tr.even.row_selected td { + background-color: #B0BED9; +} + +table.display tr.odd.row_selected td { + background-color: #9FAFD1; +} + +div.box { + height: 100px; + padding: 10px; + overflow: auto; + border: 1px solid #8080FF; + background-color: #E5E5FF; +} + +/* ********* /tables styling ****************************** */ +/* ********* /dashboard widget **************************** */ +/* ********* widgets *************************************** */ +ul.msg_list li { + background: #f7f7f7; + padding: 5px; + display: -ms-flexbox; + display: flex; + margin: 6px 6px 0; + width: 96% !important; +} + +ul.msg_list li:last-child { + margin-bottom: 6px; + padding: 10px; +} + +ul.msg_list li a { + padding: 3px 5px !important; +} + +ul.msg_list li a .image img { + border-radius: 2px 2px 2px 2px; + -webkit-border-radius: 2px 2px 2px 2px; + float: left; + margin-right: 10px; + width: 11%; +} + +ul.msg_list li a .time { + font-size: 11px; + font-style: italic; + font-weight: bold; + position: absolute; + right: 35px; +} + +ul.msg_list li a .message { + display: block !important; + font-size: 11px; +} + +.dropdown-menu.msg_list span { + white-space: normal; +} + +.dropdown-menu { + border: medium none; + box-shadow: none; + display: none; + float: left; + font-size: 12px; + left: 0; + list-style: none outside none; + padding: 0; + position: absolute; + text-shadow: none; + top: 100%; + z-index: 9998; + border: 1px solid #D9DEE4; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.dropdown-menu > li > a { + color: #5A738E; +} + +.navbar-nav .open .dropdown-menu { + position: absolute; + background: #fff; + margin-top: 0; + border: 1px solid #D9DEE4; + -webkit-box-shadow: none; + right: 0; + left: auto; + width: 220px; +} + +.navbar-nav .open .dropdown-menu.msg_list { + width: 300px; +} + +.info-number .badge { + font-size: 10px; + font-weight: normal; + line-height: 13px; + padding: 2px 6px; + position: absolute; + right: 2px; + top: 8px; +} + +ul.to_do { + padding: 0; +} + +ul.to_do li { + background: #f3f3f3; + border-radius: 3px; + position: relative; + padding: 7px; + margin-bottom: 5px; + list-style: none; +} + +ul.to_do p { + margin: 0; +} + +.dashboard-widget { + background: #f6f6f6; + border-top: 5px solid #79C3DF; + border-radius: 3px; + padding: 5px 10px 10px; +} + +.dashboard-widget .dashboard-widget-title { + font-weight: normal; + border-bottom: 1px solid #c1cdcd; + margin: 0 0 10px 0; + padding-bottom: 5px; + padding-left: 40px; + line-height: 30px; +} + +.dashboard-widget .dashboard-widget-title i { + font-size: 100%; + margin-left: -35px; + margin-right: 10px; + color: #33a1c9; + padding: 3px 6px; + border: 1px solid #abd9ea; + border-radius: 5px; + background: #fff; +} + +ul.quick-list { + width: 45%; + padding-left: 0; + display: inline-block; +} + +ul.quick-list li { + padding-left: 10px; + list-style: none; + margin: 0; + padding-bottom: 6px; + padding-top: 4px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} + +ul.quick-list li i { + padding-right: 10px; + color: #757679; +} + +.dashboard-widget-content { + padding-top: 9px; +} + +.dashboard-widget-content .sidebar-widget { + width: 50%; + display: inline-block; + vertical-align: top; + background: #fff; + border: 1px solid #abd9ea; + border-radius: 5px; + text-align: center; + float: right; + padding: 2px; + margin-top: 10px; +} + +.widget_summary { + width: 100%; + display: -ms-inline-flexbox; + display: inline-flex; +} + +.widget_summary .w_left { + float: left; + text-align: left; +} + +.widget_summary .w_center { + float: left; +} + +.widget_summary .w_right { + float: left; + text-align: right; +} + +.widget_summary .w_right span { + font-size: 20px; +} + +.w_20 { + width: 20%; +} + +.w_25 { + width: 25%; +} + +.w_55 { + width: 55%; +} + +h5.graph_title { + text-align: left; + margin-left: 10px; +} + +h5.graph_title i { + margin-right: 10px; + font-size: 17px; +} + +span.right { + float: right; + font-size: 14px !important; +} + +.tile_info a { + text-overflow: ellipsis; +} + +.sidebar-footer { + bottom: 0px; + clear: both; + display: block; + padding: 5px 0 0 0; + position: fixed; + width: 230px; +} + +.sidebar-footer a { + padding: 7px 0 3px; + text-align: center; + width: 25%; + font-size: 17px; + display: block; + float: left; + background: #333; + color: #999; +} + +.sidebar-footer a:hover { + background: #425567; +} + +/** top tiles */ +.tile_count { + margin-bottom: 20px; + margin-top: 20px; +} + +.tile_count .tile_stats_count { + border-bottom: 1px solid #D9DEE4; + padding: 0 10px 0 20px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + position: relative; +} + +@media (min-width: 992px) { + footer { + margin-left: 230px; + } +} + +@media (min-width: 992px) { + .tile_count .tile_stats_count { + margin-bottom: 10px; + border-bottom: 0; + padding-bottom: 10px; + } +} + +.tile_count .tile_stats_count:before { + content: ""; + position: absolute; + left: 0; + height: 65px; + border-left: 2px solid #ADB2B5; + margin-top: 10px; +} + +@media (min-width: 992px) { + .tile_count .tile_stats_count:first-child:before { + border-left: 0; + } +} + +.tile_count .tile_stats_count .count { + font-size: 30px; + line-height: 47px; + font-weight: 600; +} + +@media (min-width: 768px) { + .tile_count .tile_stats_count .count { + font-size: 40px; + } +} + +@media (min-width: 992px) and (max-width: 1100px) { + .tile_count .tile_stats_count .count { + font-size: 30px; + } +} + +.tile_count .tile_stats_count span { + font-size: 12px; +} + +@media (min-width: 768px) { + .tile_count .tile_stats_count span { + font-size: 13px; + } +} + +.tile_count .tile_stats_count .count_bottom i { + width: 12px; +} + +/** /top tiles **/ +.dashboard_graph { + background: #fff; + padding: 7px 10px; +} + +.dashboard_graph .col-md-9, .dashboard_graph .col-md-3 { + padding: 0; +} + +a.user-profile { + color: #5E6974 !important; +} + +.user-profile img { + width: 29px; + height: 29px; + border-radius: 50%; + margin-right: 10px; +} + +ul.top_profiles { + height: 330px; + width: 100%; +} + +ul.top_profiles li { + margin: 0; + padding: 3px 5px; +} + +ul.top_profiles li:nth-child(odd) { + background-color: #eee; +} + +.media .profile_thumb { + border: 1px solid; + width: 50px; + height: 50px; + margin: 5px 10px 5px 0; + border-radius: 50%; + padding: 9px 12px; +} + +.media .profile_thumb i { + font-size: 30px; +} + +.media .date { + background: #ccc; + width: 52px; + margin-right: 10px; + border-radius: 10px; + padding: 5px; +} + +.media .date .month { + margin: 0; + text-align: center; + color: #fff; +} + +.media .date .day { + text-align: center; + color: #fff; + font-size: 27px; + margin: 0; + line-height: 27px; + font-weight: bold; +} + +.event .media-body a.title { + font-weight: bold; +} + +.event .media-body p { + margin-bottom: 0; +} + +h4.graph_title { + margin: 7px; + text-align: center; +} + +/* ********* /widgets *************************************** */ +/* ********* iconts-display **************************** */ +.fontawesome-icon-list .fa-hover a:hover { + background-color: #ddd; + color: #fff; + text-decoration: none; +} + +.fontawesome-icon-list .fa-hover a { + display: block; + line-height: 32px; + height: 32px; + padding-left: 10px; + border-radius: 4px; +} + +.fontawesome-icon-list .fa-hover a:hover .fa { + font-size: 28px; + vertical-align: -6px; +} + +.fontawesome-icon-list .fa-hover a .fa { + width: 32px; + font-size: 16px; + display: inline-block; + text-align: right; + margin-right: 10px; +} + +.main_menu .fa { + width: 26px; + opacity: .99; + display: inline-block; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + font-size: 18px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* ********* /iconts-display **************************** */ +/** tile stats **/ +.tile-stats { + position: relative; + display: block; + margin-bottom: 12px; + border: 1px solid #E4E4E4; + -webkit-border-radius: 5px; + overflow: hidden; + padding-bottom: 5px; + -webkit-background-clip: padding-box; + -moz-border-radius: 5px; + -moz-background-clip: padding; + border-radius: 5px; + background-clip: padding-box; + background: #FFF; + transition: all 300ms ease-in-out; +} + +.tile-stats:hover .icon i { + animation-name: tansformAnimation; + animation-duration: .5s; + animation-iteration-count: 1; + color: rgba(58, 58, 58, 0.41); + animation-timing-function: ease; + animation-fill-mode: forwards; + -webkit-animation-name: tansformAnimation; + -webkit-animation-duration: .5s; + -webkit-animation-iteration-count: 1; + -webkit-animation-timing-function: ease; + -webkit-animation-fill-mode: forwards; + -moz-animation-name: tansformAnimation; + -moz-animation-duration: .5s; + -moz-animation-iteration-count: 1; + -moz-animation-timing-function: ease; + -moz-animation-fill-mode: forwards; +} + +.tile-stats .icon { + width: 20px; + height: 20px; + color: #BAB8B8; + position: absolute; + right: 53px; + top: 22px; + z-index: 1; +} + +.tile-stats .icon i { + margin: 0; + font-size: 60px; + line-height: 0; + vertical-align: bottom; + padding: 0; +} + +.tile-stats .count { + font-size: 38px; + font-weight: bold; + line-height: 1.65857; +} + +.tile-stats .count, .tile-stats h3, .tile-stats p { + position: relative; + margin: 0; + margin-left: 10px; + z-index: 5; + padding: 0; +} + +.tile-stats h3 { + color: #BAB8B8; +} + +.tile-stats p { + margin-top: 5px; + font-size: 12px; +} + +.tile-stats > .dash-box-footer { + position: relative; + text-align: center; + margin-top: 5px; + padding: 3px 0; + color: #fff; + color: rgba(255, 255, 255, 0.8); + display: block; + z-index: 10; + background: rgba(0, 0, 0, 0.1); + text-decoration: none; +} + +.tile-stats > .dash-box-footer:hover { + color: #fff; + background: rgba(0, 0, 0, 0.15); +} + +.tile-stats > .dash-box-footer:hover { + color: #fff; + background: rgba(0, 0, 0, 0.15); +} + +table.tile_info { + padding: 10px 15px; +} + +table.tile_info span.right { + margin-right: 0; + float: right; + position: absolute; + right: 4%; +} + +.tile:hover { + text-decoration: none; +} + +.tile_header { + border-bottom: transparent; + padding: 7px 15px; + margin-bottom: 15px; + background: #E7E7E7; +} + +.tile_head h4 { + margin-top: 0; + margin-bottom: 5px; +} + +.tiles-bottom { + padding: 5px 10px; + margin-top: 10px; + background: rgba(194, 194, 194, 0.3); + text-align: left; +} + +/** /tile stats **/ +/** inbox **/ +a.star { + color: #428bca !important; +} + +.mail_content { + background: none repeat scroll 0 0 #FFFFFF; + border-radius: 4px; + margin-top: 20px; + min-height: 500px; + padding: 10px 11px; + width: 100%; +} + +.list-btn-mail { + margin-bottom: 15px; +} + +.list-btn-mail.active { + border-bottom: 1px solid #39B3D7; + padding: 0 0 14px; +} + +.list-btn-mail > i { + float: left; + font-size: 18px; + font-style: normal; + width: 33px; +} + +.list-btn-mail > .cn { + background: none repeat scroll 0 0 #39B3D7; + border-radius: 12px; + color: #FFFFFF; + float: right; + font-style: normal; + padding: 0 5px; +} + +.button-mail { + margin: 0 0 15px !important; + text-align: left; + width: 100%; +} + +button, +.buttons, +.btn, +.modal-footer .btn + .btn { + margin-bottom: 5px; + margin-right: 5px; +} + +.btn-group-vertical .btn, .btn-group .btn { + margin-bottom: 0; + margin-right: 0; +} + +.mail_list_column { + border-left: 1px solid #DBDBDB; +} + +.mail_view { + border-left: 1px solid #DBDBDB; +} + +.mail_list { + width: 100%; + border-bottom: 1px solid #DBDBDB; + margin-bottom: 2px; + display: inline-block; +} + +.mail_list .left { + width: 5%; + float: left; + margin-right: 3%; +} + +.mail_list .right { + width: 90%; + float: left; +} + +.mail_list h3 { + font-size: 15px; + font-weight: bold; + margin: 0px 0 6px; +} + +.mail_list h3 small { + float: right; + color: #ADABAB; + font-size: 11px; + line-height: 20px; +} + +.mail_list .badge { + padding: 3px 6px; + font-size: 8px; + background: #BAB7B7; +} + +@media (max-width: 767px) { + .mail_list { + margin-bottom: 5px; + display: inline-block; + } +} + +.mail_heading h4 { + font-size: 18px; + border-bottom: 1px solid #ddd; + padding-bottom: 10px; + margin-top: 20px; +} + +.attachment { + margin-top: 30px; +} + +.attachment ul { + width: 100%; + list-style: none; + padding-left: 0; + display: inline-block; + margin-bottom: 30px; +} + +.attachment ul li { + float: left; + width: 150px; + margin-right: 10px; + margin-bottom: 10px; +} + +.attachment ul li img { + height: 150px; + border: 1px solid #ddd; + padding: 5px; + margin-bottom: 10px; +} + +.attachment ul li span { + float: right; +} + +.attachment .file-name { + float: left; +} + +.attachment .links { + width: 100%; + display: inline-block; +} + +.compose { + padding: 0; + position: fixed; + bottom: 0; + right: 0; + background: #fff; + border: 1px solid #D9DEE4; + border-right: 0; + border-bottom: 0; + border-top-left-radius: 5px; + z-index: 9999; + display: none; +} + +.compose .compose-header { + padding: 5px; + background: #169F85; + color: #fff; + border-top-left-radius: 5px; +} + +.compose .compose-header .close { + text-shadow: 0 1px 0 #ffffff; + line-height: .8; +} + +.compose .compose-body .editor.btn-toolbar { + margin: 0; +} + +.compose .compose-body .editor-wrapper { + height: 100%; + min-height: 50px; + max-height: 180px; + border-radius: 0; + border-left: none; + border-right: none; + overflow: auto; +} + +.compose .compose-footer { + padding: 10px; +} + +/** /inbox **/ +/* ********* form design **************************** */ +.editor.btn-toolbar { + zoom: 1; + background: #F7F7F7; + margin: 5px 2px; + padding: 3px 0; + border: 1px solid #EFEFEF; +} + +.input-group { + margin-bottom: 10px; +} + +.ln_solid { + border-top: 1px solid #e5e5e5; + color: #ffffff; + background-color: #ffffff; + height: 1px; + margin: 20px 0; +} + +span.section { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +.form-control { + border-radius: 0; + width: 100%; + height: 38px; +} + +.form-control.input-sm { + font-size: 16px; +} + +.form-horizontal .control-label { + padding-top: 8px; +} + +.form-control:focus { + border-color: #CCD0D7; + box-shadow: none !important; +} + +legend { + font-size: 18px; + color: inherit; +} + +.form-horizontal .form-group { + margin-right: 0; + margin-left: 0; +} + +.form-control-feedback { + margin-top: 8px; + height: 23px; + color: #bbb; + line-height: 24px; + font-size: 15px; +} + +.form-control-feedback.left { + border-right: 1px solid #ccc; + left: 13px; +} + +.form-control-feedback.right { + border-left: 1px solid #ccc; + right: 13px; +} + +.form-control.has-feedback-left { + padding-left: 45px; +} + +.form-control.has-feedback-right { + padding-right: 45px; +} + +.form-group { + margin-bottom: 10px; +} + +.validate { + margin-top: 10px; +} + +.invalid-form-error-message { + margin-top: 10px; + padding: 5px; +} + +.invalid-form-error-message.filled { + border-left: 2px solid #E74C3C; +} + +p.parsley-success { + color: #468847; + background-color: #DFF0D8; + border: 1px solid #D6E9C6; +} + +p.parsley-error { + color: #B94A48; + background-color: #F2DEDE; + border: 1px solid #EED3D7; +} + +ul.parsley-errors-list { + list-style: none; + color: #E74C3C; + padding-left: 0; +} + +input.parsley-error, textarea.parsley-error, select.parsley-error { + background: #FAEDEC; + border: 1px solid #E85445; +} + +.btn-group .parsley-errors-list { + display: none; +} + +.bad input, .bad select, .bad textarea { + border: 1px solid #CE5454; + box-shadow: 0 0 4px -2px #CE5454; + position: relative; + left: 0; + -moz-animation: .7s 1 shake linear; + -webkit-animation: 0.7s 1 shake linear; +} + +.item input, .item textarea { + transition: 0.42s; +} + +/* alerts (when validation fails) */ +.item .alert { + float: left; + margin: 0 0 0 20px; + padding: 3px 10px; + color: #FFF; + border-radius: 3px 4px 4px 3px; + background-color: #CE5454; + max-width: 170px; + white-space: pre; + position: relative; + left: -15px; + opacity: 0; + z-index: 1; + transition: 0.15s ease-out; +} + +.item .alert::after { + content: ''; + display: block; + height: 0; + width: 0; + border-color: transparent #CE5454 transparent transparent; + border-style: solid; + border-width: 11px 7px; + position: absolute; + left: -13px; + top: 1px; +} + +.item.bad .alert { + left: 0; + opacity: 1; +} + +.inl-bl { + display: inline-block; +} + +.well .markup { + background: #fff; + color: #777; + position: relative; + padding: 45px 15px 15px; + margin: 15px 0 0 0; + background-color: #fff; + border-radius: 0 0 4px 4px; + box-shadow: none; +} + +.well .markup::after { + content: "Example"; + position: absolute; + top: 15px; + left: 15px; + font-size: 12px; + font-weight: bold; + color: #bbb; + text-transform: uppercase; + letter-spacing: 1px; +} + +/* ***** autocomplete ***** */ +.autocomplete-suggestions { + border: 1px solid #e4e4e4; + background: #F4F4F4; + cursor: default; + overflow: auto; +} + +.autocomplete-suggestion { + padding: 2px 5px; + font-size: 1.2em; + white-space: nowrap; + overflow: hidden; +} + +.autocomplete-selected { + background: #f0f0f0; +} + +.autocomplete-suggestions strong { + font-weight: normal; + color: #3399ff; + font-weight: bolder; +} + +/* ***** /autocomplete *****/ +/* ***** buttons ********/ +.btn { + border-radius: 3px; +} + +a.btn-green, a.btn-primary, a.btn-orange, a.btn-red { + color: #fff; +} + +.btn-green { + background: #26B99A; + border: 1px solid #169F85; +} + +.btn-green:hover, .btn-green:focus, .btn-green:active, .btn-green.active, .open .dropdown-toggle.btn-green { + background: #169F85; +} + +.btn-dark { + color: #E9EDEF; + background-color: #4B5F71; + border-color: #364B5F; +} + +.btn-dark:hover, .btn-dark:focus, .btn-dark:active, .btn-dark.active, .open .dropdown-toggle.btn-dark { + color: #FFFFFF; + background-color: #394D5F; + border-color: #394D5F; +} + +.btn-round { + border-radius: 30px; +} + +.btn.btn-app { + position: relative; + padding: 15px 5px; + margin: 0 0 10px 10px; + min-width: 80px; + height: 60px; + box-shadow: none; + border-radius: 0; + text-align: center; + color: #666; + border: 1px solid #ddd; + background-color: #fafafa; + font-size: 12px; +} + +.btn.btn-app > .fa, .btn.btn-app > .glyphicon, .btn.btn-app > .ion { + font-size: 20px; + display: block; +} + +.btn.btn-app:hover { + background: #f4f4f4; + color: #444; + border-color: #aaa; +} + +.btn.btn-app:active, .btn.btn-app:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} + +.btn.btn-app > .badge { + position: absolute; + top: -3px; + right: -10px; + font-size: 10px; + font-weight: 400; +} + +/* ***** /buttons *******/ +/* ********* /form design **************************** */ +/* ********* form textarea **************************** */ +textarea { + padding: 10px; + vertical-align: top; + width: 200px; +} + +textarea:focus { + outline-style: solid; + outline-width: 2px; +} + +.btn_ { + display: inline-block; + padding: 3px 9px; + margin-bottom: 0; + font-size: 14px; + line-height: 20px; + text-align: center; + vertical-align: middle; + cursor: pointer; + color: #333333; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + background-color: #f5f5f5; + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + border: 1px solid #cccccc; + border-bottom-color: #b3b3b3; + border-radius: 4px; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +/* ********* /form textarea **************************** */ +/* ********* glyphicons **************************** */ +.bs-glyphicons { + margin: 0 -10px 20px; + overflow: hidden; +} + +.bs-glyphicons-list { + padding-left: 0; + list-style: none; +} + +.bs-glyphicons li { + float: left; + width: 25%; + height: 115px; + padding: 10px; + font-size: 10px; + line-height: 1.4; + text-align: center; + background-color: #f9f9f9; + border: 1px solid #fff; +} + +.bs-glyphicons .glyphicon { + margin-top: 5px; + margin-bottom: 10px; + font-size: 24px; +} + +.bs-glyphicons .glyphicon-class { + display: block; + text-align: center; + word-wrap: break-word; +} + +.bs-glyphicons li:hover { + color: #fff; + background-color: rgb(0, 187, 214); +} + +@media (min-width: 768px) { + .bs-glyphicons { + margin-right: 0; + margin-left: 0; + } + + .bs-glyphicons li { + width: 12.5%; + font-size: 12px; + } +} + +/* ********* /glyphicons **************************** */ +/* ********* form tags input **************************** */ +.tagsinput { + border: 1px solid #CCC; + background: #FFF; + padding: 6px 6px 0; + width: 300px; + overflow-y: auto; +} + +span.tag { + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + display: block; + float: left; + padding: 10px 15px; + text-decoration: none; + background: rgb(0, 187, 214); + color: #F1F6F7; + margin-right: 5px; + font-weight: 400; + margin-bottom: 5px; + font-family: Roboto, Arial, sans-serif; + font-size: 14px; +} + +span.tag a { + color: #F1F6F7 !important; +} + +.tagsinput span.tag a { + font-weight: bold; + color: #82ad2b; + text-decoration: none; + font-size: 11px; +} + +.tagsinput input { + width: 80px; + margin: 0px; + font-family: helvetica; + font-size: 13px; + border: 1px solid transparent; + padding: 3px; + background: transparent; + color: #000; + outline: 0px; +} + +.tagsinput div { + display: block; + float: left; +} + +.tags_clear { + clear: both; + width: 100%; + height: 0px; +} + +.not_valid { + background: #FBD8DB !important; + color: #90111A !important; +} + +/* ********* /form tags input **************************** */ +/** Tabs **/ +ul.bar_tabs { + overflow: visible; + background: #F5F7FA; + height: 25px; + margin: 21px 0 14px; + padding-left: 14px; + position: relative; + z-index: 1; + width: 100%; + border-bottom: 1px solid #E6E9ED; +} + +ul.bar_tabs > li { + border: 1px solid #E6E9ED; + color: #333 !important; + margin-top: -17px; + margin-left: 8px; + background: #fff; + border-bottom: none; + border-radius: 4px 4px 0 0; +} + +ul.bar_tabs > li.active { + border-right: 6px solid #D3D6DA; + border-top: 0; + margin-top: -15px; +} + +ul.bar_tabs > li a { + padding: 10px 17px; + background: #F5F7FA; + margin: 0; + border-top-right-radius: 0; +} + +ul.bar_tabs > li a:hover { + border: 1px solid transparent; +} + +ul.bar_tabs > li.active a { + border-bottom: none; +} + +ul.bar_tabs.right { + padding-right: 14px; +} + +ul.bar_tabs.right li { + float: right; +} + +a:focus { + outline: none; +} + +/** /Tabs **/ +/* ********* timeline **************************** */ +ul.timeline li { + position: relative; + border-bottom: 1px solid #e8e8e8; + clear: both; +} + +.timeline .block { + margin: 0; + border-left: 3px solid #e8e8e8; + overflow: visible; + padding: 10px 15px; + margin-left: 105px; +} + +.timeline.widget { + min-width: 0; + max-width: inherit; +} + +.timeline.widget .block { + margin-left: 5px; +} + +.timeline .tags { + position: absolute; + top: 15px; + left: 0; + width: 84px; +} + +.timeline .tag { + display: block; + height: 30px; + font-size: 13px; + padding: 8px; +} + +.timeline .tag span { + display: block; + overflow: hidden; + width: 100%; + white-space: nowrap; + text-overflow: ellipsis; +} + +.tag { + line-height: 1; + background: rgb(0, 187, 214); + color: #fff !important; +} + +.tag:after { + content: " "; + height: 30px; + width: 0; + position: absolute; + left: 100%; + top: 0; + margin: 0; + pointer-events: none; + border-top: 14px solid transparent; + border-bottom: 14px solid transparent; + border-left: 11px solid rgb(0, 187, 214); +} + +.timeline h2.title { + position: relative; + font-size: 16px; + margin: 0; +} + +.timeline h2.title:before { + content: ""; + position: absolute; + left: -23px; + top: 3px; + display: block; + width: 14px; + height: 14px; + border: 3px solid #d2d3d2; + border-radius: 14px; + background: #f9f9f9; +} + +.timeline .byline { + padding: .25em 0; +} + +.byline { + -webkit-font-smoothing: antialiased; + font-style: italic; + font-size: .9375em; + line-height: 1.3; + color: #aab6aa; +} + +ul.social li { + border: 0; +} + +/* ********* /timeline **************************** */ +/* ********* profile/social **************************** */ +.social-sidebar, .social-body { + float: right; +} + +.social-sidebar { + background: #EDEDED; + width: 22%; +} + +.social-body { + border: 1px solid #ccc; + width: 78%; +} + +.thumb img { + width: 50px; + height: 50px; + border-radius: 50%; +} + +.chat .thumb img { + width: 27px; + height: 27px; + border-radius: 50%; +} + +.chat .status { + float: left; + margin: 16px 0 0 -16px; + font-size: 14px; + font-weight: bold; + width: 12px; + height: 12px; + display: block; + border: 2px solid #FFF; + z-index: 12312; + border-radius: 50%; +} + +.chat .status.online { + background: rgb(0, 187, 214); +} + +.chat .status.away { + background: #F39C12; +} + +.chat .status.offline { + background: #ccc; +} + +.chat .media-body { + padding-top: 5px; +} + +/* ********* /profile/social **************************** */ +/* ********* widgets **************************** */ +.dashboard_graph .x_title { + padding: 5px 5px 7px; +} + +.dashboard_graph .x_title h3 { + margin: 0; + font-weight: normal; +} + +.chart { + position: relative; + display: inline-block; + width: 110px; + height: 110px; + margin-top: 5px; + margin-bottom: 5px; + text-align: center; +} + +.chart canvas { + position: absolute; + top: 0; + left: 0; +} + +.percent { + display: inline-block; + line-height: 110px; + z-index: 2; + font-size: 18px; +} + +.percent:after { + content: '%'; + margin-left: 0.1em; + font-size: .8em; +} + +.angular { + margin-top: 100px; +} + +.angular .chart { + margin-top: 0; +} + +.widget { + min-width: 250px; + max-width: 310px; +} + +.widget_tally_box .btn-group button { + text-align: center; +} + +.widget_tally_box .btn-group button { + color: inherit; + font-weight: 500; + background-color: #f5f5f5; + border: 1px solid #e7e7e7; +} + +ul.widget_tally, ul.widget_tally li { + width: 100%; +} + +ul.widget_tally li { + padding: 2px 10px; + border-bottom: 1px solid #ECECEC; + padding-bottom: 4px; +} + +ul.widget_tally .month { + width: 70%; + float: left; +} + +ul.widget_tally .count { + width: 30%; + float: left; + text-align: right; +} + +.pie_bg { + border-bottom: 1px solid rgba(101, 204, 182, 0.16); + padding-bottom: 15px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + padding-bottom: 10px; + box-shadow: 0 4px 6px -6px #222; +} + +.widget_tally_box .flex { + display: -ms-flexbox; + display: flex; +} + +ul.widget_profile_box { + width: 100%; + height: 42px; + padding: 3px; + background: #ececec; + margin-top: 40px; + margin-left: 1px; +} + +ul.widget_profile_box li:first-child { + width: 25%; + float: left; +} + +ul.widget_profile_box li:first-child a { + float: left; +} + +ul.widget_profile_box li:last-child { + width: 25%; + float: right; +} + +ul.widget_profile_box li:last-child a { + float: right; +} + +ul.widget_profile_box li a { + font-size: 22px; + text-align: center; + width: 35px; + height: 35px; + border: 1px solid rgba(52, 73, 94, 0.44); + display: block; + border-radius: 50%; + padding: 0px; +} + +ul.widget_profile_box li a:hover { + color: rgb(0, 187, 214) !important; + border: 1px solid #26b99a; +} + +ul.widget_profile_box li .profile_img { + width: 85px; + height: 85px; + margin: 0; + margin-top: -28px; +} + +.widget_tally_box p, .widget_tally_box span { + text-align: center; +} + +.widget_tally_box .name { + text-align: center; + margin: 25px; +} + +.widget_tally_box .name_title { + text-align: center; + margin: 5px; +} + +.widget_tally_box ul.legend { + margin: 0; +} + +.widget_tally_box ul.legend p, .widget_tally_box ul.legend span { + text-align: left; +} + +.widget_tally_box ul.legend li .icon { + font-size: 20px; + float: left; + width: 14px; +} + +.widget_tally_box ul.legend li .name { + font-size: 14px; + margin: 5px 0 0 14px; + text-overflow: ellipsis; + float: left; +} + +.widget_tally_box ul.legend p { + display: inline-block; + margin: 0; +} + +.widget_tally_box ul.verticle_bars li { + height: 140px; + width: 23%; +} + +.widget .verticle_bars li .progress.vertical.progress_wide { + width: 65%; +} + +ul.count2 { + width: 100%; + margin-left: 1px; + border: 1px solid #ddd; + border-left: 0; + border-right: 0; + padding: 10px 0; +} + +ul.count2 li { + width: 30%; + text-align: center; +} + +ul.count2 li h3 { + font-weight: 400; + margin: 0; +} + +ul.count2 li span { + font-weight: 300; +} + +/* ********* /widgets **************************** */ +.divider { + border-bottom: 1px solid #ddd; + margin: 10px; +} + +.divider-dashed { + border-top: 1px dashed #e7eaec; + background-color: #ffffff; + height: 1px; + margin: 10px 0; +} + +ul.messages { + padding: 0; + list-style: none; +} + +ul.messages li, .tasks li { + border-bottom: 1px dotted #e6e6e6; + padding: 8px 0; +} + +ul.messages li img.avatar, img.avatar { + height: 32px; + width: 32px; + float: left; + display: inline-block; + border-radius: 2px; + padding: 2px; + background: #f7f7f7; + border: 1px solid #e6e6e6; +} + +ul.messages li .message_date { + float: right; + text-align: right; +} + +ul.messages li .message_wrapper { + margin-left: 50px; + margin-right: 40px; +} + +ul.messages li .message_wrapper h4.heading { + font-weight: 600; + margin: 0; + cursor: pointer; + margin-bottom: 10px; + line-height: 100%; +} + +ul.messages li .message_wrapper blockquote { + padding: 0px 10px; + margin: 0; + border-left: 5px solid #eee; +} + +ul.user_data li { + margin-bottom: 6px; +} + +ul.user_data li p { + margin-bottom: 0; +} + +ul.user_data li .progress { + width: 90%; +} + +.project_progress .progress { + margin-bottom: 3px !important; + margin-top: 5px; +} + +.projects .list-inline { + margin: 0; +} + +.profile_title { + background: #F5F7FA; + border: 0; + padding: 7px 0; + display: -ms-flexbox; + display: flex; +} + +ul.stats-overview { + border-bottom: 1px solid #e8e8e8; + padding-bottom: 10px; + margin-bottom: 10px; +} + +ul.stats-overview li { + display: inline-block; + text-align: center; + padding: 0 15px; + width: 30%; + font-size: 14px; + border-right: 1px solid #e8e8e8; +} + +ul.stats-overview li:last-child { + border-right: 0; +} + +ul.stats-overview li .name { + font-size: 12px; +} + +ul.stats-overview li .value { + font-size: 14px; + font-weight: bold; + display: block; +} + +ul.stats-overview li:first-child { + padding-left: 0; +} + +ul.project_files li { + margin-bottom: 5px; +} + +ul.project_files li a i { + width: 20px; +} + +.project_detail p { + margin-bottom: 10px; +} + +.project_detail p.title { + font-weight: bold; + margin-bottom: 0; +} + +.avatar img { + border-radius: 50%; + max-width: 45px; +} + +/* ********* pricing **************************** */ +.pricing { + background: #fff; +} + +.pricing .title { + background: rgb(0, 187, 214); + height: 110px; + color: #fff; + padding: 15px 0 0; + text-align: center; +} + +.pricing .title h2 { + text-transform: capitalize; + font-size: 18px; + border-radius: 5px 5px 0 0; + margin: 0; + font-weight: 400; +} + +.pricing .title h1 { + font-size: 30px; + margin: 12px; +} + +.pricing .title span { + background: rgba(51, 51, 51, 0.28); + padding: 2px 5px; +} + +.pricing_features { + background: #FAFAFA; + padding: 20px 15px; + min-height: 230px; + font-size: 13.5px; +} + +.pricing_features ul li { + margin-top: 10px; +} + +.pricing_footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + text-align: center; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} + +.pricing_footer p { + font-size: 13px; + padding: 10px 0 2px; + display: block; +} + +.ui-ribbon-container { + position: relative; +} + +.ui-ribbon-container .ui-ribbon-wrapper { + position: absolute; + overflow: hidden; + width: 85px; + height: 88px; + top: -3px; + right: -3px; +} + +.ui-ribbon-container.ui-ribbon-primary .ui-ribbon { + background-color: #5b90bf; +} + +.ui-ribbon-container .ui-ribbon { + position: relative; + display: block; + text-align: center; + font-size: 15px; + font-weight: 700; + color: #fff; + transform: rotate(45deg); + padding: 7px 0; + left: -5px; + top: 15px; + width: 120px; + line-height: 20px; + background-color: #555; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); +} + +.ui-ribbon-container.ui-ribbon-primary .ui-ribbon:after, .ui-ribbon-container.ui-ribbon-primary .ui-ribbon:before { + border-top: 2px solid #5b90bf; +} + +.ui-ribbon-container .ui-ribbon:before { + left: 0; + bottom: -1px; +} + +.ui-ribbon-container .ui-ribbon:before { + right: 0; +} + +.ui-ribbon-container .ui-ribbon:after, .ui-ribbon-container .ui-ribbon:before { + position: absolute; + content: " "; + line-height: 0; + border-top: 2px solid #555; + border-left: 2px solid transparent; + border-right: 2px solid transparent; +} + +/* ********* /pricing **************************** */ +/* ********* media gallery **************************** */ +.thumbnail .image { + height: 120px; + overflow: hidden; +} + +.caption { + padding: 9px 5px; + background: #F7F7F7; +} + +.caption p { + margin-bottom: 5px; +} + +.thumbnail { + height: 190px; + overflow: hidden; +} + +.view { + overflow: hidden; + position: relative; + text-align: center; + box-shadow: 1px 1px 2px #e6e6e6; + cursor: default; +} + +.view .mask, .view .content { + position: absolute; + width: 100%; + overflow: hidden; + top: 0; + left: 0; +} + +.view img { + display: block; + position: relative; +} + +.view .tools { + text-transform: uppercase; + color: #fff; + text-align: center; + position: relative; + font-size: 17px; + padding: 3px; + background: rgba(0, 0, 0, 0.35); + margin: 43px 0 0 0; +} + +.mask.no-caption .tools { + margin: 90px 0 0 0; +} + +.view .tools a { + display: inline-block; + color: #FFF; + font-size: 18px; + font-weight: 400; + padding: 0 4px; +} + +.view p { + font-family: Georgia, serif; + font-style: italic; + font-size: 12px; + position: relative; + color: #fff; + padding: 10px 20px 20px; + text-align: center; +} + +.view a.info { + display: inline-block; + text-decoration: none; + padding: 7px 14px; + background: #000; + color: #fff; + text-transform: uppercase; + box-shadow: 0 0 1px #000; +} + +.view-first img { + transition: all 0.2s linear; +} + +.view-first .mask { + opacity: 0; + background-color: rgba(0, 0, 0, 0.5); + transition: all 0.4s ease-in-out; +} + +.view-first .tools { + transform: translateY(-100px); + opacity: 0; + transition: all 0.2s ease-in-out; +} + +.view-first p { + transform: translateY(100px); + opacity: 0; + transition: all 0.2s linear; +} + +.view-first:hover img { + transform: scale(1.1); +} + +.view-first:hover .mask { + opacity: 1; +} + +.view-first:hover .tools, .view-first:hover p { + opacity: 1; + transform: translateY(0px); +} + +.view-first:hover p { + transition-delay: 0.1s; +} + +/* ********* /media gallery **************************** */ +/* ********* verticle tabs **************************** */ +/*! + * bootstrap-vertical-tabs - v1.2.1 + * https://dbtek.github.io/bootstrap-vertical-tabs + * 2014-11-07 + * Copyright (c) 2014 İsmail Demirbilek + * License: MIT + */ +.tabs-left, .tabs-right { + border-bottom: none; + padding-top: 2px; +} + +.tabs-left { + border-right: 1px solid #F7F7F7; +} + +.tabs-right { + border-left: 1px solid #F7F7F7; +} + +.tabs-left > li, .tabs-right > li { + float: none; + margin-bottom: 2px; +} + +.tabs-left > li { + margin-right: -1px; +} + +.tabs-right > li { + margin-left: -1px; +} + +.tabs-left > li.active > a, .tabs-left > li.active > a:hover, .tabs-left > li.active > a:focus { + border-bottom-color: #F7F7F7; + border-right-color: transparent; +} + +.tabs-right > li.active > a, .tabs-right > li.active > a:hover, .tabs-right > li.active > a:focus { + border-bottom: 1px solid #F7F7F7; + border-left-color: transparent; +} + +.tabs-left > li > a { + border-radius: 4px 0 0 4px; + margin-right: 0; + display: block; + background: #F7F7F7; + text-overflow: ellipsis; + overflow: hidden; +} + +.tabs-right > li > a { + border-radius: 0 4px 4px 0; + margin-right: 0; + background: #F7F7F7; + text-overflow: ellipsis; + overflow: hidden; +} + +.sideways { + margin-top: 50px; + border: none; + position: relative; +} + +.sideways > li { + height: 20px; + width: 120px; + margin-bottom: 100px; +} + +.sideways > li > a { + border-bottom: 1px solid #ddd; + border-right-color: transparent; + text-align: center; + border-radius: 4px 4px 0px 0px; +} + +.sideways > li.active > a, .sideways > li.active > a:hover, .sideways > li.active > a:focus { + border-bottom-color: transparent; + border-right-color: #ddd; + border-left-color: #ddd; +} + +.sideways.tabs-left { + left: -50px; +} + +.sideways.tabs-right { + right: -50px; +} + +.sideways.tabs-right > li { + transform: rotate(90deg); +} + +.sideways.tabs-left > li { + transform: rotate(-90deg); +} + +/* ********* /verticle tabs **************************** */ +/* ********* moris **************************** */ +.morris-hover { + position: absolute; + z-index: 1000; +} + +.morris-hover.morris-default-style { + padding: 6px; + color: #666; + background: rgba(243, 242, 243, 0.8); + border: solid 2px rgba(195, 194, 196, 0.8); + font-family: sans-serif; + font-size: 12px; + text-align: center; +} + +.morris-hover.morris-default-style .morris-hover-row-label { + font-weight: bold; + margin: 0.25em 0; +} + +.morris-hover.morris-default-style .morris-hover-point { + white-space: nowrap; + margin: 0.1em 0; +} + +/* ********* /moris **************************** */ +/* ********* ecommerce **************************** */ +.price { + font-size: 40px; + font-weight: 400; + color: #26B99A; + margin: 0; +} + +.prod_title { + border-bottom: 1px solid #DFDFDF; + padding-bottom: 5px; + margin: 30px 0; + font-size: 20px; + font-weight: 400; +} + +.product-image img { + width: 90%; +} + +.prod_color li { + margin: 0 10px; +} + +.prod_color li p { + margin-bottom: 0; +} + +.prod_size li { + padding: 0; +} + +.prod_color .color { + width: 25px; + height: 25px; + border: 2px solid rgba(51, 51, 51, 0.28) !important; + padding: 2px; + border-radius: 50px; +} + +.product_gallery a { + width: 100px; + height: 100px; + float: left; + margin: 10px; + border: 1px solid #e5e5e5; +} + +.product_gallery a img { + width: 100%; + margin-top: 15px; +} + +.product_price { + margin: 20px 0; + padding: 5px 10px; + background-color: #FFFFFF; + text-align: left; + border: 2px dashed #E0E0E0; +} + +.price-tax { + font-size: 18px; +} + +.product_social { + margin: 20px 0; +} + +.product_social ul li a i { + font-size: 35px; +} + +/* ********* /ecommerce **************************** */ +/** login **/ +.login { + background: #F7F7F7; +} + +.login .fa-paw { + font-size: 26px; +} + +a.hiddenanchor { + display: none; +} + +.login_wrapper { + right: 0px; + margin: 0px auto; + margin-top: 5%; + max-width: 350px; + position: relative; +} + +.registration_form, .login_form { + position: absolute; + top: 0px; + width: 100%; +} + +.registration_form { + z-index: 21; + opacity: 0; + width: 100%; +} + +.login_form { + z-index: 22; +} + +#signup:target ~ .login_wrapper .registration_form, #signin:target ~ .login_wrapper .login_form { + z-index: 22; + animation-name: fadeInLeft; + animation-delay: .1s; +} + +#signup:target ~ .login_wrapper .login_form, #signin:target ~ .login_wrapper .registration_form { + animation-name: fadeOutLeft; +} + +.animate { + -webkit-animation-duration: 0.5s; + -webkit-animation-timing-function: ease; + -webkit-animation-fill-mode: both; + -moz-animation-duration: 0.5s; + -moz-animation-timing-function: ease; + -moz-animation-fill-mode: both; + -o-animation-duration: 0.5s; + -o-animation-timing-function: ease; + -o-animation-fill-mode: both; + -ms-animation-duration: 0.5s; + -ms-animation-timing-function: ease; + -ms-animation-fill-mode: both; + animation-duration: 0.5s; + animation-timing-function: ease; + animation-fill-mode: both; +} + +/** /login **/ +/** signup **/ +.login_box { + padding: 20px; + margin: auto; +} + +.left { + float: left; +} + +.alignleft { + float: left; + margin-right: 15px; +} + +.alignright { + float: right; + margin-left: 15px; +} + +.clearfix:after, form:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +.login_content { + margin: 0 auto; + padding: 25px 0 0; + position: relative; + text-align: center; + text-shadow: 0 1px 0 #fff; + min-width: 280px; +} + +.login_content a, +.login_content .btn-default:hover { + text-decoration: none; +} + +.login_content a:hover { + text-decoration: underline; +} + +.login_content h1 { + font: normal 25px Helvetica, Arial, sans-serif; + letter-spacing: -0.05em; + line-height: 20px; + margin: 10px 0 30px; +} + +.login_content h1:before, .login_content h1:after { + content: ""; + height: 1px; + position: absolute; + top: 10px; + width: 27%; +} + +.login_content h1:after { + background: #7e7e7e; + background: linear-gradient(left, #7e7e7e 0%, white 100%); + right: 0; +} + +.login_content h1:before { + background: #7e7e7e; + background: linear-gradient(right, #7e7e7e 0%, white 100%); + left: 0; +} + +.login_content h1:before, .login_content h1:after { + content: ""; + height: 1px; + position: absolute; + top: 10px; + width: 20%; +} + +.login_content h1:after { + background: #7e7e7e; + background: linear-gradient(left, #7e7e7e 0%, white 100%); + right: 0; +} + +.login_content h1:before { + background: #7e7e7e; + background: linear-gradient(right, #7e7e7e 0%, white 100%); + left: 0; +} + +.login_content form { + margin: 20px 0; + position: relative; +} + +.login_content form input[type="text"], .login_content form input[type="email"], .login_content form input[type="password"] { + border-radius: 3px; + -ms-box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset; + -o-box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset; + box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset; + border: 1px solid #c8c8c8; + color: #777; + margin: 0 0 20px; + width: 100%; +} + +.login_content form input[type="text"]:focus, .login_content form input[type="email"]:focus, .login_content form input[type="password"]:focus { + -ms-box-shadow: 0 0 2px #ed1c24 inset; + -o-box-shadow: 0 0 2px #ed1c24 inset; + box-shadow: 0 0 2px #A97AAD inset; + background-color: #fff; + border: 1px solid #A878AF; + outline: none; +} + +#username { + background-position: 10px 10px !important; +} + +#password { + background-position: 10px -53px !important; +} + +.login_content form div a { + font-size: 12px; + margin: 10px 15px 0 0; +} + +.reset_pass { + margin-top: 10px !important; +} + +.login_content div .reset_pass { + margin-top: 13px !important; + margin-right: 39px; + float: right; +} + +.separator { + border-top: 1px solid #D8D8D8; + margin-top: 10px; + padding-top: 10px; +} + +.button { + background: #f7f9fa; + background: linear-gradient(top, #f7f9fa 0%, #f0f0f0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7f9fa', endColorstr='#f0f0f0', GradientType=0); + -ms-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset; + -o-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset; + border-radius: 0 0 5px 5px; + border-top: 1px solid #CFD5D9; + padding: 15px 0; +} + +.login_content form input[type="submit"], #content form .submit { + float: left; + margin-left: 38px; +} + +.button a { + background: url(http://cssdeck.com/uploads/media/items/8/8bcLQqF.png) 0 -112px no-repeat; + color: #7E7E7E; + font-size: 17px; + padding: 2px 0 2px 40px; + text-decoration: none; + transition: all 0.3s ease; +} + +.button a:hover { + background-position: 0 -135px; + color: #00aeef; +} + +header { + width: 100%; +} + +/** signup **/ +/** NProgress **/ +#nprogress .bar { + background: rgb(0, 187, 214); +} + +#nprogress .peg { + box-shadow: 0 0 10px rgb(0, 187, 214), 0 0 5px rgb(0, 187, 214); +} + +#nprogress .spinner-icon { + border-top-color: rgb(0, 187, 214); + border-left-color: rgb(0, 187, 214); +} + +/** /NProgress **/ +/** bootstrap-wysiwyg **/ +.editor-wrapper { + min-height: 250px; + background-color: white; + border-collapse: separate; + border: 1px solid #cccccc; + padding: 4px; + box-sizing: content-box; + box-shadow: rgba(0, 0, 0, 0.07451) 0px 1px 1px 0px inset; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; + overflow: scroll; + outline: none; +} + +.voiceBtn { + width: 20px; + color: transparent; + background-color: transparent; + transform: scale(2, 2); + -webkit-transform: scale(2, 2); + -moz-transform: scale(2, 2); + border: transparent; + cursor: pointer; + box-shadow: none; + -webkit-box-shadow: none; +} + +div[data-role="editor-toolbar"] { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.dropdown-menu a { + cursor: pointer; +} + +/** /bootstrap-wysiwyg **/ +/** Select2 **/ +.select2-container--default .select2-selection--single, +.select2-container--default .select2-selection--multiple { + background-color: #fff; + border: 1px solid #ccc; + border-radius: 0; + min-height: 38px; +} + +.select2-container--default .select2-selection--single .select2-selection__rendered { + color: #73879C; + padding-top: 5px; +} + +.select2-container--default .select2-selection--multiple .select2-selection__rendered { + padding-top: 3px; +} + +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 36px; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice, +.select2-container--default .select2-selection--multiple .select2-selection__clear { + margin-top: 2px; + border: none; + border-radius: 0; + padding: 3px 5px; +} + +.select2-container--default.select2-container--focus .select2-selection--multiple { + border: 1px solid #ccc; +} + +/** /Select2 **/ +/** Switchery **/ +.switchery { + width: 32px; + height: 20px; +} + +.switchery > small { + width: 20px; + height: 20px; +} + +/** /Switchery **/ +/** Normalize.css **/ +fieldset { + border: none; + margin: 0; + padding: 0; +} + +/** /Normalize.css **/ +/** Cropper **/ +.cropper .img-container, +.cropper .img-preview { + background-color: #f7f7f7; + width: 100%; + text-align: center; +} + +.cropper .img-container { + min-height: 200px; + max-height: 516px; + margin-bottom: 20px; +} + +@media (min-width: 768px) { + .cropper .img-container { + min-height: 516px; + } +} + +.cropper .img-container > img { + max-width: 100%; +} + +.cropper .docs-preview { + margin-right: -15px; +} + +.cropper .img-preview { + float: left; + margin-right: 10px; + margin-bottom: 10px; + overflow: hidden; +} + +.cropper .img-preview > img { + max-width: 100%; +} + +.cropper .preview-lg { + width: 263px; + height: 148px; +} + +.cropper .preview-md { + width: 139px; + height: 78px; +} + +.cropper .preview-sm { + width: 69px; + height: 39px; +} + +.cropper .preview-xs { + width: 35px; + height: 20px; + margin-right: 0; +} + +.cropper .docs-data > .input-group { + margin-bottom: 10px; +} + +.cropper .docs-data > .input-group > label { + min-width: 80px; +} + +.cropper .docs-data > .input-group > span { + min-width: 50px; +} + +.cropper .docs-buttons > .btn, +.cropper .docs-buttons > .btn-group, +.cropper .docs-buttons > .form-control { + margin-right: 5px; + margin-bottom: 10px; +} + +.cropper .docs-toggles > .btn, +.cropper .docs-toggles > .btn-group, +.cropper .docs-toggles > .dropdown { + margin-bottom: 10px; +} + +.cropper .docs-tooltip { + display: block; + margin: -6px -12px; + padding: 6px 12px; +} + +.cropper .docs-tooltip > .icon { + margin: 0 -3px; + vertical-align: top; +} + +.cropper .tooltip-inner { + white-space: normal; +} + +.cropper .btn-upload .tooltip-inner, +.cropper .btn-toggle .tooltip-inner { + white-space: nowrap; +} + +.cropper .btn-toggle { + padding: 6px; +} + +.cropper .btn-toggle > .docs-tooltip { + margin: -6px; + padding: 6px; +} + +@media (max-width: 400px) { + .cropper .btn-group-crop { + margin-right: -15px !important; + } + + .cropper .btn-group-crop > .btn { + padding-left: 5px; + padding-right: 5px; + } + + .cropper .btn-group-crop .docs-tooltip { + margin-left: -5px; + margin-right: -5px; + padding-left: 5px; + padding-right: 5px; + } +} + +.cropper .docs-options .dropdown-menu { + width: 100%; +} + +.cropper .docs-options .dropdown-menu > li { + padding: 3px 20px; +} + +.cropper .docs-options .dropdown-menu > li:hover { + background-color: #f7f7f7; +} + +.cropper .docs-options .dropdown-menu > li > label { + display: block; +} + +.cropper .docs-cropped .modal-body { + text-align: center; +} + +.cropper .docs-cropped .modal-body > img, +.cropper .docs-cropped .modal-body > canvas { + max-width: 100%; +} + +.cropper .docs-diagram .modal-dialog { + max-width: 352px; +} + +.cropper .docs-cropped canvas { + max-width: 100%; +} + +/** /Cropper **/ +/** jQuery Smart Wizard **/ +.form_wizard .stepContainer { + display: block; + position: relative; + margin: 0; + padding: 0; + border: 0 solid #CCC; + overflow-x: hidden; +} + +.wizard_horizontal ul.wizard_steps { + display: table; + list-style: none; + position: relative; + width: 100%; + margin: 0 0 20px; +} + +.wizard_horizontal ul.wizard_steps li { + display: table-cell; + text-align: center; +} + +.wizard_horizontal ul.wizard_steps li a, .wizard_horizontal ul.wizard_steps li:hover { + display: block; + position: relative; + -moz-opacity: 1; + filter: alpha(opacity=100); + opacity: 1; + color: #666; +} + +.wizard_horizontal ul.wizard_steps li a:before { + content: ""; + position: absolute; + height: 4px; + background: #ccc; + top: 20px; + width: 100%; + z-index: 4; + left: 0; +} + +.wizard_horizontal ul.wizard_steps li a.disabled .step_no { + background: #ccc; +} + +.wizard_horizontal ul.wizard_steps li a .step_no { + width: 40px; + height: 40px; + line-height: 40px; + border-radius: 100px; + display: block; + margin: 0 auto 5px; + font-size: 16px; + text-align: center; + position: relative; + z-index: 5; +} + +.wizard_horizontal ul.wizard_steps li a.selected:before, .step_no { + background: #34495E; + color: #fff; +} + +.wizard_horizontal ul.wizard_steps li a.done:before, .wizard_horizontal ul.wizard_steps li a.done .step_no { + background: rgb(0, 187, 214); + color: #fff; +} + +.wizard_horizontal ul.wizard_steps li:first-child a:before { + left: 50%; +} + +.wizard_horizontal ul.wizard_steps li:last-child a:before { + right: 50%; + width: 50%; + left: auto; +} + +.wizard_verticle .stepContainer { + width: 80%; + float: left; + padding: 0 10px; +} + +.actionBar { + width: 100%; + border-top: 1px solid #ddd; + padding: 10px 5px; + text-align: right; + margin-top: 10px; +} + +.actionBar .buttonDisabled { + cursor: not-allowed; + pointer-events: none; + opacity: .65; + filter: alpha(opacity=65); + box-shadow: none; +} + +.actionBar a { + margin: 0 3px; +} + +.wizard_verticle .wizard_content { + width: 80%; + float: left; + padding-left: 20px; +} + +.wizard_verticle ul.wizard_steps { + display: table; + list-style: none; + position: relative; + width: 20%; + float: left; + margin: 0 0 20px; +} + +.wizard_verticle ul.wizard_steps li { + display: list-item; + text-align: center; +} + +.wizard_verticle ul.wizard_steps li a { + height: 80px; +} + +.wizard_verticle ul.wizard_steps li a:first-child { + margin-top: 20px; +} + +.wizard_verticle ul.wizard_steps li a, .wizard_verticle ul.wizard_steps li:hover { + display: block; + position: relative; + -moz-opacity: 1; + filter: alpha(opacity=100); + opacity: 1; + color: #666; +} + +.wizard_verticle ul.wizard_steps li a:before { + content: ""; + position: absolute; + height: 100%; + background: #ccc; + top: 20px; + width: 4px; + z-index: 4; + left: 49%; +} + +.wizard_verticle ul.wizard_steps li a.disabled .step_no { + background: #ccc; +} + +.wizard_verticle ul.wizard_steps li a .step_no { + width: 40px; + height: 40px; + line-height: 40px; + border-radius: 100px; + display: block; + margin: 0 auto 5px; + font-size: 16px; + text-align: center; + position: relative; + z-index: 5; +} + +.wizard_verticle ul.wizard_steps li a.selected:before, .step_no { + background: #34495E; + color: #fff; +} + +.wizard_verticle ul.wizard_steps li a.done:before, .wizard_verticle ul.wizard_steps li a.done .step_no { + background: rgb(0, 187, 214); + color: #fff; +} + +.wizard_verticle ul.wizard_steps li:first-child a:before { + left: 49%; +} + +.wizard_verticle ul.wizard_steps li:last-child a:before { + left: 49%; + left: auto; + width: 0; +} + +.form_wizard .loader { + display: none; +} + +.form_wizard .msgBox { + display: none; +} + +/** jQuery Smart Wizard **/ +/** bootstrap-progressbar **/ +.progress { + border-radius: 0; +} + +.progress-bar-info { + background-color: #3498DB; +} + +.progress-bar-success { + background-color: #26B99A; +} + +.progress_summary .progress { + margin: 5px 0 12px !important; +} + +.progress_summary .row { + margin-bottom: 5px; +} + +.progress_summary .row .col-xs-2 { + padding: 0; +} + +.progress_summary .more_info span { + text-align: right; + float: right; +} + +.progress_summary .data span { + text-align: right; + float: right; +} + +.progress_summary p { + margin-bottom: 3px; + width: 100%; +} + +.progress_title .left { + float: left; + text-align: left; +} + +.progress_title .right { + float: right; + text-align: right; + font-weight: 300; +} + +.progress.progress_sm { + border-radius: 0; + margin-bottom: 18px; + height: 10px !important; +} + +.progress.progress_sm .progress-bar { + height: 10px !important; +} + +.dashboard_graph p { + margin: 0 0 4px; +} + +ul.verticle_bars { + width: 100%; +} + +ul.verticle_bars li { + width: 23%; + height: 200px; + margin: 0; +} + +.progress.vertical.progress_wide { + width: 35px; +} + +/** bootstrap-progressbar **/ +/** PNotify **/ +.alert-success { + color: #ffffff; + background-color: rgba(38, 185, 154, 0.88); + border-color: rgba(38, 185, 154, 0.88); +} + +.alert-info { + color: #E9EDEF; + background-color: rgba(52, 152, 219, 0.88); + border-color: rgba(52, 152, 219, 0.88); +} + +.alert-warning { + color: #E9EDEF; + background-color: rgba(243, 156, 18, 0.88); + border-color: rgba(243, 156, 18, 0.88); +} + +.alert-danger, +.alert-error { + color: #E9EDEF; + background-color: rgba(231, 76, 60, 0.88); + border-color: rgba(231, 76, 60, 0.88); +} + +.ui-pnotify.dark .ui-pnotify-container { + color: #E9EDEF; + background-color: rgba(52, 73, 94, 0.88); + border-color: rgba(52, 73, 94, 0.88); +} + +.custom-notifications { + position: fixed; + margin: 15px; + right: 0; + float: right; + width: 400px; + z-index: 4000; + bottom: 0; +} + +ul.notifications { + float: right; + display: block; + margin-bottom: 7px; + padding: 0; + width: 100%; +} + +.notifications li { + float: right; + margin: 3px; + width: 36px; + box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.3); +} + +.notifications li:last-child { + margin-left: 0; +} + +.notifications a { + display: block; + text-align: center; + text-decoration: none; + text-transform: uppercase; + padding: 9px 8px; +} + +.tabbed_notifications .text { + padding: 5px 15px; + height: 140px; + border-radius: 7px; + box-shadow: 6px 6px 6px rgba(0, 0, 0, 0.3); +} + +.tabbed_notifications div p { + display: inline-block; +} + +.tabbed_notifications h2 { + font-weight: bold; + text-transform: uppercase; + width: 80%; + float: left; + height: 20px; + text-overflow: ellipsis; + overflow: hidden; + display: block; +} + +.tabbed_notifications .close { + padding: 5px; + color: #E9EDEF; + float: right; + opacity: 1; +} + +/** /PNotify **/ +/** bootstrap-daterangepicker **/ +.daterangepicker.dropdown-menu { + font-size: 13px; + padding: 0; + overflow: hidden; +} + +.daterangepicker.picker_1 { + background: #34495E; + color: #ECF0F1; +} + +.daterangepicker.picker_1 table.table-condensed thead tr:first-child { + background: rgb(0, 187, 214); +} + +.daterangepicker table.table-condensed thead tr:first-child th { + line-height: 28px; + text-align: center; +} + +.daterangepicker.picker_1 table.table-condensed thead tr { + background: #213345; +} + +.daterangepicker table.table-condensed thead tr { + line-height: 14px; +} + +.daterangepicker table.table-condensed tbody tr:first-child td { + padding-top: 10px; +} + +.daterangepicker table.table-condensed th:first-child, .daterangepicker table.table-condensed td:first-child { + padding-left: 12px; +} + +.daterangepicker table.table-condensed th:last-child, .daterangepicker table.table-condensed td:last-child { + padding-right: 12px; +} + +.table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { + padding: 5px 7px; + text-align: center; +} + +.daterangepicker table.table-condensed tbody tr:last-child td { + padding-bottom: 10px; +} + +.daterangepicker.picker_2 table.table-condensed thead tr:first-child { + color: inherit; +} + +.daterangepicker.picker_2 table.table-condensed thead tr { + color: rgb(0, 187, 214); +} + +.daterangepicker.picker_3 table.table-condensed thead tr:first-child { + background: rgb(0, 187, 214); + color: #ECF0F1; +} + +.daterangepicker.picker_4 table.table-condensed tbody td { + background: #ECF0F1; + color: #34495E; + border: 1px solid #fff; + padding: 4px 7px; +} + +.daterangepicker.picker_4 table.table-condensed tbody td.active { + background: #536A7F; + color: #fff; +} + +.daterangepicker.picker_4 table.table-condensed thead tr:first-child { + background: #34495E; + color: #ECF0F1; +} + +.xdisplay_input { + width: 240px; + overflow: hidden; + padding: 0; +} + +.xdisplay { + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + margin-bottom: 20px; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + width: 230px; + overflow: hidden; + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); +} + +.daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar, .daterangepicker.openscenter .ranges, .daterangepicker.openscenter .calendar { + float: right; +} + +.daterangepicker table { + width: 100%; + margin: 0; +} + +.daterangepicker td, .daterangepicker th { + text-align: center; + width: 20px; + height: 20px; + cursor: pointer; + white-space: nowrap; +} + +.daterangepicker td.off { + color: #999; +} + +.daterangepicker td.disabled { + color: #999; +} + +.daterangepicker td.available:hover, .daterangepicker th.available:hover { + background: #eee; + color: #34495E; +} + +.daterangepicker td.in-range { + background: #E4E7EA; + border-radius: 0; +} + +.daterangepicker td.available + td.start-date { + border-radius: 4px 0 0 4px; +} + +.daterangepicker td.in-range + td.end-date { + border-radius: 0 4px 4px 0; +} + +.daterangepicker td.start-date.end-date { + border-radius: 4px !important; +} + +.daterangepicker td.active, .daterangepicker td.active:hover { + background-color: #536A7F; + color: #fff; +} + +.daterangepicker td.week, .daterangepicker th.week { + font-size: 80%; + color: #ccc; +} + +.daterangepicker select.monthselect, .daterangepicker select.yearselect { + font-size: 12px; + padding: 1px; + height: auto; + margin: 0; + cursor: default; + height: 30px; + border: 1px solid #ADB2B5; + line-height: 30px; + border-radius: 0px !important; +} + +.daterangepicker select.monthselect { + margin-right: 2%; + width: 56%; +} + +.daterangepicker select.yearselect { + width: 40%; +} + +.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.ampmselect { + width: 50px; + margin-bottom: 0; +} + +.daterangepicker_start_input { + float: left; +} + +.daterangepicker_end_input { + float: left; + padding-left: 11px; +} + +.daterangepicker th.month { + width: auto; +} + +.daterangepicker .daterangepicker_start_input label, .daterangepicker .daterangepicker_end_input label { + color: #333; + display: block; + font-size: 11px; + font-weight: normal; + height: 20px; + line-height: 20px; + margin-bottom: 2px; + text-shadow: #fff 1px 1px 0px; + text-transform: uppercase; + width: 74px; +} + +.daterangepicker .ranges input { + font-size: 11px; +} + +.daterangepicker .ranges .input-mini { + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; + color: #555; + display: block; + font-size: 11px; + height: 30px; + line-height: 30px; + vertical-align: middle; + margin: 0 0 10px 0; + padding: 0 6px; + width: 74px; +} + +.daterangepicker .ranges .input-mini:hover { + cursor: pointer; +} + +.daterangepicker .ranges ul { + list-style: none; + margin: 0; + padding: 0; +} + +.daterangepicker .ranges li { + font-size: 13px; + background: #f5f5f5; + border: 1px solid #f5f5f5; + color: #536A7F; + padding: 3px 12px; + margin-bottom: 8px; + border-radius: 5px; + cursor: pointer; +} + +.daterangepicker .ranges li.active, .daterangepicker .ranges li:hover { + background: #536A7F; + border: 1px solid #536A7F; + color: #fff; +} + +.daterangepicker .calendar { + display: none; + max-width: 270px; +} + +.daterangepicker.show-calendar .calendar { + display: block; +} + +.daterangepicker .calendar.single .calendar-date { + border: none; +} + +.daterangepicker.single .ranges, .daterangepicker.single .calendar { + float: none; +} + +.daterangepicker .ranges { + width: 160px; + text-align: left; + margin: 4px; +} + +.daterangepicker .ranges .range_inputs > div { + float: left; +} + +.daterangepicker .ranges .range_inputs > div:nth-child(2) { + padding-left: 11px; +} + +.daterangepicker.opensleft .ranges, .daterangepicker.opensleft .calendar { + float: left; + margin: 4px; +} + +.daterangepicker .icon { + width: 20px; + height: 20px; + display: inline-block; + vertical-align: middle; +} + +/** bootstrap-daterangepicker **/ +/** FullCalendar **/ +.fc-state-default { + background: #f5f5f5; + color: #73879C; +} + +.fc-state-down, +.fc-state-active { + color: #333; + background: #ccc; +} + +/** /FullCalendar **/ +/** Dropzone.js **/ +.dropzone { + min-height: 300px; + border: 1px solid #e5e5e5; +} + +/** /Dropzone.js **/ + +.tag-field-item { + padding: 5px; + font-size: 20px; +} + +.blog .blog-item .entry-meta > span, .blog .blog-item .entry-meta > div { + max-width: 33% !important; +} + +.category-select { + padding: 0; + margin: 0; + border: 0 solid #ccc; + width: 120px; + border-radius: 3px; + overflow: hidden; +} + +.category-select select { + padding: 5px 8px; + width: 130%; + border: none; + box-shadow: none; + background: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.category-select select:focus { + outline: none; +} + +table.dataTable thead th.sorting:after, +table.dataTable thead th.sorting_asc:after, +table.dataTable thead th.sorting_desc:after { + font-family: FontAwesome; +} + +table.dataTable thead th.sorting:after { + content: "\f0dc"; +} +table.dataTable thead th.sorting_asc:after { + content: "\f0de"; +} +table.dataTable thead th.sorting_desc:after { + content: "\f0dd"; +} + +.dataTable .fa-check-circle { + color: #08DD73 +} + +.dataTable .fa-times-circle { + color: #F72754; +} + +.ql-snow .ql-formats { + width: auto; +} diff --git a/assets/css/custom.min.css b/assets/css/custom.min.css new file mode 100644 index 0000000..4e2048c --- /dev/null +++ b/assets/css/custom.min.css @@ -0,0 +1,7 @@ +@charset "UTF-8";.x_title h2,table.tile_info td p{white-space:nowrap;text-overflow:ellipsis}.site_title,.x_title h2,table.tile_info td p{text-overflow:ellipsis}.detail a,.expand,.jqstooltip,.paging_full_numbers a:hover,.site_title:focus,.site_title:hover,a,a:focus,a:hover{text-decoration:none}.byline,.main_menu .fa{-webkit-font-smoothing:antialiased}.left_col{background:#2A3F54}.nav-sm .container.body .col-md-3.left_col{min-height:100%;width:70px;padding:0;z-index:9999;position:absolute}.nav-sm .container.body .col-md-3.left_col.menu_fixed{position:fixed;height:100%}.nav-sm .container.body .col-md-3.left_col .mCSB_container,.nav-sm .container.body .col-md-3.left_col .mCustomScrollBox{overflow:visible}.overflow_hidden,.sidebar-widget,.site_title,.tile,.weather-days .col-sm-2,.x_title h2,table.tile_info td p{overflow:hidden}.nav-sm .hidden-small{visibility:hidden}.nav-sm .container.body .right_col{padding:10px 20px;margin-left:70px;z-index:2}.nav-sm .navbar.nav_title{width:70px}.nav-sm .navbar.nav_title a span{display:none}.nav-sm .navbar.nav_title a i{font-size:27px;margin:13px 0 0 3px}.site_title i{border:1px solid #EAEAEA;padding:5px 6px;border-radius:50%}.nav-sm .main_container .top_nav{display:block;margin-left:70px;z-index:2}.nav-sm .nav.side-menu li a{text-align:center!important;font-weight:400;font-size:10px;padding:10px 5px}.nav-sm .nav.child_menu li.active,.nav-sm .nav.side-menu li.active-sm{border-right:5px solid #1ABB9C}.nav-sm .nav.side-menu li.active-sm ul ul,.nav-sm ul.nav.child_menu ul{position:static;width:200px;background:0 0}.nav-sm>.nav.side-menu>li.active-sm>a{color:#1ABB9C!important}.nav-sm .nav.side-menu li a i.toggle-up{display:none!important}.nav-sm .menu_section h3,.nav-sm .profile,.nav-sm span.fa{display:none}.nav-sm .nav.side-menu li a i{font-size:25px!important;text-align:center;width:100%!important;margin-bottom:5px}.nav-sm ul.nav.child_menu{left:100%;position:absolute;top:0;width:210px;z-index:4000;background:#3E5367;display:none}.nav-sm ul.nav.child_menu li{padding:0 10px}.nav-sm ul.nav.child_menu li a{text-align:left!important}.menu_section{margin-bottom:15px}.menu_section h3{padding-left:23px;color:#fff;text-transform:uppercase;letter-spacing:.5px;font-weight:700;font-size:11px;margin-bottom:0;margin-top:0;text-shadow:1px 1px #000}.menu_section>ul{margin-top:10px}.profile_pic{width:35%;float:left}.img-circle.profile_img{width:70%;background:#fff;margin-left:15%;z-index:1000;position:inherit;margin-top:20px;border:1px solid rgba(52,73,94,.44);padding:4px}.profile_info{padding:25px 10px 10px;width:65%;float:left}.profile_info span{font-size:13px;line-height:30px;color:#BAB8B8}.profile_info h2{font-size:14px;color:#ECF0F1;margin:0;font-weight:300}.profile.img_2{text-align:center}.profile.img_2 .profile_pic{width:100%}.profile.img_2 .profile_pic .img-circle.profile_img{width:50%;margin:10px 0 0}.profile.img_2 .profile_info{padding:15px 10px 0;width:100%;margin-bottom:10px;float:left}.main_menu span.fa{float:right;text-align:center;margin-top:5px;font-size:10px;min-width:inherit;color:#C4CFDA}.active a span.fa{text-align:right!important;margin-right:4px}.nav-sm .menu_section{margin:0}.nav-sm li li span.fa{display:inline-block}.nav_menu{float:left;background:#EDEDED;border-bottom:1px solid #D9DEE4;margin-bottom:10px;width:100%;position:relative}@media (min-width:480px){.nav_menu{position:static}}.nav-md .container.body .col-md-3.left_col{min-height:100%;width:230px;padding:0;position:absolute;display:-ms-flexbox;display:flex;z-index:1}.nav-md .container.body .col-md-3.left_col.menu_fixed{height:100%;position:fixed}body .container.body .right_col{background:#F7F7F7}.nav-md .container.body .right_col{padding:10px 20px 0;margin-left:230px}.nav_title{width:230px;float:left;background:#2A3F54;border-radius:0;height:57px}@media (max-width:991px){.nav-md .container.body .right_col,.nav-md .container.body .top_nav{width:100%;margin:0}.nav-md .container.body .col-md-3.left_col{display:none}.nav-md .container.body .right_col{width:100%;padding-right:0}.right_col{padding:10px!important}}@media (max-width:1200px){.x_title h2{width:62%;font-size:17px}.graph,.tile{zoom:85%;height:inherit}}@media (max-width:1270px) and (min-width:192px){.x_title h2 small{display:none}}.left_col .mCSB_scrollTools{width:6px}.left_col .mCSB_dragger{max-height:400px!important}.blue{color:#3498DB}.purple{color:#9B59B6}.green{color:#1ABB9C}.aero{color:#9CC2CB}.red{color:#E74C3C}.dark{color:#34495E}.border-blue{border-color:#3498DB!important}.border-purple{border-color:#9B59B6!important}.border-green{border-color:#1ABB9C!important}.border-aero{border-color:#9CC2CB!important}.border-red{border-color:#E74C3C!important}.border-dark{border-color:#34495E!important}.bg-white{background:#fff!important;border:1px solid #fff!important;color:#73879C}.bg-green{background:#1ABB9C!important;border:1px solid #1ABB9C!important;color:#fff}.bg-red{background:#E74C3C!important;border:1px solid #E74C3C!important;color:#fff}.bg-blue{background:#3498DB!important;border:1px solid #3498DB!important;color:#fff}.bg-orange{background:#F39C12!important;border:1px solid #F39C12!important;color:#fff}.bg-purple{background:#9B59B6!important;border:1px solid #9B59B6!important;color:#fff}.bg-blue-sky{background:#50C1CF!important;border:1px solid #50C1CF!important;color:#fff}.container{width:100%;padding:0}.top_nav .nav .open>a,.top_nav .nav .open>a:focus,.top_nav .nav .open>a:hover,.top_nav .nav>li>a:focus,.top_nav .nav>li>a:hover{background:#D9DEE4}body{color:#73879C;background:#2A3F54;font-family:"Helvetica Neue",Roboto,Arial,"Droid Sans",sans-serif;font-size:13px;font-weight:400;line-height:1.471}.main_container .top_nav{display:block;margin-left:230px}.no-padding{padding:0!important}.page-title{width:100%;height:65px;padding:10px 0}.page-title .title_left{width:45%;float:left;display:block}.page-title .title_left h3{margin:9px 0}.page-title .title_right{width:55%;float:left;display:block}.page-title .title_right .pull-right{margin:10px 0}.fixed_height_320{height:320px}.fixed_height_390{height:390px}.fixed_height_200{height:200px}.progress-bar-dark{background-color:#34495E!important}.progress-bar-gray{background-color:#BDC3C7!important}table.no-margin .progress{margin-bottom:0}.main_content{padding:10px 20px}.col-md-55{width:50%;margin-bottom:10px}@media (min-width:768px){.col-md-55{width:20%}}@media (min-width:992px){.col-md-55{width:20%}}@media (min-width:1200px){.col-md-55{width:20%}}@media (min-width:192px) and (max-width:1270px){table.tile_info span.right{margin-right:7px;float:left}}.center-margin{margin:0 auto;float:none!important}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-55,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;float:left;padding-right:10px;padding-left:10px}.row{margin-right:-10px;margin-left:-10px}.grid_slider .col-md-6{padding:0 40px}.h1,.h2,.h3,h1,h2,h3{margin-top:10px;margin-bottom:10px}a{color:#5A738E}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus,:active,:focus,:visited,a,a:active,a:focus,a:visited{outline:0}.navbar{margin-bottom:0}.navbar-header{background:#34495E}.navbar-right{margin-right:0}.top_nav .navbar-right{margin:0;width:70%;float:right}.top_nav .navbar-right li{display:inline-block;float:right;position:static}@media (min-width:480px){.top_nav .navbar-right li{position:relative}}.top_nav .dropdown-menu li{width:100%}.top_nav .dropdown-menu li a{width:100%;padding:12px 20px}.top_nav li a i{font-size:15px}.navbar-static-top{position:fixed;top:0;width:100%}.sidebar-header{border-bottom:0;margin-top:46px}.sidebar-header:first-of-type{margin-top:0}.nav.side-menu>li{position:relative;display:block;cursor:pointer}.nav.side-menu>li>a{margin-bottom:6px}.nav.side-menu>li>a:hover{color:#F2F5F7!important}.nav.side-menu>li>a:hover,.nav>li>a:focus{text-decoration:none;background:0 0}.nav.child_menu{display:none}.nav.child_menu li.active,.nav.child_menu li:hover{background-color:rgba(255,255,255,.06)}.nav.child_menu li{padding-left:36px}.nav-md ul.nav.child_menu li:before{background:#425668;bottom:auto;content:"";height:8px;left:23px;margin-top:15px;position:absolute;right:auto;width:8px;z-index:1;border-radius:50%}.nav-md ul.nav.child_menu li:after{border-left:1px solid #425668;bottom:0;content:"";left:27px;position:absolute;top:0}.nav.top_menu>li>a,.nav>li>a{position:relative;display:block}.nav.child_menu>li>a,.nav.side-menu>li>a{color:#E7E7E7;font-weight:500}.nav li li.current-page a,.nav.child_menu li li a.active,.nav.child_menu li li a:hover{color:#fff}.nav.child_menu li li.active,.nav.child_menu li li:hover{background:0 0}.nav>li>a{padding:13px 15px 12px}.nav.side-menu>li.active,.nav.side-menu>li.current-page{border-right:5px solid #1ABB9C}.nav li.current-page{background:rgba(255,255,255,.05)}.nav li li li.current-page{background:0 0}.navbar-brand,.navbar-nav>li>a,.site_title{color:#ECF0F1!important;margin-left:0!important}.nav.side-menu>li.active>a{text-shadow:rgba(0,0,0,.25) 0 -1px 0;background:linear-gradient(#334556,#2C4257),#2A3F54;box-shadow:rgba(0,0,0,.25) 0 1px 0,inset rgba(255,255,255,.16) 0 1px 0}.navbar-brand,.navbar-nav>li>a{font-weight:500;line-height:32px}.site_title{font-weight:400;font-size:22px;width:100%;line-height:59px;display:block;height:55px;margin:0;padding-left:10px}.nav.navbar-nav>li>a{color:#515356!important}.nav.top_menu>li>a{padding:10px 15px;color:#34495E!important}.nav>li>a:focus,.nav>li>a:hover{background-color:transparent}.top_search{padding:0}.top_search .form-control{box-shadow:inset 0 1px 0 rgba(0,0,0,.075);border-radius:25px 0 0 25px;padding-left:20px;border:1px solid rgba(221,226,232,.49)}.top_search .form-control:focus{border:1px solid rgba(221,226,232,.49);border-right:0}.top_search .input-group-btn button{border-radius:0 25px 25px 0;border:1px solid rgba(221,226,232,.49);border-left:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);color:#93A2B2;margin-bottom:0!important}.tiles,.top_tiles{margin-bottom:0}.toggle{float:left;margin:0;padding-top:16px;width:70px}.toggle a{padding:15px 15px 0;margin:0;cursor:pointer}.toggle a i{font-size:26px}.nav.child_menu>li>a{color:rgba(255,255,255,.75);font-size:12px;padding:9px}.panel_toolbox{float:right;min-width:70px}.panel_toolbox>li{float:left;cursor:pointer}.panel_toolbox>li>a{padding:5px;color:#C5C7CB;font-size:14px}.panel_toolbox>li>a:hover{background:#F5F7FA}.line_30{line-height:30px}.main_menu_side{padding:0}.bs-docs-sidebar .nav>li>a{display:block;padding:4px 6px}footer{background:#fff;padding:15px 20px;display:block}.nav-sm footer{margin-left:70px}.footer_fixed footer{position:fixed;left:0;bottom:0;width:100%}.degrees:after,.x_content,.x_panel{position:relative}@media (min-width:768px){.footer_fixed .nav-sm footer,.footer_fixed footer{margin-left:0}}.tile-stats.sparkline{padding:10px;text-align:center}.jqstooltip{background:#34495E!important;width:30px!important;height:22px!important}.tooltip{display:block!important}.tiles{border-top:1px solid #ccc;margin-top:15px;padding-top:5px}.top_tiles .tile h2{font-size:30px;line-height:30px;margin:3px 0 7px;font-weight:700}article.media{width:100%}*,:after,:before{box-sizing:border-box}#integration-list{width:100%;margin:0 auto;display:table}#integration-list ul{padding:0;margin:20px 0;color:#555}#integration-list ul>li{list-style:none;border-top:1px solid #ddd;display:block;padding:15px;overflow:hidden}#integration-list ul:last-child{border-bottom:1px solid #ddd}#integration-list ul>li:hover{background:#efefef}.expand{display:block;color:#555;cursor:pointer}.expand h2{width:85%;float:left}h2{font-size:18px;font-weight:400}#left,#right{display:table}#sup{display:table-cell;vertical-align:middle;width:80%}.detail a{color:#C0392B;border:1px solid #C0392B;padding:6px 10px 5px;font-size:13px;margin-right:7px}.detail{margin:10px 0;display:none;line-height:22px;height:150px}.detail span{margin:0}.right-arrow{width:10px;float:right;font-weight:700;font-size:20px}.accordion .panel{margin-bottom:5px;border-radius:0;border-bottom:1px solid #efefef}.x_panel,.x_title{margin-bottom:10px}.accordion .panel-heading{background:#F2F5F7;padding:13px;width:100%;display:block}.accordion .panel:hover{background:#F2F5F7}.x_panel{width:100%;padding:10px 17px;display:inline-block;background:#fff;border:1px solid #E6E9ED;-webkit-column-break-inside:avoid;-moz-column-break-inside:avoid;column-break-inside:avoid;opacity:1;transition:all .2s ease}.x_title{border-bottom:2px solid #E6E9ED;padding:1px 5px 6px}.x_title .filter{width:40%;float:right}.x_content,table.tile td ul li a,table.tile_info{width:100%}.x_title h2{margin:5px 0 6px;float:left;display:block}.x_title h2 small{margin-left:10px}.x_title span{color:#BDBDBD}.x_content{padding:0 5px 6px;float:left;clear:both;margin-top:5px}.x_content h4{font-size:16px;font-weight:500}legend{padding-bottom:7px}.demo-placeholder{height:280px}.profile_details:nth-child(3n){clear:both}.profile_details .profile_view{display:inline-block;padding:10px 0 0;background:#fff}.profile_details .profile_view .divider{border-top:1px solid #e5e5e5;padding-top:5px;margin-top:5px}.profile_details .profile_view .ratings{margin-bottom:0;text-align:left;font-size:16px}.profile_details .profile_view .bottom{background:#F2F5F7;padding:9px 0;border-top:1px solid #E6E9ED}.profile_details .profile_view .left{margin-top:20px}.profile_details .profile_view .left p{margin-bottom:3px}.profile_details .profile_view .right{margin-top:0;padding:10px}.profile_details .profile_view .img-circle{border:1px solid #E6E9ED;padding:2px}.profile_details .profile_view h2{margin:5px 0}.profile_details .profile_view .brief{margin:0;font-weight:300}.profile_details .profile_left{background:#fff}.pagination.pagination-split li{display:inline-block;margin-right:3px}.pagination.pagination-split li a{border-radius:4px;color:#768399;-moz-border-radius:4px;-webkit-border-radius:4px}table.tile h3,table.tile h4,table.tile span{font-weight:700;vertical-align:middle!important}table.tile td,table.tile th{text-align:center}table.tile th{border-bottom:1px solid #E6ECEE}table.tile td{padding:5px 0}table.tile td ul{text-align:left;padding-left:0}table.tile td ul li{list-style:none;width:100%}table.tile td ul li a big{right:0;float:right;margin-right:13px}table.tile_info td{text-align:left;padding:1px;font-size:15px}table.tile_info td p{margin:0;line-height:28px}table.tile_info td i{margin-right:8px;font-size:17px;float:left;width:18px;line-height:28px}table.tile_info td:first-child{width:83%}td span{line-height:28px}.error-number{font-size:90px;line-height:90px;margin:20px 0}.col-middle{margin-top:5%}.mid_center{width:370px;margin:0 auto;text-align:center;padding:10px 20px}h3.degrees{font-size:22px;font-weight:400;text-align:center}.degrees:after{content:"o";top:-12px;font-size:13px;font-weight:300}.daily-weather .day{font-size:14px;border-top:2px solid rgba(115,135,156,.36);text-align:center;border-bottom:2px solid rgba(115,135,156,.36);padding:5px 0}.weather-days .col-sm-2{width:16.66666667%}.weather .row{margin-bottom:0}.bulk-actions{display:none}table.countries_list{width:100%}table.countries_list td{padding:0 10px;line-height:30px;border-top:1px solid #eee}.dataTables_paginate a{padding:6px 9px!important;background:#ddd!important;border-color:#ddd!important}.paging_full_numbers a.paginate_active{background-color:rgba(38,185,154,.59)!important;border-color:rgba(38,185,154,.59)!important}a.DTTT_button,button.DTTT_button,div.DTTT_button{border:1px solid #E7E7E7!important;background:#E7E7E7!important;box-shadow:none!important}table.jambo_table{border:1px solid rgba(221,221,221,.78)}table.jambo_table thead{background:rgba(52,73,94,.94);color:#ECF0F1}table.jambo_table tbody tr:hover td{background:rgba(38,185,154,.07);border-top:1px solid rgba(38,185,154,.11);border-bottom:1px solid rgba(38,185,154,.11)}table.jambo_table tbody tr.selected{background:rgba(38,185,154,.16)}table.jambo_table tbody tr.selected td{border-top:1px solid rgba(38,185,154,.4);border-bottom:1px solid rgba(38,185,154,.4)}.dataTables_wrapper{position:relative;clear:both;zoom:1}.dataTables_processing{position:absolute;top:50%;left:50%;width:250px;height:30px;margin-left:-125px;margin-top:-15px;padding:14px 0 2px;border:1px solid #ddd;text-align:center;color:#999;font-size:14px;background-color:#fff}td.details,td.group{background-color:#d1cfd0}.dataTables_length{width:40%;float:left}.dataTables_filter{width:50%;float:right;text-align:right}.dataTables_info{width:60%;float:left}.dataTables_paginate{float:right;text-align:right}.dataTables_empty,table.display td.center{text-align:center}table.dataTable td.focus,table.dataTable th.focus{outline:#1ABB9C solid 2px!important;outline-offset:-1px}.paging_full_numbers a:active,table.display thead td:active,table.display thead th:active{outline:0}table.display{margin:0 auto;clear:both;width:100%}table.display thead th{padding:8px 18px 8px 10px;border-bottom:1px solid #000;font-weight:700;cursor:pointer}table.display tfoot th{padding:3px 18px 3px 10px;border-top:1px solid #000;font-weight:700}table.display tr.heading2 td{border-bottom:1px solid #aaa}table.display td{padding:3px 10px}.dataTables_scroll{clear:both}.dataTables_scrollBody{-webkit-overflow-scrolling:touch}.top .dataTables_info{float:none}.clear{clear:both}tfoot input{margin:.5em 0;width:100%;color:#444}tfoot input.search_init{color:#999}td.group{border-bottom:2px solid #A19B9E;border-top:2px solid #A19B9E}td.details{border:2px solid #A19B9E}.example_alt_pagination div.dataTables_info{width:40%}.paging_full_numbers{width:400px;height:22px;line-height:22px}.paging_full_numbers a.paginate_active,.paging_full_numbers a.paginate_button{border:1px solid #aaa;-webkit-border-radius:5px;-moz-border-radius:5px;padding:2px 5px;margin:0 3px;cursor:pointer}.paging_full_numbers a.paginate_button{background-color:#ddd}.paging_full_numbers a.paginate_button:hover{background-color:#ccc;text-decoration:none!important}.login_content .btn-default:hover,.login_content a,.tagsinput span.tag a,.tile-stats>.dash-box-footer,.tile:hover,.view a.info,span.tag{text-decoration:none}table.display tr.even.row_selected td{background-color:#B0BED9}table.display tr.odd.row_selected td{background-color:#9FAFD1}div.box{height:100px;padding:10px;overflow:auto;border:1px solid #8080FF;background-color:#E5E5FF}ul.msg_list li{background:#f7f7f7;padding:5px;display:-ms-flexbox;display:flex;margin:6px 6px 0;width:96%!important}ul.msg_list li:last-child{margin-bottom:6px;padding:10px}ul.msg_list li a{padding:3px 5px!important}ul.msg_list li a .image img{border-radius:2px;-webkit-border-radius:2px;float:left;margin-right:10px;width:11%}ul.msg_list li a .time{font-size:11px;font-style:italic;font-weight:700;position:absolute;right:35px}ul.msg_list li a .message{display:block!important;font-size:11px}.dropdown-menu.msg_list span{white-space:normal}.tile_count .tile_stats_count,ul.quick-list li{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dropdown-menu{box-shadow:none;display:none;float:left;font-size:12px;left:0;list-style:none;padding:0;position:absolute;text-shadow:none;top:100%;z-index:9998;border:1px solid #D9DEE4;border-top-left-radius:0;border-top-right-radius:0}.dropdown-menu>li>a{color:#5A738E}.navbar-nav .open .dropdown-menu{position:absolute;background:#fff;margin-top:0;border:1px solid #D9DEE4;-webkit-box-shadow:none;right:0;left:auto;width:220px}.navbar-nav .open .dropdown-menu.msg_list{width:300px}.info-number .badge{font-size:10px;font-weight:400;line-height:13px;padding:2px 6px;position:absolute;right:2px;top:8px}ul.to_do{padding:0}ul.to_do li{background:#f3f3f3;border-radius:3px;position:relative;padding:7px;margin-bottom:5px;list-style:none}ul.to_do p{margin:0}.dashboard-widget{background:#f6f6f6;border-top:5px solid #79C3DF;border-radius:3px;padding:5px 10px 10px}.dashboard-widget .dashboard-widget-title{font-weight:400;border-bottom:1px solid #c1cdcd;margin:0 0 10px;padding-bottom:5px;padding-left:40px;line-height:30px}.dashboard-widget .dashboard-widget-title i{font-size:100%;margin-left:-35px;margin-right:10px;color:#33a1c9;padding:3px 6px;border:1px solid #abd9ea;border-radius:5px;background:#fff}ul.quick-list{width:45%;padding-left:0;display:inline-block}ul.quick-list li{padding-left:10px;list-style:none;margin:0;padding-bottom:6px;padding-top:4px}ul.quick-list li i{padding-right:10px;color:#757679}.dashboard-widget-content{padding-top:9px}.dashboard-widget-content .sidebar-widget{width:50%;display:inline-block;vertical-align:top;background:#fff;border:1px solid #abd9ea;border-radius:5px;text-align:center;float:right;padding:2px;margin-top:10px}.widget_summary{width:100%;display:-ms-inline-flexbox;display:inline-flex}.widget_summary .w_left{float:left;text-align:left}.widget_summary .w_center{float:left}.widget_summary .w_right{float:left;text-align:right}.widget_summary .w_right span{font-size:20px}.w_20{width:20%}.w_25{width:25%}.w_55{width:55%}h5.graph_title{text-align:left;margin-left:10px}h5.graph_title i{margin-right:10px;font-size:17px}span.right{float:right;font-size:14px!important}.tile_info a{text-overflow:ellipsis}.sidebar-footer{bottom:0;clear:both;display:block;padding:5px 0 0;position:fixed;width:230px;background:#2A3F54}.sidebar-footer a{padding:7px 0 3px;text-align:center;width:25%;font-size:17px;display:block;float:left;background:#172D44}.sidebar-footer a:hover{background:#425567}.tile_count{margin-bottom:20px;margin-top:20px}.tile_count .tile_stats_count{border-bottom:1px solid #D9DEE4;padding:0 10px 0 20px;position:relative}.tile_count .tile_stats_count:before{content:"";position:absolute;left:0;height:65px;border-left:2px solid #ADB2B5;margin-top:10px}@media (min-width:992px){footer{margin-left:230px}.tile_count .tile_stats_count{margin-bottom:10px;border-bottom:0;padding-bottom:10px}.tile_count .tile_stats_count:first-child:before{border-left:0}}.tile_count .tile_stats_count .count{font-size:30px;line-height:47px;font-weight:600}@media (min-width:768px){.tile_count .tile_stats_count .count{font-size:40px}}@media (min-width:992px) and (max-width:1100px){.tile_count .tile_stats_count .count{font-size:30px}}.tile_count .tile_stats_count span{font-size:12px}@media (min-width:768px){.tile_count .tile_stats_count span{font-size:13px}}.tile_count .tile_stats_count .count_bottom i{width:12px}.dashboard_graph{background:#fff;padding:7px 10px}.dashboard_graph .col-md-3,.dashboard_graph .col-md-9{padding:0}a.user-profile{color:#5E6974!important}.user-profile img{width:29px;height:29px;border-radius:50%;margin-right:10px}ul.top_profiles{height:330px;width:100%}ul.top_profiles li{margin:0;padding:3px 5px}ul.top_profiles li:nth-child(odd){background-color:#eee}.media .profile_thumb{border:1px solid;width:50px;height:50px;margin:5px 10px 5px 0;border-radius:50%;padding:9px 12px}.media .profile_thumb i{font-size:30px}.media .date{background:#ccc;width:52px;margin-right:10px;border-radius:10px;padding:5px}.media .date .day,.media .date .month{margin:0;text-align:center;color:#fff}.media .date .day{font-size:27px;line-height:27px;font-weight:700}.event .media-body a.title{font-weight:700}.event .media-body p{margin-bottom:0}h4.graph_title{margin:7px;text-align:center}.fontawesome-icon-list .fa-hover a:hover{background-color:#ddd;color:#fff;text-decoration:none}.fontawesome-icon-list .fa-hover a{display:block;line-height:32px;height:32px;padding-left:10px;border-radius:4px}.fontawesome-icon-list .fa-hover a:hover .fa{font-size:28px;vertical-align:-6px}.fontawesome-icon-list .fa-hover a .fa{width:32px;font-size:16px;display:inline-block;text-align:right;margin-right:10px}.main_menu .fa{width:26px;opacity:.99;display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:400;font-size:18px;-moz-osx-font-smoothing:grayscale}.tile-stats{position:relative;display:block;margin-bottom:12px;border:1px solid #E4E4E4;-webkit-border-radius:5px;overflow:hidden;padding-bottom:5px;-webkit-background-clip:padding-box;-moz-border-radius:5px;-moz-background-clip:padding;border-radius:5px;background:#FFF;transition:all .3s ease-in-out}.tile-stats:hover .icon i{animation-name:tansformAnimation;animation-duration:.5s;animation-iteration-count:1;color:rgba(58,58,58,.41);animation-timing-function:ease;animation-fill-mode:forwards;-webkit-animation-name:tansformAnimation;-webkit-animation-duration:.5s;-webkit-animation-iteration-count:1;-webkit-animation-timing-function:ease;-webkit-animation-fill-mode:forwards;-moz-animation-name:tansformAnimation;-moz-animation-duration:.5s;-moz-animation-iteration-count:1;-moz-animation-timing-function:ease;-moz-animation-fill-mode:forwards}.tile-stats .icon{width:20px;height:20px;color:#BAB8B8;position:absolute;right:53px;top:22px;z-index:1}.tile-stats .icon i{margin:0;font-size:60px;line-height:0;vertical-align:bottom;padding:0}.tile-stats .count{font-size:38px;font-weight:700;line-height:1.65857}.tile-stats .count,.tile-stats h3,.tile-stats p{position:relative;margin:0 0 0 10px;z-index:5;padding:0}.tile-stats h3{color:#BAB8B8}.tile-stats p{margin-top:5px;font-size:12px}.tile-stats>.dash-box-footer{position:relative;text-align:center;margin-top:5px;padding:3px 0;color:#fff;color:rgba(255,255,255,.8);display:block;z-index:10;background:rgba(0,0,0,.1)}.tile-stats>.dash-box-footer:hover{color:#fff;background:rgba(0,0,0,.15)}table.tile_info{padding:10px 15px}table.tile_info span.right{margin-right:0;float:right;position:absolute;right:4%}.tile_header{border-bottom:transparent;padding:7px 15px;margin-bottom:15px;background:#E7E7E7}.tile_head h4{margin-top:0;margin-bottom:5px}.tiles-bottom{padding:5px 10px;margin-top:10px;background:rgba(194,194,194,.3);text-align:left}a.star{color:#428bca!important}.mail_content{background:#FFF;border-radius:4px;margin-top:20px;min-height:500px;padding:10px 11px;width:100%}.list-btn-mail{margin-bottom:15px}.list-btn-mail.active{border-bottom:1px solid #39B3D7;padding:0 0 14px}.list-btn-mail>i{float:left;font-size:18px;font-style:normal;width:33px}.list-btn-mail>.cn{background:#39B3D7;border-radius:12px;color:#FFF;float:right;font-style:normal;padding:0 5px}.byline,.view p{font-style:italic}.button-mail{margin:0 0 15px!important;text-align:left;width:100%}.btn,.buttons,.modal-footer .btn+.btn,button{margin-bottom:5px;margin-right:5px}.btn-group .btn,.btn-group-vertical .btn{margin-bottom:0;margin-right:0}.mail_list_column,.mail_view{border-left:1px solid #DBDBDB}.mail_list{width:100%;border-bottom:1px solid #DBDBDB;margin-bottom:2px;display:inline-block}.mail_list .left{width:5%;float:left;margin-right:3%}.mail_list .right{width:90%;float:left}.mail_list h3{font-size:15px;font-weight:700;margin:0 0 6px}.mail_list h3 small{float:right;color:#ADABAB;font-size:11px;line-height:20px}.mail_list .badge{padding:3px 6px;font-size:8px;background:#BAB7B7}@media (max-width:767px){.mail_list{margin-bottom:5px;display:inline-block}}.mail_heading h4{font-size:18px;border-bottom:1px solid #ddd;padding-bottom:10px;margin-top:20px}.attachment{margin-top:30px}.attachment ul{width:100%;list-style:none;padding-left:0;display:inline-block;margin-bottom:30px}.attachment ul li{float:left;width:150px;margin-right:10px;margin-bottom:10px}.attachment ul li img{height:150px;border:1px solid #ddd;padding:5px;margin-bottom:10px}.attachment ul li span{float:right}.attachment .file-name{float:left}.attachment .links{width:100%;display:inline-block}.compose{padding:0;position:fixed;bottom:0;right:0;background:#fff;border:1px solid #D9DEE4;border-right:0;border-bottom:0;border-top-left-radius:5px;z-index:9999;display:none}.compose .compose-header{padding:5px;background:#169F85;color:#fff;border-top-left-radius:5px}.compose .compose-header .close{text-shadow:0 1px 0 #fff;line-height:.8}.compose .compose-body .editor.btn-toolbar{margin:0}.compose .compose-body .editor-wrapper{height:100%;min-height:50px;max-height:180px;border-radius:0;border-left:none;border-right:none;overflow:auto}.compose .compose-footer{padding:10px}.editor.btn-toolbar{zoom:1;background:#F7F7F7;margin:5px 2px;padding:3px 0;border:1px solid #EFEFEF}.input-group{margin-bottom:10px}.ln_solid{border-top:1px solid #e5e5e5;color:#fff;background-color:#fff;height:1px;margin:20px 0}span.section{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}.form-control{border-radius:0;width:100%}.form-horizontal .control-label{padding-top:8px}.form-control:focus{border-color:#CCD0D7;box-shadow:none!important}legend{font-size:18px;color:inherit}.form-horizontal .form-group{margin-right:0;margin-left:0}.form-control-feedback{margin-top:8px;height:23px;color:#bbb;line-height:24px;font-size:15px}.form-control-feedback.left{border-right:1px solid #ccc;left:13px}.form-control-feedback.right{border-left:1px solid #ccc;right:13px}.form-control.has-feedback-left{padding-left:45px}.form-control.has-feedback-right{padding-right:45px}.form-group{margin-bottom:10px}.validate{margin-top:10px}.invalid-form-error-message{margin-top:10px;padding:5px}.invalid-form-error-message.filled{border-left:2px solid #E74C3C}p.parsley-success{color:#468847;background-color:#DFF0D8;border:1px solid #D6E9C6}p.parsley-error{color:#B94A48;background-color:#F2DEDE;border:1px solid #EED3D7}ul.parsley-errors-list{list-style:none;color:#E74C3C;padding-left:0}input.parsley-error,select.parsley-error,textarea.parsley-error{background:#FAEDEC;border:1px solid #E85445}.btn-group .parsley-errors-list{display:none}.bad input,.bad select,.bad textarea{border:1px solid #CE5454;box-shadow:0 0 4px -2px #CE5454;position:relative;left:0;-moz-animation:.7s 1 shake linear;-webkit-animation:.7s 1 shake linear}.item input,.item textarea{transition:.42s}.item .alert{float:left;margin:0 0 0 20px;padding:3px 10px;color:#FFF;border-radius:3px 4px 4px 3px;background-color:#CE5454;max-width:170px;white-space:pre;position:relative;left:-15px;opacity:0;z-index:1;transition:.15s ease-out}.item .alert::after{content:'';display:block;height:0;width:0;border-color:transparent #CE5454 transparent transparent;border-style:solid;border-width:11px 7px;position:absolute;left:-13px;top:1px}.item.bad .alert{left:0;opacity:1}.inl-bl{display:inline-block}.well .markup{background:#fff;color:#777;position:relative;padding:45px 15px 15px;margin:15px 0 0;border-radius:0 0 4px 4px;box-shadow:none}.well .markup::after{content:"Example";position:absolute;top:15px;left:15px;font-size:12px;font-weight:700;color:#bbb;text-transform:uppercase;letter-spacing:1px}.autocomplete-suggestions{border:1px solid #e4e4e4;background:#F4F4F4;cursor:default;overflow:auto}.autocomplete-suggestion{padding:2px 5px;font-size:1.2em;white-space:nowrap;overflow:hidden}.autocomplete-selected{background:#f0f0f0}.autocomplete-suggestions strong{color:#39f;font-weight:bolder}.btn{border-radius:3px}a.btn-red,a.btn-primary,a.btn-green,a.btn-orange{color:#fff}.btn-green{background:#26B99A;border:1px solid #169F85}.btn-green.active,.btn-green:active,.btn-green:focus,.btn-green:hover,.open .dropdown-toggle.btn-green{background:#169F85}.btn-dark{color:#E9EDEF;background-color:#4B5F71;border-color:#364B5F}.btn-dark.active,.btn-dark:active,.btn-dark:focus,.btn-dark:hover,.open .dropdown-toggle.btn-dark{color:#FFF;background-color:#394D5F;border-color:#394D5F}.btn-round{border-radius:30px}.btn.btn-app{position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;box-shadow:none;border-radius:0;text-align:center;color:#666;border:1px solid #ddd;background-color:#fafafa;font-size:12px}.btn.btn-app>.fa,.btn.btn-app>.glyphicon,.btn.btn-app>.ion{font-size:20px;display:block}.btn.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn.btn-app:active,.btn.btn-app:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}textarea{padding:10px;vertical-align:top;width:200px}textarea:focus{outline-style:solid;outline-width:2px}.btn_{display:inline-block;padding:3px 9px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);background-color:#f5f5f5;background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border:1px solid #ccc;border-bottom-color:#b3b3b3;border-radius:4px;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.bs-glyphicons{margin:0 -10px 20px;overflow:hidden}.bs-glyphicons-list{padding-left:0;list-style:none}.bs-glyphicons li{float:left;width:25%;height:115px;padding:10px;font-size:10px;line-height:1.4;text-align:center;background-color:#f9f9f9;border:1px solid #fff}.bs-glyphicons .glyphicon{margin-top:5px;margin-bottom:10px;font-size:24px}.bs-glyphicons .glyphicon-class{display:block;text-align:center;word-wrap:break-word}.bs-glyphicons li:hover{color:#fff;background-color:#1ABB9C}@media (min-width:768px){.bs-glyphicons{margin-right:0;margin-left:0}.bs-glyphicons li{width:12.5%;font-size:12px}}.tagsinput{border:1px solid #CCC;background:#FFF;padding:6px 6px 0;width:300px;overflow-y:auto}span.tag{-moz-border-radius:2px;-webkit-border-radius:2px;display:block;float:left;padding:10px 15px;background:#1ABB9C;color:#F1F6F7;margin-right:5px;font-weight:400;margin-bottom:5px;font-family:Roboto,Arial,sans-serif;font-size:14px}span.tag a{color:#F1F6F7!important}.tagsinput span.tag a{font-weight:700;color:#82ad2b;font-size:11px}.tagsinput input{width:80px;margin:0;font-family:helvetica;font-size:13px;border:1px solid transparent;padding:3px;background:0 0;color:#000;outline:0}.tagsinput div{display:block;float:left}.social-body,.social-sidebar,ul.bar_tabs.right li{float:right}.tags_clear{clear:both;width:100%;height:0}.not_valid{background:#FBD8DB!important;color:#90111A!important}ul.bar_tabs{overflow:visible;background:#F5F7FA;height:25px;margin:21px 0 14px;padding-left:14px;position:relative;z-index:1;width:100%;border-bottom:1px solid #E6E9ED}ul.bar_tabs>li{border:1px solid #E6E9ED;color:#333!important;margin-top:-17px;margin-left:8px;background:#fff;border-bottom:none;border-radius:4px 4px 0 0}ul.bar_tabs>li.active{border-right:6px solid #D3D6DA;border-top:0;margin-top:-15px}ul.bar_tabs>li a{padding:10px 17px;background:#F5F7FA;margin:0;border-top-right-radius:0}ul.bar_tabs>li a:hover{border:1px solid transparent}ul.bar_tabs>li.active a{border-bottom:none}ul.bar_tabs.right{padding-right:14px}a:focus{outline:0}ul.timeline li{position:relative;border-bottom:1px solid #e8e8e8;clear:both}.timeline .block{margin:0 0 0 125px;border-left:3px solid #e8e8e8;overflow:visible;padding:10px 15px}.timeline.widget{min-width:0;max-width:inherit}.timeline.widget .block{margin-left:5px}.timeline .tags{position:absolute;top:15px;left:0;width:104px}.timeline .tag{display:block;height:30px;font-size:13px;padding:8px}.timeline .tag span{display:block;overflow:hidden;width:100%;white-space:nowrap;text-overflow:ellipsis}.tag{line-height:1;background:#1ABB9C;color:#fff!important}.tag:after{content:" ";height:30px;width:0;position:absolute;left:100%;top:0;margin:0;pointer-events:none;border-top:14px solid transparent;border-bottom:14px solid transparent;border-left:11px solid #1ABB9C}.timeline h2.title{position:relative;font-size:16px;margin:0}.timeline h2.title:before{content:"";position:absolute;left:-23px;top:3px;display:block;width:14px;height:14px;border:3px solid #d2d3d2;border-radius:14px;background:#f9f9f9}.timeline .byline{padding:.25em 0}.byline{font-size:.9375em;line-height:1.3;color:#aab6aa}ul.social li{border:0}.social-sidebar{background:#EDEDED;width:22%}.social-body{border:1px solid #ccc;width:78%}.thumb img{width:50px;height:50px;border-radius:50%}.chat .thumb img{width:27px;height:27px;border-radius:50%}.chat .status{float:left;margin:16px 0 0 -16px;font-size:14px;font-weight:700;width:12px;height:12px;display:block;border:2px solid #FFF;z-index:12312;border-radius:50%}.chart,.percent{display:inline-block}.chat .status.online{background:#1ABB9C}.chat .status.away{background:#F39C12}.chat .status.offline{background:#ccc}.chat .media-body{padding-top:5px}.dashboard_graph .x_title{padding:5px 5px 7px}.dashboard_graph .x_title h3{margin:0;font-weight:400}.chart{position:relative;width:110px;height:110px;margin-top:5px;margin-bottom:5px;text-align:center}.chart canvas{position:absolute;top:0;left:0}.percent{line-height:110px;z-index:2;font-size:18px}.percent:after{content:'%';margin-left:.1em;font-size:.8em}.angular{margin-top:100px}.angular .chart{margin-top:0}.widget{min-width:250px;max-width:310px}.widget_tally_box .btn-group button{text-align:center;color:inherit;font-weight:500;background-color:#f5f5f5;border:1px solid #e7e7e7}ul.widget_tally,ul.widget_tally li{width:100%}ul.widget_tally li{padding:2px 10px 4px;border-bottom:1px solid #ECECEC}ul.widget_tally .month{width:70%;float:left}ul.widget_tally .count{width:30%;float:left;text-align:right}.pie_bg{border-bottom:1px solid rgba(101,204,182,.16);border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);padding-bottom:10px;box-shadow:0 4px 6px -6px #222}.widget_tally_box .flex{display:-ms-flexbox;display:flex}ul.widget_profile_box{width:100%;height:42px;padding:3px;background:#ececec;margin-top:40px;margin-left:1px}ul.widget_profile_box li:first-child{width:25%;float:left}ul.widget_profile_box li:first-child a{float:left}ul.widget_profile_box li:last-child{width:25%;float:right}ul.widget_profile_box li:last-child a{float:right}ul.widget_profile_box li a{font-size:22px;text-align:center;width:35px;height:35px;border:1px solid rgba(52,73,94,.44);display:block;border-radius:50%;padding:0}ul.widget_profile_box li a:hover{color:#1ABB9C!important;border:1px solid #26b99a}ul.widget_profile_box li .profile_img{width:85px;height:85px;margin:-28px 0 0}.widget_tally_box p,.widget_tally_box span{text-align:center}.widget_tally_box .name{text-align:center;margin:25px}.widget_tally_box .name_title{text-align:center;margin:5px}.widget_tally_box ul.legend{margin:0}.widget_tally_box ul.legend p,.widget_tally_box ul.legend span{text-align:left}.widget_tally_box ul.legend li .icon{font-size:20px;float:left;width:14px}.widget_tally_box ul.legend li .name{font-size:14px;margin:5px 0 0 14px;text-overflow:ellipsis;float:left}.widget_tally_box ul.legend p{display:inline-block;margin:0}.widget_tally_box ul.verticle_bars li{height:140px;width:23%}.widget .verticle_bars li .progress.vertical.progress_wide{width:65%}ul.count2{width:100%;margin-left:1px;border:1px solid #ddd;border-left:0;border-right:0;padding:10px 0}ul.count2 li{width:30%;text-align:center}ul.count2 li h3{font-weight:400;margin:0}ul.count2 li span{font-weight:300}.divider{border-bottom:1px solid #ddd;margin:10px}.divider-dashed{border-top:1px dashed #e7eaec;background-color:#fff;height:1px;margin:10px 0}ul.messages{padding:0;list-style:none}.tasks li,ul.messages li{border-bottom:1px dotted #e6e6e6;padding:8px 0}img.avatar,ul.messages li img.avatar{height:32px;width:32px;float:left;display:inline-block;border-radius:2px;padding:2px;background:#f7f7f7;border:1px solid #e6e6e6}ul.messages li .message_date{float:right;text-align:right}ul.messages li .message_wrapper{margin-left:50px;margin-right:40px}ul.messages li .message_wrapper h4.heading{font-weight:600;margin:0 0 10px;cursor:pointer;line-height:100%}ul.messages li .message_wrapper blockquote{padding:0 10px;margin:0;border-left:5px solid #eee}ul.user_data li{margin-bottom:6px}ul.user_data li p{margin-bottom:0}ul.user_data li .progress{width:90%}.project_progress .progress{margin-bottom:3px!important;margin-top:5px}.projects .list-inline{margin:0}.profile_title{background:#F5F7FA;border:0;padding:7px 0;display:-ms-flexbox;display:flex}ul.stats-overview{border-bottom:1px solid #e8e8e8;padding-bottom:10px;margin-bottom:10px}ul.stats-overview li{display:inline-block;text-align:center;padding:0 15px;width:30%;font-size:14px;border-right:1px solid #e8e8e8}ul.stats-overview li:last-child{border-right:0}ul.stats-overview li .name{font-size:12px}ul.stats-overview li .value{font-size:14px;font-weight:700;display:block}ul.stats-overview li:first-child{padding-left:0}ul.project_files li{margin-bottom:5px}ul.project_files li a i{width:20px}.project_detail p{margin-bottom:10px}.project_detail p.title{font-weight:700;margin-bottom:0}.avatar img{border-radius:50%;max-width:45px}.pricing{background:#fff}.pricing .title{background:#1ABB9C;height:110px;color:#fff;padding:15px 0 0;text-align:center}.pricing .title h2{text-transform:capitalize;font-size:18px;border-radius:5px 5px 0 0;margin:0;font-weight:400}.notifications a,.tabbed_notifications h2,.view .tools,.view a.info{text-transform:uppercase}.pricing .title h1{font-size:30px;margin:12px}.pricing .title span{background:rgba(51,51,51,.28);padding:2px 5px}.pricing_features{background:#FAFAFA;padding:20px 15px;min-height:230px;font-size:13.5px}.pricing_features ul li{margin-top:10px}.pricing_footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;text-align:center;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.pricing_footer p{font-size:13px;padding:10px 0 2px;display:block}.ui-ribbon-container{position:relative}.ui-ribbon-container .ui-ribbon-wrapper{position:absolute;overflow:hidden;width:85px;height:88px;top:-3px;right:-3px}.ui-ribbon-container.ui-ribbon-primary .ui-ribbon{background-color:#5b90bf}.ui-ribbon-container .ui-ribbon{position:relative;display:block;text-align:center;font-size:15px;font-weight:700;color:#fff;transform:rotate(45deg);padding:7px 0;left:-5px;top:15px;width:120px;line-height:20px;background-color:#555;box-shadow:0 0 3px rgba(0,0,0,.3)}.ui-ribbon-container.ui-ribbon-primary .ui-ribbon:after,.ui-ribbon-container.ui-ribbon-primary .ui-ribbon:before{border-top:2px solid #5b90bf}.ui-ribbon-container .ui-ribbon:before{left:0;bottom:-1px;right:0}.ui-ribbon-container .ui-ribbon:after,.ui-ribbon-container .ui-ribbon:before{position:absolute;content:" ";line-height:0;border-top:2px solid #555;border-left:2px solid transparent;border-right:2px solid transparent}.thumbnail .image{height:120px;overflow:hidden}.caption{padding:9px 5px;background:#F7F7F7}.caption p{margin-bottom:5px}.thumbnail{height:190px;overflow:hidden}.view{overflow:hidden;position:relative;text-align:center;box-shadow:1px 1px 2px #e6e6e6;cursor:default}.dropdown-menu a,.voiceBtn{cursor:pointer}.view .content,.view .mask{position:absolute;width:100%;overflow:hidden;top:0;left:0}.sideways,.view .tools,.view img,.view p{position:relative}.view img{display:block}.view .tools{color:#fff;text-align:center;font-size:17px;padding:3px;background:rgba(0,0,0,.35);margin:43px 0 0}.mask.no-caption .tools{margin:90px 0 0}.view .tools a{display:inline-block;color:#FFF;font-size:18px;font-weight:400;padding:0 4px}.view p{font-family:Georgia,serif;font-size:12px;color:#fff;padding:10px 20px 20px;text-align:center}.view a.info{display:inline-block;padding:7px 14px;background:#000;color:#fff;box-shadow:0 0 1px #000}.view-first img{transition:all .2s linear}.view-first .mask{opacity:0;background-color:rgba(0,0,0,.5);transition:all .4s ease-in-out}.view-first .tools{transform:translateY(-100px);opacity:0;transition:all .2s ease-in-out}.view-first p{transform:translateY(100px);opacity:0;transition:all .2s linear}.view-first:hover img{transform:scale(1.1)}.view-first:hover .mask{opacity:1}.view-first:hover .tools,.view-first:hover p{opacity:1;transform:translateY(0)}.view-first:hover p{transition-delay:.1s}/*! + * bootstrap-vertical-tabs - v1.2.1 + * https://dbtek.github.io/bootstrap-vertical-tabs + * 2014-11-07 + * Copyright (c) 2014 İsmail Demirbilek + * License: MIT + */.tabs-left,.tabs-right{border-bottom:none;padding-top:2px}.tabs-left{border-right:1px solid #F7F7F7}.tabs-right{border-left:1px solid #F7F7F7}.tabs-left>li,.tabs-right>li{float:none;margin-bottom:2px}.alignleft,.left{float:left}.tabs-left>li{margin-right:-1px}.tabs-left>li>a,.tabs-right>li>a{margin-right:0;background:#F7F7F7;overflow:hidden;text-overflow:ellipsis}.tabs-right>li{margin-left:-1px}.tabs-left>li.active>a,.tabs-left>li.active>a:focus,.tabs-left>li.active>a:hover{border-bottom-color:#F7F7F7;border-right-color:transparent}.tabs-right>li.active>a,.tabs-right>li.active>a:focus,.tabs-right>li.active>a:hover{border-bottom:1px solid #F7F7F7;border-left-color:transparent}.tabs-left>li>a{border-radius:4px 0 0 4px;display:block}.tabs-right>li>a{border-radius:0 4px 4px 0}.sideways{margin-top:50px;border:none}.sideways>li{height:20px;width:120px;margin-bottom:100px}.sideways>li>a{border-bottom:1px solid #ddd;border-right-color:transparent;text-align:center;border-radius:4px 4px 0 0}.sideways>li.active>a,.sideways>li.active>a:focus,.sideways>li.active>a:hover{border-bottom-color:transparent;border-right-color:#ddd;border-left-color:#ddd}.sideways.tabs-left{left:-50px}.sideways.tabs-right{right:-50px}.sideways.tabs-right>li{transform:rotate(90deg)}.sideways.tabs-left>li{transform:rotate(-90deg)}.morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{padding:6px;color:#666;background:rgba(243,242,243,.8);border:2px solid rgba(195,194,196,.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:700;margin:.25em 0}.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:.1em 0}.price{font-size:40px;font-weight:400;color:#26B99A;margin:0}.prod_title{border-bottom:1px solid #DFDFDF;padding-bottom:5px;margin:30px 0;font-size:20px;font-weight:400}.product-image img{width:90%}.prod_color li{margin:0 10px}.prod_color li p{margin-bottom:0}.prod_size li{padding:0}.prod_color .color{width:25px;height:25px;border:2px solid rgba(51,51,51,.28)!important;padding:2px;border-radius:50px}.product_gallery a{width:100px;height:100px;float:left;margin:10px;border:1px solid #e5e5e5}.product_gallery a img{width:100%;margin-top:15px}.product_price{margin:20px 0;padding:5px 10px;background-color:#FFF;text-align:left;border:2px dashed #E0E0E0}.price-tax{font-size:18px}.product_social{margin:20px 0}.product_social ul li a i{font-size:35px}.login{background:#F7F7F7}.login .fa-paw{font-size:26px}a.hiddenanchor{display:none}.login_wrapper{right:0;margin:5% auto 0;max-width:350px;position:relative}.cropper .docs-cropped .modal-body>canvas,.cropper .docs-cropped .modal-body>img,.cropper .img-container>img,.cropper .img-preview>img{max-width:100%}.login_form,.registration_form{position:absolute;top:0;width:100%}.registration_form{z-index:21;opacity:0;width:100%}.login_form{z-index:22}#signin:target~.login_wrapper .login_form,#signup:target~.login_wrapper .registration_form{z-index:22;animation-name:fadeInLeft;animation-delay:.1s}#signin:target~.login_wrapper .registration_form,#signup:target~.login_wrapper .login_form{animation-name:fadeOutLeft}.animate{-webkit-animation-duration:.5s;-webkit-animation-timing-function:ease;-webkit-animation-fill-mode:both;-moz-animation-duration:.5s;-moz-animation-timing-function:ease;-moz-animation-fill-mode:both;-o-animation-duration:.5s;-o-animation-timing-function:ease;-o-animation-fill-mode:both;-ms-animation-duration:.5s;-ms-animation-timing-function:ease;-ms-animation-fill-mode:both;animation-duration:.5s;animation-timing-function:ease;animation-fill-mode:both}.login_box{padding:20px;margin:auto}.alignleft{margin-right:15px}.alignright{float:right;margin-left:15px}.clearfix:after,form:after{content:".";display:block;height:0;clear:both;visibility:hidden}.login_content{margin:0 auto;padding:25px 0 0;position:relative;text-align:center;text-shadow:0 1px 0 #fff;min-width:280px}.login_content a:hover{text-decoration:underline}.login_content h1{font:400 25px Helvetica,Arial,sans-serif;letter-spacing:-.05em;line-height:20px;margin:10px 0 30px}.login_content h1:after,.login_content h1:before{content:"";height:1px;position:absolute;top:10px;width:20%}.login_content h1:after{background:#7e7e7e;background:linear-gradient(left,#7e7e7e 0,#fff 100%);right:0}.login_content h1:before{background:#7e7e7e;background:linear-gradient(right,#7e7e7e 0,#fff 100%);left:0}.login_content form{margin:20px 0;position:relative}.login_content form input[type=text],.login_content form input[type=email],.login_content form input[type=password]{border-radius:3px;-ms-box-shadow:0 1px 0 #fff,0 -2px 5px rgba(0,0,0,.08) inset;-o-box-shadow:0 1px 0 #fff,0 -2px 5px rgba(0,0,0,.08) inset;box-shadow:0 1px 0 #fff,0 -2px 5px rgba(0,0,0,.08) inset;border:1px solid #c8c8c8;color:#777;margin:0 0 20px;width:100%}.login_content form input[type=text]:focus,.login_content form input[type=email]:focus,.login_content form input[type=password]:focus{-ms-box-shadow:0 0 2px #ed1c24 inset;-o-box-shadow:0 0 2px #ed1c24 inset;box-shadow:0 0 2px #A97AAD inset;background-color:#fff;border:1px solid #A878AF;outline:0}#username{background-position:10px 10px!important}#password{background-position:10px -53px!important}.login_content form div a{font-size:12px;margin:10px 15px 0 0}.reset_pass{margin-top:10px!important}.login_content div .reset_pass{margin-top:13px!important;margin-right:39px;float:right}.separator{border-top:1px solid #D8D8D8;margin-top:10px;padding-top:10px}.button{background:#f7f9fa;background:linear-gradient(top,#f7f9fa 0,#f0f0f0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7f9fa', endColorstr='#f0f0f0', GradientType=0);-ms-box-shadow:0 1px 2px rgba(0,0,0,.1) inset;-o-box-shadow:0 1px 2px rgba(0,0,0,.1) inset;box-shadow:0 1px 2px rgba(0,0,0,.1) inset;border-radius:0 0 5px 5px;border-top:1px solid #CFD5D9;padding:15px 0}#content form .submit,.login_content form input[type=submit]{float:left;margin-left:38px}.button a{background:url(http://cssdeck.com/uploads/media/items/8/8bcLQqF.png) 0 -112px no-repeat;color:#7E7E7E;font-size:17px;padding:2px 0 2px 40px;text-decoration:none;transition:all .3s ease}.button a:hover{background-position:0 -135px;color:#00aeef}header{width:100%}#nprogress .bar{background:#1ABB9C}#nprogress .peg{box-shadow:0 0 10px #1ABB9C,0 0 5px #1ABB9C}#nprogress .spinner-icon{border-top-color:#1ABB9C;border-left-color:#1ABB9C}.editor-wrapper{min-height:250px;background-color:#fff;border-collapse:separate;border:1px solid #ccc;padding:4px;box-sizing:content-box;box-shadow:rgba(0,0,0,.07451) 0 1px 1px 0 inset;overflow:scroll;outline:0;border-radius:3px}.voiceBtn{width:20px;color:transparent;background-color:transparent;transform:scale(2,2);-webkit-transform:scale(2,2);-moz-transform:scale(2,2);border:transparent;box-shadow:none;-webkit-box-shadow:none}div[data-role=editor-toolbar]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select2-container--default .select2-selection--multiple,.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #ccc;border-radius:0;min-height:38px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#73879C;padding-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__rendered{padding-top:3px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:36px}.select2-container--default .select2-selection--multiple .select2-selection__choice,.select2-container--default .select2-selection--multiple .select2-selection__clear{margin-top:2px;border:none;border-radius:0;padding:3px 5px}.select2-container--default.select2-container--focus .select2-selection--multiple{border:1px solid #ccc}.switchery{width:32px;height:20px}.switchery>small{width:20px;height:20px}fieldset{border:none;margin:0;padding:0}.cropper .img-container,.cropper .img-preview{background-color:#f7f7f7;width:100%;text-align:center}.cropper .img-container{min-height:200px;max-height:516px;margin-bottom:20px}.cropper .docs-data>.input-group,.cropper .docs-toggles>.btn,.cropper .docs-toggles>.btn-group,.cropper .docs-toggles>.dropdown,.cropper .img-preview{margin-bottom:10px}@media (min-width:768px){.cropper .img-container{min-height:516px}}.cropper .docs-preview{margin-right:-15px}.cropper .img-preview{float:left;margin-right:10px;overflow:hidden}.cropper .preview-lg{width:263px;height:148px}.cropper .preview-md{width:139px;height:78px}.cropper .preview-sm{width:69px;height:39px}.cropper .preview-xs{width:35px;height:20px;margin-right:0}.cropper .docs-data>.input-group>label{min-width:80px}.cropper .docs-data>.input-group>span{min-width:50px}.cropper .docs-buttons>.btn,.cropper .docs-buttons>.btn-group,.cropper .docs-buttons>.form-control{margin-right:5px;margin-bottom:10px}.cropper .docs-tooltip{display:block;margin:-6px -12px;padding:6px 12px}.cropper .docs-tooltip>.icon{margin:0 -3px;vertical-align:top}.cropper .tooltip-inner{white-space:normal}.cropper .btn-toggle .tooltip-inner,.cropper .btn-upload .tooltip-inner{white-space:nowrap}.cropper .btn-toggle{padding:6px}.cropper .btn-toggle>.docs-tooltip{margin:-6px;padding:6px}@media (max-width:400px){.cropper .btn-group-crop{margin-right:-15px!important}.cropper .btn-group-crop>.btn{padding-left:5px;padding-right:5px}.cropper .btn-group-crop .docs-tooltip{margin-left:-5px;margin-right:-5px;padding-left:5px;padding-right:5px}}.cropper .docs-options .dropdown-menu{width:100%}.cropper .docs-options .dropdown-menu>li{padding:3px 20px}.cropper .docs-options .dropdown-menu>li:hover{background-color:#f7f7f7}.cropper .docs-options .dropdown-menu>li>label{display:block}.cropper .docs-cropped .modal-body{text-align:center}.cropper .docs-diagram .modal-dialog{max-width:352px}.cropper .docs-cropped canvas{max-width:100%}.form_wizard .stepContainer{display:block;position:relative;margin:0;padding:0;border:0 solid #CCC;overflow-x:hidden}.wizard_horizontal ul.wizard_steps{display:table;list-style:none;position:relative;width:100%;margin:0 0 20px}.wizard_horizontal ul.wizard_steps li{display:table-cell;text-align:center}.wizard_horizontal ul.wizard_steps li a,.wizard_horizontal ul.wizard_steps li:hover{display:block;position:relative;-moz-opacity:1;filter:alpha(opacity=100);opacity:1;color:#666}.wizard_horizontal ul.wizard_steps li a:before{content:"";position:absolute;height:4px;background:#ccc;top:20px;width:100%;z-index:4;left:0}.wizard_horizontal ul.wizard_steps li a.disabled .step_no{background:#ccc}.wizard_horizontal ul.wizard_steps li a .step_no{width:40px;height:40px;line-height:40px;border-radius:100px;display:block;margin:0 auto 5px;font-size:16px;text-align:center;position:relative;z-index:5}.step_no,.wizard_horizontal ul.wizard_steps li a.selected:before{background:#34495E;color:#fff}.wizard_horizontal ul.wizard_steps li a.done .step_no,.wizard_horizontal ul.wizard_steps li a.done:before{background:#1ABB9C;color:#fff}.wizard_horizontal ul.wizard_steps li:first-child a:before{left:50%}.wizard_horizontal ul.wizard_steps li:last-child a:before{right:50%;width:50%;left:auto}.wizard_verticle .stepContainer{width:80%;float:left;padding:0 10px}.actionBar{width:100%;border-top:1px solid #ddd;padding:10px 5px;text-align:right;margin-top:10px}.actionBar .buttonDisabled{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.actionBar a{margin:0 3px}.wizard_verticle .wizard_content{width:80%;float:left;padding-left:20px}.wizard_verticle ul.wizard_steps{display:table;list-style:none;position:relative;width:20%;float:left;margin:0 0 20px}.wizard_verticle ul.wizard_steps li{display:list-item;text-align:center}.wizard_verticle ul.wizard_steps li a{height:80px}.wizard_verticle ul.wizard_steps li a:first-child{margin-top:20px}.wizard_verticle ul.wizard_steps li a,.wizard_verticle ul.wizard_steps li:hover{display:block;position:relative;-moz-opacity:1;filter:alpha(opacity=100);opacity:1;color:#666}.wizard_verticle ul.wizard_steps li a:before{content:"";position:absolute;height:100%;background:#ccc;top:20px;width:4px;z-index:4;left:49%}.wizard_verticle ul.wizard_steps li a.disabled .step_no{background:#ccc}.wizard_verticle ul.wizard_steps li a .step_no{width:40px;height:40px;line-height:40px;border-radius:100px;display:block;margin:0 auto 5px;font-size:16px;text-align:center;position:relative;z-index:5}.progress.progress_sm,.progress.progress_sm .progress-bar{height:10px!important}.step_no,.wizard_verticle ul.wizard_steps li a.selected:before{background:#34495E;color:#fff}.wizard_verticle ul.wizard_steps li a.done .step_no,.wizard_verticle ul.wizard_steps li a.done:before{background:#1ABB9C;color:#fff}.wizard_verticle ul.wizard_steps li:first-child a:before{left:49%}.wizard_verticle ul.wizard_steps li:last-child a:before{left:49%;left:auto;width:0}.form_wizard .loader,.form_wizard .msgBox{display:none}.progress{border-radius:0}.progress-bar-info{background-color:#3498DB}.progress-bar-success{background-color:#26B99A}.progress_summary .progress{margin:5px 0 12px!important}.progress_summary .row{margin-bottom:5px}.progress_summary .row .col-xs-2{padding:0}.progress_summary .data span,.progress_summary .more_info span{text-align:right;float:right}.progress_summary p{margin-bottom:3px;width:100%}.progress_title .left{float:left;text-align:left}.progress_title .right{float:right;text-align:right;font-weight:300}.progress.progress_sm{border-radius:0;margin-bottom:18px}.dashboard_graph p{margin:0 0 4px}ul.verticle_bars{width:100%}ul.verticle_bars li{width:23%;height:200px;margin:0}.progress.vertical.progress_wide{width:35px}.alert-success{color:#fff;background-color:rgba(38,185,154,.88);border-color:rgba(38,185,154,.88)}.alert-info{color:#E9EDEF;background-color:rgba(52,152,219,.88);border-color:rgba(52,152,219,.88)}.alert-warning{color:#E9EDEF;background-color:rgba(243,156,18,.88);border-color:rgba(243,156,18,.88)}.alert-danger,.alert-error{color:#E9EDEF;background-color:rgba(231,76,60,.88);border-color:rgba(231,76,60,.88)}.ui-pnotify.dark .ui-pnotify-container{color:#E9EDEF;background-color:rgba(52,73,94,.88);border-color:rgba(52,73,94,.88)}.custom-notifications{position:fixed;margin:15px;right:0;float:right;width:400px;z-index:4000;bottom:0}ul.notifications{float:right;display:block;margin-bottom:7px;padding:0;width:100%}.notifications li{float:right;margin:3px;width:36px;box-shadow:3px 3px 3px rgba(0,0,0,.3)}.notifications li:last-child{margin-left:0}.notifications a{display:block;text-align:center;text-decoration:none;padding:9px 8px}.tabbed_notifications .text{padding:5px 15px;height:140px;border-radius:7px;box-shadow:6px 6px 6px rgba(0,0,0,.3)}.tabbed_notifications div p{display:inline-block}.tabbed_notifications h2{font-weight:700;width:80%;float:left;height:20px;text-overflow:ellipsis;overflow:hidden;display:block}.tabbed_notifications .close{padding:5px;color:#E9EDEF;float:right;opacity:1}.daterangepicker.dropdown-menu{font-size:13px;padding:0;overflow:hidden}.daterangepicker.picker_1{background:#34495E;color:#ECF0F1}.daterangepicker.picker_1 table.table-condensed thead tr:first-child{background:#1ABB9C}.daterangepicker table.table-condensed thead tr:first-child th{line-height:28px;text-align:center}.daterangepicker.picker_1 table.table-condensed thead tr{background:#213345}.daterangepicker table.table-condensed thead tr{line-height:14px}.daterangepicker table.table-condensed tbody tr:first-child td{padding-top:10px}.daterangepicker table.table-condensed td:first-child,.daterangepicker table.table-condensed th:first-child{padding-left:12px}.daterangepicker table.table-condensed td:last-child,.daterangepicker table.table-condensed th:last-child{padding-right:12px}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px 7px;text-align:center}.daterangepicker table.table-condensed tbody tr:last-child td{padding-bottom:10px}.daterangepicker.picker_2 table.table-condensed thead tr:first-child{color:inherit}.daterangepicker.picker_2 table.table-condensed thead tr{color:#1ABB9C}.daterangepicker.picker_3 table.table-condensed thead tr:first-child{background:#1ABB9C;color:#ECF0F1}.daterangepicker.picker_4 table.table-condensed tbody td{background:#ECF0F1;color:#34495E;border:1px solid #fff;padding:4px 7px}.daterangepicker.picker_4 table.table-condensed tbody td.active{background:#536A7F;color:#fff}.daterangepicker.picker_4 table.table-condensed thead tr:first-child{background:#34495E;color:#ECF0F1}.xdisplay_input{width:240px;overflow:hidden;padding:0}.xdisplay{background-color:#fff;background-clip:padding-box;border:1px solid #ccc;margin-bottom:20px;border:1px solid rgba(0,0,0,.15);border-radius:4px;width:230px;overflow:hidden;box-shadow:0 6px 12px rgba(0,0,0,.175)}.daterangepicker.openscenter .calendar,.daterangepicker.openscenter .ranges,.daterangepicker.opensright .calendar,.daterangepicker.opensright .ranges{float:right}.daterangepicker table{width:100%;margin:0}.daterangepicker td,.daterangepicker th{text-align:center;width:20px;height:20px;cursor:pointer;white-space:nowrap}.daterangepicker td.disabled,.daterangepicker td.off{color:#999}.daterangepicker td.available:hover,.daterangepicker th.available:hover{background:#eee;color:#34495E}.daterangepicker td.in-range{background:#E4E7EA;border-radius:0}.daterangepicker td.available+td.start-date{border-radius:4px 0 0 4px}.daterangepicker td.in-range+td.end-date{border-radius:0 4px 4px 0}.daterangepicker td.start-date.end-date{border-radius:4px!important}.daterangepicker td.active,.daterangepicker td.active:hover{background-color:#536A7F;color:#fff}.daterangepicker td.week,.daterangepicker th.week{font-size:80%;color:#ccc}.daterangepicker select.monthselect,.daterangepicker select.yearselect{font-size:12px;padding:1px;margin:0;cursor:default;height:30px;border:1px solid #ADB2B5;line-height:30px;border-radius:0!important}.daterangepicker select.monthselect{margin-right:2%;width:56%}.daterangepicker select.yearselect{width:40%}.daterangepicker select.ampmselect,.daterangepicker select.hourselect,.daterangepicker select.minuteselect{width:50px;margin-bottom:0}.daterangepicker_start_input{float:left}.daterangepicker_end_input{float:left;padding-left:11px}.daterangepicker th.month{width:auto}.daterangepicker .daterangepicker_end_input label,.daterangepicker .daterangepicker_start_input label{color:#333;display:block;font-size:11px;font-weight:400;height:20px;line-height:20px;margin-bottom:2px;text-shadow:#fff 1px 1px 0;text-transform:uppercase;width:74px}.daterangepicker .ranges input{font-size:11px}.daterangepicker .ranges .input-mini{background-color:#eee;border:1px solid #ccc;border-radius:4px;color:#555;display:block;font-size:11px;height:30px;line-height:30px;vertical-align:middle;margin:0 0 10px;padding:0 6px;width:74px}.daterangepicker .ranges .input-mini:hover{cursor:pointer}.daterangepicker .ranges ul{list-style:none;margin:0;padding:0}.daterangepicker .ranges li{font-size:13px;background:#f5f5f5;border:1px solid #f5f5f5;color:#536A7F;padding:3px 12px;margin-bottom:8px;border-radius:5px;cursor:pointer}.daterangepicker .ranges li.active,.daterangepicker .ranges li:hover{background:#536A7F;border:1px solid #536A7F;color:#fff}.daterangepicker .calendar{display:none;max-width:270px}.daterangepicker.show-calendar .calendar{display:block}.daterangepicker .calendar.single .calendar-date{border:none}.daterangepicker.single .calendar,.daterangepicker.single .ranges{float:none}.daterangepicker .ranges{width:160px;text-align:left;margin:4px}.daterangepicker .ranges .range_inputs>div{float:left}.daterangepicker .ranges .range_inputs>div:nth-child(2){padding-left:11px}.daterangepicker.opensleft .calendar,.daterangepicker.opensleft .ranges{float:left;margin:4px}.daterangepicker .icon{width:20px;height:20px;display:inline-block;vertical-align:middle}.fc-state-default{background:#f5f5f5;color:#73879C}.fc-state-active,.fc-state-down{color:#333;background:#ccc}.dropzone{min-height:300px;border:1px solid #e5e5e5}.tag-field-item{padding:5px;font-size:20px} \ No newline at end of file diff --git a/assets/css/dark.css b/assets/css/dark.css new file mode 100644 index 0000000..b4724f5 --- /dev/null +++ b/assets/css/dark.css @@ -0,0 +1,63 @@ +/* + +Dark style from softwaremaniacs.org (c) Ivan Sagalaev + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #444; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-section, +.hljs-link { + color: white; +} + +.hljs, +.hljs-subst { + color: #ddd; +} + +.hljs-string, +.hljs-title, +.hljs-name, +.hljs-type, +.hljs-attribute, +.hljs-symbol, +.hljs-bullet, +.hljs-built_in, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #d88; +} + +.hljs-comment, +.hljs-quote, +.hljs-deletion, +.hljs-meta { + color: #777; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-title, +.hljs-section, +.hljs-doctag, +.hljs-type, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/assets/css/fix-bootstrap-4.css b/assets/css/fix-bootstrap-4.css new file mode 100644 index 0000000..b936030 --- /dev/null +++ b/assets/css/fix-bootstrap-4.css @@ -0,0 +1,174 @@ +body { + padding-top: 60px; + transition: padding-top 0.4s; + color: rgba(0, 0, 0, .7); + background: #fafafa; + font-family: 'Roboto', sans-serif; + font-weight: 300; + font-size: 18px; + overflow-x: hidden; +} + +h1, h2, h3, h4, h5, h6 { + font-family: Roboto, sans-serif; + font-weight: 400; +} + +h1, h2, h3 { + margin-top: 10px; + margin-bottom: 18px; +} + +h1 { + font-size: 42px; + font-weight: 900; + color: rgba(0, 0, 0, .8); +} + +h2 { + color: rgba(0, 0, 0, .75); + font-size: 32px; + font-weight: 700; +} + +h3 { + color: rgba(0, 0, 0, .6); + font-size: 28px; + font-weight: 500; +} + +h4 { + font-weight: 800; +} + +a { + color: #34495e; + -webkit-transition: ease-out .3s; + -moz-transition: ease-out .3s; + -o-transition: ease-out .3s; + transition: ease-out .3s; +} + +p a { + color: #2272ff; + padding: 5px 0; + position: relative; +} + +p a::after { + height: 2px; + width: 100%; + background: #333; + position: absolute; + content: ""; + left: 0; + bottom: 0; + -webkit-transform: scaleX(0); + -moz-transform: scaleX(0); + -ms-transform: scaleX(0); + -o-transform: scaleX(0); + transform: scaleX(0); + -webkit-transition: .3s; + -moz-transition: .3s; + -ms-transition: .3s; + -o-transition: .3s; + transition: .3s; +} + +section.midnight-blue a::after { + background: white; +} + +a:not(.btn):hover, a:not(.btn):focus { + color: #3b7ae3 !important; + text-decoration: none; + outline: none; +} + +p a:not(.btn):hover::after { + -webkit-transform: scaleX(1); + -moz-transform: scaleX(1); + -ms-transform: scaleX(1); + -o-transform: scaleX(1); + transform: scaleX(1); +} + +hr { + border-top: 1px solid #bdc3c7; + border-bottom: 1px solid #bdc3c7; +} + +p { + margin-bottom: 1em; +} + +.modal { + border: 0; +} + +.modal .modal-header { + border: 0; + padding: 20px 20px 0; +} + +.modal .modal-header > h4 { + font-weight: 300; + font-size: 14px; + color: #848484; + text-transform: uppercase; + margin: 0; +} + +.modal .modal-body { + padding: 20px; +} + +.modal input[type="text"], .modal input[type="password"] { + padding: 5px 10px; + min-height: 30px; + margin-right: 10px; +} + +.modal .icon-remove { + color: #848484; + position: absolute; + right: -5px; + top: -5px; + width: 16px; + height: 16px; + line-height: 16px; + text-align: center; + display: block; + background: #ebebeb; + -webkit-border-radius: 100%; + -moz-border-radius: 100%; + border-radius: 100%; + cursor: pointer; +} + +.modal button { + margin-left: 10px; + border: 0; +} + +.modal.fade .modal-dialog { + transform: scale(0); + transition: transform .3s cubic-bezier(.42, -.39, 1, 1); +} + +.modal.show .modal-dialog { + transform: scale(1); + transition: transform .3s cubic-bezier(0,0,.58,1.39); +} + +.bg-primary { + background: #2272ff !important; +} + +.breadcrumb .breadcrumb-item a { + color: #2272ff !important; +} + +.breadcrumb .breadcrumb-item:hover a { + color: #0D47A1 !important; +} \ No newline at end of file diff --git a/assets/css/header.css b/assets/css/header.css new file mode 100644 index 0000000..ec358f3 --- /dev/null +++ b/assets/css/header.css @@ -0,0 +1,342 @@ +.navbar { + height: 60px; +} + +.navbar-content { + margin-left: auto; + margin-top: 17px; +} + +.menu-icon span, .menu-icon:before, .menu-icon:after, .menu-icon span:before, .menu-icon span:after { + display: block; + position: absolute; + top: 50%; + left: 0.125em; + background-color: #fff; + width: 0.75em; + height: 0.05em; + border-radius: 0; +} + +.menu-icon { + font-size: 3.75rem; + width: 1em; + height: 1em; + display: inline-block; + background-color: transparent; + border: 0; + padding: 0; + outline: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-touch-callout: none; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + transform: scale(.8); + position: fixed; + left: 25px; + top: 0; + z-index: 1041; +} + +.menu-icon span { + margin-top: -0.025em; +} + +.menu-icon:before { + content: ""; + margin-top: -0.275em; +} + +.menu-icon:after { + content: ""; + margin-top: 0.225em; +} + +.menu-icon:before, .menu-icon:after { + display: none; +} + +.menu-icon span { + -webkit-transition: 0.25s ease; + transition: 0.25s ease; +} + +.menu-icon span:before, .menu-icon span:after { + content: ""; + -webkit-transition: 0.25s ease; + transition: 0.25s ease; + top: 0; + left: 0; +} + +.menu-icon span:before { + -webkit-transform: translateY(-0.25em); + transform: translateY(-0.25em); +} + +.menu-icon span:after { + -webkit-transform: translateY(0.25em); + transform: translateY(0.25em); +} + +.menu-icon.is-open span, .menu-icon.is-open:before, .menu-icon.is-open:after, .menu-icon.is-open span:before, .menu-icon.is-open span:after { + background-color: #222; +} + +.menu-icon.is-open span { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} + +.menu-icon.is-open span:before, .menu-icon.is-open span:after { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); +} + +/* Navbar brand svg */ +.navbar-brand { + padding: 7px; + transition: padding 0.3s; +} + +.navbar-brand svg { + position: absolute; + left: 50%; + transform: translateX(-50%); + height: 45px; +} + +.navbar-content { + height: 60px; + margin-top: 0; +} + +.navbar-content ul { + list-style: none; + cursor: default; + height: 60px; + margin: 0; +} + +.navbar-content ul li { + display: inline-block; + font-size: 30px; + margin: 0 10px; + height: 60px; + vertical-align: top; +} + +.navbar-content ul li a.navbar-link { + display: block; + height: 48px; + margin: 6px 0; + color: #fff !important; +} + +.navbar-content ul li #notificationMenuButton { + height: 30px; + margin: 9px -14px 9px 0; +} + +.navbar-content ul li:hover a.navbar-link, +.navbar-content ul li:active a.navbar-link, +.navbar-content ul li:focus a.navbar-link { + color: #ddd !important; +} + +.navbar-content ul li .badge { + display: inline-block; + font-size: 14px; + transform: translate(-50%, -75%); +} + +.navbar-content ul li .badge:empty { + opacity: 0; +} + +#notificationMenu { + width: 360px; +} + +#notificationMenu .list-group { + max-height: 500px; + overflow: auto; +} + +#notificationMenu a:not(.disabled) { + color: #0d0d0d !important; +} + +#notificationMenu a:hover, +#notificationMenu a:active, +#notificationMenu a:focus { + color: #fff !important; + background-color: #2272ff; +} + +#userMenuButton { + font-size: 18px; + background: white; + color: #444 !important; + border-radius: 25px; + vertical-align: middle; + padding: 4px 25px 5px 0; +} + +#userMenuButton img { + height: 100%; + margin-left: 5px; +} + +@media screen and (max-width: 991px) { + .navbar-content { + transform: scale(.75) translateX(25px); + margin-top: -8px; + } +} + +#logo-container { + top: 8px; +} + +#logo-container, #logo-container * { + -webkit-transition: all .2s cubic-bezier(0, 0, 1, 1); + -moz-transition: all .2s cubic-bezier(0, 0, 1, 1); + -ms-transition: all .2s cubic-bezier(0, 0, 1, 1); + -o-transition: all .2s cubic-bezier(0, 0, 1, 1); + transition: all .2s cubic-bezier(0, 0, 1, 1); +} + +.logo-container:hover .b { + -webkit-transform: translateX(-100px); + -moz-transform: translateX(-100px); + -ms-transform: translateX(-100px); + -o-transform: translateX(-100px); + transform: translateX(-100px); +} + +.logo-container:hover .c { + -webkit-transform: translateX(100px); + -moz-transform: translateX(100px); + -ms-transform: translateX(100px); + -o-transform: translateX(100px); + transform: translateX(100px); +} + +.logo-container:hover .d { + animation: bouncing 3s infinite; +} + +@keyframes bouncing { + 14% { + transform: translate(90px, 10px); + } + 28% { + transform: translate(-45px, 50px); + } + 42% { + transform: translate(-22px, -76px); + } + 56% { + transform: translate(96px, -29px); + } + 70% { + transform: translate(-63px, 34px); + } + 84% { + transform: translate(-40px, -56px); + } +} + +.logo-container { + width: 500px; + height: 60px; + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); +} + +#logo-text { + position: absolute; + left: 50%; + top: 18px; + transform: translateX(calc(-50% + 100px)); + margin: 0; + opacity: 0; + visibility: hidden; + -webkit-transition: all .2s cubic-bezier(0, 0, 1, 1); + -moz-transition: all .2s cubic-bezier(0, 0, 1, 1); + -ms-transition: all .2s cubic-bezier(0, 0, 1, 1); + -o-transition: all .2s cubic-bezier(0, 0, 1, 1); + transition: all .2s cubic-bezier(0, 0, 1, 1); + font-size: 24px; + text-transform: none; + color: #fff; +} + +.logo-container:hover #logo-text { + visibility: visible; + opacity: 1; + transform: translateX(calc(-50% + 55px)); +} + +.logo-container:hover #logo-container { + transform: translateX(calc(-50% - 55px)); +} + +#login-icon { + height: 30px; +} + +#login-icon .z { + fill: #fff; +} + +.navbar-link:hover #logo-icon .z { + fill: #ddd; +} + +.navbar-link:hover #login-icon .y { + -webkit-transition: all .2s; + -moz-transition: all .2s; + -ms-transition: all .2s; + -o-transition: all .2s; + transition: all .2s; + transform: translate(0, 0); + animation: arrow-pointing 1.5s infinite; +} + +@keyframes arrow-pointing { + 50% { + -webkit-transform: translate(-140px, 0); + -moz-transform: translate(-140px, 0); + -ms-transform: translate(-140px, 0); + -o-transform: translate(-140px, 0); + transform: translate(-140px, 0); + } +} + +.navbar-link svg, .navbar-link i { + display: block; + transition: color .5s; +} + +.navbar-link span { + font-size: 12px; + color: #fff; + display: block; + text-align: center; +} + +.navbar-link:hover span, .navbar-link:hover i { + color: #ddd; +} + +.navbar-link .fa { + text-align: center; +} diff --git a/assets/css/home.css b/assets/css/home.css new file mode 100644 index 0000000..3843aeb --- /dev/null +++ b/assets/css/home.css @@ -0,0 +1,239 @@ +/* Main slider */ +#main-slider .carousel-item { + height: calc(100vh - 60px); + background: no-repeat center; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; +} + +#main-slider .carousel-item .carousel-caption { + top: 0; + height: 600px; + position: absolute; + display: block !important; + opacity: 0; + -webkit-transition: opacity ease-in-out 500ms; + -moz-transition: opacity ease-in-out 500ms; + -o-transition: opacity ease-in-out 500ms; + transition: opacity ease-in-out 500ms; +} + +#main-slider .carousel-item.active .carousel-caption { + opacity: 1; + -webkit-transition: opacity ease-in-out 500ms; + -moz-transition: opacity ease-in-out 500ms; + -o-transition: opacity ease-in-out 500ms; + transition: opacity ease-in-out 500ms; +} + +#main-slider .carousel-item .carousel-caption .container { + top: auto; + position: relative; +} + +#main-slider .carousel-item .carousel-content { + margin-top: 139px; +} + +#main-slider .carousel-item .boxed { + padding: 10px 15px; + background-color: rgba(0, 0, 0, 0.8); + border-radius: 10px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: default; +} + +#main-slider .carousel-item a.boxed { + cursor: pointer; +} + +#main-slider .carousel-item h2 { + color: #fff; +} + +#main-slider .carousel-item p { + display: inline-block; + width: 100%; +} + +#main-slider .carousel-item .btn { + border: 3px solid rgba(255, 255, 255, 0.5); + color: #fff; + margin-top: 5px; + transition: ease-in-out .1s; +} + +#main-slider .carousel-item .btn:hover { + border-width: 0; + margin: 8px 3px; +} + +#main-slider .active .animation.animated-item-1 { + -webkit-animation: fadeInUp 300ms linear 300ms both; + -moz-animation: fadeInUp 300ms linear 300ms both; + -o-animation: fadeInUp 300ms linear 300ms both; + -ms-animation: fadeInUp 300ms linear 300ms both; + animation: fadeInUp 300ms linear 300ms both; +} + +#main-slider .active .animation.animated-item-2 { + -webkit-animation: fadeInUp 300ms linear 600ms both; + -moz-animation: fadeInUp 300ms linear 600ms both; + -o-animation: fadeInUp 300ms linear 600ms both; + -ms-animation: fadeInUp 300ms linear 600ms both; + animation: fadeInUp 300ms linear 600ms both; +} + +#main-slider .active .animation.animated-item-3 { + -webkit-animation: fadeInUp 300ms linear 900ms both; + -moz-animation: fadeInUp 300ms linear 900ms both; + -o-animation: fadeInUp 300ms linear 900ms both; + -ms-animation: fadeInUp 300ms linear 900ms both; + animation: fadeInUp 300ms linear 900ms both; +} + +#main-slider .active .animation.animated-item-4 { + -webkit-animation: fadeInUp 300ms linear 1200ms both; + -moz-animation: fadeInUp 300ms linear 1200ms both; + -o-animation: fadeInUp 300ms linear 1200ms both; + -ms-animation: fadeInUp 300ms linear 1200ms both; + animation: fadeInUp 300ms linear 1200ms both; +} + +/* Backgrounds for social media posts */ +.bg-twitter { + background-color: #4099FF; +} + +.bg-youtube { + background-color: #e52d27; +} + +/* Social Media table */ +.social-media-list { + width: 100%; +} + +.social-media-list .social-media-item { + display: inline-block; + margin: 5px 3px; + padding: 5px 0; + border-radius: 10px; + transition: background-color .25s, color .25s !important; +} + +.social-media-list .social-media-item h4 { + font-size: 16px; + font-weight: 300; + text-align: center; +} + +.social-media-list .social-media-item a { + display: block; + width: 64px; + margin: 0 auto; +} + +.social-media-list .social-media-item.twitter .icon-md, +.social-media-list .social-media-item.twitter:hover { + background-color: #4099FF; + color: #fff; +} + +.social-media-list .social-media-item.youtube .icon-md, +.social-media-list .social-media-item.youtube:hover { + background-color: #e52d27; + color: #fff; +} + +.social-media-list .social-media-item.google-plus .icon-md, +.social-media-list .social-media-item.google-plus:hover { + background-color: #d34836; + color: #fff; +} + +.social-media-list .social-media-item._500px .icon-md, +.social-media-list .social-media-item._500px:hover { + background-color: #0099e5; + color: #fff; +} + +.social-media-list .social-media-item.patreon .icon-md, +.social-media-list .social-media-item.patreon:hover { + background-color: #E6461A; + color: #fff; +} + +.social-media-list .social-media-item.steam .icon-md, +.social-media-list .social-media-item.steam:hover { + background-color: #0A2341; + color: #fff; +} + +.social-media-list .social-media-item.github .icon-md, +.social-media-list .social-media-item.github:hover { + background-color: #000; + color: #fff; +} + +.social-media-list .social-media-item.twitch .icon-md, +.social-media-list .social-media-item.twitch:hover { + background-color: #6441A4; + color: #fff; +} + +.social-media-list .social-media-item.spotify .icon-md, +.social-media-list .social-media-item.spotify:hover { + background-color: #1ED760; + color: #fff; +} + +.social-media-list .social-media-item.twitter:hover .icon-md { + color: #4099FF; + background-color: white; +} + +.social-media-list .social-media-item.youtube:hover .icon-md { + color: #e52d27; + background-color: white; +} + +.social-media-list .social-media-item.google-plus:hover .icon-md { + color: #d34836; + background-color: white; +} + +.social-media-list .social-media-item._500px:hover .icon-md { + color: #0099e5; + background-color: white; +} + +.social-media-list .social-media-item.patreon:hover .icon-md { + color: #E6461A; + background-color: white; +} + +.social-media-list .social-media-item.steam:hover .icon-md { + color: #0A2341; + background-color: white; +} + +.social-media-list .social-media-item.github:hover .icon-md { + color: #000; + background-color: white; +} + +.social-media-list .social-media-item.twitch:hover .icon-md { + color: #6441A4; + background-color: white; +} + +.social-media-list .social-media-item.spotify:hover .icon-md { + color: #1ED760; + background-color: white; +} diff --git a/assets/css/lib/animate.css b/assets/css/lib/animate.css new file mode 100644 index 0000000..0f8f340 --- /dev/null +++ b/assets/css/lib/animate.css @@ -0,0 +1,3263 @@ +@charset "UTF-8"; +/* +Animate.css - http://daneden.me/animate +Licensed under the MIT license + +Copyright (c) 2013 Daniel Eden + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +body { /* Addresses a small issue in webkit: http://bit.ly/NEdoDq */ + -webkit-backface-visibility: hidden; +} +.animated { + -webkit-animation-duration: 1s; + -moz-animation-duration: 1s; + -o-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + -moz-animation-fill-mode: both; + -o-animation-fill-mode: both; + animation-fill-mode: both; +} + +.animated.hinge { + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -o-animation-duration: 2s; + animation-duration: 2s; +} + +@-webkit-keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +@-moz-keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +@-o-keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +@keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +.animated.flash { + -webkit-animation-name: flash; + -moz-animation-name: flash; + -o-animation-name: flash; + animation-name: flash; +} +@-webkit-keyframes shake { + 0%, 100% {-webkit-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-webkit-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-webkit-transform: translateX(10px);} +} + +@-moz-keyframes shake { + 0%, 100% {-moz-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-moz-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-moz-transform: translateX(10px);} +} + +@-o-keyframes shake { + 0%, 100% {-o-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-o-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-o-transform: translateX(10px);} +} + +@keyframes shake { + 0%, 100% {transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {transform: translateX(-10px);} + 20%, 40%, 60%, 80% {transform: translateX(10px);} +} + +.animated.shake { + -webkit-animation-name: shake; + -moz-animation-name: shake; + -o-animation-name: shake; + animation-name: shake; +} +@-webkit-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-webkit-transform: translateY(0);} + 40% {-webkit-transform: translateY(-30px);} + 60% {-webkit-transform: translateY(-15px);} +} + +@-moz-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-moz-transform: translateY(0);} + 40% {-moz-transform: translateY(-30px);} + 60% {-moz-transform: translateY(-15px);} +} + +@-o-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-o-transform: translateY(0);} + 40% {-o-transform: translateY(-30px);} + 60% {-o-transform: translateY(-15px);} +} +@keyframes bounce { + 0%, 20%, 50%, 80%, 100% {transform: translateY(0);} + 40% {transform: translateY(-30px);} + 60% {transform: translateY(-15px);} +} + +.animated.bounce { + -webkit-animation-name: bounce; + -moz-animation-name: bounce; + -o-animation-name: bounce; + animation-name: bounce; +} +@-webkit-keyframes tada { + 0% {-webkit-transform: scale(1);} + 10%, 20% {-webkit-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-webkit-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-webkit-transform: scale(1.1) rotate(-3deg);} + 100% {-webkit-transform: scale(1) rotate(0);} +} + +@-moz-keyframes tada { + 0% {-moz-transform: scale(1);} + 10%, 20% {-moz-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-moz-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-moz-transform: scale(1.1) rotate(-3deg);} + 100% {-moz-transform: scale(1) rotate(0);} +} + +@-o-keyframes tada { + 0% {-o-transform: scale(1);} + 10%, 20% {-o-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-o-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-o-transform: scale(1.1) rotate(-3deg);} + 100% {-o-transform: scale(1) rotate(0);} +} + +@keyframes tada { + 0% {transform: scale(1);} + 10%, 20% {transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {transform: scale(1.1) rotate(-3deg);} + 100% {transform: scale(1) rotate(0);} +} + +.animated.tada { + -webkit-animation-name: tada; + -moz-animation-name: tada; + -o-animation-name: tada; + animation-name: tada; +} +@-webkit-keyframes swing { + 20%, 40%, 60%, 80%, 100% { -webkit-transform-origin: top center; } + 20% { -webkit-transform: rotate(15deg); } + 40% { -webkit-transform: rotate(-10deg); } + 60% { -webkit-transform: rotate(5deg); } + 80% { -webkit-transform: rotate(-5deg); } + 100% { -webkit-transform: rotate(0deg); } +} + +@-moz-keyframes swing { + 20% { -moz-transform: rotate(15deg); } + 40% { -moz-transform: rotate(-10deg); } + 60% { -moz-transform: rotate(5deg); } + 80% { -moz-transform: rotate(-5deg); } + 100% { -moz-transform: rotate(0deg); } +} + +@-o-keyframes swing { + 20% { -o-transform: rotate(15deg); } + 40% { -o-transform: rotate(-10deg); } + 60% { -o-transform: rotate(5deg); } + 80% { -o-transform: rotate(-5deg); } + 100% { -o-transform: rotate(0deg); } +} + +@keyframes swing { + 20% { transform: rotate(15deg); } + 40% { transform: rotate(-10deg); } + 60% { transform: rotate(5deg); } + 80% { transform: rotate(-5deg); } + 100% { transform: rotate(0deg); } +} + +.animated.swing { + -webkit-transform-origin: top center; + -moz-transform-origin: top center; + -o-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + -moz-animation-name: swing; + -o-animation-name: swing; + animation-name: swing; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes wobble { + 0% { -webkit-transform: translateX(0%); } + 15% { -webkit-transform: translateX(-25%) rotate(-5deg); } + 30% { -webkit-transform: translateX(20%) rotate(3deg); } + 45% { -webkit-transform: translateX(-15%) rotate(-3deg); } + 60% { -webkit-transform: translateX(10%) rotate(2deg); } + 75% { -webkit-transform: translateX(-5%) rotate(-1deg); } + 100% { -webkit-transform: translateX(0%); } +} + +@-moz-keyframes wobble { + 0% { -moz-transform: translateX(0%); } + 15% { -moz-transform: translateX(-25%) rotate(-5deg); } + 30% { -moz-transform: translateX(20%) rotate(3deg); } + 45% { -moz-transform: translateX(-15%) rotate(-3deg); } + 60% { -moz-transform: translateX(10%) rotate(2deg); } + 75% { -moz-transform: translateX(-5%) rotate(-1deg); } + 100% { -moz-transform: translateX(0%); } +} + +@-o-keyframes wobble { + 0% { -o-transform: translateX(0%); } + 15% { -o-transform: translateX(-25%) rotate(-5deg); } + 30% { -o-transform: translateX(20%) rotate(3deg); } + 45% { -o-transform: translateX(-15%) rotate(-3deg); } + 60% { -o-transform: translateX(10%) rotate(2deg); } + 75% { -o-transform: translateX(-5%) rotate(-1deg); } + 100% { -o-transform: translateX(0%); } +} + +@keyframes wobble { + 0% { transform: translateX(0%); } + 15% { transform: translateX(-25%) rotate(-5deg); } + 30% { transform: translateX(20%) rotate(3deg); } + 45% { transform: translateX(-15%) rotate(-3deg); } + 60% { transform: translateX(10%) rotate(2deg); } + 75% { transform: translateX(-5%) rotate(-1deg); } + 100% { transform: translateX(0%); } +} + +.animated.wobble { + -webkit-animation-name: wobble; + -moz-animation-name: wobble; + -o-animation-name: wobble; + animation-name: wobble; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes pulse { + 0% { -webkit-transform: scale(1); } + 50% { -webkit-transform: scale(1.1); } + 100% { -webkit-transform: scale(1); } +} +@-moz-keyframes pulse { + 0% { -moz-transform: scale(1); } + 50% { -moz-transform: scale(1.1); } + 100% { -moz-transform: scale(1); } +} +@-o-keyframes pulse { + 0% { -o-transform: scale(1); } + 50% { -o-transform: scale(1.1); } + 100% { -o-transform: scale(1); } +} +@keyframes pulse { + 0% { transform: scale(1); } + 50% { transform: scale(1.1); } + 100% { transform: scale(1); } +} + +.animated.pulse { + -webkit-animation-name: pulse; + -moz-animation-name: pulse; + -o-animation-name: pulse; + animation-name: pulse; +} +@-webkit-keyframes flip { + 0% { + -webkit-transform: perspective(400px) rotateY(0); + -webkit-animation-timing-function: ease-out; + } + 40% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg); + -webkit-animation-timing-function: ease-out; + } + 50% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -webkit-animation-timing-function: ease-in; + } + 80% { + -webkit-transform: perspective(400px) rotateY(360deg) scale(.95); + -webkit-animation-timing-function: ease-in; + } + 100% { + -webkit-transform: perspective(400px) scale(1); + -webkit-animation-timing-function: ease-in; + } +} +@-moz-keyframes flip { + 0% { + -moz-transform: perspective(400px) rotateY(0); + -moz-animation-timing-function: ease-out; + } + 40% { + -moz-transform: perspective(400px) translateZ(150px) rotateY(170deg); + -moz-animation-timing-function: ease-out; + } + 50% { + -moz-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -moz-animation-timing-function: ease-in; + } + 80% { + -moz-transform: perspective(400px) rotateY(360deg) scale(.95); + -moz-animation-timing-function: ease-in; + } + 100% { + -moz-transform: perspective(400px) scale(1); + -moz-animation-timing-function: ease-in; + } +} +@-o-keyframes flip { + 0% { + -o-transform: perspective(400px) rotateY(0); + -o-animation-timing-function: ease-out; + } + 40% { + -o-transform: perspective(400px) translateZ(150px) rotateY(170deg); + -o-animation-timing-function: ease-out; + } + 50% { + -o-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -o-animation-timing-function: ease-in; + } + 80% { + -o-transform: perspective(400px) rotateY(360deg) scale(.95); + -o-animation-timing-function: ease-in; + } + 100% { + -o-transform: perspective(400px) scale(1); + -o-animation-timing-function: ease-in; + } +} +@keyframes flip { + 0% { + transform: perspective(400px) rotateY(0); + animation-timing-function: ease-out; + } + 40% { + transform: perspective(400px) translateZ(150px) rotateY(170deg); + animation-timing-function: ease-out; + } + 50% { + transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + animation-timing-function: ease-in; + } + 80% { + transform: perspective(400px) rotateY(360deg) scale(.95); + animation-timing-function: ease-in; + } + 100% { + transform: perspective(400px) scale(1); + animation-timing-function: ease-in; + } +} + +.animated.flip { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flip; + -moz-backface-visibility: visible !important; + -moz-animation-name: flip; + -o-backface-visibility: visible !important; + -o-animation-name: flip; + backface-visibility: visible !important; + animation-name: flip; +} +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@-moz-keyframes flipInX { + 0% { + -moz-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -moz-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -moz-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -moz-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@-o-keyframes flipInX { + 0% { + -o-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -o-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -o-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -o-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@keyframes flipInX { + 0% { + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + transform: perspective(400px) rotateX(-10deg); + } + + 70% { + transform: perspective(400px) rotateX(10deg); + } + + 100% { + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} + +.animated.flipInX { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipInX; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipInX; + -o-backface-visibility: visible !important; + -o-animation-name: flipInX; + backface-visibility: visible !important; + animation-name: flipInX; +} +@-webkit-keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@-moz-keyframes flipOutX { + 0% { + -moz-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -moz-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@-o-keyframes flipOutX { + 0% { + -o-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -o-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@keyframes flipOutX { + 0% { + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +.animated.flipOutX { + -webkit-animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + -moz-animation-name: flipOutX; + -moz-backface-visibility: visible !important; + -o-animation-name: flipOutX; + -o-backface-visibility: visible !important; + animation-name: flipOutX; + backface-visibility: visible !important; +} +@-webkit-keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@-moz-keyframes flipInY { + 0% { + -moz-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -moz-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -moz-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -moz-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@-o-keyframes flipInY { + 0% { + -o-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -o-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -o-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -o-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@keyframes flipInY { + 0% { + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + transform: perspective(400px) rotateY(-10deg); + } + + 70% { + transform: perspective(400px) rotateY(10deg); + } + + 100% { + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} + +.animated.flipInY { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipInY; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipInY; + -o-backface-visibility: visible !important; + -o-animation-name: flipInY; + backface-visibility: visible !important; + animation-name: flipInY; +} +@-webkit-keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@-moz-keyframes flipOutY { + 0% { + -moz-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -moz-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@-o-keyframes flipOutY { + 0% { + -o-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -o-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@keyframes flipOutY { + 0% { + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} + +.animated.flipOutY { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipOutY; + -o-backface-visibility: visible !important; + -o-animation-name: flipOutY; + backface-visibility: visible !important; + animation-name: flipOutY; +} +@-webkit-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@-moz-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@-o-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +.animated.fadeIn { + -webkit-animation-name: fadeIn; + -moz-animation-name: fadeIn; + -o-animation-name: fadeIn; + animation-name: fadeIn; +} +@-webkit-keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInUp { + 0% { + opacity: 0; + -moz-transform: translateY(20px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInUp { + 0% { + opacity: 0; + -o-transform: translateY(20px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInUp { + 0% { + opacity: 0; + transform: translateY(20px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.animated.fadeInUp { + -webkit-animation-name: fadeInUp; + -moz-animation-name: fadeInUp; + -o-animation-name: fadeInUp; + animation-name: fadeInUp; +} +@-webkit-keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInDown { + 0% { + opacity: 0; + -moz-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInDown { + 0% { + opacity: 0; + -o-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInDown { + 0% { + opacity: 0; + transform: translateY(-20px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.animated.fadeInDown { + -webkit-animation-name: fadeInDown; + -moz-animation-name: fadeInDown; + -o-animation-name: fadeInDown; + animation-name: fadeInDown; +} +@-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes fadeInLeft { + 0% { + opacity: 0; + -moz-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-o-keyframes fadeInLeft { + 0% { + opacity: 0; + -o-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} + +@keyframes fadeInLeft { + 0% { + opacity: 0; + transform: translateX(-20px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.animated.fadeInLeft { + -webkit-animation-name: fadeInLeft; + -moz-animation-name: fadeInLeft; + -o-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} +@-webkit-keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes fadeInRight { + 0% { + opacity: 0; + -moz-transform: translateX(20px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-o-keyframes fadeInRight { + 0% { + opacity: 0; + -o-transform: translateX(20px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} + +@keyframes fadeInRight { + 0% { + opacity: 0; + transform: translateX(20px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.animated.fadeInRight { + -webkit-animation-name: fadeInRight; + -moz-animation-name: fadeInRight; + -o-animation-name: fadeInRight; + animation-name: fadeInRight; +} +@-webkit-keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInUpBig { + 0% { + opacity: 0; + -moz-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInUpBig { + 0% { + opacity: 0; + -o-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInUpBig { + 0% { + opacity: 0; + transform: translateY(2000px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.animated.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + -moz-animation-name: fadeInUpBig; + -o-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} +@-webkit-keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInDownBig { + 0% { + opacity: 0; + -moz-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInDownBig { + 0% { + opacity: 0; + -o-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInDownBig { + 0% { + opacity: 0; + transform: translateY(-2000px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.animated.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + -moz-animation-name: fadeInDownBig; + -o-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} +@-webkit-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} +@-moz-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -moz-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} +@-o-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -o-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} +@keyframes fadeInLeftBig { + 0% { + opacity: 0; + transform: translateX(-2000px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.animated.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + -moz-animation-name: fadeInLeftBig; + -o-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} +@-webkit-keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes fadeInRightBig { + 0% { + opacity: 0; + -moz-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-o-keyframes fadeInRightBig { + 0% { + opacity: 0; + -o-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} + +@keyframes fadeInRightBig { + 0% { + opacity: 0; + transform: translateX(2000px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.animated.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + -moz-animation-name: fadeInRightBig; + -o-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} +@-webkit-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@-moz-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@-o-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +.animated.fadeOut { + -webkit-animation-name: fadeOut; + -moz-animation-name: fadeOut; + -o-animation-name: fadeOut; + animation-name: fadeOut; +} +@-webkit-keyframes fadeOutUp { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-20px); + } +} +@-moz-keyframes fadeOutUp { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-20px); + } +} +@-o-keyframes fadeOutUp { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(-20px); + } +} +@keyframes fadeOutUp { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(-20px); + } +} + +.animated.fadeOutUp { + -webkit-animation-name: fadeOutUp; + -moz-animation-name: fadeOutUp; + -o-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} +@-webkit-keyframes fadeOutDown { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(20px); + } +} + +@-moz-keyframes fadeOutDown { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(20px); + } +} + +@-o-keyframes fadeOutDown { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(20px); + } +} + +@keyframes fadeOutDown { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(20px); + } +} + +.animated.fadeOutDown { + -webkit-animation-name: fadeOutDown; + -moz-animation-name: fadeOutDown; + -o-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} +@-webkit-keyframes fadeOutLeft { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-20px); + } +} + +@-moz-keyframes fadeOutLeft { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-20px); + } +} + +@-o-keyframes fadeOutLeft { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(-20px); + } +} + +@keyframes fadeOutLeft { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(-20px); + } +} + +.animated.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + -moz-animation-name: fadeOutLeft; + -o-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} +@-webkit-keyframes fadeOutRight { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(20px); + } +} + +@-moz-keyframes fadeOutRight { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(20px); + } +} + +@-o-keyframes fadeOutRight { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(20px); + } +} + +@keyframes fadeOutRight { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(20px); + } +} + +.animated.fadeOutRight { + -webkit-animation-name: fadeOutRight; + -moz-animation-name: fadeOutRight; + -o-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} +@-webkit-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } +} + +@-moz-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-2000px); + } +} + +@-o-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(-2000px); + } +} + +@keyframes fadeOutUpBig { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(-2000px); + } +} + +.animated.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + -moz-animation-name: fadeOutUpBig; + -o-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} +@-webkit-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + } +} + +@-moz-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(2000px); + } +} + +@-o-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(2000px); + } +} + +@keyframes fadeOutDownBig { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(2000px); + } +} + +.animated.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + -moz-animation-name: fadeOutDownBig; + -o-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} +@-webkit-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } +} + +@-moz-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-2000px); + } +} + +@-o-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(-2000px); + } +} + +@keyframes fadeOutLeftBig { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(-2000px); + } +} + +.animated.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + -moz-animation-name: fadeOutLeftBig; + -o-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} +@-webkit-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + } +} +@-moz-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(2000px); + } +} +@-o-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(2000px); + } +} +@keyframes fadeOutRightBig { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(2000px); + } +} + +.animated.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + -moz-animation-name: fadeOutRightBig; + -o-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} +@-webkit-keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(.3); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.05); + } + + 70% { + -webkit-transform: scale(.9); + } + + 100% { + -webkit-transform: scale(1); + } +} + +@-moz-keyframes bounceIn { + 0% { + opacity: 0; + -moz-transform: scale(.3); + } + + 50% { + opacity: 1; + -moz-transform: scale(1.05); + } + + 70% { + -moz-transform: scale(.9); + } + + 100% { + -moz-transform: scale(1); + } +} + +@-o-keyframes bounceIn { + 0% { + opacity: 0; + -o-transform: scale(.3); + } + + 50% { + opacity: 1; + -o-transform: scale(1.05); + } + + 70% { + -o-transform: scale(.9); + } + + 100% { + -o-transform: scale(1); + } +} + +@keyframes bounceIn { + 0% { + opacity: 0; + transform: scale(.3); + } + + 50% { + opacity: 1; + transform: scale(1.05); + } + + 70% { + transform: scale(.9); + } + + 100% { + transform: scale(1); + } +} + +.animated.bounceIn { + -webkit-animation-name: bounceIn; + -moz-animation-name: bounceIn; + -o-animation-name: bounceIn; + animation-name: bounceIn; +} +@-webkit-keyframes bounceInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(-30px); + } + + 80% { + -webkit-transform: translateY(10px); + } + + 100% { + -webkit-transform: translateY(0); + } +} +@-moz-keyframes bounceInUp { + 0% { + opacity: 0; + -moz-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateY(-30px); + } + + 80% { + -moz-transform: translateY(10px); + } + + 100% { + -moz-transform: translateY(0); + } +} + +@-o-keyframes bounceInUp { + 0% { + opacity: 0; + -o-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -o-transform: translateY(-30px); + } + + 80% { + -o-transform: translateY(10px); + } + + 100% { + -o-transform: translateY(0); + } +} + +@keyframes bounceInUp { + 0% { + opacity: 0; + transform: translateY(2000px); + } + + 60% { + opacity: 1; + transform: translateY(-30px); + } + + 80% { + transform: translateY(10px); + } + + 100% { + transform: translateY(0); + } +} + +.animated.bounceInUp { + -webkit-animation-name: bounceInUp; + -moz-animation-name: bounceInUp; + -o-animation-name: bounceInUp; + animation-name: bounceInUp; +} +@-webkit-keyframes bounceInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(30px); + } + + 80% { + -webkit-transform: translateY(-10px); + } + + 100% { + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes bounceInDown { + 0% { + opacity: 0; + -moz-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateY(30px); + } + + 80% { + -moz-transform: translateY(-10px); + } + + 100% { + -moz-transform: translateY(0); + } +} + +@-o-keyframes bounceInDown { + 0% { + opacity: 0; + -o-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -o-transform: translateY(30px); + } + + 80% { + -o-transform: translateY(-10px); + } + + 100% { + -o-transform: translateY(0); + } +} + +@keyframes bounceInDown { + 0% { + opacity: 0; + transform: translateY(-2000px); + } + + 60% { + opacity: 1; + transform: translateY(30px); + } + + 80% { + transform: translateY(-10px); + } + + 100% { + transform: translateY(0); + } +} + +.animated.bounceInDown { + -webkit-animation-name: bounceInDown; + -moz-animation-name: bounceInDown; + -o-animation-name: bounceInDown; + animation-name: bounceInDown; +} +@-webkit-keyframes bounceInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(30px); + } + + 80% { + -webkit-transform: translateX(-10px); + } + + 100% { + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes bounceInLeft { + 0% { + opacity: 0; + -moz-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateX(30px); + } + + 80% { + -moz-transform: translateX(-10px); + } + + 100% { + -moz-transform: translateX(0); + } +} + +@-o-keyframes bounceInLeft { + 0% { + opacity: 0; + -o-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -o-transform: translateX(30px); + } + + 80% { + -o-transform: translateX(-10px); + } + + 100% { + -o-transform: translateX(0); + } +} + +@keyframes bounceInLeft { + 0% { + opacity: 0; + transform: translateX(-2000px); + } + + 60% { + opacity: 1; + transform: translateX(30px); + } + + 80% { + transform: translateX(-10px); + } + + 100% { + transform: translateX(0); + } +} + +.animated.bounceInLeft { + -webkit-animation-name: bounceInLeft; + -moz-animation-name: bounceInLeft; + -o-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} +@-webkit-keyframes bounceInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(-30px); + } + + 80% { + -webkit-transform: translateX(10px); + } + + 100% { + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes bounceInRight { + 0% { + opacity: 0; + -moz-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateX(-30px); + } + + 80% { + -moz-transform: translateX(10px); + } + + 100% { + -moz-transform: translateX(0); + } +} + +@-o-keyframes bounceInRight { + 0% { + opacity: 0; + -o-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -o-transform: translateX(-30px); + } + + 80% { + -o-transform: translateX(10px); + } + + 100% { + -o-transform: translateX(0); + } +} + +@keyframes bounceInRight { + 0% { + opacity: 0; + transform: translateX(2000px); + } + + 60% { + opacity: 1; + transform: translateX(-30px); + } + + 80% { + transform: translateX(10px); + } + + 100% { + transform: translateX(0); + } +} + +.animated.bounceInRight { + -webkit-animation-name: bounceInRight; + -moz-animation-name: bounceInRight; + -o-animation-name: bounceInRight; + animation-name: bounceInRight; +} +@-webkit-keyframes bounceOut { + 0% { + -webkit-transform: scale(1); + } + + 25% { + -webkit-transform: scale(.95); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.1); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.3); + } +} + +@-moz-keyframes bounceOut { + 0% { + -moz-transform: scale(1); + } + + 25% { + -moz-transform: scale(.95); + } + + 50% { + opacity: 1; + -moz-transform: scale(1.1); + } + + 100% { + opacity: 0; + -moz-transform: scale(.3); + } +} + +@-o-keyframes bounceOut { + 0% { + -o-transform: scale(1); + } + + 25% { + -o-transform: scale(.95); + } + + 50% { + opacity: 1; + -o-transform: scale(1.1); + } + + 100% { + opacity: 0; + -o-transform: scale(.3); + } +} + +@keyframes bounceOut { + 0% { + transform: scale(1); + } + + 25% { + transform: scale(.95); + } + + 50% { + opacity: 1; + transform: scale(1.1); + } + + 100% { + opacity: 0; + transform: scale(.3); + } +} + +.animated.bounceOut { + -webkit-animation-name: bounceOut; + -moz-animation-name: bounceOut; + -o-animation-name: bounceOut; + animation-name: bounceOut; +} +@-webkit-keyframes bounceOutUp { + 0% { + -webkit-transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } +} + +@-moz-keyframes bounceOutUp { + 0% { + -moz-transform: translateY(0); + } + + 20% { + opacity: 1; + -moz-transform: translateY(20px); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-2000px); + } +} + +@-o-keyframes bounceOutUp { + 0% { + -o-transform: translateY(0); + } + + 20% { + opacity: 1; + -o-transform: translateY(20px); + } + + 100% { + opacity: 0; + -o-transform: translateY(-2000px); + } +} + +@keyframes bounceOutUp { + 0% { + transform: translateY(0); + } + + 20% { + opacity: 1; + transform: translateY(20px); + } + + 100% { + opacity: 0; + transform: translateY(-2000px); + } +} + +.animated.bounceOutUp { + -webkit-animation-name: bounceOutUp; + -moz-animation-name: bounceOutUp; + -o-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} +@-webkit-keyframes bounceOutDown { + 0% { + -webkit-transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + } +} + +@-moz-keyframes bounceOutDown { + 0% { + -moz-transform: translateY(0); + } + + 20% { + opacity: 1; + -moz-transform: translateY(-20px); + } + + 100% { + opacity: 0; + -moz-transform: translateY(2000px); + } +} + +@-o-keyframes bounceOutDown { + 0% { + -o-transform: translateY(0); + } + + 20% { + opacity: 1; + -o-transform: translateY(-20px); + } + + 100% { + opacity: 0; + -o-transform: translateY(2000px); + } +} + +@keyframes bounceOutDown { + 0% { + transform: translateY(0); + } + + 20% { + opacity: 1; + transform: translateY(-20px); + } + + 100% { + opacity: 0; + transform: translateY(2000px); + } +} + +.animated.bounceOutDown { + -webkit-animation-name: bounceOutDown; + -moz-animation-name: bounceOutDown; + -o-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} +@-webkit-keyframes bounceOutLeft { + 0% { + -webkit-transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } +} + +@-moz-keyframes bounceOutLeft { + 0% { + -moz-transform: translateX(0); + } + + 20% { + opacity: 1; + -moz-transform: translateX(20px); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-2000px); + } +} + +@-o-keyframes bounceOutLeft { + 0% { + -o-transform: translateX(0); + } + + 20% { + opacity: 1; + -o-transform: translateX(20px); + } + + 100% { + opacity: 0; + -o-transform: translateX(-2000px); + } +} + +@keyframes bounceOutLeft { + 0% { + transform: translateX(0); + } + + 20% { + opacity: 1; + transform: translateX(20px); + } + + 100% { + opacity: 0; + transform: translateX(-2000px); + } +} + +.animated.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + -moz-animation-name: bounceOutLeft; + -o-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} +@-webkit-keyframes bounceOutRight { + 0% { + -webkit-transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + } +} + +@-moz-keyframes bounceOutRight { + 0% { + -moz-transform: translateX(0); + } + + 20% { + opacity: 1; + -moz-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -moz-transform: translateX(2000px); + } +} + +@-o-keyframes bounceOutRight { + 0% { + -o-transform: translateX(0); + } + + 20% { + opacity: 1; + -o-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -o-transform: translateX(2000px); + } +} + +@keyframes bounceOutRight { + 0% { + transform: translateX(0); + } + + 20% { + opacity: 1; + transform: translateX(-20px); + } + + 100% { + opacity: 0; + transform: translateX(2000px); + } +} + +.animated.bounceOutRight { + -webkit-animation-name: bounceOutRight; + -moz-animation-name: bounceOutRight; + -o-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} +@-webkit-keyframes rotateIn { + 0% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(0); + opacity: 1; + } +} +@-moz-keyframes rotateIn { + 0% { + -moz-transform-origin: center center; + -moz-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: center center; + -moz-transform: rotate(0); + opacity: 1; + } +} +@-o-keyframes rotateIn { + 0% { + -o-transform-origin: center center; + -o-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -o-transform-origin: center center; + -o-transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateIn { + 0% { + transform-origin: center center; + transform: rotate(-200deg); + opacity: 0; + } + + 100% { + transform-origin: center center; + transform: rotate(0); + opacity: 1; + } +} + +.animated.rotateIn { + -webkit-animation-name: rotateIn; + -moz-animation-name: rotateIn; + -o-animation-name: rotateIn; + animation-name: rotateIn; +} +@-webkit-keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInUpLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInUpLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + 0% { + transform-origin: left bottom; + transform: rotate(90deg); + opacity: 0; + } + + 100% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } +} + +.animated.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + -moz-animation-name: rotateInUpLeft; + -o-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} +@-webkit-keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInDownLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInDownLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + 0% { + transform-origin: left bottom; + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } +} + +.animated.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + -moz-animation-name: rotateInDownLeft; + -o-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} +@-webkit-keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInUpRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInUpRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpRight { + 0% { + transform-origin: right bottom; + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } +} + +.animated.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + -moz-animation-name: rotateInUpRight; + -o-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} +@-webkit-keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInDownRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInDownRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownRight { + 0% { + transform-origin: right bottom; + transform: rotate(90deg); + opacity: 0; + } + + 100% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } +} + +.animated.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + -moz-animation-name: rotateInDownRight; + -o-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} +@-webkit-keyframes rotateOut { + 0% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(200deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOut { + 0% { + -moz-transform-origin: center center; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: center center; + -moz-transform: rotate(200deg); + opacity: 0; + } +} + +@-o-keyframes rotateOut { + 0% { + -o-transform-origin: center center; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: center center; + -o-transform: rotate(200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + 0% { + transform-origin: center center; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: center center; + transform: rotate(200deg); + opacity: 0; + } +} + +.animated.rotateOut { + -webkit-animation-name: rotateOut; + -moz-animation-name: rotateOut; + -o-animation-name: rotateOut; + animation-name: rotateOut; +} +@-webkit-keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutUpLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutUpLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + 0% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: left bottom; + transform: rotate(-90deg); + opacity: 0; + } +} + +.animated.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + -moz-animation-name: rotateOutUpLeft; + -o-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} +@-webkit-keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutDownLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutDownLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + 0% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: left bottom; + transform: rotate(90deg); + opacity: 0; + } +} + +.animated.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + -moz-animation-name: rotateOutDownLeft; + -o-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} +@-webkit-keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutUpRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutUpRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + 0% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: right bottom; + transform: rotate(90deg); + opacity: 0; + } +} + +.animated.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + -moz-animation-name: rotateOutUpRight; + -o-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} +@-webkit-keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutDownRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutDownRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + 0% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: right bottom; + transform: rotate(-90deg); + opacity: 0; + } +} + +.animated.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + -moz-animation-name: rotateOutDownRight; + -o-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} +@-webkit-keyframes hinge { + 0% { -webkit-transform: rotate(0); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 20%, 60% { -webkit-transform: rotate(80deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 40% { -webkit-transform: rotate(60deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 80% { -webkit-transform: rotate(60deg) translateY(0); opacity: 1; -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 100% { -webkit-transform: translateY(700px); opacity: 0; } +} + +@-moz-keyframes hinge { + 0% { -moz-transform: rotate(0); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 20%, 60% { -moz-transform: rotate(80deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 40% { -moz-transform: rotate(60deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 80% { -moz-transform: rotate(60deg) translateY(0); opacity: 1; -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 100% { -moz-transform: translateY(700px); opacity: 0; } +} + +@-o-keyframes hinge { + 0% { -o-transform: rotate(0); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 20%, 60% { -o-transform: rotate(80deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 40% { -o-transform: rotate(60deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 80% { -o-transform: rotate(60deg) translateY(0); opacity: 1; -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 100% { -o-transform: translateY(700px); opacity: 0; } +} + +@keyframes hinge { + 0% { transform: rotate(0); transform-origin: top left; animation-timing-function: ease-in-out; } + 20%, 60% { transform: rotate(80deg); transform-origin: top left; animation-timing-function: ease-in-out; } + 40% { transform: rotate(60deg); transform-origin: top left; animation-timing-function: ease-in-out; } + 80% { transform: rotate(60deg) translateY(0); opacity: 1; transform-origin: top left; animation-timing-function: ease-in-out; } + 100% { transform: translateY(700px); opacity: 0; } +} + +.animated.hinge { + -webkit-animation-name: hinge; + -moz-animation-name: hinge; + -o-animation-name: hinge; + animation-name: hinge; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollIn { + 0% { opacity: 0; -webkit-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -webkit-transform: translateX(0px) rotate(0deg); } +} + +@-moz-keyframes rollIn { + 0% { opacity: 0; -moz-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -moz-transform: translateX(0px) rotate(0deg); } +} + +@-o-keyframes rollIn { + 0% { opacity: 0; -o-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -o-transform: translateX(0px) rotate(0deg); } +} + +@keyframes rollIn { + 0% { opacity: 0; transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; transform: translateX(0px) rotate(0deg); } +} + +.animated.rollIn { + -webkit-animation-name: rollIn; + -moz-animation-name: rollIn; + -o-animation-name: rollIn; + animation-name: rollIn; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollOut { + 0% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(100%) rotate(120deg); + } +} + +@-moz-keyframes rollOut { + 0% { + opacity: 1; + -moz-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -moz-transform: translateX(100%) rotate(120deg); + } +} + +@-o-keyframes rollOut { + 0% { + opacity: 1; + -o-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -o-transform: translateX(100%) rotate(120deg); + } +} + +@keyframes rollOut { + 0% { + opacity: 1; + transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + transform: translateX(100%) rotate(120deg); + } +} + +.animated.rollOut { + -webkit-animation-name: rollOut; + -moz-animation-name: rollOut; + -o-animation-name: rollOut; + animation-name: rollOut; +} + +/* originally authored by Angelo Rohit - https://github.com/angelorohit */ + +@-webkit-keyframes lightSpeedIn { + 0% { -webkit-transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { -webkit-transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { -webkit-transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { -webkit-transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +@-moz-keyframes lightSpeedIn { + 0% { -moz-transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { -moz-transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { -moz-transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { -moz-transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +@-o-keyframes lightSpeedIn { + 0% { -o-transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { -o-transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { -o-transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { -o-transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +@keyframes lightSpeedIn { + 0% { transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +.animated.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + -moz-animation-name: lightSpeedIn; + -o-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + + -webkit-animation-timing-function: ease-out; + -moz-animation-timing-function: ease-out; + -o-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} + +.animated.lightSpeedIn { + -webkit-animation-duration: 0.5s; + -moz-animation-duration: 0.5s; + -o-animation-duration: 0.5s; + animation-duration: 0.5s; +} + +/* originally authored by Angelo Rohit - https://github.com/angelorohit */ + +@-webkit-keyframes lightSpeedOut { + 0% { -webkit-transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { -webkit-transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +@-moz-keyframes lightSpeedOut { + 0% { -moz-transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { -moz-transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +@-o-keyframes lightSpeedOut { + 0% { -o-transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { -o-transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +@keyframes lightSpeedOut { + 0% { transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +.animated.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + -moz-animation-name: lightSpeedOut; + -o-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + + -webkit-animation-timing-function: ease-in; + -moz-animation-timing-function: ease-in; + -o-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} + +.animated.lightSpeedOut { + -webkit-animation-duration: 0.25s; + -moz-animation-duration: 0.25s; + -o-animation-duration: 0.25s; + animation-duration: 0.25s; +} + +/* originally authored by Angelo Rohit - https://github.com/angelorohit */ + +@-webkit-keyframes wiggle { + 0% { -webkit-transform: skewX(9deg); } + 10% { -webkit-transform: skewX(-8deg); } + 20% { -webkit-transform: skewX(7deg); } + 30% { -webkit-transform: skewX(-6deg); } + 40% { -webkit-transform: skewX(5deg); } + 50% { -webkit-transform: skewX(-4deg); } + 60% { -webkit-transform: skewX(3deg); } + 70% { -webkit-transform: skewX(-2deg); } + 80% { -webkit-transform: skewX(1deg); } + 90% { -webkit-transform: skewX(0deg); } + 100% { -webkit-transform: skewX(0deg); } +} + +@-moz-keyframes wiggle { + 0% { -moz-transform: skewX(9deg); } + 10% { -moz-transform: skewX(-8deg); } + 20% { -moz-transform: skewX(7deg); } + 30% { -moz-transform: skewX(-6deg); } + 40% { -moz-transform: skewX(5deg); } + 50% { -moz-transform: skewX(-4deg); } + 60% { -moz-transform: skewX(3deg); } + 70% { -moz-transform: skewX(-2deg); } + 80% { -moz-transform: skewX(1deg); } + 90% { -moz-transform: skewX(0deg); } + 100% { -moz-transform: skewX(0deg); } +} + +@-o-keyframes wiggle { + 0% { -o-transform: skewX(9deg); } + 10% { -o-transform: skewX(-8deg); } + 20% { -o-transform: skewX(7deg); } + 30% { -o-transform: skewX(-6deg); } + 40% { -o-transform: skewX(5deg); } + 50% { -o-transform: skewX(-4deg); } + 60% { -o-transform: skewX(3deg); } + 70% { -o-transform: skewX(-2deg); } + 80% { -o-transform: skewX(1deg); } + 90% { -o-transform: skewX(0deg); } + 100% { -o-transform: skewX(0deg); } +} + +@keyframes wiggle { + 0% { transform: skewX(9deg); } + 10% { transform: skewX(-8deg); } + 20% { transform: skewX(7deg); } + 30% { transform: skewX(-6deg); } + 40% { transform: skewX(5deg); } + 50% { transform: skewX(-4deg); } + 60% { transform: skewX(3deg); } + 70% { transform: skewX(-2deg); } + 80% { transform: skewX(1deg); } + 90% { transform: skewX(0deg); } + 100% { transform: skewX(0deg); } +} + +.animated.wiggle { + -webkit-animation-name: wiggle; + -moz-animation-name: wiggle; + -o-animation-name: wiggle; + animation-name: wiggle; + + -webkit-animation-timing-function: ease-in; + -moz-animation-timing-function: ease-in; + -o-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} + +.animated.wiggle { + -webkit-animation-duration: 0.75s; + -moz-animation-duration: 0.75s; + -o-animation-duration: 0.75s; + animation-duration: 0.75s; +} diff --git a/assets/css/lib/animate.min.css b/assets/css/lib/animate.min.css new file mode 100644 index 0000000..25a5551 --- /dev/null +++ b/assets/css/lib/animate.min.css @@ -0,0 +1 @@ +@charset "UTF-8";body{-webkit-backface-visibility:hidden}.animated{-webkit-animation-duration:1s;-moz-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.animated.hinge{-webkit-animation-duration:2s;-moz-animation-duration:2s;-o-animation-duration:2s;animation-duration:2s}@-webkit-keyframes flash{0%,50%,100%{opacity:1}25%,75%{opacity:0}}@-moz-keyframes flash{0%,50%,100%{opacity:1}25%,75%{opacity:0}}@-o-keyframes flash{0%,50%,100%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,50%,100%{opacity:1}25%,75%{opacity:0}}.animated.flash{-webkit-animation-name:flash;-moz-animation-name:flash;-o-animation-name:flash;animation-name:flash}@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px)}}@-moz-keyframes shake{0%,100%{-moz-transform:translateX(0)}10%,30%,50%,70%,90%{-moz-transform:translateX(-10px)}20%,40%,60%,80%{-moz-transform:translateX(10px)}}@-o-keyframes shake{0%,100%{-o-transform:translateX(0)}10%,30%,50%,70%,90%{-o-transform:translateX(-10px)}20%,40%,60%,80%{-o-transform:translateX(10px)}}@keyframes shake{0%,100%{transform:translateX(0)}10%,30%,50%,70%,90%{transform:translateX(-10px)}20%,40%,60%,80%{transform:translateX(10px)}}.animated.shake{-webkit-animation-name:shake;-moz-animation-name:shake;-o-animation-name:shake;animation-name:shake}@-webkit-keyframes bounce{0%,20%,50%,80%,100%{-webkit-transform:translateY(0)}40%{-webkit-transform:translateY(-30px)}60%{-webkit-transform:translateY(-15px)}}@-moz-keyframes bounce{0%,20%,50%,80%,100%{-moz-transform:translateY(0)}40%{-moz-transform:translateY(-30px)}60%{-moz-transform:translateY(-15px)}}@-o-keyframes bounce{0%,20%,50%,80%,100%{-o-transform:translateY(0)}40%{-o-transform:translateY(-30px)}60%{-o-transform:translateY(-15px)}}@keyframes bounce{0%,20%,50%,80%,100%{transform:translateY(0)}40%{transform:translateY(-30px)}60%{transform:translateY(-15px)}}.animated.bounce{-webkit-animation-name:bounce;-moz-animation-name:bounce;-o-animation-name:bounce;animation-name:bounce}@-webkit-keyframes tada{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(0.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.1) rotate(-3deg)}100%{-webkit-transform:scale(1) rotate(0)}}@-moz-keyframes tada{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(0.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.1) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.1) rotate(-3deg)}100%{-moz-transform:scale(1) rotate(0)}}@-o-keyframes tada{0%{-o-transform:scale(1)}10%,20%{-o-transform:scale(0.9) rotate(-3deg)}30%,50%,70%,90%{-o-transform:scale(1.1) rotate(3deg)}40%,60%,80%{-o-transform:scale(1.1) rotate(-3deg)}100%{-o-transform:scale(1) rotate(0)}}@keyframes tada{0%{transform:scale(1)}10%,20%{transform:scale(0.9) rotate(-3deg)}30%,50%,70%,90%{transform:scale(1.1) rotate(3deg)}40%,60%,80%{transform:scale(1.1) rotate(-3deg)}100%{transform:scale(1) rotate(0)}}.animated.tada{-webkit-animation-name:tada;-moz-animation-name:tada;-o-animation-name:tada;animation-name:tada}@-webkit-keyframes swing{20%,40%,60%,80%,100%{-webkit-transform-origin:top center}20%{-webkit-transform:rotate(15deg)}40%{-webkit-transform:rotate(-10deg)}60%{-webkit-transform:rotate(5deg)}80%{-webkit-transform:rotate(-5deg)}100%{-webkit-transform:rotate(0deg)}}@-moz-keyframes swing{20%{-moz-transform:rotate(15deg)}40%{-moz-transform:rotate(-10deg)}60%{-moz-transform:rotate(5deg)}80%{-moz-transform:rotate(-5deg)}100%{-moz-transform:rotate(0deg)}}@-o-keyframes swing{20%{-o-transform:rotate(15deg)}40%{-o-transform:rotate(-10deg)}60%{-o-transform:rotate(5deg)}80%{-o-transform:rotate(-5deg)}100%{-o-transform:rotate(0deg)}}@keyframes swing{20%{transform:rotate(15deg)}40%{transform:rotate(-10deg)}60%{transform:rotate(5deg)}80%{transform:rotate(-5deg)}100%{transform:rotate(0deg)}}.animated.swing{-webkit-transform-origin:top center;-moz-transform-origin:top center;-o-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;-moz-animation-name:swing;-o-animation-name:swing;animation-name:swing}@-webkit-keyframes wobble{0%{-webkit-transform:translateX(0%)}15%{-webkit-transform:translateX(-25%) rotate(-5deg)}30%{-webkit-transform:translateX(20%) rotate(3deg)}45%{-webkit-transform:translateX(-15%) rotate(-3deg)}60%{-webkit-transform:translateX(10%) rotate(2deg)}75%{-webkit-transform:translateX(-5%) rotate(-1deg)}100%{-webkit-transform:translateX(0%)}}@-moz-keyframes wobble{0%{-moz-transform:translateX(0%)}15%{-moz-transform:translateX(-25%) rotate(-5deg)}30%{-moz-transform:translateX(20%) rotate(3deg)}45%{-moz-transform:translateX(-15%) rotate(-3deg)}60%{-moz-transform:translateX(10%) rotate(2deg)}75%{-moz-transform:translateX(-5%) rotate(-1deg)}100%{-moz-transform:translateX(0%)}}@-o-keyframes wobble{0%{-o-transform:translateX(0%)}15%{-o-transform:translateX(-25%) rotate(-5deg)}30%{-o-transform:translateX(20%) rotate(3deg)}45%{-o-transform:translateX(-15%) rotate(-3deg)}60%{-o-transform:translateX(10%) rotate(2deg)}75%{-o-transform:translateX(-5%) rotate(-1deg)}100%{-o-transform:translateX(0%)}}@keyframes wobble{0%{transform:translateX(0%)}15%{transform:translateX(-25%) rotate(-5deg)}30%{transform:translateX(20%) rotate(3deg)}45%{transform:translateX(-15%) rotate(-3deg)}60%{transform:translateX(10%) rotate(2deg)}75%{transform:translateX(-5%) rotate(-1deg)}100%{transform:translateX(0%)}}.animated.wobble{-webkit-animation-name:wobble;-moz-animation-name:wobble;-o-animation-name:wobble;animation-name:wobble}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1)}50%{-webkit-transform:scale(1.1)}100%{-webkit-transform:scale(1)}}@-moz-keyframes pulse{0%{-moz-transform:scale(1)}50%{-moz-transform:scale(1.1)}100%{-moz-transform:scale(1)}}@-o-keyframes pulse{0%{-o-transform:scale(1)}50%{-o-transform:scale(1.1)}100%{-o-transform:scale(1)}}@keyframes pulse{0%{transform:scale(1)}50%{transform:scale(1.1)}100%{transform:scale(1)}}.animated.pulse{-webkit-animation-name:pulse;-moz-animation-name:pulse;-o-animation-name:pulse;animation-name:pulse}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotateY(0);-webkit-animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(170deg);-webkit-animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(190deg) scale(1);-webkit-animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) rotateY(360deg) scale(.95);-webkit-animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px) scale(1);-webkit-animation-timing-function:ease-in}}@-moz-keyframes flip{0%{-moz-transform:perspective(400px) rotateY(0);-moz-animation-timing-function:ease-out}40%{-moz-transform:perspective(400px) translateZ(150px) rotateY(170deg);-moz-animation-timing-function:ease-out}50%{-moz-transform:perspective(400px) translateZ(150px) rotateY(190deg) scale(1);-moz-animation-timing-function:ease-in}80%{-moz-transform:perspective(400px) rotateY(360deg) scale(.95);-moz-animation-timing-function:ease-in}100%{-moz-transform:perspective(400px) scale(1);-moz-animation-timing-function:ease-in}}@-o-keyframes flip{0%{-o-transform:perspective(400px) rotateY(0);-o-animation-timing-function:ease-out}40%{-o-transform:perspective(400px) translateZ(150px) rotateY(170deg);-o-animation-timing-function:ease-out}50%{-o-transform:perspective(400px) translateZ(150px) rotateY(190deg) scale(1);-o-animation-timing-function:ease-in}80%{-o-transform:perspective(400px) rotateY(360deg) scale(.95);-o-animation-timing-function:ease-in}100%{-o-transform:perspective(400px) scale(1);-o-animation-timing-function:ease-in}}@keyframes flip{0%{transform:perspective(400px) rotateY(0);animation-timing-function:ease-out}40%{transform:perspective(400px) translateZ(150px) rotateY(170deg);animation-timing-function:ease-out}50%{transform:perspective(400px) translateZ(150px) rotateY(190deg) scale(1);animation-timing-function:ease-in}80%{transform:perspective(400px) rotateY(360deg) scale(.95);animation-timing-function:ease-in}100%{transform:perspective(400px) scale(1);animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible!important;-webkit-animation-name:flip;-moz-backface-visibility:visible!important;-moz-animation-name:flip;-o-backface-visibility:visible!important;-o-animation-name:flip;backface-visibility:visible!important;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);opacity:0}40%{-webkit-transform:perspective(400px) rotateX(-10deg)}70%{-webkit-transform:perspective(400px) rotateX(10deg)}100%{-webkit-transform:perspective(400px) rotateX(0deg);opacity:1}}@-moz-keyframes flipInX{0%{-moz-transform:perspective(400px) rotateX(90deg);opacity:0}40%{-moz-transform:perspective(400px) rotateX(-10deg)}70%{-moz-transform:perspective(400px) rotateX(10deg)}100%{-moz-transform:perspective(400px) rotateX(0deg);opacity:1}}@-o-keyframes flipInX{0%{-o-transform:perspective(400px) rotateX(90deg);opacity:0}40%{-o-transform:perspective(400px) rotateX(-10deg)}70%{-o-transform:perspective(400px) rotateX(10deg)}100%{-o-transform:perspective(400px) rotateX(0deg);opacity:1}}@keyframes flipInX{0%{transform:perspective(400px) rotateX(90deg);opacity:0}40%{transform:perspective(400px) rotateX(-10deg)}70%{transform:perspective(400px) rotateX(10deg)}100%{transform:perspective(400px) rotateX(0deg);opacity:1}}.animated.flipInX{-webkit-backface-visibility:visible!important;-webkit-animation-name:flipInX;-moz-backface-visibility:visible!important;-moz-animation-name:flipInX;-o-backface-visibility:visible!important;-o-animation-name:flipInX;backface-visibility:visible!important;animation-name:flipInX}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px) rotateX(0deg);opacity:1}100%{-webkit-transform:perspective(400px) rotateX(90deg);opacity:0}}@-moz-keyframes flipOutX{0%{-moz-transform:perspective(400px) rotateX(0deg);opacity:1}100%{-moz-transform:perspective(400px) rotateX(90deg);opacity:0}}@-o-keyframes flipOutX{0%{-o-transform:perspective(400px) rotateX(0deg);opacity:1}100%{-o-transform:perspective(400px) rotateX(90deg);opacity:0}}@keyframes flipOutX{0%{transform:perspective(400px) rotateX(0deg);opacity:1}100%{transform:perspective(400px) rotateX(90deg);opacity:0}}.animated.flipOutX{-webkit-animation-name:flipOutX;-webkit-backface-visibility:visible!important;-moz-animation-name:flipOutX;-moz-backface-visibility:visible!important;-o-animation-name:flipOutX;-o-backface-visibility:visible!important;animation-name:flipOutX;backface-visibility:visible!important}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotateY(90deg);opacity:0}40%{-webkit-transform:perspective(400px) rotateY(-10deg)}70%{-webkit-transform:perspective(400px) rotateY(10deg)}100%{-webkit-transform:perspective(400px) rotateY(0deg);opacity:1}}@-moz-keyframes flipInY{0%{-moz-transform:perspective(400px) rotateY(90deg);opacity:0}40%{-moz-transform:perspective(400px) rotateY(-10deg)}70%{-moz-transform:perspective(400px) rotateY(10deg)}100%{-moz-transform:perspective(400px) rotateY(0deg);opacity:1}}@-o-keyframes flipInY{0%{-o-transform:perspective(400px) rotateY(90deg);opacity:0}40%{-o-transform:perspective(400px) rotateY(-10deg)}70%{-o-transform:perspective(400px) rotateY(10deg)}100%{-o-transform:perspective(400px) rotateY(0deg);opacity:1}}@keyframes flipInY{0%{transform:perspective(400px) rotateY(90deg);opacity:0}40%{transform:perspective(400px) rotateY(-10deg)}70%{transform:perspective(400px) rotateY(10deg)}100%{transform:perspective(400px) rotateY(0deg);opacity:1}}.animated.flipInY{-webkit-backface-visibility:visible!important;-webkit-animation-name:flipInY;-moz-backface-visibility:visible!important;-moz-animation-name:flipInY;-o-backface-visibility:visible!important;-o-animation-name:flipInY;backface-visibility:visible!important;animation-name:flipInY}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px) rotateY(0deg);opacity:1}100%{-webkit-transform:perspective(400px) rotateY(90deg);opacity:0}}@-moz-keyframes flipOutY{0%{-moz-transform:perspective(400px) rotateY(0deg);opacity:1}100%{-moz-transform:perspective(400px) rotateY(90deg);opacity:0}}@-o-keyframes flipOutY{0%{-o-transform:perspective(400px) rotateY(0deg);opacity:1}100%{-o-transform:perspective(400px) rotateY(90deg);opacity:0}}@keyframes flipOutY{0%{transform:perspective(400px) rotateY(0deg);opacity:1}100%{transform:perspective(400px) rotateY(90deg);opacity:0}}.animated.flipOutY{-webkit-backface-visibility:visible!important;-webkit-animation-name:flipOutY;-moz-backface-visibility:visible!important;-moz-animation-name:flipOutY;-o-backface-visibility:visible!important;-o-animation-name:flipOutY;backface-visibility:visible!important;animation-name:flipOutY}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@-moz-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@-o-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.animated.fadeIn{-webkit-animation-name:fadeIn;-moz-animation-name:fadeIn;-o-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(20px)}100%{opacity:1;-webkit-transform:translateY(0)}}@-moz-keyframes fadeInUp{0%{opacity:0;-moz-transform:translateY(20px)}100%{opacity:1;-moz-transform:translateY(0)}}@-o-keyframes fadeInUp{0%{opacity:0;-o-transform:translateY(20px)}100%{opacity:1;-o-transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}100%{opacity:1;transform:translateY(0)}}.animated.fadeInUp{-webkit-animation-name:fadeInUp;-moz-animation-name:fadeInUp;-o-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-20px)}100%{opacity:1;-webkit-transform:translateY(0)}}@-moz-keyframes fadeInDown{0%{opacity:0;-moz-transform:translateY(-20px)}100%{opacity:1;-moz-transform:translateY(0)}}@-o-keyframes fadeInDown{0%{opacity:0;-o-transform:translateY(-20px)}100%{opacity:1;-o-transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;transform:translateY(-20px)}100%{opacity:1;transform:translateY(0)}}.animated.fadeInDown{-webkit-animation-name:fadeInDown;-moz-animation-name:fadeInDown;-o-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px)}100%{opacity:1;-webkit-transform:translateX(0)}}@-moz-keyframes fadeInLeft{0%{opacity:0;-moz-transform:translateX(-20px)}100%{opacity:1;-moz-transform:translateX(0)}}@-o-keyframes fadeInLeft{0%{opacity:0;-o-transform:translateX(-20px)}100%{opacity:1;-o-transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;transform:translateX(-20px)}100%{opacity:1;transform:translateX(0)}}.animated.fadeInLeft{-webkit-animation-name:fadeInLeft;-moz-animation-name:fadeInLeft;-o-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px)}100%{opacity:1;-webkit-transform:translateX(0)}}@-moz-keyframes fadeInRight{0%{opacity:0;-moz-transform:translateX(20px)}100%{opacity:1;-moz-transform:translateX(0)}}@-o-keyframes fadeInRight{0%{opacity:0;-o-transform:translateX(20px)}100%{opacity:1;-o-transform:translateX(0)}}@keyframes fadeInRight{0%{opacity:0;transform:translateX(20px)}100%{opacity:1;transform:translateX(0)}}.animated.fadeInRight{-webkit-animation-name:fadeInRight;-moz-animation-name:fadeInRight;-o-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0)}}@-moz-keyframes fadeInUpBig{0%{opacity:0;-moz-transform:translateY(2000px)}100%{opacity:1;-moz-transform:translateY(0)}}@-o-keyframes fadeInUpBig{0%{opacity:0;-o-transform:translateY(2000px)}100%{opacity:1;-o-transform:translateY(0)}}@keyframes fadeInUpBig{0%{opacity:0;transform:translateY(2000px)}100%{opacity:1;transform:translateY(0)}}.animated.fadeInUpBig{-webkit-animation-name:fadeInUpBig;-moz-animation-name:fadeInUpBig;-o-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translateY(-2000px)}100%{opacity:1;-webkit-transform:translateY(0)}}@-moz-keyframes fadeInDownBig{0%{opacity:0;-moz-transform:translateY(-2000px)}100%{opacity:1;-moz-transform:translateY(0)}}@-o-keyframes fadeInDownBig{0%{opacity:0;-o-transform:translateY(-2000px)}100%{opacity:1;-o-transform:translateY(0)}}@keyframes fadeInDownBig{0%{opacity:0;transform:translateY(-2000px)}100%{opacity:1;transform:translateY(0)}}.animated.fadeInDownBig{-webkit-animation-name:fadeInDownBig;-moz-animation-name:fadeInDownBig;-o-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translateX(-2000px)}100%{opacity:1;-webkit-transform:translateX(0)}}@-moz-keyframes fadeInLeftBig{0%{opacity:0;-moz-transform:translateX(-2000px)}100%{opacity:1;-moz-transform:translateX(0)}}@-o-keyframes fadeInLeftBig{0%{opacity:0;-o-transform:translateX(-2000px)}100%{opacity:1;-o-transform:translateX(0)}}@keyframes fadeInLeftBig{0%{opacity:0;transform:translateX(-2000px)}100%{opacity:1;transform:translateX(0)}}.animated.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;-moz-animation-name:fadeInLeftBig;-o-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translateX(2000px)}100%{opacity:1;-webkit-transform:translateX(0)}}@-moz-keyframes fadeInRightBig{0%{opacity:0;-moz-transform:translateX(2000px)}100%{opacity:1;-moz-transform:translateX(0)}}@-o-keyframes fadeInRightBig{0%{opacity:0;-o-transform:translateX(2000px)}100%{opacity:1;-o-transform:translateX(0)}}@keyframes fadeInRightBig{0%{opacity:0;transform:translateX(2000px)}100%{opacity:1;transform:translateX(0)}}.animated.fadeInRightBig{-webkit-animation-name:fadeInRightBig;-moz-animation-name:fadeInRightBig;-o-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@-moz-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@-o-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.animated.fadeOut{-webkit-animation-name:fadeOut;-moz-animation-name:fadeOut;-o-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-20px)}}@-moz-keyframes fadeOutUp{0%{opacity:1;-moz-transform:translateY(0)}100%{opacity:0;-moz-transform:translateY(-20px)}}@-o-keyframes fadeOutUp{0%{opacity:1;-o-transform:translateY(0)}100%{opacity:0;-o-transform:translateY(-20px)}}@keyframes fadeOutUp{0%{opacity:1;transform:translateY(0)}100%{opacity:0;transform:translateY(-20px)}}.animated.fadeOutUp{-webkit-animation-name:fadeOutUp;-moz-animation-name:fadeOutUp;-o-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(20px)}}@-moz-keyframes fadeOutDown{0%{opacity:1;-moz-transform:translateY(0)}100%{opacity:0;-moz-transform:translateY(20px)}}@-o-keyframes fadeOutDown{0%{opacity:1;-o-transform:translateY(0)}100%{opacity:0;-o-transform:translateY(20px)}}@keyframes fadeOutDown{0%{opacity:1;transform:translateY(0)}100%{opacity:0;transform:translateY(20px)}}.animated.fadeOutDown{-webkit-animation-name:fadeOutDown;-moz-animation-name:fadeOutDown;-o-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-20px)}}@-moz-keyframes fadeOutLeft{0%{opacity:1;-moz-transform:translateX(0)}100%{opacity:0;-moz-transform:translateX(-20px)}}@-o-keyframes fadeOutLeft{0%{opacity:1;-o-transform:translateX(0)}100%{opacity:0;-o-transform:translateX(-20px)}}@keyframes fadeOutLeft{0%{opacity:1;transform:translateX(0)}100%{opacity:0;transform:translateX(-20px)}}.animated.fadeOutLeft{-webkit-animation-name:fadeOutLeft;-moz-animation-name:fadeOutLeft;-o-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(20px)}}@-moz-keyframes fadeOutRight{0%{opacity:1;-moz-transform:translateX(0)}100%{opacity:0;-moz-transform:translateX(20px)}}@-o-keyframes fadeOutRight{0%{opacity:1;-o-transform:translateX(0)}100%{opacity:0;-o-transform:translateX(20px)}}@keyframes fadeOutRight{0%{opacity:1;transform:translateX(0)}100%{opacity:0;transform:translateX(20px)}}.animated.fadeOutRight{-webkit-animation-name:fadeOutRight;-moz-animation-name:fadeOutRight;-o-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutUpBig{0%{opacity:1;-webkit-transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-2000px)}}@-moz-keyframes fadeOutUpBig{0%{opacity:1;-moz-transform:translateY(0)}100%{opacity:0;-moz-transform:translateY(-2000px)}}@-o-keyframes fadeOutUpBig{0%{opacity:1;-o-transform:translateY(0)}100%{opacity:0;-o-transform:translateY(-2000px)}}@keyframes fadeOutUpBig{0%{opacity:1;transform:translateY(0)}100%{opacity:0;transform:translateY(-2000px)}}.animated.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;-moz-animation-name:fadeOutUpBig;-o-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes fadeOutDownBig{0%{opacity:1;-webkit-transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(2000px)}}@-moz-keyframes fadeOutDownBig{0%{opacity:1;-moz-transform:translateY(0)}100%{opacity:0;-moz-transform:translateY(2000px)}}@-o-keyframes fadeOutDownBig{0%{opacity:1;-o-transform:translateY(0)}100%{opacity:0;-o-transform:translateY(2000px)}}@keyframes fadeOutDownBig{0%{opacity:1;transform:translateY(0)}100%{opacity:0;transform:translateY(2000px)}}.animated.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;-moz-animation-name:fadeOutDownBig;-o-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1;-webkit-transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-2000px)}}@-moz-keyframes fadeOutLeftBig{0%{opacity:1;-moz-transform:translateX(0)}100%{opacity:0;-moz-transform:translateX(-2000px)}}@-o-keyframes fadeOutLeftBig{0%{opacity:1;-o-transform:translateX(0)}100%{opacity:0;-o-transform:translateX(-2000px)}}@keyframes fadeOutLeftBig{0%{opacity:1;transform:translateX(0)}100%{opacity:0;transform:translateX(-2000px)}}.animated.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;-moz-animation-name:fadeOutLeftBig;-o-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRightBig{0%{opacity:1;-webkit-transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(2000px)}}@-moz-keyframes fadeOutRightBig{0%{opacity:1;-moz-transform:translateX(0)}100%{opacity:0;-moz-transform:translateX(2000px)}}@-o-keyframes fadeOutRightBig{0%{opacity:1;-o-transform:translateX(0)}100%{opacity:0;-o-transform:translateX(2000px)}}@keyframes fadeOutRightBig{0%{opacity:1;transform:translateX(0)}100%{opacity:0;transform:translateX(2000px)}}.animated.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;-moz-animation-name:fadeOutRightBig;-o-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.3)}50%{opacity:1;-webkit-transform:scale(1.05)}70%{-webkit-transform:scale(.9)}100%{-webkit-transform:scale(1)}}@-moz-keyframes bounceIn{0%{opacity:0;-moz-transform:scale(.3)}50%{opacity:1;-moz-transform:scale(1.05)}70%{-moz-transform:scale(.9)}100%{-moz-transform:scale(1)}}@-o-keyframes bounceIn{0%{opacity:0;-o-transform:scale(.3)}50%{opacity:1;-o-transform:scale(1.05)}70%{-o-transform:scale(.9)}100%{-o-transform:scale(1)}}@keyframes bounceIn{0%{opacity:0;transform:scale(.3)}50%{opacity:1;transform:scale(1.05)}70%{transform:scale(.9)}100%{transform:scale(1)}}.animated.bounceIn{-webkit-animation-name:bounceIn;-moz-animation-name:bounceIn;-o-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceInUp{0%{opacity:0;-webkit-transform:translateY(2000px)}60%{opacity:1;-webkit-transform:translateY(-30px)}80%{-webkit-transform:translateY(10px)}100%{-webkit-transform:translateY(0)}}@-moz-keyframes bounceInUp{0%{opacity:0;-moz-transform:translateY(2000px)}60%{opacity:1;-moz-transform:translateY(-30px)}80%{-moz-transform:translateY(10px)}100%{-moz-transform:translateY(0)}}@-o-keyframes bounceInUp{0%{opacity:0;-o-transform:translateY(2000px)}60%{opacity:1;-o-transform:translateY(-30px)}80%{-o-transform:translateY(10px)}100%{-o-transform:translateY(0)}}@keyframes bounceInUp{0%{opacity:0;transform:translateY(2000px)}60%{opacity:1;transform:translateY(-30px)}80%{transform:translateY(10px)}100%{transform:translateY(0)}}.animated.bounceInUp{-webkit-animation-name:bounceInUp;-moz-animation-name:bounceInUp;-o-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceInDown{0%{opacity:0;-webkit-transform:translateY(-2000px)}60%{opacity:1;-webkit-transform:translateY(30px)}80%{-webkit-transform:translateY(-10px)}100%{-webkit-transform:translateY(0)}}@-moz-keyframes bounceInDown{0%{opacity:0;-moz-transform:translateY(-2000px)}60%{opacity:1;-moz-transform:translateY(30px)}80%{-moz-transform:translateY(-10px)}100%{-moz-transform:translateY(0)}}@-o-keyframes bounceInDown{0%{opacity:0;-o-transform:translateY(-2000px)}60%{opacity:1;-o-transform:translateY(30px)}80%{-o-transform:translateY(-10px)}100%{-o-transform:translateY(0)}}@keyframes bounceInDown{0%{opacity:0;transform:translateY(-2000px)}60%{opacity:1;transform:translateY(30px)}80%{transform:translateY(-10px)}100%{transform:translateY(0)}}.animated.bounceInDown{-webkit-animation-name:bounceInDown;-moz-animation-name:bounceInDown;-o-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%{opacity:0;-webkit-transform:translateX(-2000px)}60%{opacity:1;-webkit-transform:translateX(30px)}80%{-webkit-transform:translateX(-10px)}100%{-webkit-transform:translateX(0)}}@-moz-keyframes bounceInLeft{0%{opacity:0;-moz-transform:translateX(-2000px)}60%{opacity:1;-moz-transform:translateX(30px)}80%{-moz-transform:translateX(-10px)}100%{-moz-transform:translateX(0)}}@-o-keyframes bounceInLeft{0%{opacity:0;-o-transform:translateX(-2000px)}60%{opacity:1;-o-transform:translateX(30px)}80%{-o-transform:translateX(-10px)}100%{-o-transform:translateX(0)}}@keyframes bounceInLeft{0%{opacity:0;transform:translateX(-2000px)}60%{opacity:1;transform:translateX(30px)}80%{transform:translateX(-10px)}100%{transform:translateX(0)}}.animated.bounceInLeft{-webkit-animation-name:bounceInLeft;-moz-animation-name:bounceInLeft;-o-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%{opacity:0;-webkit-transform:translateX(2000px)}60%{opacity:1;-webkit-transform:translateX(-30px)}80%{-webkit-transform:translateX(10px)}100%{-webkit-transform:translateX(0)}}@-moz-keyframes bounceInRight{0%{opacity:0;-moz-transform:translateX(2000px)}60%{opacity:1;-moz-transform:translateX(-30px)}80%{-moz-transform:translateX(10px)}100%{-moz-transform:translateX(0)}}@-o-keyframes bounceInRight{0%{opacity:0;-o-transform:translateX(2000px)}60%{opacity:1;-o-transform:translateX(-30px)}80%{-o-transform:translateX(10px)}100%{-o-transform:translateX(0)}}@keyframes bounceInRight{0%{opacity:0;transform:translateX(2000px)}60%{opacity:1;transform:translateX(-30px)}80%{transform:translateX(10px)}100%{transform:translateX(0)}}.animated.bounceInRight{-webkit-animation-name:bounceInRight;-moz-animation-name:bounceInRight;-o-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceOut{0%{-webkit-transform:scale(1)}25%{-webkit-transform:scale(.95)}50%{opacity:1;-webkit-transform:scale(1.1)}100%{opacity:0;-webkit-transform:scale(.3)}}@-moz-keyframes bounceOut{0%{-moz-transform:scale(1)}25%{-moz-transform:scale(.95)}50%{opacity:1;-moz-transform:scale(1.1)}100%{opacity:0;-moz-transform:scale(.3)}}@-o-keyframes bounceOut{0%{-o-transform:scale(1)}25%{-o-transform:scale(.95)}50%{opacity:1;-o-transform:scale(1.1)}100%{opacity:0;-o-transform:scale(.3)}}@keyframes bounceOut{0%{transform:scale(1)}25%{transform:scale(.95)}50%{opacity:1;transform:scale(1.1)}100%{opacity:0;transform:scale(.3)}}.animated.bounceOut{-webkit-animation-name:bounceOut;-moz-animation-name:bounceOut;-o-animation-name:bounceOut;animation-name:bounceOut}@-webkit-keyframes bounceOutUp{0%{-webkit-transform:translateY(0)}20%{opacity:1;-webkit-transform:translateY(20px)}100%{opacity:0;-webkit-transform:translateY(-2000px)}}@-moz-keyframes bounceOutUp{0%{-moz-transform:translateY(0)}20%{opacity:1;-moz-transform:translateY(20px)}100%{opacity:0;-moz-transform:translateY(-2000px)}}@-o-keyframes bounceOutUp{0%{-o-transform:translateY(0)}20%{opacity:1;-o-transform:translateY(20px)}100%{opacity:0;-o-transform:translateY(-2000px)}}@keyframes bounceOutUp{0%{transform:translateY(0)}20%{opacity:1;transform:translateY(20px)}100%{opacity:0;transform:translateY(-2000px)}}.animated.bounceOutUp{-webkit-animation-name:bounceOutUp;-moz-animation-name:bounceOutUp;-o-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes bounceOutDown{0%{-webkit-transform:translateY(0)}20%{opacity:1;-webkit-transform:translateY(-20px)}100%{opacity:0;-webkit-transform:translateY(2000px)}}@-moz-keyframes bounceOutDown{0%{-moz-transform:translateY(0)}20%{opacity:1;-moz-transform:translateY(-20px)}100%{opacity:0;-moz-transform:translateY(2000px)}}@-o-keyframes bounceOutDown{0%{-o-transform:translateY(0)}20%{opacity:1;-o-transform:translateY(-20px)}100%{opacity:0;-o-transform:translateY(2000px)}}@keyframes bounceOutDown{0%{transform:translateY(0)}20%{opacity:1;transform:translateY(-20px)}100%{opacity:0;transform:translateY(2000px)}}.animated.bounceOutDown{-webkit-animation-name:bounceOutDown;-moz-animation-name:bounceOutDown;-o-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{0%{-webkit-transform:translateX(0)}20%{opacity:1;-webkit-transform:translateX(20px)}100%{opacity:0;-webkit-transform:translateX(-2000px)}}@-moz-keyframes bounceOutLeft{0%{-moz-transform:translateX(0)}20%{opacity:1;-moz-transform:translateX(20px)}100%{opacity:0;-moz-transform:translateX(-2000px)}}@-o-keyframes bounceOutLeft{0%{-o-transform:translateX(0)}20%{opacity:1;-o-transform:translateX(20px)}100%{opacity:0;-o-transform:translateX(-2000px)}}@keyframes bounceOutLeft{0%{transform:translateX(0)}20%{opacity:1;transform:translateX(20px)}100%{opacity:0;transform:translateX(-2000px)}}.animated.bounceOutLeft{-webkit-animation-name:bounceOutLeft;-moz-animation-name:bounceOutLeft;-o-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{0%{-webkit-transform:translateX(0)}20%{opacity:1;-webkit-transform:translateX(-20px)}100%{opacity:0;-webkit-transform:translateX(2000px)}}@-moz-keyframes bounceOutRight{0%{-moz-transform:translateX(0)}20%{opacity:1;-moz-transform:translateX(-20px)}100%{opacity:0;-moz-transform:translateX(2000px)}}@-o-keyframes bounceOutRight{0%{-o-transform:translateX(0)}20%{opacity:1;-o-transform:translateX(-20px)}100%{opacity:0;-o-transform:translateX(2000px)}}@keyframes bounceOutRight{0%{transform:translateX(0)}20%{opacity:1;transform:translateX(-20px)}100%{opacity:0;transform:translateX(2000px)}}.animated.bounceOutRight{-webkit-animation-name:bounceOutRight;-moz-animation-name:bounceOutRight;-o-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center center;-webkit-transform:rotate(-200deg);opacity:0}100%{-webkit-transform-origin:center center;-webkit-transform:rotate(0);opacity:1}}@-moz-keyframes rotateIn{0%{-moz-transform-origin:center center;-moz-transform:rotate(-200deg);opacity:0}100%{-moz-transform-origin:center center;-moz-transform:rotate(0);opacity:1}}@-o-keyframes rotateIn{0%{-o-transform-origin:center center;-o-transform:rotate(-200deg);opacity:0}100%{-o-transform-origin:center center;-o-transform:rotate(0);opacity:1}}@keyframes rotateIn{0%{transform-origin:center center;transform:rotate(-200deg);opacity:0}100%{transform-origin:center center;transform:rotate(0);opacity:1}}.animated.rotateIn{-webkit-animation-name:rotateIn;-moz-animation-name:rotateIn;-o-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(90deg);opacity:0}100%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(0);opacity:1}}@-moz-keyframes rotateInUpLeft{0%{-moz-transform-origin:left bottom;-moz-transform:rotate(90deg);opacity:0}100%{-moz-transform-origin:left bottom;-moz-transform:rotate(0);opacity:1}}@-o-keyframes rotateInUpLeft{0%{-o-transform-origin:left bottom;-o-transform:rotate(90deg);opacity:0}100%{-o-transform-origin:left bottom;-o-transform:rotate(0);opacity:1}}@keyframes rotateInUpLeft{0%{transform-origin:left bottom;transform:rotate(90deg);opacity:0}100%{transform-origin:left bottom;transform:rotate(0);opacity:1}}.animated.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;-moz-animation-name:rotateInUpLeft;-o-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(-90deg);opacity:0}100%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(0);opacity:1}}@-moz-keyframes rotateInDownLeft{0%{-moz-transform-origin:left bottom;-moz-transform:rotate(-90deg);opacity:0}100%{-moz-transform-origin:left bottom;-moz-transform:rotate(0);opacity:1}}@-o-keyframes rotateInDownLeft{0%{-o-transform-origin:left bottom;-o-transform:rotate(-90deg);opacity:0}100%{-o-transform-origin:left bottom;-o-transform:rotate(0);opacity:1}}@keyframes rotateInDownLeft{0%{transform-origin:left bottom;transform:rotate(-90deg);opacity:0}100%{transform-origin:left bottom;transform:rotate(0);opacity:1}}.animated.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;-moz-animation-name:rotateInDownLeft;-o-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(0);opacity:1}}@-moz-keyframes rotateInUpRight{0%{-moz-transform-origin:right bottom;-moz-transform:rotate(-90deg);opacity:0}100%{-moz-transform-origin:right bottom;-moz-transform:rotate(0);opacity:1}}@-o-keyframes rotateInUpRight{0%{-o-transform-origin:right bottom;-o-transform:rotate(-90deg);opacity:0}100%{-o-transform-origin:right bottom;-o-transform:rotate(0);opacity:1}}@keyframes rotateInUpRight{0%{transform-origin:right bottom;transform:rotate(-90deg);opacity:0}100%{transform-origin:right bottom;transform:rotate(0);opacity:1}}.animated.rotateInUpRight{-webkit-animation-name:rotateInUpRight;-moz-animation-name:rotateInUpRight;-o-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(90deg);opacity:0}100%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(0);opacity:1}}@-moz-keyframes rotateInDownRight{0%{-moz-transform-origin:right bottom;-moz-transform:rotate(90deg);opacity:0}100%{-moz-transform-origin:right bottom;-moz-transform:rotate(0);opacity:1}}@-o-keyframes rotateInDownRight{0%{-o-transform-origin:right bottom;-o-transform:rotate(90deg);opacity:0}100%{-o-transform-origin:right bottom;-o-transform:rotate(0);opacity:1}}@keyframes rotateInDownRight{0%{transform-origin:right bottom;transform:rotate(90deg);opacity:0}100%{transform-origin:right bottom;transform:rotate(0);opacity:1}}.animated.rotateInDownRight{-webkit-animation-name:rotateInDownRight;-moz-animation-name:rotateInDownRight;-o-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center center;-webkit-transform:rotate(0);opacity:1}100%{-webkit-transform-origin:center center;-webkit-transform:rotate(200deg);opacity:0}}@-moz-keyframes rotateOut{0%{-moz-transform-origin:center center;-moz-transform:rotate(0);opacity:1}100%{-moz-transform-origin:center center;-moz-transform:rotate(200deg);opacity:0}}@-o-keyframes rotateOut{0%{-o-transform-origin:center center;-o-transform:rotate(0);opacity:1}100%{-o-transform-origin:center center;-o-transform:rotate(200deg);opacity:0}}@keyframes rotateOut{0%{transform-origin:center center;transform:rotate(0);opacity:1}100%{transform-origin:center center;transform:rotate(200deg);opacity:0}}.animated.rotateOut{-webkit-animation-name:rotateOut;-moz-animation-name:rotateOut;-o-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(0);opacity:1}100%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(-90deg);opacity:0}}@-moz-keyframes rotateOutUpLeft{0%{-moz-transform-origin:left bottom;-moz-transform:rotate(0);opacity:1}100%{-moz-transform-origin:left bottom;-moz-transform:rotate(-90deg);opacity:0}}@-o-keyframes rotateOutUpLeft{0%{-o-transform-origin:left bottom;-o-transform:rotate(0);opacity:1}100%{-o-transform-origin:left bottom;-o-transform:rotate(-90deg);opacity:0}}@keyframes rotateOutUpLeft{0%{transform-origin:left bottom;transform:rotate(0);opacity:1}100%{transform-origin:left bottom;transform:rotate(-90deg);opacity:0}}.animated.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;-moz-animation-name:rotateOutUpLeft;-o-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(0);opacity:1}100%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(90deg);opacity:0}}@-moz-keyframes rotateOutDownLeft{0%{-moz-transform-origin:left bottom;-moz-transform:rotate(0);opacity:1}100%{-moz-transform-origin:left bottom;-moz-transform:rotate(90deg);opacity:0}}@-o-keyframes rotateOutDownLeft{0%{-o-transform-origin:left bottom;-o-transform:rotate(0);opacity:1}100%{-o-transform-origin:left bottom;-o-transform:rotate(90deg);opacity:0}}@keyframes rotateOutDownLeft{0%{transform-origin:left bottom;transform:rotate(0);opacity:1}100%{transform-origin:left bottom;transform:rotate(90deg);opacity:0}}.animated.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;-moz-animation-name:rotateOutDownLeft;-o-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(0);opacity:1}100%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(90deg);opacity:0}}@-moz-keyframes rotateOutUpRight{0%{-moz-transform-origin:right bottom;-moz-transform:rotate(0);opacity:1}100%{-moz-transform-origin:right bottom;-moz-transform:rotate(90deg);opacity:0}}@-o-keyframes rotateOutUpRight{0%{-o-transform-origin:right bottom;-o-transform:rotate(0);opacity:1}100%{-o-transform-origin:right bottom;-o-transform:rotate(90deg);opacity:0}}@keyframes rotateOutUpRight{0%{transform-origin:right bottom;transform:rotate(0);opacity:1}100%{transform-origin:right bottom;transform:rotate(90deg);opacity:0}}.animated.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;-moz-animation-name:rotateOutUpRight;-o-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(0);opacity:1}100%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(-90deg);opacity:0}}@-moz-keyframes rotateOutDownRight{0%{-moz-transform-origin:right bottom;-moz-transform:rotate(0);opacity:1}100%{-moz-transform-origin:right bottom;-moz-transform:rotate(-90deg);opacity:0}}@-o-keyframes rotateOutDownRight{0%{-o-transform-origin:right bottom;-o-transform:rotate(0);opacity:1}100%{-o-transform-origin:right bottom;-o-transform:rotate(-90deg);opacity:0}}@keyframes rotateOutDownRight{0%{transform-origin:right bottom;transform:rotate(0);opacity:1}100%{transform-origin:right bottom;transform:rotate(-90deg);opacity:0}}.animated.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;-moz-animation-name:rotateOutDownRight;-o-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes hinge{0%{-webkit-transform:rotate(0);-webkit-transform-origin:top left;-webkit-animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate(80deg);-webkit-transform-origin:top left;-webkit-animation-timing-function:ease-in-out}40%{-webkit-transform:rotate(60deg);-webkit-transform-origin:top left;-webkit-animation-timing-function:ease-in-out}80%{-webkit-transform:rotate(60deg) translateY(0);opacity:1;-webkit-transform-origin:top left;-webkit-animation-timing-function:ease-in-out}100%{-webkit-transform:translateY(700px);opacity:0}}@-moz-keyframes hinge{0%{-moz-transform:rotate(0);-moz-transform-origin:top left;-moz-animation-timing-function:ease-in-out}20%,60%{-moz-transform:rotate(80deg);-moz-transform-origin:top left;-moz-animation-timing-function:ease-in-out}40%{-moz-transform:rotate(60deg);-moz-transform-origin:top left;-moz-animation-timing-function:ease-in-out}80%{-moz-transform:rotate(60deg) translateY(0);opacity:1;-moz-transform-origin:top left;-moz-animation-timing-function:ease-in-out}100%{-moz-transform:translateY(700px);opacity:0}}@-o-keyframes hinge{0%{-o-transform:rotate(0);-o-transform-origin:top left;-o-animation-timing-function:ease-in-out}20%,60%{-o-transform:rotate(80deg);-o-transform-origin:top left;-o-animation-timing-function:ease-in-out}40%{-o-transform:rotate(60deg);-o-transform-origin:top left;-o-animation-timing-function:ease-in-out}80%{-o-transform:rotate(60deg) translateY(0);opacity:1;-o-transform-origin:top left;-o-animation-timing-function:ease-in-out}100%{-o-transform:translateY(700px);opacity:0}}@keyframes hinge{0%{transform:rotate(0);transform-origin:top left;animation-timing-function:ease-in-out}20%,60%{transform:rotate(80deg);transform-origin:top left;animation-timing-function:ease-in-out}40%{transform:rotate(60deg);transform-origin:top left;animation-timing-function:ease-in-out}80%{transform:rotate(60deg) translateY(0);opacity:1;transform-origin:top left;animation-timing-function:ease-in-out}100%{transform:translateY(700px);opacity:0}}.animated.hinge{-webkit-animation-name:hinge;-moz-animation-name:hinge;-o-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0px) rotate(0deg)}}@-moz-keyframes rollIn{0%{opacity:0;-moz-transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-moz-transform:translateX(0px) rotate(0deg)}}@-o-keyframes rollIn{0%{opacity:0;-o-transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-o-transform:translateX(0px) rotate(0deg)}}@keyframes rollIn{0%{opacity:0;transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;transform:translateX(0px) rotate(0deg)}}.animated.rollIn{-webkit-animation-name:rollIn;-moz-animation-name:rollIn;-o-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1;-webkit-transform:translateX(0px) rotate(0deg)}100%{opacity:0;-webkit-transform:translateX(100%) rotate(120deg)}}@-moz-keyframes rollOut{0%{opacity:1;-moz-transform:translateX(0px) rotate(0deg)}100%{opacity:0;-moz-transform:translateX(100%) rotate(120deg)}}@-o-keyframes rollOut{0%{opacity:1;-o-transform:translateX(0px) rotate(0deg)}100%{opacity:0;-o-transform:translateX(100%) rotate(120deg)}}@keyframes rollOut{0%{opacity:1;transform:translateX(0px) rotate(0deg)}100%{opacity:0;transform:translateX(100%) rotate(120deg)}}.animated.rollOut{-webkit-animation-name:rollOut;-moz-animation-name:rollOut;-o-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translateX(100%) skewX(-30deg);opacity:0}60%{-webkit-transform:translateX(-20%) skewX(30deg);opacity:1}80%{-webkit-transform:translateX(0%) skewX(-15deg);opacity:1}100%{-webkit-transform:translateX(0%) skewX(0deg);opacity:1}}@-moz-keyframes lightSpeedIn{0%{-moz-transform:translateX(100%) skewX(-30deg);opacity:0}60%{-moz-transform:translateX(-20%) skewX(30deg);opacity:1}80%{-moz-transform:translateX(0%) skewX(-15deg);opacity:1}100%{-moz-transform:translateX(0%) skewX(0deg);opacity:1}}@-o-keyframes lightSpeedIn{0%{-o-transform:translateX(100%) skewX(-30deg);opacity:0}60%{-o-transform:translateX(-20%) skewX(30deg);opacity:1}80%{-o-transform:translateX(0%) skewX(-15deg);opacity:1}100%{-o-transform:translateX(0%) skewX(0deg);opacity:1}}@keyframes lightSpeedIn{0%{transform:translateX(100%) skewX(-30deg);opacity:0}60%{transform:translateX(-20%) skewX(30deg);opacity:1}80%{transform:translateX(0%) skewX(-15deg);opacity:1}100%{transform:translateX(0%) skewX(0deg);opacity:1}}.animated.lightSpeedIn{-webkit-animation-name:lightSpeedIn;-moz-animation-name:lightSpeedIn;-o-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}.animated.lightSpeedIn{-webkit-animation-duration:.5s;-moz-animation-duration:.5s;-o-animation-duration:.5s;animation-duration:.5s}@-webkit-keyframes lightSpeedOut{0%{-webkit-transform:translateX(0%) skewX(0deg);opacity:1}100%{-webkit-transform:translateX(100%) skewX(-30deg);opacity:0}}@-moz-keyframes lightSpeedOut{0%{-moz-transform:translateX(0%) skewX(0deg);opacity:1}100%{-moz-transform:translateX(100%) skewX(-30deg);opacity:0}}@-o-keyframes lightSpeedOut{0%{-o-transform:translateX(0%) skewX(0deg);opacity:1}100%{-o-transform:translateX(100%) skewX(-30deg);opacity:0}}@keyframes lightSpeedOut{0%{transform:translateX(0%) skewX(0deg);opacity:1}100%{transform:translateX(100%) skewX(-30deg);opacity:0}}.animated.lightSpeedOut{-webkit-animation-name:lightSpeedOut;-moz-animation-name:lightSpeedOut;-o-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;-moz-animation-timing-function:ease-in;-o-animation-timing-function:ease-in;animation-timing-function:ease-in}.animated.lightSpeedOut{-webkit-animation-duration:.25s;-moz-animation-duration:.25s;-o-animation-duration:.25s;animation-duration:.25s}@-webkit-keyframes wiggle{0%{-webkit-transform:skewX(9deg)}10%{-webkit-transform:skewX(-8deg)}20%{-webkit-transform:skewX(7deg)}30%{-webkit-transform:skewX(-6deg)}40%{-webkit-transform:skewX(5deg)}50%{-webkit-transform:skewX(-4deg)}60%{-webkit-transform:skewX(3deg)}70%{-webkit-transform:skewX(-2deg)}80%{-webkit-transform:skewX(1deg)}90%{-webkit-transform:skewX(0deg)}100%{-webkit-transform:skewX(0deg)}}@-moz-keyframes wiggle{0%{-moz-transform:skewX(9deg)}10%{-moz-transform:skewX(-8deg)}20%{-moz-transform:skewX(7deg)}30%{-moz-transform:skewX(-6deg)}40%{-moz-transform:skewX(5deg)}50%{-moz-transform:skewX(-4deg)}60%{-moz-transform:skewX(3deg)}70%{-moz-transform:skewX(-2deg)}80%{-moz-transform:skewX(1deg)}90%{-moz-transform:skewX(0deg)}100%{-moz-transform:skewX(0deg)}}@-o-keyframes wiggle{0%{-o-transform:skewX(9deg)}10%{-o-transform:skewX(-8deg)}20%{-o-transform:skewX(7deg)}30%{-o-transform:skewX(-6deg)}40%{-o-transform:skewX(5deg)}50%{-o-transform:skewX(-4deg)}60%{-o-transform:skewX(3deg)}70%{-o-transform:skewX(-2deg)}80%{-o-transform:skewX(1deg)}90%{-o-transform:skewX(0deg)}100%{-o-transform:skewX(0deg)}}@keyframes wiggle{0%{transform:skewX(9deg)}10%{transform:skewX(-8deg)}20%{transform:skewX(7deg)}30%{transform:skewX(-6deg)}40%{transform:skewX(5deg)}50%{transform:skewX(-4deg)}60%{transform:skewX(3deg)}70%{transform:skewX(-2deg)}80%{transform:skewX(1deg)}90%{transform:skewX(0deg)}100%{transform:skewX(0deg)}}.animated.wiggle{-webkit-animation-name:wiggle;-moz-animation-name:wiggle;-o-animation-name:wiggle;animation-name:wiggle;-webkit-animation-timing-function:ease-in;-moz-animation-timing-function:ease-in;-o-animation-timing-function:ease-in;animation-timing-function:ease-in}.animated.wiggle{-webkit-animation-duration:.75s;-moz-animation-duration:.75s;-o-animation-duration:.75s;animation-duration:.75s} \ No newline at end of file diff --git a/assets/css/lib/bootstrap-3.0.0.css b/assets/css/lib/bootstrap-3.0.0.css new file mode 100644 index 0000000..305f6e2 --- /dev/null +++ b/assets/css/lib/bootstrap-3.0.0.css @@ -0,0 +1,6845 @@ +/*! + * Bootstrap v3.0.0 + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */ + + +/*! normalize.css v2.1.0 | MIT License | git.io/normalize */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block +} + +audio, +canvas, +video { + display: inline-block +} + +audio:not([controls]) { + display: none; + height: 0 +} + +[hidden] { + display: none +} + +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100% +} + +body { + margin: 0 +} + +a:focus { + outline: thin dotted +} + +a:active, +a:hover { + outline: 0 +} + +h1 { + margin: .67em 0; + font-size: 2em +} + +abbr[title] { + border-bottom: 1px dotted +} + +b, +strong { + font-weight: bold +} + +dfn { + font-style: italic +} + +hr { + height: 0; + -moz-box-sizing: content-box; + box-sizing: content-box +} + +mark { + color: #000; + background: #ff0 +} + +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em +} + +pre { + white-space: pre-wrap +} + +q { + quotes: "\201C" "\201D" "\2018" "\2019" +} + +small { + font-size: 80% +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline +} + +sup { + top: -0.5em +} + +sub { + bottom: -0.25em +} + +img { + border: 0 +} + +svg:not(:root) { + overflow: hidden +} + +figure { + margin: 0 +} + +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0 +} + +legend { + padding: 0; + border: 0 +} + +button, +input, +select, +textarea { + margin: 0; + font-family: inherit; + font-size: 100% +} + +button, +input { + line-height: normal +} + +button, +select { + text-transform: none +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button +} + +button[disabled], +html input[disabled] { + cursor: default +} + +input[type="checkbox"], +input[type="radio"] { + padding: 0; + box-sizing: border-box +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield +} + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0 +} + +textarea { + overflow: auto; + vertical-align: top +} + +table { + border-collapse: collapse; + border-spacing: 0 +} + +@media print { + * { + color: #000!important; + text-shadow: none!important; + background: transparent!important; + box-shadow: none!important + } + a, + a:visited { + text-decoration: underline + } + a[href]:after { + content: " (" attr(href) ")" + } + abbr[title]:after { + content: " (" attr(title) ")" + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: "" + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid + } + thead { + display: table-header-group + } + tr, + img { + page-break-inside: avoid + } + img { + max-width: 100%!important + } + @page { + margin: 2cm .5cm + } + p, + h2, + h3 { + orphans: 3; + widows: 3 + } + h2, + h3 { + page-break-after: avoid + } + .navbar { + display: none + } + .table td, + .table th { + background-color: #fff!important + } + .btn>.caret, + .dropup>.btn>.caret { + border-top-color: #000!important + } + .label { + border: 1px solid #000 + } + .table { + border-collapse: collapse!important + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd!important + } +} + +*, +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +html { + font-size: 62.5%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0) +} + +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.428571429; + color: #333; + background-color: #fff +} + +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit +} + +button, +input, +select[multiple], +textarea { + background-image: none +} + +a { + color: #428bca; + text-decoration: none +} + +a:hover, +a:focus { + color: #2a6496; + text-decoration: underline +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px +} + +img { + vertical-align: middle +} + +.img-responsive { + display: block; + height: auto; + max-width: 100% +} + +.img-rounded { + border-radius: 6px +} + +.img-thumbnail { + display: inline-block; + height: auto; + max-width: 100%; + padding: 4px; + line-height: 1.428571429; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + transition: all .2s ease-in-out +} + +.img-circle { + border-radius: 50% +} + +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0 0 0 0); + border: 0 +} + +p { + margin: 0 0 10px +} + +.lead { + margin-bottom: 20px; + font-size: 16.099999999999998px; + font-weight: 200; + line-height: 1.4 +} + +@media(min-width:768px) { + .lead { + font-size: 21px + } +} + +small { + font-size: 85% +} + +cite { + font-style: normal +} + +.text-muted { + color: #999 +} + +.text-primary { + color: #428bca +} + +.text-warning { + color: #c09853 +} + +.text-danger { + color: #b94a48 +} + +.text-success { + color: #468847 +} + +.text-info { + color: #3a87ad +} + +.text-left { + text-align: left +} + +.text-right { + text-align: right +} + +.text-center { + text-align: center +} + +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 500; + line-height: 1.1 +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small { + font-weight: normal; + line-height: 1; + color: #999 +} + +h1, +h2, +h3 { + margin-top: 20px; + margin-bottom: 10px +} + +h4, +h5, +h6 { + margin-top: 10px; + margin-bottom: 10px +} + +h1, +.h1 { + font-size: 36px +} + +h2, +.h2 { + font-size: 30px +} + +h3, +.h3 { + font-size: 24px +} + +h4, +.h4 { + font-size: 18px +} + +h5, +.h5 { + font-size: 14px +} + +h6, +.h6 { + font-size: 12px +} + +h1 small, +.h1 small { + font-size: 24px +} + +h2 small, +.h2 small { + font-size: 18px +} + +h3 small, +.h3 small, +h4 small, +.h4 small { + font-size: 14px +} + +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee +} + +ul, +ol { + margin-top: 0; + margin-bottom: 10px +} + +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0 +} + +.list-unstyled { + padding-left: 0; + list-style: none +} + +.list-inline { + padding-left: 0; + list-style: none +} + +.list-inline>li { + display: inline-block; + padding-right: 5px; + padding-left: 5px +} + +dl { + margin-bottom: 20px +} + +dt, +dd { + line-height: 1.428571429 +} + +dt { + font-weight: bold +} + +dd { + margin-left: 0 +} + +@media(min-width:768px) { + .dl-horizontal dt { + float: left; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap + } + .dl-horizontal dd { + margin-left: 150px + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + display: table; + content: " " + } + .dl-horizontal dd:after { + clear: both + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + display: table; + content: " " + } + .dl-horizontal dd:after { + clear: both + } +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999 +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase +} + +blockquote { + padding: 10px 0px; + margin: 0 0 0px; + border-left: 5px solid #eee +} + +blockquote p { + font-size: 17.5px; + font-weight: 300; + line-height: 1.25 +} + +blockquote p:last-child { + margin-bottom: 0 +} + +blockquote small { + display: block; + line-height: 1.428571429; + color: #999 +} + +blockquote small:before { + content: '\2014 \00A0' +} + +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eee; + border-left: 0 +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right +} + +blockquote.pull-right small:before { + content: '' +} + +blockquote.pull-right small:after { + content: '\00A0 \2014' +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: "" +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 1.428571429 +} + +code, +pre { + font-family: Monaco, Menlo, Consolas, "Courier New", monospace +} + +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + white-space: nowrap; + background-color: #f9f2f4; + border-radius: 4px +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.428571429; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px +} + +pre.prettyprint { + margin-bottom: 20px +} + +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border: 0 +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll +} + +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto +} + +.container:before, +.container:after { + display: table; + content: " " +} + +.container:after { + clear: both +} + +.container:before, +.container:after { + display: table; + content: " " +} + +.container:after { + clear: both +} + +.row { + margin-right: -15px; + margin-left: -15px +} + +.row:before, +.row:after { + display: table; + content: " " +} + +.row:after { + clear: both +} + +.row:before, +.row:after { + display: table; + content: " " +} + +.row:after { + clear: both +} + +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} + +table { + max-width: 100%; + background-color: transparent +} + +th { + text-align: left +} + +.table { + width: 100%; + margin-bottom: 20px +} + +.table thead>tr>th, +.table tbody>tr>th, +.table tfoot>tr>th, +.table thead>tr>td, +.table tbody>tr>td, +.table tfoot>tr>td { + padding: 8px; + line-height: 1.428571429; + vertical-align: top; + border-top: 1px solid #ddd +} + +.table thead>tr>th { + vertical-align: bottom; + border-bottom: 2px solid #ddd +} + +.table caption+thead tr:first-child th, +.table colgroup+thead tr:first-child th, +.table thead:first-child tr:first-child th, +.table caption+thead tr:first-child td, +.table colgroup+thead tr:first-child td, +.table thead:first-child tr:first-child td { + border-top: 0 +} + +.table tbody+tbody { + border-top: 2px solid #ddd +} + +.table .table { + background-color: #fff +} + +.table-condensed thead>tr>th, +.table-condensed tbody>tr>th, +.table-condensed tfoot>tr>th, +.table-condensed thead>tr>td, +.table-condensed tbody>tr>td, +.table-condensed tfoot>tr>td { + padding: 5px +} + +.table-bordered { + border: 1px solid #ddd +} + +.table-bordered>thead>tr>th, +.table-bordered>tbody>tr>th, +.table-bordered>tfoot>tr>th, +.table-bordered>thead>tr>td, +.table-bordered>tbody>tr>td, +.table-bordered>tfoot>tr>td { + border: 1px solid #ddd +} + +.table-bordered>thead>tr>th, +.table-bordered>thead>tr>td { + border-bottom-width: 2px +} + +.table-striped>tbody>tr:nth-child(odd)>td, +.table-striped>tbody>tr:nth-child(odd)>th { + background-color: #f9f9f9 +} + +.table-hover>tbody>tr:hover>td, +.table-hover>tbody>tr:hover>th { + background-color: #f5f5f5 +} + +table col[class*="col-"] { + display: table-column; + float: none +} + +table td[class*="col-"], +table th[class*="col-"] { + display: table-cell; + float: none +} + +.table>thead>tr>td.active, +.table>tbody>tr>td.active, +.table>tfoot>tr>td.active, +.table>thead>tr>th.active, +.table>tbody>tr>th.active, +.table>tfoot>tr>th.active, +.table>thead>tr.active>td, +.table>tbody>tr.active>td, +.table>tfoot>tr.active>td, +.table>thead>tr.active>th, +.table>tbody>tr.active>th, +.table>tfoot>tr.active>th { + background-color: #f5f5f5 +} + +.table>thead>tr>td.success, +.table>tbody>tr>td.success, +.table>tfoot>tr>td.success, +.table>thead>tr>th.success, +.table>tbody>tr>th.success, +.table>tfoot>tr>th.success, +.table>thead>tr.success>td, +.table>tbody>tr.success>td, +.table>tfoot>tr.success>td, +.table>thead>tr.success>th, +.table>tbody>tr.success>th, +.table>tfoot>tr.success>th { + background-color: #dff0d8; + border-color: #d6e9c6 +} + +.table-hover>tbody>tr>td.success:hover, +.table-hover>tbody>tr>th.success:hover, +.table-hover>tbody>tr.success:hover>td { + background-color: #d0e9c6; + border-color: #c9e2b3 +} + +.table>thead>tr>td.danger, +.table>tbody>tr>td.danger, +.table>tfoot>tr>td.danger, +.table>thead>tr>th.danger, +.table>tbody>tr>th.danger, +.table>tfoot>tr>th.danger, +.table>thead>tr.danger>td, +.table>tbody>tr.danger>td, +.table>tfoot>tr.danger>td, +.table>thead>tr.danger>th, +.table>tbody>tr.danger>th, +.table>tfoot>tr.danger>th { + background-color: #f2dede; + border-color: #eed3d7 +} + +.table-hover>tbody>tr>td.danger:hover, +.table-hover>tbody>tr>th.danger:hover, +.table-hover>tbody>tr.danger:hover>td { + background-color: #ebcccc; + border-color: #e6c1c7 +} + +.table>thead>tr>td.warning, +.table>tbody>tr>td.warning, +.table>tfoot>tr>td.warning, +.table>thead>tr>th.warning, +.table>tbody>tr>th.warning, +.table>tfoot>tr>th.warning, +.table>thead>tr.warning>td, +.table>tbody>tr.warning>td, +.table>tfoot>tr.warning>td, +.table>thead>tr.warning>th, +.table>tbody>tr.warning>th, +.table>tfoot>tr.warning>th { + background-color: #fcf8e3; + border-color: #fbeed5 +} + +.table-hover>tbody>tr>td.warning:hover, +.table-hover>tbody>tr>th.warning:hover, +.table-hover>tbody>tr.warning:hover>td { + background-color: #faf2cc; + border-color: #f8e5be +} + +@media(max-width:768px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-x: scroll; + overflow-y: hidden; + border: 1px solid #ddd + } + .table-responsive>.table { + margin-bottom: 0; + background-color: #fff + } + .table-responsive>.table>thead>tr>th, + .table-responsive>.table>tbody>tr>th, + .table-responsive>.table>tfoot>tr>th, + .table-responsive>.table>thead>tr>td, + .table-responsive>.table>tbody>tr>td, + .table-responsive>.table>tfoot>tr>td { + white-space: nowrap + } + .table-responsive>.table-bordered { + border: 0 + } + .table-responsive>.table-bordered>thead>tr>th:first-child, + .table-responsive>.table-bordered>tbody>tr>th:first-child, + .table-responsive>.table-bordered>tfoot>tr>th:first-child, + .table-responsive>.table-bordered>thead>tr>td:first-child, + .table-responsive>.table-bordered>tbody>tr>td:first-child, + .table-responsive>.table-bordered>tfoot>tr>td:first-child { + border-left: 0 + } + .table-responsive>.table-bordered>thead>tr>th:last-child, + .table-responsive>.table-bordered>tbody>tr>th:last-child, + .table-responsive>.table-bordered>tfoot>tr>th:last-child, + .table-responsive>.table-bordered>thead>tr>td:last-child, + .table-responsive>.table-bordered>tbody>tr>td:last-child, + .table-responsive>.table-bordered>tfoot>tr>td:last-child { + border-right: 0 + } + .table-responsive>.table-bordered>thead>tr:last-child>th, + .table-responsive>.table-bordered>tbody>tr:last-child>th, + .table-responsive>.table-bordered>tfoot>tr:last-child>th, + .table-responsive>.table-bordered>thead>tr:last-child>td, + .table-responsive>.table-bordered>tbody>tr:last-child>td, + .table-responsive>.table-bordered>tfoot>tr:last-child>td { + border-bottom: 0 + } +} + +fieldset { + padding: 0; + margin: 0; + border: 0 +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5 +} + +label { + display: inline-block; + margin-bottom: 5px; + font-weight: bold +} + +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal +} + +input[type="file"] { + display: block +} + +select[multiple], +select[size] { + height: auto +} + +select optgroup { + font-family: inherit; + font-size: inherit; + font-style: inherit +} + +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px +} + +input[type="number"]::-webkit-outer-spin-button, +input[type="number"]::-webkit-inner-spin-button { + height: auto +} + +.form-control:-moz-placeholder { + color: #999 +} + +.form-control::-moz-placeholder { + color: #999 +} + +.form-control:-ms-input-placeholder { + color: #999 +} + +.form-control::-webkit-input-placeholder { + color: #999 +} + +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.428571429; + color: #555; + vertical-align: middle; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s +} + +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6) +} + +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #eee +} + +textarea.form-control { + height: auto +} + +.form-group { + margin-bottom: 15px +} + +.radio, +.checkbox { + display: block; + min-height: 20px; + padding-left: 20px; + margin-top: 10px; + margin-bottom: 10px; + vertical-align: middle +} + +.radio label, +.checkbox label { + display: inline; + margin-bottom: 0; + font-weight: normal; + cursor: pointer +} + +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + float: left; + margin-left: -20px +} + +.radio+.radio, +.checkbox+.checkbox { + margin-top: -5px +} + +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer +} + +.radio-inline+.radio-inline, +.checkbox-inline+.checkbox-inline { + margin-top: 0; + margin-left: 10px +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +.radio[disabled], +.radio-inline[disabled], +.checkbox[disabled], +.checkbox-inline[disabled], +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"], +fieldset[disabled] .radio, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed +} + +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} + +select.input-sm { + height: 30px; + line-height: 30px +} + +textarea.input-sm { + height: auto +} + +.input-lg { + height: 45px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px +} + +select.input-lg { + height: 45px; + line-height: 45px +} + +textarea.input-lg { + height: auto +} + +.has-warning .help-block, +.has-warning .control-label { + color: #c09853 +} + +.has-warning .form-control { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) +} + +.has-warning .form-control:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e +} + +.has-warning .input-group-addon { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853 +} + +.has-error .help-block, +.has-error .control-label { + color: #b94a48 +} + +.has-error .form-control { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) +} + +.has-error .form-control:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392 +} + +.has-error .input-group-addon { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48 +} + +.has-success .help-block, +.has-success .control-label { + color: #468847 +} + +.has-success .form-control { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) +} + +.has-success .form-control:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b +} + +.has-success .input-group-addon { + color: #468847; + background-color: #dff0d8; + border-color: #468847 +} + +.form-control-static { + padding-top: 7px; + margin-bottom: 0 +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373 +} + +@media(min-width:768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle + } + .form-inline .form-control { + display: inline-block + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + padding-left: 0; + margin-top: 0; + margin-bottom: 0 + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + float: none; + margin-left: 0 + } +} + +.form-horizontal .control-label, +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0 +} + +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px +} + +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + display: table; + content: " " +} + +.form-horizontal .form-group:after { + clear: both +} + +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + display: table; + content: " " +} + +.form-horizontal .form-group:after { + clear: both +} + +@media(min-width:768px) { + .form-horizontal .control-label { + text-align: right + } +} + +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.428571429; + text-align: center; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + border: 1px solid transparent; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px +} + +.btn:hover, +.btn:focus { + color: #333; + text-decoration: none +} + +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125) +} + +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + pointer-events: none; + cursor: not-allowed; + opacity: .65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none +} + +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc +} + +.btn-default:hover, +.btn-default:focus, +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + color: #333; + background-color: #ebebeb; + border-color: #adadad +} + +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + background-image: none +} + +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc +} + +.btn-primary { + color: #fff; + background-color: #428bca; + border-color: #357ebd +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + color: #fff; + background-color: #3276b1; + border-color: #285e8e +} + +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-image: none +} + +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #428bca; + border-color: #357ebd +} + +.btn-orange { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236 +} + +.btn-orange:hover, +.btn-orange:focus, +.btn-orange:active, +.btn-orange.active, +.open .dropdown-toggle.btn-orange { + color: #fff; + background-color: #ed9c28; + border-color: #d58512 +} + +.btn-orange:active, +.btn-orange.active, +.open .dropdown-toggle.btn-orange { + background-image: none +} + +.btn-orange.disabled, +.btn-orange[disabled], +fieldset[disabled] .btn-orange, +.btn-orange.disabled:hover, +.btn-orange[disabled]:hover, +fieldset[disabled] .btn-orange:hover, +.btn-orange.disabled:focus, +.btn-orange[disabled]:focus, +fieldset[disabled] .btn-orange:focus, +.btn-orange.disabled:active, +.btn-orange[disabled]:active, +fieldset[disabled] .btn-orange:active, +.btn-orange.disabled.active, +.btn-orange[disabled].active, +fieldset[disabled] .btn-orange.active { + background-color: #f0ad4e; + border-color: #eea236 +} + +.btn-red { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a +} + +.btn-red:hover, +.btn-red:focus, +.btn-red:active, +.btn-red.active, +.open .dropdown-toggle.btn-red { + color: #fff; + background-color: #d2322d; + border-color: #ac2925 +} + +.btn-red:active, +.btn-red.active, +.open .dropdown-toggle.btn-red { + background-image: none +} + +.btn-red.disabled, +.btn-red[disabled], +fieldset[disabled] .btn-red, +.btn-red.disabled:hover, +.btn-red[disabled]:hover, +fieldset[disabled] .btn-red:hover, +.btn-red.disabled:focus, +.btn-red[disabled]:focus, +fieldset[disabled] .btn-red:focus, +.btn-red.disabled:active, +.btn-red[disabled]:active, +fieldset[disabled] .btn-red:active, +.btn-red.disabled.active, +.btn-red[disabled].active, +fieldset[disabled] .btn-red.active { + background-color: #d9534f; + border-color: #d43f3a +} + +.btn-green { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c +} + +.btn-green:hover, +.btn-green:focus, +.btn-green:active, +.btn-green.active, +.open .dropdown-toggle.btn-green { + color: #fff; + background-color: #47a447; + border-color: #398439 +} + +.btn-green:active, +.btn-green.active, +.open .dropdown-toggle.btn-green { + background-image: none +} + +.btn-green.disabled, +.btn-green[disabled], +fieldset[disabled] .btn-green, +.btn-green.disabled:hover, +.btn-green[disabled]:hover, +fieldset[disabled] .btn-green:hover, +.btn-green.disabled:focus, +.btn-green[disabled]:focus, +fieldset[disabled] .btn-green:focus, +.btn-green.disabled:active, +.btn-green[disabled]:active, +fieldset[disabled] .btn-green:active, +.btn-green.disabled.active, +.btn-green[disabled].active, +fieldset[disabled] .btn-green.active { + background-color: #5cb85c; + border-color: #4cae4c +} + +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + color: #fff; + background-color: #39b3d7; + border-color: #269abc +} + +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + background-image: none +} + +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da +} + +.btn-link { + font-weight: normal; + color: #428bca; + cursor: pointer; + border-radius: 0 +} + +.btn-link, +.btn-link:active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none +} + +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent +} + +.btn-link:hover, +.btn-link:focus { + color: #2a6496; + text-decoration: underline; + background-color: transparent +} + +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #999; + text-decoration: none +} + +.btn-lg { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px +} + +.btn-sm, +.btn-xs { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} + +.btn-xs { + padding: 1px 5px +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0 +} + +.btn-block+.btn-block { + margin-top: 5px +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100% +} + +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + transition: opacity .15s linear +} + +.fade.in { + opacity: 1 +} + +.collapse { + display: none +} + +.collapse.in { + display: block +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height .35s ease; + transition: height .35s ease +} + +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('../../fonts/glyphicons-halflings-regular.eot'); + src: url('../../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg') +} + +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + -webkit-font-smoothing: antialiased; + font-style: normal; + font-weight: normal; + line-height: 1 +} + +.glyphicon-asterisk:before { + content: "\2a" +} + +.glyphicon-plus:before { + content: "\2b" +} + +.glyphicon-euro:before { + content: "\20ac" +} + +.glyphicon-minus:before { + content: "\2212" +} + +.glyphicon-cloud:before { + content: "\2601" +} + +.glyphicon-envelope:before { + content: "\2709" +} + +.glyphicon-pencil:before { + content: "\270f" +} + +.glyphicon-glass:before { + content: "\e001" +} + +.glyphicon-music:before { + content: "\e002" +} + +.glyphicon-search:before { + content: "\e003" +} + +.glyphicon-heart:before { + content: "\e005" +} + +.glyphicon-star:before { + content: "\e006" +} + +.glyphicon-star-empty:before { + content: "\e007" +} + +.glyphicon-user:before { + content: "\e008" +} + +.glyphicon-film:before { + content: "\e009" +} + +.glyphicon-th-large:before { + content: "\e010" +} + +.glyphicon-th:before { + content: "\e011" +} + +.glyphicon-th-list:before { + content: "\e012" +} + +.glyphicon-ok:before { + content: "\e013" +} + +.glyphicon-remove:before { + content: "\e014" +} + +.glyphicon-zoom-in:before { + content: "\e015" +} + +.glyphicon-zoom-out:before { + content: "\e016" +} + +.glyphicon-off:before { + content: "\e017" +} + +.glyphicon-signal:before { + content: "\e018" +} + +.glyphicon-cog:before { + content: "\e019" +} + +.glyphicon-trash:before { + content: "\e020" +} + +.glyphicon-home:before { + content: "\e021" +} + +.glyphicon-file:before { + content: "\e022" +} + +.glyphicon-time:before { + content: "\e023" +} + +.glyphicon-road:before { + content: "\e024" +} + +.glyphicon-download-alt:before { + content: "\e025" +} + +.glyphicon-download:before { + content: "\e026" +} + +.glyphicon-upload:before { + content: "\e027" +} + +.glyphicon-inbox:before { + content: "\e028" +} + +.glyphicon-play-circle:before { + content: "\e029" +} + +.glyphicon-repeat:before { + content: "\e030" +} + +.glyphicon-refresh:before { + content: "\e031" +} + +.glyphicon-list-alt:before { + content: "\e032" +} + +.glyphicon-flag:before { + content: "\e034" +} + +.glyphicon-headphones:before { + content: "\e035" +} + +.glyphicon-volume-off:before { + content: "\e036" +} + +.glyphicon-volume-down:before { + content: "\e037" +} + +.glyphicon-volume-up:before { + content: "\e038" +} + +.glyphicon-qrcode:before { + content: "\e039" +} + +.glyphicon-barcode:before { + content: "\e040" +} + +.glyphicon-tag:before { + content: "\e041" +} + +.glyphicon-tags:before { + content: "\e042" +} + +.glyphicon-book:before { + content: "\e043" +} + +.glyphicon-print:before { + content: "\e045" +} + +.glyphicon-font:before { + content: "\e047" +} + +.glyphicon-bold:before { + content: "\e048" +} + +.glyphicon-italic:before { + content: "\e049" +} + +.glyphicon-text-height:before { + content: "\e050" +} + +.glyphicon-text-width:before { + content: "\e051" +} + +.glyphicon-align-left:before { + content: "\e052" +} + +.glyphicon-align-center:before { + content: "\e053" +} + +.glyphicon-align-right:before { + content: "\e054" +} + +.glyphicon-align-justify:before { + content: "\e055" +} + +.glyphicon-list:before { + content: "\e056" +} + +.glyphicon-indent-left:before { + content: "\e057" +} + +.glyphicon-indent-right:before { + content: "\e058" +} + +.glyphicon-facetime-video:before { + content: "\e059" +} + +.glyphicon-picture:before { + content: "\e060" +} + +.glyphicon-map-marker:before { + content: "\e062" +} + +.glyphicon-adjust:before { + content: "\e063" +} + +.glyphicon-tint:before { + content: "\e064" +} + +.glyphicon-edit:before { + content: "\e065" +} + +.glyphicon-share:before { + content: "\e066" +} + +.glyphicon-check:before { + content: "\e067" +} + +.glyphicon-move:before { + content: "\e068" +} + +.glyphicon-step-backward:before { + content: "\e069" +} + +.glyphicon-fast-backward:before { + content: "\e070" +} + +.glyphicon-backward:before { + content: "\e071" +} + +.glyphicon-play:before { + content: "\e072" +} + +.glyphicon-pause:before { + content: "\e073" +} + +.glyphicon-stop:before { + content: "\e074" +} + +.glyphicon-forward:before { + content: "\e075" +} + +.glyphicon-fast-forward:before { + content: "\e076" +} + +.glyphicon-step-forward:before { + content: "\e077" +} + +.glyphicon-eject:before { + content: "\e078" +} + +.glyphicon-chevron-left:before { + content: "\e079" +} + +.glyphicon-chevron-right:before { + content: "\e080" +} + +.glyphicon-plus-sign:before { + content: "\e081" +} + +.glyphicon-minus-sign:before { + content: "\e082" +} + +.glyphicon-remove-sign:before { + content: "\e083" +} + +.glyphicon-ok-sign:before { + content: "\e084" +} + +.glyphicon-question-sign:before { + content: "\e085" +} + +.glyphicon-info-sign:before { + content: "\e086" +} + +.glyphicon-screenshot:before { + content: "\e087" +} + +.glyphicon-remove-circle:before { + content: "\e088" +} + +.glyphicon-ok-circle:before { + content: "\e089" +} + +.glyphicon-ban-circle:before { + content: "\e090" +} + +.glyphicon-arrow-left:before { + content: "\e091" +} + +.glyphicon-arrow-right:before { + content: "\e092" +} + +.glyphicon-arrow-up:before { + content: "\e093" +} + +.glyphicon-arrow-down:before { + content: "\e094" +} + +.glyphicon-share-alt:before { + content: "\e095" +} + +.glyphicon-resize-full:before { + content: "\e096" +} + +.glyphicon-resize-small:before { + content: "\e097" +} + +.glyphicon-exclamation-sign:before { + content: "\e101" +} + +.glyphicon-gift:before { + content: "\e102" +} + +.glyphicon-leaf:before { + content: "\e103" +} + +.glyphicon-eye-open:before { + content: "\e105" +} + +.glyphicon-eye-close:before { + content: "\e106" +} + +.glyphicon-warning-sign:before { + content: "\e107" +} + +.glyphicon-plane:before { + content: "\e108" +} + +.glyphicon-random:before { + content: "\e110" +} + +.glyphicon-comment:before { + content: "\e111" +} + +.glyphicon-magnet:before { + content: "\e112" +} + +.glyphicon-chevron-up:before { + content: "\e113" +} + +.glyphicon-chevron-down:before { + content: "\e114" +} + +.glyphicon-retweet:before { + content: "\e115" +} + +.glyphicon-shopping-cart:before { + content: "\e116" +} + +.glyphicon-folder-close:before { + content: "\e117" +} + +.glyphicon-folder-open:before { + content: "\e118" +} + +.glyphicon-resize-vertical:before { + content: "\e119" +} + +.glyphicon-resize-horizontal:before { + content: "\e120" +} + +.glyphicon-hdd:before { + content: "\e121" +} + +.glyphicon-bullhorn:before { + content: "\e122" +} + +.glyphicon-certificate:before { + content: "\e124" +} + +.glyphicon-thumbs-up:before { + content: "\e125" +} + +.glyphicon-thumbs-down:before { + content: "\e126" +} + +.glyphicon-hand-right:before { + content: "\e127" +} + +.glyphicon-hand-left:before { + content: "\e128" +} + +.glyphicon-hand-up:before { + content: "\e129" +} + +.glyphicon-hand-down:before { + content: "\e130" +} + +.glyphicon-circle-arrow-right:before { + content: "\e131" +} + +.glyphicon-circle-arrow-left:before { + content: "\e132" +} + +.glyphicon-circle-arrow-up:before { + content: "\e133" +} + +.glyphicon-circle-arrow-down:before { + content: "\e134" +} + +.glyphicon-globe:before { + content: "\e135" +} + +.glyphicon-tasks:before { + content: "\e137" +} + +.glyphicon-filter:before { + content: "\e138" +} + +.glyphicon-fullscreen:before { + content: "\e140" +} + +.glyphicon-dashboard:before { + content: "\e141" +} + +.glyphicon-heart-empty:before { + content: "\e143" +} + +.glyphicon-link:before { + content: "\e144" +} + +.glyphicon-phone:before { + content: "\e145" +} + +.glyphicon-usd:before { + content: "\e148" +} + +.glyphicon-gbp:before { + content: "\e149" +} + +.glyphicon-sort:before { + content: "\e150" +} + +.glyphicon-sort-by-alphabet:before { + content: "\e151" +} + +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152" +} + +.glyphicon-sort-by-order:before { + content: "\e153" +} + +.glyphicon-sort-by-order-alt:before { + content: "\e154" +} + +.glyphicon-sort-by-attributes:before { + content: "\e155" +} + +.glyphicon-sort-by-attributes-alt:before { + content: "\e156" +} + +.glyphicon-unchecked:before { + content: "\e157" +} + +.glyphicon-expand:before { + content: "\e158" +} + +.glyphicon-collapse-down:before { + content: "\e159" +} + +.glyphicon-collapse-up:before { + content: "\e160" +} + +.glyphicon-log-in:before { + content: "\e161" +} + +.glyphicon-flash:before { + content: "\e162" +} + +.glyphicon-log-out:before { + content: "\e163" +} + +.glyphicon-new-window:before { + content: "\e164" +} + +.glyphicon-record:before { + content: "\e165" +} + +.glyphicon-save:before { + content: "\e166" +} + +.glyphicon-open:before { + content: "\e167" +} + +.glyphicon-saved:before { + content: "\e168" +} + +.glyphicon-import:before { + content: "\e169" +} + +.glyphicon-export:before { + content: "\e170" +} + +.glyphicon-send:before { + content: "\e171" +} + +.glyphicon-floppy-disk:before { + content: "\e172" +} + +.glyphicon-floppy-saved:before { + content: "\e173" +} + +.glyphicon-floppy-remove:before { + content: "\e174" +} + +.glyphicon-floppy-save:before { + content: "\e175" +} + +.glyphicon-floppy-open:before { + content: "\e176" +} + +.glyphicon-credit-card:before { + content: "\e177" +} + +.glyphicon-transfer:before { + content: "\e178" +} + +.glyphicon-cutlery:before { + content: "\e179" +} + +.glyphicon-header:before { + content: "\e180" +} + +.glyphicon-compressed:before { + content: "\e181" +} + +.glyphicon-earphone:before { + content: "\e182" +} + +.glyphicon-phone-alt:before { + content: "\e183" +} + +.glyphicon-tower:before { + content: "\e184" +} + +.glyphicon-stats:before { + content: "\e185" +} + +.glyphicon-sd-video:before { + content: "\e186" +} + +.glyphicon-hd-video:before { + content: "\e187" +} + +.glyphicon-subtitles:before { + content: "\e188" +} + +.glyphicon-sound-stereo:before { + content: "\e189" +} + +.glyphicon-sound-dolby:before { + content: "\e190" +} + +.glyphicon-sound-5-1:before { + content: "\e191" +} + +.glyphicon-sound-6-1:before { + content: "\e192" +} + +.glyphicon-sound-7-1:before { + content: "\e193" +} + +.glyphicon-copyright-mark:before { + content: "\e194" +} + +.glyphicon-registration-mark:before { + content: "\e195" +} + +.glyphicon-cloud-download:before { + content: "\e197" +} + +.glyphicon-cloud-upload:before { + content: "\e198" +} + +.glyphicon-tree-conifer:before { + content: "\e199" +} + +.glyphicon-tree-deciduous:before { + content: "\e200" +} + +.glyphicon-briefcase:before { + content: "\1f4bc" +} + +.glyphicon-calendar:before { + content: "\1f4c5" +} + +.glyphicon-pushpin:before { + content: "\1f4cc" +} + +.glyphicon-paperclip:before { + content: "\1f4ce" +} + +.glyphicon-camera:before { + content: "\1f4f7" +} + +.glyphicon-lock:before { + content: "\1f512" +} + +.glyphicon-bell:before { + content: "\1f514" +} + +.glyphicon-bookmark:before { + content: "\1f516" +} + +.glyphicon-fire:before { + content: "\1f525" +} + +.glyphicon-wrench:before { + content: "\1f527" +} + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid #000; + border-right: 4px solid transparent; + border-bottom: 0 dotted; + border-left: 4px solid transparent; + content: "" +} + +.dropdown { + position: relative +} + +.dropdown-toggle:focus { + outline: 0 +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + list-style: none; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box +} + +.dropdown-menu.pull-right { + right: 0; + left: auto +} + +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5 +} + +.dropdown-menu>li>a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.428571429; + color: #333; + white-space: nowrap +} + +.dropdown-menu>li>a:hover, +.dropdown-menu>li>a:focus { + color: #fff; + text-decoration: none; + background-color: #428bca +} + +.dropdown-menu>.active>a, +.dropdown-menu>.active>a:hover, +.dropdown-menu>.active>a:focus { + color: #fff; + text-decoration: none; + background-color: #428bca; + outline: 0 +} + +.dropdown-menu>.disabled>a, +.dropdown-menu>.disabled>a:hover, +.dropdown-menu>.disabled>a:focus { + color: #999 +} + +.dropdown-menu>.disabled>a:hover, +.dropdown-menu>.disabled>a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid: DXImageTransform.Microsoft.gradient(enabled=false) +} + +.open>.dropdown-menu { + display: block +} + +.open>a { + outline: 0 +} + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.428571429; + color: #999 +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990 +} + +.pull-right>.dropdown-menu { + right: 0; + left: auto +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0 dotted; + border-bottom: 4px solid #000; + content: "" +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px +} + +@media(min-width:768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto + } +} + +.btn-default .caret { + border-top-color: #333 +} + +.btn-primary .caret, +.btn-green .caret, +.btn-orange .caret, +.btn-red .caret, +.btn-info .caret { + border-top-color: #fff +} + +.dropup .btn-default .caret { + border-bottom-color: #333 +} + +.dropup .btn-primary .caret, +.dropup .btn-green .caret, +.dropup .btn-orange .caret, +.dropup .btn-red .caret, +.dropup .btn-info .caret { + border-bottom-color: #fff +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle +} + +.btn-group>.btn, +.btn-group-vertical>.btn { + position: relative; + float: left +} + +.btn-group>.btn:hover, +.btn-group-vertical>.btn:hover, +.btn-group>.btn:focus, +.btn-group-vertical>.btn:focus, +.btn-group>.btn:active, +.btn-group-vertical>.btn:active, +.btn-group>.btn.active, +.btn-group-vertical>.btn.active { + z-index: 2 +} + +.btn-group>.btn:focus, +.btn-group-vertical>.btn:focus { + outline: 0 +} + +.btn-group .btn+.btn, +.btn-group .btn+.btn-group, +.btn-group .btn-group+.btn, +.btn-group .btn-group+.btn-group { + margin-left: -1px +} + +.btn-toolbar:before, +.btn-toolbar:after { + display: table; + content: " " +} + +.btn-toolbar:after { + clear: both +} + +.btn-toolbar:before, +.btn-toolbar:after { + display: table; + content: " " +} + +.btn-toolbar:after { + clear: both +} + +.btn-toolbar .btn-group { + float: left +} + +.btn-toolbar>.btn+.btn, +.btn-toolbar>.btn-group+.btn, +.btn-toolbar>.btn+.btn-group, +.btn-toolbar>.btn-group+.btn-group { + margin-left: 5px +} + +.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0 +} + +.btn-group>.btn:first-child { + margin-left: 0 +} + +.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.btn-group>.btn:last-child:not(:first-child), +.btn-group>.dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0 +} + +.btn-group>.btn-group { + float: left +} + +.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn { + border-radius: 0 +} + +.btn-group>.btn-group:first-child>.btn:last-child, +.btn-group>.btn-group:first-child>.dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.btn-group>.btn-group:last-child>.btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0 +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0 +} + +.btn-group-xs>.btn { + padding: 5px 10px; + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} + +.btn-group-sm>.btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} + +.btn-group-lg>.btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px +} + +.btn-group>.btn+.dropdown-toggle { + padding-right: 8px; + padding-left: 8px +} + +.btn-group>.btn-lg+.dropdown-toggle { + padding-right: 12px; + padding-left: 12px +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125) +} + +.btn .caret { + margin-left: 0 +} + +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0 +} + +.dropup .btn-lg .caret { + border-width: 0 5px 5px +} + +.btn-group-vertical>.btn, +.btn-group-vertical>.btn-group { + display: block; + float: none; + width: 100%; + max-width: 100% +} + +.btn-group-vertical>.btn-group:before, +.btn-group-vertical>.btn-group:after { + display: table; + content: " " +} + +.btn-group-vertical>.btn-group:after { + clear: both +} + +.btn-group-vertical>.btn-group:before, +.btn-group-vertical>.btn-group:after { + display: table; + content: " " +} + +.btn-group-vertical>.btn-group:after { + clear: both +} + +.btn-group-vertical>.btn-group>.btn { + float: none +} + +.btn-group-vertical>.btn+.btn, +.btn-group-vertical>.btn+.btn-group, +.btn-group-vertical>.btn-group+.btn, +.btn-group-vertical>.btn-group+.btn-group { + margin-top: -1px; + margin-left: 0 +} + +.btn-group-vertical>.btn:not(:first-child):not(:last-child) { + border-radius: 0 +} + +.btn-group-vertical>.btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group-vertical>.btn:last-child:not(:first-child) { + border-top-right-radius: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 0 +} + +.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn { + border-radius: 0 +} + +.btn-group-vertical>.btn-group:first-child>.btn:last-child, +.btn-group-vertical>.btn-group:first-child>.dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group-vertical>.btn-group:last-child>.btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0 +} + +.btn-group-justified { + display: table; + width: 100%; + border-collapse: separate; + table-layout: fixed +} + +.btn-group-justified .btn { + display: table-cell; + float: none; + width: 1% +} + +[data-toggle="buttons"]>.btn>input[type="radio"], +[data-toggle="buttons"]>.btn>input[type="checkbox"] { + display: none +} + +.input-group { + position: relative; + display: table; + border-collapse: separate +} + +.input-group.col { + float: none; + padding-right: 0; + padding-left: 0 +} + +.input-group .form-control { + width: 100%; + margin-bottom: 0 +} + +.input-group-lg>.form-control, +.input-group-lg>.input-group-addon, +.input-group-lg>.input-group-btn>.btn { + height: 45px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px +} + +select.input-group-lg>.form-control, +select.input-group-lg>.input-group-addon, +select.input-group-lg>.input-group-btn>.btn { + height: 45px; + line-height: 45px +} + +textarea.input-group-lg>.form-control, +textarea.input-group-lg>.input-group-addon, +textarea.input-group-lg>.input-group-btn>.btn { + height: auto +} + +.input-group-sm>.form-control, +.input-group-sm>.input-group-addon, +.input-group-sm>.input-group-btn>.btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} + +select.input-group-sm>.form-control, +select.input-group-sm>.input-group-addon, +select.input-group-sm>.input-group-btn>.btn { + height: 30px; + line-height: 30px +} + +textarea.input-group-sm>.form-control, +textarea.input-group-sm>.input-group-addon, +textarea.input-group-sm>.input-group-btn>.btn { + height: auto +} + +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell +} + +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0 +} + +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle +} + +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px +} + +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px +} + +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px +} + +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0 +} + +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child>.btn, +.input-group-btn:first-child>.dropdown-toggle, +.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group-addon:first-child { + border-right: 0 +} + +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child>.btn, +.input-group-btn:last-child>.dropdown-toggle, +.input-group-btn:first-child>.btn:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0 +} + +.input-group-addon:last-child { + border-left: 0 +} + +.input-group-btn { + position: relative; + white-space: nowrap +} + +.input-group-btn>.btn { + position: relative +} + +.input-group-btn>.btn+.btn { + margin-left: -4px +} + +.input-group-btn>.btn:hover, +.input-group-btn>.btn:active { + z-index: 2 +} + +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.nav:before, +.nav:after { + display: table; + content: " " +} + +.nav:after { + clear: both +} + +.nav:before, +.nav:after { + display: table; + content: " " +} + +.nav:after { + clear: both +} + +.nav>li { + position: relative; + display: block +} + +.nav>li>a { + position: relative; + display: block; + padding: 10px 15px +} + +.nav>li>a:hover, +.nav>li>a:focus { + text-decoration: none; + background-color: #eee +} + +.nav>li.disabled>a { + color: #999 +} + +.nav>li.disabled>a:hover, +.nav>li.disabled>a:focus { + color: #999; + text-decoration: none; + cursor: not-allowed; + background-color: transparent +} + +.nav .open>a, +.nav .open>a:hover, +.nav .open>a:focus { + background-color: #eee; + border-color: #428bca +} + +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5 +} + +.nav>li>a>img { + max-width: none +} + +.nav-tabs { + border-bottom: 1px solid #ddd +} + +.nav-tabs>li { + float: left; + margin-bottom: -1px +} + +.nav-tabs>li>a { + margin-right: 2px; + line-height: 1.428571429; + border: 1px solid transparent; + border-radius: 4px 4px 0 0 +} + +.nav-tabs>li>a:hover { + border-color: #eee #eee #ddd +} + +.nav-tabs>li.active>a, +.nav-tabs>li.active>a:hover, +.nav-tabs>li.active>a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent +} + +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0 +} + +.nav-tabs.nav-justified>li { + float: none +} + +.nav-tabs.nav-justified>li>a { + text-align: center +} + +@media(min-width:992px) { + .nav-tabs.nav-justified>li { + display: table-cell; + width: 1% + } +} + +.nav-tabs.nav-justified>li>a { + margin-right: 0; + border-bottom: 1px solid #ddd +} + +.nav-tabs.nav-justified>.active>a { + border-bottom-color: #fff +} + +.nav-pills>li { + float: left +} + +.nav-pills>li>a { + border-radius: 5px +} + +.nav-pills>li+li { + margin-left: 2px +} + +.nav-pills>li.active>a, +.nav-pills>li.active>a:hover, +.nav-pills>li.active>a:focus { + color: #fff; + background-color: #428bca +} + +.nav-stacked>li { + float: none +} + +.nav-stacked>li+li { + margin-top: 2px; + margin-left: 0 +} + +.nav-justified { + width: 100% +} + +.nav-justified>li { + float: none +} + +.nav-justified>li>a { + text-align: center +} + +@media(min-width:768px) { + .nav-justified>li { + display: table-cell; + width: 1% + } +} + +.nav-tabs-justified { + border-bottom: 0 +} + +.nav-tabs-justified>li>a { + margin-right: 0; + border-bottom: 1px solid #ddd +} + +.nav-tabs-justified>.active>a { + border-bottom-color: #fff +} + +.tabbable:before, +.tabbable:after { + display: table; + content: " " +} + +.tabbable:after { + clear: both +} + +.tabbable:before, +.tabbable:after { + display: table; + content: " " +} + +.tabbable:after { + clear: both +} + +.tab-content>.tab-pane, +.pill-content>.pill-pane { + display: none; +} + +.tab-content>.active, +.pill-content>.active { + display: block +} + +.nav .caret { + border-top-color: #428bca; + border-bottom-color: #428bca +} + +.nav a:hover .caret { + border-top-color: #2a6496; + border-bottom-color: #2a6496 +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0 +} + +.navbar { + position: relative; + z-index: 1000; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent +} + +.navbar:before, +.navbar:after { + display: table; + content: " " +} + +.navbar:after { + clear: both +} + +.navbar:before, +.navbar:after { + display: table; + content: " " +} + +.navbar:after { + clear: both +} + +@media(min-width:992px) { + .navbar { + border-radius: 4px + } +} + +.navbar-header:before, +.navbar-header:after { + display: table; + content: " " +} + +.navbar-header:after { + clear: both +} + +.navbar-header:before, +.navbar-header:after { + display: table; + content: " " +} + +.navbar-header:after { + clear: both +} + +@media(min-width:992px) { + .navbar-header { + float: left + } +} + +.navbar-collapse { + max-height: 360px; + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch +} + +.navbar-collapse:before, +.navbar-collapse:after { + display: table; + content: " " +} + +.navbar-collapse:after { + clear: both +} + +.navbar-collapse:before, +.navbar-collapse:after { + display: table; + content: " " +} + +.navbar-collapse:after { + clear: both +} + +.navbar-collapse.in { + overflow-y: auto +} + +@media(min-width:992px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none + } + .navbar-collapse.collapse { + display: block!important; + height: auto!important; + padding-bottom: 0; + overflow: visible!important + } + .navbar-collapse.in { + overflow-y: visible + } + .navbar-collapse .navbar-nav.navbar-left:first-child { + margin-left: -15px + } + .navbar-collapse .navbar-nav.navbar-right:last-child { + margin-right: -15px + } + .navbar-collapse .navbar-text:last-child { + margin-right: 0 + } +} + +.container>.navbar-header, +.container>.navbar-collapse { + margin-right: -15px; + margin-left: -15px +} + +@media(min-width:992px) { + .container>.navbar-header, + .container>.navbar-collapse { + margin-right: 0; + margin-left: 0 + } +} + +.navbar-static-top { + border-width: 0 0 1px +} + +@media(min-width:992px) { + .navbar-static-top { + border-radius: 0 + } +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + border-width: 0 0 1px +} + +@media(min-width:992px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0 + } +} + +.navbar-fixed-top { + top: 0; + z-index: 1030 +} + +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0 +} + +.navbar-brand { + float: left; + padding: 15px 15px; + font-size: 18px; + line-height: 20px +} + +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none +} + +@media(min-width:992px) { + .navbar>.container .navbar-brand { + margin-left: -15px + } +} + +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 20px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + border: 1px solid transparent; + border-radius: 4px; + transition: margin-top 0.3s; +} + +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px +} + +.navbar-toggle .icon-bar+.icon-bar { + margin-top: 4px +} + +@media(min-width:992px) { + .navbar-toggle { + display: none + } +} + +.navbar-nav { + margin: 7.5px -15px +} + +.navbar-nav>li>a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px +} + +@media(max-width:992px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none + } + .navbar-nav .open .dropdown-menu>li>a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px + } + .navbar-nav .open .dropdown-menu>li>a { + line-height: 20px + } + .navbar-nav .open .dropdown-menu>li>a:hover, + .navbar-nav .open .dropdown-menu>li>a:focus { + background-image: none + } +} + +@media(min-width:992px) { + .navbar-nav { + float: left; + margin: 0 + } + .navbar-nav>li { + float: left + } + .navbar-nav>li>a { + padding-top: 15px; + padding-bottom: 15px + } +} + +@media(min-width:992px) { + .navbar-left { + float: left!important + } + .navbar-right { + float: right!important + } +} + +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1) +} + +@media(min-width:768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle + } + .navbar-form .form-control { + display: inline-block + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + padding-left: 0; + margin-top: 0; + margin-bottom: 0 + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + float: none; + margin-left: 0 + } +} + +@media(max-width:767px) { + .navbar-form .form-group { + margin-bottom: 5px + } +} + +@media(min-width:768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none + } +} + +.navbar-nav>li>.dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0 +} + +.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.navbar-nav.pull-right>li>.dropdown-menu, +.navbar-nav>li>.dropdown-menu.pull-right { + right: 0; + left: auto +} + +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px +} + +.navbar-text { + float: left; + margin-top: 15px; + margin-bottom: 15px +} + +@media(min-width:768px) { + .navbar-text { + margin-right: 15px; + margin-left: 15px + } +} + +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7 +} + +.navbar-default .navbar-brand { + color: #777 +} + +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent +} + +.navbar-default .navbar-text { + color: #777 +} + +.navbar-default .navbar-nav>li>a { + color: #777 +} + +.navbar-default .navbar-nav>li>a:hover, +.navbar-default .navbar-nav>li>a:focus { + color: #333; + background-color: transparent +} + +.navbar-default .navbar-nav>.active>a, +.navbar-default .navbar-nav>.active>a:hover, +.navbar-default .navbar-nav>.active>a:focus { + color: #555; + background-color: #e7e7e7 +} + +.navbar-default .navbar-nav>.disabled>a, +.navbar-default .navbar-nav>.disabled>a:hover, +.navbar-default .navbar-nav>.disabled>a:focus { + color: #ccc; + background-color: transparent +} + +.navbar-default .navbar-toggle { + border-color: #ddd +} + +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd +} + +.navbar-default .navbar-toggle .icon-bar { + background-color: #ccc +} + +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e6e6e6 +} + +.navbar-default .navbar-nav>.dropdown>a:hover .caret, +.navbar-default .navbar-nav>.dropdown>a:focus .caret { + border-top-color: #333; + border-bottom-color: #333 +} + +.navbar-default .navbar-nav>.open>a, +.navbar-default .navbar-nav>.open>a:hover, +.navbar-default .navbar-nav>.open>a:focus { + color: #555; + background-color: #e7e7e7 +} + +.navbar-default .navbar-nav>.open>a .caret, +.navbar-default .navbar-nav>.open>a:hover .caret, +.navbar-default .navbar-nav>.open>a:focus .caret { + border-top-color: #555; + border-bottom-color: #555 +} + +.navbar-default .navbar-nav>.dropdown>a .caret { + border-top-color: #777; + border-bottom-color: #777 +} + +@media(max-width:767px) { + .navbar-default .navbar-nav .open .dropdown-menu>li>a { + color: #777 + } + .navbar-default .navbar-nav .open .dropdown-menu>li>a:hover, + .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus { + color: #333; + background-color: transparent + } + .navbar-default .navbar-nav .open .dropdown-menu>.active>a, + .navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover, + .navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus { + color: #555; + background-color: #e7e7e7 + } + .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a, + .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover, + .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus { + color: #ccc; + background-color: transparent + } +} + +.navbar-default .navbar-link { + color: #777 +} + +.navbar-default .navbar-link:hover { + color: #333 +} + +.navbar-inverse { + background-color: #222; + border-color: #080808 +} + +.navbar-inverse .navbar-brand { + color: #999 +} + +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent +} + +.navbar-inverse .navbar-text { + color: #999 +} + +.navbar-inverse .navbar-nav>li>a { + color: #999 +} + +.navbar-inverse .navbar-nav>li>a:hover, +.navbar-inverse .navbar-nav>li>a:focus { + color: #fff; + background-color: transparent +} + +.navbar-inverse .navbar-nav>.active>a, +.navbar-inverse .navbar-nav>.active>a:hover, +.navbar-inverse .navbar-nav>.active>a:focus { + color: #fff; + background-color: #080808 +} + +.navbar-inverse .navbar-nav>.disabled>a, +.navbar-inverse .navbar-nav>.disabled>a:hover, +.navbar-inverse .navbar-nav>.disabled>a:focus { + color: #444; + background-color: transparent +} + +.navbar-inverse .navbar-toggle { + border-color: #333 +} + +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333 +} + +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff +} + +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010 +} + +.navbar-inverse .navbar-nav>.open>a, +.navbar-inverse .navbar-nav>.open>a:hover, +.navbar-inverse .navbar-nav>.open>a:focus { + color: #fff; + background-color: #080808 +} + +.navbar-inverse .navbar-nav>.dropdown>a:hover .caret { + border-top-color: #fff; + border-bottom-color: #fff +} + +.navbar-inverse .navbar-nav>.dropdown>a .caret { + border-top-color: #999; + border-bottom-color: #999 +} + +.navbar-inverse .navbar-nav>.open>a .caret, +.navbar-inverse .navbar-nav>.open>a:hover .caret, +.navbar-inverse .navbar-nav>.open>a:focus .caret { + border-top-color: #fff; + border-bottom-color: #fff +} + +@media(max-width:767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header { + border-color: #080808 + } + .navbar-inverse .navbar-nav .open .dropdown-menu>li>a { + color: #999 + } + .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus { + color: #fff; + background-color: transparent + } + .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a, + .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus { + color: #fff; + background-color: #080808 + } + .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a, + .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus { + color: #444; + background-color: transparent + } +} + +.navbar-inverse .navbar-link { + color: #999 +} + +.navbar-inverse .navbar-link:hover { + color: #fff +} + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px +} + +.breadcrumb>li { + display: inline-block +} + +.breadcrumb>li+li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0" +} + +.breadcrumb>.active { + color: #999 +} + +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px +} + +.pagination>li { + display: inline +} + +.pagination>li>a, +.pagination>li>span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.428571429; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd +} + +.pagination>li:first-child>a, +.pagination>li:first-child>span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px +} + +.pagination>li:last-child>a, +.pagination>li:last-child>span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px +} + +.pagination>li>a:hover, +.pagination>li>span:hover, +.pagination>li>a:focus, +.pagination>li>span:focus { + background-color: #eee +} + +.pagination>.active>a, +.pagination>.active>span, +.pagination>.active>a:hover, +.pagination>.active>span:hover, +.pagination>.active>a:focus, +.pagination>.active>span:focus { + z-index: 2; + color: #fff; + cursor: default; + background-color: #428bca; + border-color: #428bca +} + +.pagination>.disabled>span, +.pagination>.disabled>a, +.pagination>.disabled>a:hover, +.pagination>.disabled>a:focus { + color: #999; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd +} + +.pagination-lg>li>a, +.pagination-lg>li>span { + padding: 10px 16px; + font-size: 18px +} + +.pagination-lg>li:first-child>a, +.pagination-lg>li:first-child>span { + border-bottom-left-radius: 6px; + border-top-left-radius: 6px +} + +.pagination-lg>li:last-child>a, +.pagination-lg>li:last-child>span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px +} + +.pagination-sm>li>a, +.pagination-sm>li>span { + padding: 5px 10px; + font-size: 12px +} + +.pagination-sm>li:first-child>a, +.pagination-sm>li:first-child>span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px +} + +.pagination-sm>li:last-child>a, +.pagination-sm>li:last-child>span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px +} + +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none +} + +.pager:before, +.pager:after { + display: table; + content: " " +} + +.pager:after { + clear: both +} + +.pager:before, +.pager:after { + display: table; + content: " " +} + +.pager:after { + clear: both +} + +.pager li { + display: inline +} + +.pager li>a, +.pager li>span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px +} + +.pager li>a:hover, +.pager li>a:focus { + text-decoration: none; + background-color: #eee +} + +.pager .next>a, +.pager .next>span { + float: right +} + +.pager .previous>a, +.pager .previous>span { + float: left +} + +.pager .disabled>a, +.pager .disabled>a:hover, +.pager .disabled>a:focus, +.pager .disabled>span { + color: #999; + cursor: not-allowed; + background-color: #fff +} + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em +} + +.label[href]:hover, +.label[href]:focus { + color: #fff; + text-decoration: none; + cursor: pointer +} + +.label:empty { + display: none +} + +.label-default { + background-color: #999 +} + +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #808080 +} + +.label-primary { + background-color: #428bca +} + +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #3071a9 +} + +.label-success { + background-color: #5cb85c +} + +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44 +} + +.label-info { + background-color: #5bc0de +} + +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5 +} + +.label-warning { + background-color: #f0ad4e +} + +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f +} + +.label-danger { + background-color: #d9534f +} + +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c +} + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background-color: #999; + border-radius: 10px +} + +.badge:empty { + display: none +} + +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer +} + +.btn .badge { + position: relative; + top: -1px +} + +a.list-group-item.active>.badge, +.nav-pills>.active>a>.badge { + color: #428bca; + background-color: #fff +} + +.nav-pills>li>a>.badge { + margin-left: 3px +} + +.jumbotron { + padding: 30px; + margin-bottom: 30px; + font-size: 21px; + font-weight: 200; + line-height: 2.1428571435; + color: inherit; + background-color: #eee +} + +.jumbotron h1 { + line-height: 1; + color: inherit +} + +.jumbotron p { + line-height: 1.4 +} + +.container .jumbotron { + border-radius: 6px +} + +@media screen and (min-width:768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px + } + .container .jumbotron { + padding-right: 60px; + padding-left: 60px + } + .jumbotron h1 { + font-size: 63px + } +} + +.thumbnail { + display: inline-block; + display: block; + height: auto; + max-width: 100%; + padding: 4px; + line-height: 1.428571429; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + transition: all .2s ease-in-out +} + +.thumbnail>img { + display: block; + height: auto; + max-width: 100% +} + +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #428bca +} + +.thumbnail>img { + margin-right: auto; + margin-left: auto +} + +.thumbnail .caption { + padding: 9px; + color: #333 +} + +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px +} + +.alert h4 { + margin-top: 0; + color: inherit +} + +.alert .alert-link { + font-weight: bold +} + +.alert>p, +.alert>ul { + margin-bottom: 0 +} + +.alert>p+p { + margin-top: 5px +} + +.alert-dismissable { + padding-right: 35px +} + +.alert-dismissable .close { + position: relative; + top: -2px; + right: -21px; + color: inherit +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6 +} + +.alert-success hr { + border-top-color: #c9e2b3 +} + +.alert-success .alert-link { + color: #356635 +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1 +} + +.alert-info hr { + border-top-color: #a6e1ec +} + +.alert-info .alert-link { + color: #2d6987 +} + +.alert-warning { + color: #c09853; + background-color: #fcf8e3; + border-color: #fbeed5 +} + +.alert-warning hr { + border-top-color: #f8e5be +} + +.alert-warning .alert-link { + color: #a47e3c +} + +.alert-danger { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7 +} + +.alert-danger hr { + border-top-color: #e6c1c7 +} + +.alert-danger .alert-link { + color: #953b39 +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0 + } + to { + background-position: 0 0 + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0 + } + to { + background-position: 0 0 + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0 + } + to { + background-position: 40px 0 + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0 + } + to { + background-position: 0 0 + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1) +} + +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #fff; + text-align: center; + background-color: #428bca; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width .6s ease; + transition: width .6s ease +} + +.progress-striped .progress-bar { + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px +} + +.progress.active .progress-bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite +} + +.progress-bar-success { + background-color: #5cb85c +} + +.progress-striped .progress-bar-success { + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent) +} + +.progress-bar-info { + background-color: #5bc0de +} + +.progress-striped .progress-bar-info { + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent) +} + +.progress-bar-warning { + background-color: #f0ad4e +} + +.progress-striped .progress-bar-warning { + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent) +} + +.progress-bar-danger { + background-color: #d9534f +} + +.progress-striped .progress-bar-danger { + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent) +} + +.media, +.media-body { + overflow: hidden; + zoom: 1 +} + +.media, +.media .media { + margin-top: 15px +} + +.media:first-child { + margin-top: 0 +} + +.media-object { + display: block +} + +.media-heading { + margin: 0 0 5px +} + +.media>.pull-left { + margin-right: 10px +} + +.media>.pull-right { + margin-left: 10px +} + +.media-list { + padding-left: 0; + list-style: none +} + +.list-group { + padding-left: 0; + margin-bottom: 20px +} + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd +} + +.list-group-item:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px +} + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px +} + +.list-group-item>.badge { + float: right +} + +.list-group-item>.badge+.badge { + margin-right: 5px +} + +a.list-group-item { + color: #555 +} + +a.list-group-item .list-group-item-heading { + color: #333 +} + +a.list-group-item:hover, +a.list-group-item:focus { + text-decoration: none; + background-color: #f5f5f5 +} + +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #428bca; + border-color: #428bca +} + +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading { + color: inherit +} + +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #e1edf7 +} + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px +} + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3 +} + +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05) +} + +.panel-body { + padding: 15px +} + +.panel-body:before, +.panel-body:after { + display: table; + content: " " +} + +.panel-body:after { + clear: both +} + +.panel-body:before, +.panel-body:after { + display: table; + content: " " +} + +.panel-body:after { + clear: both +} + +.panel>.list-group { + margin-bottom: 0 +} + +.panel>.list-group .list-group-item { + border-width: 1px 0 +} + +.panel>.list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0 +} + +.panel>.list-group .list-group-item:last-child { + border-bottom: 0 +} + +.panel-heading+.list-group .list-group-item:first-child { + border-top-width: 0 +} + +.panel>.table { + margin-bottom: 0 +} + +.panel>.panel-body+.table { + border-top: 1px solid #ddd +} + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px +} + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px +} + +.panel-title>a { + color: inherit +} + +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px +} + +.panel-group .panel { + margin-bottom: 0; + overflow: hidden; + border-radius: 4px +} + +.panel-group .panel+.panel { + margin-top: 5px +} + +.panel-group .panel-heading { + border-bottom: 0 +} + +.panel-group .panel-heading+.panel-collapse .panel-body { + border-top: 1px solid #ddd +} + +.panel-group .panel-footer { + border-top: 0 +} + +.panel-group .panel-footer+.panel-collapse .panel-body { + border-bottom: 1px solid #ddd +} + +.panel-default { + border-color: #ddd +} + +.panel-default>.panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd +} + +.panel-default>.panel-heading+.panel-collapse .panel-body { + border-top-color: #ddd +} + +.panel-default>.panel-footer+.panel-collapse .panel-body { + border-bottom-color: #ddd +} + +.panel-primary { + border-color: #428bca +} + +.panel-primary>.panel-heading { + color: #fff; + background-color: #428bca; + border-color: #428bca +} + +.panel-primary>.panel-heading+.panel-collapse .panel-body { + border-top-color: #428bca +} + +.panel-primary>.panel-footer+.panel-collapse .panel-body { + border-bottom-color: #428bca +} + +.panel-success { + border-color: #d6e9c6 +} + +.panel-success>.panel-heading { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6 +} + +.panel-success>.panel-heading+.panel-collapse .panel-body { + border-top-color: #d6e9c6 +} + +.panel-success>.panel-footer+.panel-collapse .panel-body { + border-bottom-color: #d6e9c6 +} + +.panel-warning { + border-color: #fbeed5 +} + +.panel-warning>.panel-heading { + color: #c09853; + background-color: #fcf8e3; + border-color: #fbeed5 +} + +.panel-warning>.panel-heading+.panel-collapse .panel-body { + border-top-color: #fbeed5 +} + +.panel-warning>.panel-footer+.panel-collapse .panel-body { + border-bottom-color: #fbeed5 +} + +.panel-danger { + border-color: #eed3d7 +} + +.panel-danger>.panel-heading { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7 +} + +.panel-danger>.panel-heading+.panel-collapse .panel-body { + border-top-color: #eed3d7 +} + +.panel-danger>.panel-footer+.panel-collapse .panel-body { + border-bottom-color: #eed3d7 +} + +.panel-info { + border-color: #bce8f1 +} + +.panel-info>.panel-heading { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1 +} + +.panel-info>.panel-heading+.panel-collapse .panel-body { + border-top-color: #bce8f1 +} + +.panel-info>.panel-footer+.panel-collapse .panel-body { + border-bottom-color: #bce8f1 +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05) +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15) +} + +.well-lg { + padding: 24px; + border-radius: 6px +} + +.well-sm { + padding: 9px; + border-radius: 3px +} + +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .2; + filter: alpha(opacity=20) +} + +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + opacity: .5; + filter: alpha(opacity=50) +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none +} + +.modal-open { + overflow: hidden +} + +body.modal-open, +.modal-open .navbar-fixed-top, +.modal-open .navbar-fixed-bottom { + margin-right: 15px +} + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + display: none; + overflow: auto; + overflow-y: scroll +} + +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform .3s ease-out; + -moz-transition: -moz-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out +} + +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0) +} + +.modal-dialog { + z-index: 1050; + width: auto; + padding: 10px; + margin-right: auto; + margin-left: auto +} + +.modal-content { + position: relative; + background-color: #fff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; + background-color: #000 +} + +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0) +} + +.modal-backdrop.in { + opacity: .5; + filter: alpha(opacity=50) +} + +.modal-header { + min-height: 16.428571429px; + padding: 15px; + border-bottom: 1px solid #e5e5e5 +} + +.modal-header .close { + margin-top: -2px +} + +.modal-title { + margin: 0; + line-height: 1.428571429 +} + +.modal-body { + position: relative; + padding: 20px +} + +.modal-footer { + padding: 19px 20px 20px; + margin-top: 15px; + text-align: right; + border-top: 1px solid #e5e5e5 +} + +.modal-footer:before, +.modal-footer:after { + display: table; + content: " " +} + +.modal-footer:after { + clear: both +} + +.modal-footer:before, +.modal-footer:after { + display: table; + content: " " +} + +.modal-footer:after { + clear: both +} + +.modal-footer .btn+.btn { + margin-bottom: 0; + margin-left: 5px +} + +.modal-footer .btn-group .btn+.btn { + margin-left: -1px +} + +.modal-footer .btn-block+.btn-block { + margin-left: 0 +} + +@media screen and (min-width:768px) { + .modal-dialog { + right: auto; + left: 50%; + width: 600px; + padding-top: 30px; + padding-bottom: 30px + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5) + } +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 12px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible +} + +.tooltip.in { + opacity: .9; + filter: alpha(opacity=90) +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + text-decoration: none; + background-color: #000; + border-radius: 4px +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000; + border-width: 5px 5px 0 +} + +.tooltip.top-left .tooltip-arrow { + bottom: 0; + left: 5px; + border-top-color: #000; + border-width: 5px 5px 0 +} + +.tooltip.top-right .tooltip-arrow { + right: 5px; + bottom: 0; + border-top-color: #000; + border-width: 5px 5px 0 +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000; + border-width: 5px 5px 5px 0 +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000; + border-width: 5px 0 5px 5px +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000; + border-width: 0 5px 5px +} + +.tooltip.bottom-left .tooltip-arrow { + top: 0; + left: 5px; + border-bottom-color: #000; + border-width: 0 5px 5px +} + +.tooltip.bottom-right .tooltip-arrow { + top: 0; + right: 5px; + border-bottom-color: #000; + border-width: 0 5px 5px +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + background-clip: padding-box +} + +.popover.top { + margin-top: -10px +} + +.popover.right { + margin-left: 10px +} + +.popover.bottom { + margin-top: 10px +} + +.popover.left { + margin-left: -10px +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0 +} + +.popover-content { + padding: 9px 14px +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid +} + +.popover .arrow { + border-width: 11px +} + +.popover .arrow:after { + border-width: 10px; + content: "" +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0 +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #fff; + border-bottom-width: 0; + content: " " +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0 +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #fff; + border-left-width: 0; + content: " " +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0 +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #fff; + border-top-width: 0; + content: " " +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0 +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #fff; + border-right-width: 0; + content: " " +} + +.carousel { + position: relative +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden +} + +.carousel-inner>.item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + transition: .6s ease-in-out left +} + +.carousel-inner>.item>img, +.carousel-inner>.item>a>img { + display: block; + height: auto; + max-width: 100%; + line-height: 1 +} + +.carousel-inner>.active, +.carousel-inner>.next, +.carousel-inner>.prev { + display: block +} + +.carousel-inner>.active { + left: 0 +} + +.carousel-inner>.next, +.carousel-inner>.prev { + position: absolute; + top: 0; + width: 100% +} + +.carousel-inner>.next { + left: 100% +} + +.carousel-inner>.prev { + left: -100% +} + +.carousel-inner>.next.left, +.carousel-inner>.prev.right { + left: 0 +} + +.carousel-inner>.active.left { + left: -100% +} + +.carousel-inner>.active.right { + left: 100% +} + +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + opacity: .5; + filter: alpha(opacity=50) +} + +.carousel-control.left { + background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); + background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1) +} + +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); + background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1) +} + +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + opacity: .9; + filter: alpha(opacity=90) +} + +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + left: 50%; + z-index: 5; + display: inline-block +} + +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + margin-left: -10px; + font-family: serif +} + +.carousel-control .icon-prev:before { + content: '\2039' +} + +.carousel-control .icon-next:before { + content: '\203a' +} + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none +} + +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + border: 1px solid #fff; + border-radius: 10px +} + +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6) +} + +.carousel-caption .btn { + text-shadow: none +} + +@media screen and (min-width:768px) { + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + margin-left: -15px; + font-size: 30px + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px + } + .carousel-indicators { + bottom: 20px + } +} + +.clearfix:before, +.clearfix:after { + display: table; + content: " " +} + +.clearfix:after { + clear: both +} + +.pull-right { + float: right!important +} + +.pull-left { + float: left!important +} + +.hide { + display: none!important +} + +.show { + display: block!important +} + +.invisible { + visibility: hidden +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0 +} + +.affix { + position: fixed +} + +@-ms-viewport { + width: device-width +} + +@media screen and (max-width:400px) { + @-ms-viewport { + width: 320px + } +} + +.hidden { + display: none!important; + visibility: hidden!important +} + +.visible-xs { + display: none!important +} + +tr.visible-xs { + display: none!important +} + +th.visible-xs, +td.visible-xs { + display: none!important +} + +@media(max-width:767px) { + .visible-xs { + display: block!important + } + tr.visible-xs { + display: table-row!important + } + th.visible-xs, + td.visible-xs { + display: table-cell!important + } +} + +@media(min-width:768px) and (max-width:991px) { + .visible-xs.visible-sm { + display: block!important + } + tr.visible-xs.visible-sm { + display: table-row!important + } + th.visible-xs.visible-sm, + td.visible-xs.visible-sm { + display: table-cell!important + } +} + +@media(min-width:992px) and (max-width:1199px) { + .visible-xs.visible-md { + display: block!important + } + tr.visible-xs.visible-md { + display: table-row!important + } + th.visible-xs.visible-md, + td.visible-xs.visible-md { + display: table-cell!important + } +} + +@media(min-width:1200px) { + .visible-xs.visible-lg { + display: block!important + } + tr.visible-xs.visible-lg { + display: table-row!important + } + th.visible-xs.visible-lg, + td.visible-xs.visible-lg { + display: table-cell!important + } +} + +.visible-sm { + display: none!important +} + +tr.visible-sm { + display: none!important +} + +th.visible-sm, +td.visible-sm { + display: none!important +} + +@media(max-width:767px) { + .visible-sm.visible-xs { + display: block!important + } + tr.visible-sm.visible-xs { + display: table-row!important + } + th.visible-sm.visible-xs, + td.visible-sm.visible-xs { + display: table-cell!important + } +} + +@media(min-width:768px) and (max-width:991px) { + .visible-sm { + display: block!important + } + tr.visible-sm { + display: table-row!important + } + th.visible-sm, + td.visible-sm { + display: table-cell!important + } +} + +@media(min-width:992px) and (max-width:1199px) { + .visible-sm.visible-md { + display: block!important + } + tr.visible-sm.visible-md { + display: table-row!important + } + th.visible-sm.visible-md, + td.visible-sm.visible-md { + display: table-cell!important + } +} + +@media(min-width:1200px) { + .visible-sm.visible-lg { + display: block!important + } + tr.visible-sm.visible-lg { + display: table-row!important + } + th.visible-sm.visible-lg, + td.visible-sm.visible-lg { + display: table-cell!important + } +} + +.visible-md { + display: none!important +} + +tr.visible-md { + display: none!important +} + +th.visible-md, +td.visible-md { + display: none!important +} + +@media(max-width:767px) { + .visible-md.visible-xs { + display: block!important + } + tr.visible-md.visible-xs { + display: table-row!important + } + th.visible-md.visible-xs, + td.visible-md.visible-xs { + display: table-cell!important + } +} + +@media(min-width:768px) and (max-width:991px) { + .visible-md.visible-sm { + display: block!important + } + tr.visible-md.visible-sm { + display: table-row!important + } + th.visible-md.visible-sm, + td.visible-md.visible-sm { + display: table-cell!important + } +} + +@media(min-width:992px) and (max-width:1199px) { + .visible-md { + display: block!important + } + tr.visible-md { + display: table-row!important + } + th.visible-md, + td.visible-md { + display: table-cell!important + } +} + +@media(min-width:1200px) { + .visible-md.visible-lg { + display: block!important + } + tr.visible-md.visible-lg { + display: table-row!important + } + th.visible-md.visible-lg, + td.visible-md.visible-lg { + display: table-cell!important + } +} + +.visible-lg { + display: none!important +} + +tr.visible-lg { + display: none!important +} + +th.visible-lg, +td.visible-lg { + display: none!important +} + +@media(max-width:767px) { + .visible-lg.visible-xs { + display: block!important + } + tr.visible-lg.visible-xs { + display: table-row!important + } + th.visible-lg.visible-xs, + td.visible-lg.visible-xs { + display: table-cell!important + } +} + +@media(min-width:768px) and (max-width:991px) { + .visible-lg.visible-sm { + display: block!important + } + tr.visible-lg.visible-sm { + display: table-row!important + } + th.visible-lg.visible-sm, + td.visible-lg.visible-sm { + display: table-cell!important + } +} + +@media(min-width:992px) and (max-width:1199px) { + .visible-lg.visible-md { + display: block!important + } + tr.visible-lg.visible-md { + display: table-row!important + } + th.visible-lg.visible-md, + td.visible-lg.visible-md { + display: table-cell!important + } +} + +@media(min-width:1200px) { + .visible-lg { + display: block!important + } + tr.visible-lg { + display: table-row!important + } + th.visible-lg, + td.visible-lg { + display: table-cell!important + } +} + +.hidden-xs { + display: block!important +} + +tr.hidden-xs { + display: table-row!important +} + +th.hidden-xs, +td.hidden-xs { + display: table-cell!important +} + +@media(max-width:767px) { + .hidden-xs { + display: none!important + } + tr.hidden-xs { + display: none!important + } + th.hidden-xs, + td.hidden-xs { + display: none!important + } +} + +@media(min-width:768px) and (max-width:991px) { + .hidden-xs.hidden-sm { + display: none!important + } + tr.hidden-xs.hidden-sm { + display: none!important + } + th.hidden-xs.hidden-sm, + td.hidden-xs.hidden-sm { + display: none!important + } +} + +@media(min-width:992px) and (max-width:1199px) { + .hidden-xs.hidden-md { + display: none!important + } + tr.hidden-xs.hidden-md { + display: none!important + } + th.hidden-xs.hidden-md, + td.hidden-xs.hidden-md { + display: none!important + } +} + +@media(min-width:1200px) { + .hidden-xs.hidden-lg { + display: none!important + } + tr.hidden-xs.hidden-lg { + display: none!important + } + th.hidden-xs.hidden-lg, + td.hidden-xs.hidden-lg { + display: none!important + } +} + +.hidden-sm { + display: block!important +} + +tr.hidden-sm { + display: table-row!important +} + +th.hidden-sm, +td.hidden-sm { + display: table-cell!important +} + +@media(max-width:767px) { + .hidden-sm.hidden-xs { + display: none!important + } + tr.hidden-sm.hidden-xs { + display: none!important + } + th.hidden-sm.hidden-xs, + td.hidden-sm.hidden-xs { + display: none!important + } +} + +@media(min-width:768px) and (max-width:991px) { + .hidden-sm { + display: none!important + } + tr.hidden-sm { + display: none!important + } + th.hidden-sm, + td.hidden-sm { + display: none!important + } +} + +@media(min-width:992px) and (max-width:1199px) { + .hidden-sm.hidden-md { + display: none!important + } + tr.hidden-sm.hidden-md { + display: none!important + } + th.hidden-sm.hidden-md, + td.hidden-sm.hidden-md { + display: none!important + } +} + +@media(min-width:1200px) { + .hidden-sm.hidden-lg { + display: none!important + } + tr.hidden-sm.hidden-lg { + display: none!important + } + th.hidden-sm.hidden-lg, + td.hidden-sm.hidden-lg { + display: none!important + } +} + +.hidden-md { + display: block!important +} + +tr.hidden-md { + display: table-row!important +} + +th.hidden-md, +td.hidden-md { + display: table-cell!important +} + +@media(max-width:767px) { + .hidden-md.hidden-xs { + display: none!important + } + tr.hidden-md.hidden-xs { + display: none!important + } + th.hidden-md.hidden-xs, + td.hidden-md.hidden-xs { + display: none!important + } +} + +@media(min-width:768px) and (max-width:991px) { + .hidden-md.hidden-sm { + display: none!important + } + tr.hidden-md.hidden-sm { + display: none!important + } + th.hidden-md.hidden-sm, + td.hidden-md.hidden-sm { + display: none!important + } +} + +@media(min-width:992px) and (max-width:1199px) { + .hidden-md { + display: none!important + } + tr.hidden-md { + display: none!important + } + th.hidden-md, + td.hidden-md { + display: none!important + } +} + +@media(min-width:1200px) { + .hidden-md.hidden-lg { + display: none!important + } + tr.hidden-md.hidden-lg { + display: none!important + } + th.hidden-md.hidden-lg, + td.hidden-md.hidden-lg { + display: none!important + } +} + +.hidden-lg { + display: block!important +} + +tr.hidden-lg { + display: table-row!important +} + +th.hidden-lg, +td.hidden-lg { + display: table-cell!important +} + +@media(max-width:767px) { + .hidden-lg.hidden-xs { + display: none!important + } + tr.hidden-lg.hidden-xs { + display: none!important + } + th.hidden-lg.hidden-xs, + td.hidden-lg.hidden-xs { + display: none!important + } +} + +@media(min-width:768px) and (max-width:991px) { + .hidden-lg.hidden-sm { + display: none!important + } + tr.hidden-lg.hidden-sm { + display: none!important + } + th.hidden-lg.hidden-sm, + td.hidden-lg.hidden-sm { + display: none!important + } +} + +@media(min-width:992px) and (max-width:1199px) { + .hidden-lg.hidden-md { + display: none!important + } + tr.hidden-lg.hidden-md { + display: none!important + } + th.hidden-lg.hidden-md, + td.hidden-lg.hidden-md { + display: none!important + } +} + +@media(min-width:1200px) { + .hidden-lg { + display: none!important + } + tr.hidden-lg { + display: none!important + } + th.hidden-lg, + td.hidden-lg { + display: none!important + } +} + +.visible-print { + display: none!important +} + +tr.visible-print { + display: none!important +} + +th.visible-print, +td.visible-print { + display: none!important +} + +@media print { + .visible-print { + display: block!important + } + tr.visible-print { + display: table-row!important + } + th.visible-print, + td.visible-print { + display: table-cell!important + } + .hidden-print { + display: none!important + } + tr.hidden-print { + display: none!important + } + th.hidden-print, + td.hidden-print { + display: none!important + } +} diff --git a/assets/css/lib/bootstrap-3.0.0.min.css b/assets/css/lib/bootstrap-3.0.0.min.css new file mode 100644 index 0000000..4d04ec2 --- /dev/null +++ b/assets/css/lib/bootstrap-3.0.0.min.css @@ -0,0 +1 @@ +article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}button,input,select[multiple],textarea{background-image:none}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);border:0}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16.099999999999998px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-warning{color:#c09853}.text-danger{color:#b94a48}.text-success{color:#468847}.text-info{color:#3a87ad}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h4,h5,h6{margin-top:10px;margin-bottom:10px}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}h1 small,.h1 small{font-size:24px}h2 small,.h2 small{font-size:18px}h3 small,.h3 small,h4 small,.h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:150px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 0;margin:0;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.428571429;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:1.428571429}code,pre{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.container{max-width:750px}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11{float:left}.col-sm-1{width:8.333333333333332%}.col-sm-2{width:16.666666666666664%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333333333%}.col-sm-5{width:41.66666666666667%}.col-sm-6{width:50%}.col-sm-7{width:58.333333333333336%}.col-sm-8{width:66.66666666666666%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333333334%}.col-sm-11{width:91.66666666666666%}.col-sm-12{width:100%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-11{left:91.66666666666666%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-offset-0{margin-left:0}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-11{margin-left:91.66666666666666%}}@media(min-width:992px){.container{max-width:970px}.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11{float:left}.col-md-1{width:8.333333333333332%}.col-md-2{width:16.666666666666664%}.col-md-3{width:25%}.col-md-4{width:33.33333333333333%}.col-md-5{width:41.66666666666667%}.col-md-6{width:50%}.col-md-7{width:58.333333333333336%}.col-md-8{width:66.66666666666666%}.col-md-9{width:75%}.col-md-10{width:83.33333333333334%}.col-md-11{width:91.66666666666666%}.col-md-12{width:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.333333333333332%}.col-md-push-2{left:16.666666666666664%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333333333%}.col-md-push-5{left:41.66666666666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.333333333333336%}.col-md-push-8{left:66.66666666666666%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333333334%}.col-md-push-11{left:91.66666666666666%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-11{right:91.66666666666666%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-11{margin-left:91.66666666666666%}}@media(min-width:1200px){.container{max-width:1170px}.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11{float:left}.col-lg-1{width:8.333333333333332%}.col-lg-2{width:16.666666666666664%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333333333%}.col-lg-5{width:41.66666666666667%}.col-lg-6{width:50%}.col-lg-7{width:58.333333333333336%}.col-lg-8{width:66.66666666666666%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333333334%}.col-lg-11{width:91.66666666666666%}.col-lg-12{width:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-11{left:91.66666666666666%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-11{margin-left:91.66666666666666%}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table thead>tr>th,.table tbody>tr>th,.table tfoot>tr>th,.table thead>tr>td,.table tbody>tr>td,.table tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table caption+thead tr:first-child th,.table colgroup+thead tr:first-child th,.table thead:first-child tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed thead>tr>th,.table-condensed tbody>tr>th,.table-condensed tfoot>tr>th,.table-condensed thead>tr>td,.table-condensed tbody>tr>td,.table-condensed tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8;border-color:#d6e9c6}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td{background-color:#d0e9c6;border-color:#c9e2b3}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede;border-color:#eed3d7}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td{background-color:#ebcccc;border-color:#e6c1c7}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3;border-color:#fbeed5}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td{background-color:#faf2cc;border-color:#f8e5be}@media(max-width:768px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0;background-color:#fff}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>thead>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>thead>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:45px;line-height:45px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.has-error .help-block,.has-error .control-label{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.has-success .help-block,.has-success .control-label{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;background-color:#dff0d8;border-color:#468847}.form-control-static{padding-top:7px;margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-orange{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-orange:hover,.btn-orange:focus,.btn-orange:active,.btn-orange.active,.open .dropdown-toggle.btn-orange{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-orange:active,.btn-orange.active,.open .dropdown-toggle.btn-orange{background-image:none}.btn-orange.disabled,.btn-orange[disabled],fieldset[disabled] .btn-orange,.btn-orange.disabled:hover,.btn-orange[disabled]:hover,fieldset[disabled] .btn-orange:hover,.btn-orange.disabled:focus,.btn-orange[disabled]:focus,fieldset[disabled] .btn-orange:focus,.btn-orange.disabled:active,.btn-orange[disabled]:active,fieldset[disabled] .btn-orange:active,.btn-orange.disabled.active,.btn-orange[disabled].active,fieldset[disabled] .btn-orange.active{background-color:#f0ad4e;border-color:#eea236}.btn-red{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-red:hover,.btn-red:focus,.btn-red:active,.btn-red.active,.open .dropdown-toggle.btn-red{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-red:active,.btn-red.active,.open .dropdown-toggle.btn-red{background-image:none}.btn-red.disabled,.btn-red[disabled],fieldset[disabled] .btn-red,.btn-red.disabled:hover,.btn-red[disabled]:hover,fieldset[disabled] .btn-red:hover,.btn-red.disabled:focus,.btn-red[disabled]:focus,fieldset[disabled] .btn-red:focus,.btn-red.disabled:active,.btn-red[disabled]:active,fieldset[disabled] .btn-red:active,.btn-red.disabled.active,.btn-red[disabled].active,fieldset[disabled] .btn-red.active{background-color:#d9534f;border-color:#d43f3a}.btn-green{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-green:hover,.btn-green:focus,.btn-green:active,.btn-green.active,.open .dropdown-toggle.btn-green{color:#fff;background-color:#47a447;border-color:#398439}.btn-green:active,.btn-green.active,.open .dropdown-toggle.btn-green{background-image:none}.btn-green.disabled,.btn-green[disabled],fieldset[disabled] .btn-green,.btn-green.disabled:hover,.btn-green[disabled]:hover,fieldset[disabled] .btn-green:hover,.btn-green.disabled:focus,.btn-green[disabled]:focus,fieldset[disabled] .btn-green:focus,.btn-green.disabled:active,.btn-green[disabled]:active,fieldset[disabled] .btn-green:active,.btn-green.disabled.active,.btn-green[disabled].active,fieldset[disabled] .btn-green.active{background-color:#5cb85c;border-color:#4cae4c}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-xs{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../../fonts/glyphicons-halflings-regular.eot');src:url('../../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')} .glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1} .glyphicon-asterisk:before{content:"\2a"} .glyphicon-plus:before{content:"\2b"} .glyphicon-euro:before{content:"\20ac"} .glyphicon-minus:before{content:"\2212"} .glyphicon-cloud:before{content:"\2601"} .glyphicon-envelope:before{content:"\2709"} .glyphicon-pencil:before{content:"\270f"} .glyphicon-glass:before{content:"\e001"} .glyphicon-music:before{content:"\e002"} .glyphicon-search:before{content:"\e003"} .glyphicon-heart:before{content:"\e005"} .glyphicon-star:before{content:"\e006"} .glyphicon-star-empty:before{content:"\e007"} .glyphicon-user:before{content:"\e008"} .glyphicon-film:before{content:"\e009"} .glyphicon-th-large:before{content:"\e010"} .glyphicon-th:before{content:"\e011"} .glyphicon-th-list:before{content:"\e012"} .glyphicon-ok:before{content:"\e013"} .glyphicon-remove:before{content:"\e014"} .glyphicon-zoom-in:before{content:"\e015"} .glyphicon-zoom-out:before{content:"\e016"} .glyphicon-off:before{content:"\e017"} .glyphicon-signal:before{content:"\e018"} .glyphicon-cog:before{content:"\e019"} .glyphicon-trash:before{content:"\e020"} .glyphicon-home:before{content:"\e021"} .glyphicon-file:before{content:"\e022"} .glyphicon-time:before{content:"\e023"} .glyphicon-road:before{content:"\e024"} .glyphicon-download-alt:before{content:"\e025"} .glyphicon-download:before{content:"\e026"} .glyphicon-upload:before{content:"\e027"} .glyphicon-inbox:before{content:"\e028"} .glyphicon-play-circle:before{content:"\e029"} .glyphicon-repeat:before{content:"\e030"} .glyphicon-refresh:before{content:"\e031"} .glyphicon-list-alt:before{content:"\e032"} .glyphicon-flag:before{content:"\e034"} .glyphicon-headphones:before{content:"\e035"} .glyphicon-volume-off:before{content:"\e036"} .glyphicon-volume-down:before{content:"\e037"} .glyphicon-volume-up:before{content:"\e038"} .glyphicon-qrcode:before{content:"\e039"} .glyphicon-barcode:before{content:"\e040"} .glyphicon-tag:before{content:"\e041"} .glyphicon-tags:before{content:"\e042"} .glyphicon-book:before{content:"\e043"} .glyphicon-print:before{content:"\e045"} .glyphicon-font:before{content:"\e047"} .glyphicon-bold:before{content:"\e048"} .glyphicon-italic:before{content:"\e049"} .glyphicon-text-height:before{content:"\e050"} .glyphicon-text-width:before{content:"\e051"} .glyphicon-align-left:before{content:"\e052"} .glyphicon-align-center:before{content:"\e053"} .glyphicon-align-right:before{content:"\e054"} .glyphicon-align-justify:before{content:"\e055"} .glyphicon-list:before{content:"\e056"} .glyphicon-indent-left:before{content:"\e057"} .glyphicon-indent-right:before{content:"\e058"} .glyphicon-facetime-video:before{content:"\e059"} .glyphicon-picture:before{content:"\e060"} .glyphicon-map-marker:before{content:"\e062"} .glyphicon-adjust:before{content:"\e063"} .glyphicon-tint:before{content:"\e064"} .glyphicon-edit:before{content:"\e065"} .glyphicon-share:before{content:"\e066"} .glyphicon-check:before{content:"\e067"} .glyphicon-move:before{content:"\e068"} .glyphicon-step-backward:before{content:"\e069"} .glyphicon-fast-backward:before{content:"\e070"} .glyphicon-backward:before{content:"\e071"} .glyphicon-play:before{content:"\e072"} .glyphicon-pause:before{content:"\e073"} .glyphicon-stop:before{content:"\e074"} .glyphicon-forward:before{content:"\e075"} .glyphicon-fast-forward:before{content:"\e076"} .glyphicon-step-forward:before{content:"\e077"} .glyphicon-eject:before{content:"\e078"} .glyphicon-chevron-left:before{content:"\e079"} .glyphicon-chevron-right:before{content:"\e080"} .glyphicon-plus-sign:before{content:"\e081"} .glyphicon-minus-sign:before{content:"\e082"} .glyphicon-remove-sign:before{content:"\e083"} .glyphicon-ok-sign:before{content:"\e084"} .glyphicon-question-sign:before{content:"\e085"} .glyphicon-info-sign:before{content:"\e086"} .glyphicon-screenshot:before{content:"\e087"} .glyphicon-remove-circle:before{content:"\e088"} .glyphicon-ok-circle:before{content:"\e089"} .glyphicon-ban-circle:before{content:"\e090"} .glyphicon-arrow-left:before{content:"\e091"} .glyphicon-arrow-right:before{content:"\e092"} .glyphicon-arrow-up:before{content:"\e093"} .glyphicon-arrow-down:before{content:"\e094"} .glyphicon-share-alt:before{content:"\e095"} .glyphicon-resize-full:before{content:"\e096"} .glyphicon-resize-small:before{content:"\e097"} .glyphicon-exclamation-sign:before{content:"\e101"} .glyphicon-gift:before{content:"\e102"} .glyphicon-leaf:before{content:"\e103"} .glyphicon-eye-open:before{content:"\e105"} .glyphicon-eye-close:before{content:"\e106"} .glyphicon-warning-sign:before{content:"\e107"} .glyphicon-plane:before{content:"\e108"} .glyphicon-random:before{content:"\e110"} .glyphicon-comment:before{content:"\e111"} .glyphicon-magnet:before{content:"\e112"} .glyphicon-chevron-up:before{content:"\e113"} .glyphicon-chevron-down:before{content:"\e114"} .glyphicon-retweet:before{content:"\e115"} .glyphicon-shopping-cart:before{content:"\e116"} .glyphicon-folder-close:before{content:"\e117"} .glyphicon-folder-open:before{content:"\e118"} .glyphicon-resize-vertical:before{content:"\e119"} .glyphicon-resize-horizontal:before{content:"\e120"} .glyphicon-hdd:before{content:"\e121"} .glyphicon-bullhorn:before{content:"\e122"} .glyphicon-certificate:before{content:"\e124"} .glyphicon-thumbs-up:before{content:"\e125"} .glyphicon-thumbs-down:before{content:"\e126"} .glyphicon-hand-right:before{content:"\e127"} .glyphicon-hand-left:before{content:"\e128"} .glyphicon-hand-up:before{content:"\e129"} .glyphicon-hand-down:before{content:"\e130"} .glyphicon-circle-arrow-right:before{content:"\e131"} .glyphicon-circle-arrow-left:before{content:"\e132"} .glyphicon-circle-arrow-up:before{content:"\e133"} .glyphicon-circle-arrow-down:before{content:"\e134"} .glyphicon-globe:before{content:"\e135"} .glyphicon-tasks:before{content:"\e137"} .glyphicon-filter:before{content:"\e138"} .glyphicon-fullscreen:before{content:"\e140"} .glyphicon-dashboard:before{content:"\e141"} .glyphicon-heart-empty:before{content:"\e143"} .glyphicon-link:before{content:"\e144"} .glyphicon-phone:before{content:"\e145"} .glyphicon-usd:before{content:"\e148"} .glyphicon-gbp:before{content:"\e149"} .glyphicon-sort:before{content:"\e150"} .glyphicon-sort-by-alphabet:before{content:"\e151"} .glyphicon-sort-by-alphabet-alt:before{content:"\e152"} .glyphicon-sort-by-order:before{content:"\e153"} .glyphicon-sort-by-order-alt:before{content:"\e154"} .glyphicon-sort-by-attributes:before{content:"\e155"} .glyphicon-sort-by-attributes-alt:before{content:"\e156"} .glyphicon-unchecked:before{content:"\e157"} .glyphicon-expand:before{content:"\e158"} .glyphicon-collapse-down:before{content:"\e159"} .glyphicon-collapse-up:before{content:"\e160"} .glyphicon-log-in:before{content:"\e161"} .glyphicon-flash:before{content:"\e162"} .glyphicon-log-out:before{content:"\e163"} .glyphicon-new-window:before{content:"\e164"} .glyphicon-record:before{content:"\e165"} .glyphicon-save:before{content:"\e166"} .glyphicon-open:before{content:"\e167"} .glyphicon-saved:before{content:"\e168"} .glyphicon-import:before{content:"\e169"} .glyphicon-export:before{content:"\e170"} .glyphicon-send:before{content:"\e171"} .glyphicon-floppy-disk:before{content:"\e172"} .glyphicon-floppy-saved:before{content:"\e173"} .glyphicon-floppy-remove:before{content:"\e174"} .glyphicon-floppy-save:before{content:"\e175"} .glyphicon-floppy-open:before{content:"\e176"} .glyphicon-credit-card:before{content:"\e177"} .glyphicon-transfer:before{content:"\e178"} .glyphicon-cutlery:before{content:"\e179"} .glyphicon-header:before{content:"\e180"} .glyphicon-compressed:before{content:"\e181"} .glyphicon-earphone:before{content:"\e182"} .glyphicon-phone-alt:before{content:"\e183"} .glyphicon-tower:before{content:"\e184"} .glyphicon-stats:before{content:"\e185"} .glyphicon-sd-video:before{content:"\e186"} .glyphicon-hd-video:before{content:"\e187"} .glyphicon-subtitles:before{content:"\e188"} .glyphicon-sound-stereo:before{content:"\e189"} .glyphicon-sound-dolby:before{content:"\e190"} .glyphicon-sound-5-1:before{content:"\e191"} .glyphicon-sound-6-1:before{content:"\e192"} .glyphicon-sound-7-1:before{content:"\e193"} .glyphicon-copyright-mark:before{content:"\e194"} .glyphicon-registration-mark:before{content:"\e195"} .glyphicon-cloud-download:before{content:"\e197"} .glyphicon-cloud-upload:before{content:"\e198"} .glyphicon-tree-conifer:before{content:"\e199"} .glyphicon-tree-deciduous:before{content:"\e200"} .glyphicon-briefcase:before{content:"\1f4bc"} .glyphicon-calendar:before{content:"\1f4c5"} .glyphicon-pushpin:before{content:"\1f4cc"} .glyphicon-paperclip:before{content:"\1f4ce"} .glyphicon-camera:before{content:"\1f4f7"} .glyphicon-lock:before{content:"\1f512"} .glyphicon-bell:before{content:"\1f514"} .glyphicon-bookmark:before{content:"\1f516"} .glyphicon-fire:before{content:"\1f525"} .glyphicon-wrench:before{content:"\1f527"} .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid #000;border-right:4px solid transparent;border-bottom:0 dotted;border-left:4px solid transparent;content:""} .dropdown{position:relative} .dropdown-toggle:focus{outline:0} .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box} .dropdown-menu.pull-right{right:0;left:auto} .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5} .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap} .dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#fff;text-decoration:none;background-color:#428bca} .dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0} .dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999} .dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)} .open>.dropdown-menu{display:block} .open>a{outline:0} .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999} .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990} .pull-right>.dropdown-menu{right:0;left:auto} .dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0 dotted;border-bottom:4px solid #000;content:""} .dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}} .btn-default .caret{border-top-color:#333} .btn-primary .caret,.btn-green .caret,.btn-orange .caret,.btn-red .caret,.btn-info .caret{border-top-color:#fff} .dropup .btn-default .caret{border-bottom-color:#333} .dropup .btn-primary .caret,.dropup .btn-green .caret,.dropup .btn-orange .caret,.dropup .btn-red .caret,.dropup .btn-info .caret{border-bottom-color:#fff} .btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle} .btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left} .btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2} .btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0} .btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px} .btn-toolbar:before,.btn-toolbar:after{display:table;content:" "} .btn-toolbar:after{clear:both} .btn-toolbar:before,.btn-toolbar:after{display:table;content:" "} .btn-toolbar:after{clear:both} .btn-toolbar .btn-group{float:left} .btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px} .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0} .btn-group>.btn:first-child{margin-left:0} .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0} .btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0} .btn-group>.btn-group{float:left} .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0} .btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0} .btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0} .btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0} .btn-group-xs>.btn{padding:5px 10px;padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px} .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px} .btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px} .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px} .btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px} .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)} .btn .caret{margin-left:0} .btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0} .dropup .btn-lg .caret{border-width:0 5px 5px} .btn-group-vertical>.btn,.btn-group-vertical>.btn-group{display:block;float:none;width:100%;max-width:100%} .btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "} .btn-group-vertical>.btn-group:after{clear:both} .btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "} .btn-group-vertical>.btn-group:after{clear:both} .btn-group-vertical>.btn-group>.btn{float:none} .btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0} .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0} .btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0} .btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0} .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0} .btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0} .btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0} .btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed} .btn-group-justified .btn{display:table-cell;float:none;width:1%} [data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none} .input-group{position:relative;display:table;border-collapse:separate} .input-group.col{float:none;padding-right:0;padding-left:0} .input-group .form-control{width:100%;margin-bottom:0} .input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px} select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px} textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto} .input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px} select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px} textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto} .input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell} .input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0} .input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle} .input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px} .input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px} .input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px} .input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0} .input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0} .input-group-addon:first-child{border-right:0} .input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0} .input-group-addon:last-child{border-left:0} .input-group-btn{position:relative;white-space:nowrap} .input-group-btn>.btn{position:relative} .input-group-btn>.btn+.btn{margin-left:-4px} .input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2} .nav{padding-left:0;margin-bottom:0;list-style:none} .nav:before,.nav:after{display:table;content:" "} .nav:after{clear:both} .nav:before,.nav:after{display:table;content:" "} .nav:after{clear:both} .nav>li{position:relative;display:block} .nav>li>a{position:relative;display:block;padding:10px 15px} .nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee} .nav>li.disabled>a{color:#999} .nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent} .nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca} .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5} .nav>li>a>img{max-width:none} .nav-tabs{border-bottom:1px solid #ddd} .nav-tabs>li{float:left;margin-bottom:-1px} .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0} .nav-tabs>li>a:hover{border-color:#eee #eee #ddd} .nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent} .nav-tabs.nav-justified{width:100%;border-bottom:0} .nav-tabs.nav-justified>li{float:none} .nav-tabs.nav-justified>li>a{text-align:center}@media(min-width:992px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}} .nav-tabs.nav-justified>li>a{margin-right:0;border-bottom:1px solid #ddd} .nav-tabs.nav-justified>.active>a{border-bottom-color:#fff} .nav-pills>li{float:left} .nav-pills>li>a{border-radius:5px} .nav-pills>li+li{margin-left:2px} .nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca} .nav-stacked>li{float:none} .nav-stacked>li+li{margin-top:2px;margin-left:0} .nav-justified{width:100%} .nav-justified>li{float:none} .nav-justified>li>a{text-align:center}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}} .nav-tabs-justified{border-bottom:0} .nav-tabs-justified>li>a{margin-right:0;border-bottom:1px solid #ddd} .nav-tabs-justified>.active>a{border-bottom-color:#fff} .tabbable:before,.tabbable:after{display:table;content:" "} .tabbable:after{clear:both} .tabbable:before,.tabbable:after{display:table;content:" "} .tabbable:after{clear:both} .tab-content>.tab-pane,.pill-content>.pill-pane{display:none} .tab-content>.active,.pill-content>.active{display:block} .nav .caret{border-top-color:#428bca;border-bottom-color:#428bca} .nav a:hover .caret{border-top-color:#2a6496;border-bottom-color:#2a6496} .nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0} .navbar{position:relative;z-index:1000;min-height:50px;margin-bottom:20px;border:1px solid transparent} .navbar:before,.navbar:after{display:table;content:" "} .navbar:after{clear:both} .navbar:before,.navbar:after{display:table;content:" "} .navbar:after{clear:both}@media(min-width:992px){.navbar{border-radius:4px}} .navbar-header:before,.navbar-header:after{display:table;content:" "} .navbar-header:after{clear:both} .navbar-header:before,.navbar-header:after{display:table;content:" "} .navbar-header:after{clear:both}@media(min-width:992px){.navbar-header{float:left}} .navbar-collapse{max-height:360px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch} .navbar-collapse:before,.navbar-collapse:after{display:table;content:" "} .navbar-collapse:after{clear:both} .navbar-collapse:before,.navbar-collapse:after{display:table;content:" "} .navbar-collapse:after{clear:both} .navbar-collapse.in{overflow-y:auto}@media(min-width:992px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-collapse .navbar-nav.navbar-left:first-child{margin-left:-15px}.navbar-collapse .navbar-nav.navbar-right:last-child{margin-right:-15px}.navbar-collapse .navbar-text:last-child{margin-right:0}} .container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:992px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}} .navbar-static-top{border-width:0 0 1px}@media(min-width:992px){.navbar-static-top{border-radius:0}} .navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;border-width:0 0 1px}@media(min-width:992px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}} .navbar-fixed-top{top:0;z-index:1030} .navbar-fixed-bottom{bottom:0;margin-bottom:0} .navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px} .navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:992px){.navbar>.container .navbar-brand{margin-left:-15px}} .navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:20px;margin-right:15px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px;transition:margin-top .3s} .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px} .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:992px){.navbar-toggle{display:none}} .navbar-nav{margin:7.5px -15px} .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:992px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:992px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}@media(min-width:992px){.navbar-left{float:left!important}.navbar-right{float:right!important}} .navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}} .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0} .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0} .navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto} .navbar-btn{margin-top:8px;margin-bottom:8px} .navbar-text{float:left;margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{margin-right:15px;margin-left:15px}} .navbar-default{background-color:#f8f8f8;border-color:#e7e7e7} .navbar-default .navbar-brand{color:#777} .navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent} .navbar-default .navbar-text{color:#777} .navbar-default .navbar-nav>li>a{color:#777} .navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent} .navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7} .navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent} .navbar-default .navbar-toggle{border-color:#ddd} .navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd} .navbar-default .navbar-toggle .icon-bar{background-color:#ccc} .navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e6e6e6} .navbar-default .navbar-nav>.dropdown>a:hover .caret,.navbar-default .navbar-nav>.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333} .navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7} .navbar-default .navbar-nav>.open>a .caret,.navbar-default .navbar-nav>.open>a:hover .caret,.navbar-default .navbar-nav>.open>a:focus .caret{border-top-color:#555;border-bottom-color:#555} .navbar-default .navbar-nav>.dropdown>a .caret{border-top-color:#777;border-bottom-color:#777}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}} .navbar-default .navbar-link{color:#777} .navbar-default .navbar-link:hover{color:#333} .navbar-inverse{background-color:#222;border-color:#080808} .navbar-inverse .navbar-brand{color:#999} .navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent} .navbar-inverse .navbar-text{color:#999} .navbar-inverse .navbar-nav>li>a{color:#999} .navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent} .navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808} .navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent} .navbar-inverse .navbar-toggle{border-color:#333} .navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333} .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff} .navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010} .navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808} .navbar-inverse .navbar-nav>.dropdown>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff} .navbar-inverse .navbar-nav>.dropdown>a .caret{border-top-color:#999;border-bottom-color:#999} .navbar-inverse .navbar-nav>.open>a .caret,.navbar-inverse .navbar-nav>.open>a:hover .caret,.navbar-inverse .navbar-nav>.open>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}} .navbar-inverse .navbar-link{color:#999} .navbar-inverse .navbar-link:hover{color:#fff} .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px} .breadcrumb>li{display:inline-block} .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"} .breadcrumb>.active{color:#999} .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px} .pagination>li{display:inline} .pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd} .pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px} .pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px} .pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee} .pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca} .pagination>.disabled>span,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd} .pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px} .pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px} .pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px} .pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px} .pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px} .pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px} .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none} .pager:before,.pager:after{display:table;content:" "} .pager:after{clear:both} .pager:before,.pager:after{display:table;content:" "} .pager:after{clear:both} .pager li{display:inline} .pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px} .pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee} .pager .next>a,.pager .next>span{float:right} .pager .previous>a,.pager .previous>span{float:left} .pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff} .label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em} .label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer} .label:empty{display:none} .label-default{background-color:#999} .label-default[href]:hover,.label-default[href]:focus{background-color:#808080} .label-primary{background-color:#428bca} .label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9} .label-success{background-color:#5cb85c} .label-success[href]:hover,.label-success[href]:focus{background-color:#449d44} .label-info{background-color:#5bc0de} .label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5} .label-warning{background-color:#f0ad4e} .label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f} .label-danger{background-color:#d9534f} .label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c} .badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px} .badge:empty{display:none} a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer} .btn .badge{position:relative;top:-1px} a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff} .nav-pills>li>a>.badge{margin-left:3px} .jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee} .jumbotron h1{line-height:1;color:inherit} .jumbotron p{line-height:1.4} .container .jumbotron{border-radius:6px}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1{font-size:63px}} .thumbnail{display:inline-block;display:block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out} .thumbnail>img{display:block;height:auto;max-width:100%} a.thumbnail:hover,a.thumbnail:focus{border-color:#428bca} .thumbnail>img{margin-right:auto;margin-left:auto} .thumbnail .caption{padding:9px;color:#333} .alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px} .alert h4{margin-top:0;color:inherit} .alert .alert-link{font-weight:bold} .alert>p,.alert>ul{margin-bottom:0} .alert>p+p{margin-top:5px} .alert-dismissable{padding-right:35px} .alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit} .alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6} .alert-success hr{border-top-color:#c9e2b3} .alert-success .alert-link{color:#356635} .alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1} .alert-info hr{border-top-color:#a6e1ec} .alert-info .alert-link{color:#2d6987} .alert-warning{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5} .alert-warning hr{border-top-color:#f8e5be} .alert-warning .alert-link{color:#a47e3c} .alert-danger{color:#b94a48;background-color:#f2dede;border-color:#eed3d7} .alert-danger hr{border-top-color:#e6c1c7} .alert-danger .alert-link{color:#953b39} @-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}} @-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}} @-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}} @keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}} .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)} .progress-bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease} .progress-striped .progress-bar{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px} .progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite} .progress-bar-success{background-color:#5cb85c} .progress-striped .progress-bar-success{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)} .progress-bar-info{background-color:#5bc0de} .progress-striped .progress-bar-info{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)} .progress-bar-warning{background-color:#f0ad4e} .progress-striped .progress-bar-warning{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)} .progress-bar-danger{background-color:#d9534f} .progress-striped .progress-bar-danger{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)} .media,.media-body{overflow:hidden;zoom:1} .media,.media .media{margin-top:15px} .media:first-child{margin-top:0} .media-object{display:block} .media-heading{margin:0 0 5px} .media>.pull-left{margin-right:10px} .media>.pull-right{margin-left:10px} .media-list{padding-left:0;list-style:none} .list-group{padding-left:0;margin-bottom:20px} .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd} .list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px} .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px} .list-group-item>.badge{float:right} .list-group-item>.badge+.badge{margin-right:5px} a.list-group-item{color:#555} a.list-group-item .list-group-item-heading{color:#333} a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5} .list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca} .list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading{color:inherit} .list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7} .list-group-item-heading{margin-top:0;margin-bottom:5px} .list-group-item-text{margin-bottom:0;line-height:1.3} .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)} .panel-body{padding:15px} .panel-body:before,.panel-body:after{display:table;content:" "} .panel-body:after{clear:both} .panel-body:before,.panel-body:after{display:table;content:" "} .panel-body:after{clear:both} .panel>.list-group{margin-bottom:0} .panel>.list-group .list-group-item{border-width:1px 0} .panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0} .panel>.list-group .list-group-item:last-child{border-bottom:0} .panel-heading+.list-group .list-group-item:first-child{border-top-width:0} .panel>.table{margin-bottom:0} .panel>.panel-body+.table{border-top:1px solid #ddd} .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px} .panel-title{margin-top:0;margin-bottom:0;font-size:16px} .panel-title>a{color:inherit} .panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px} .panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px} .panel-group .panel+.panel{margin-top:5px} .panel-group .panel-heading{border-bottom:0} .panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd} .panel-group .panel-footer{border-top:0} .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd} .panel-default{border-color:#ddd} .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd} .panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd} .panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd} .panel-primary{border-color:#428bca} .panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca} .panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca} .panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca} .panel-success{border-color:#d6e9c6} .panel-success>.panel-heading{color:#468847;background-color:#dff0d8;border-color:#d6e9c6} .panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6} .panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6} .panel-warning{border-color:#fbeed5} .panel-warning>.panel-heading{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5} .panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#fbeed5} .panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#fbeed5} .panel-danger{border-color:#eed3d7} .panel-danger>.panel-heading{color:#b94a48;background-color:#f2dede;border-color:#eed3d7} .panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#eed3d7} .panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#eed3d7} .panel-info{border-color:#bce8f1} .panel-info>.panel-heading{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1} .panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1} .panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1} .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)} .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)} .well-lg{padding:24px;border-radius:6px} .well-sm{padding:9px;border-radius:3px} .close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)} .close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)} button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none} .modal-open{overflow:hidden} body.modal-open,.modal-open .navbar-fixed-top,.modal-open .navbar-fixed-bottom{margin-right:15px} .modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll} .modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out} .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)} .modal-dialog{z-index:1050;width:auto;padding:10px;margin-right:auto;margin-left:auto} .modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box} .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000} .modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)} .modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)} .modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5} .modal-header .close{margin-top:-2px} .modal-title{margin:0;line-height:1.428571429} .modal-body{position:relative;padding:20px} .modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5} .modal-footer:before,.modal-footer:after{display:table;content:" "} .modal-footer:after{clear:both} .modal-footer:before,.modal-footer:after{display:table;content:" "} .modal-footer:after{clear:both} .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px} .modal-footer .btn-group .btn+.btn{margin-left:-1px} .modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{right:auto;left:50%;width:600px;padding-top:30px;padding-bottom:30px}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}} .tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible} .tooltip.in{opacity:.9;filter:alpha(opacity=90)} .tooltip.top{padding:5px 0;margin-top:-3px} .tooltip.right{padding:0 5px;margin-left:3px} .tooltip.bottom{padding:5px 0;margin-top:3px} .tooltip.left{padding:0 5px;margin-left:-3px} .tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px} .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid} .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0} .tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0} .tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0} .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0} .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px} .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px} .tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px} .tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px} .popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box} .popover.top{margin-top:-10px} .popover.right{margin-left:10px} .popover.bottom{margin-top:10px} .popover.left{margin-left:-10px} .popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0} .popover-content{padding:9px 14px} .popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid} .popover .arrow{border-width:11px} .popover .arrow:after{border-width:10px;content:""} .popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0} .popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "} .popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0} .popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "} .popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0} .popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "} .popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0} .popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "} .carousel{position:relative} .carousel-inner{position:relative;width:100%;overflow:hidden} .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left} .carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1} .carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block} .carousel-inner>.active{left:0} .carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%} .carousel-inner>.next{left:100%} .carousel-inner>.prev{left:-100%} .carousel-inner>.next.left,.carousel-inner>.prev.right{left:0} .carousel-inner>.active.left{left:-100%} .carousel-inner>.active.right{left:100%} .carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)} .carousel-control.left{background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.5)),to(rgba(0,0,0,0.0001)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)} .carousel-control.right{right:0;left:auto;background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.0001)),to(rgba(0,0,0,0.5)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)} .carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)} .carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;left:50%;z-index:5;display:inline-block} .carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif} .carousel-control .icon-prev:before{content:'\2039'} .carousel-control .icon-next:before{content:'\203a'} .carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none} .carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;border:1px solid #fff;border-radius:10px} .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff} .carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)} .carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}} .clearfix:before,.clearfix:after{display:table;content:" "} .clearfix:after{clear:both} .pull-right{float:right!important} .pull-left{float:left!important} .hide{display:none!important} .show{display:block!important} .invisible{visibility:hidden} .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0} .affix{position:fixed}@-ms-viewport{width:device-width}@media screen and (max-width:400px){@-ms-viewport{width:320px}} .hidden{display:none!important;visibility:hidden!important} .visible-xs{display:none!important} tr.visible-xs{display:none!important} th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}} .visible-sm{display:none!important} tr.visible-sm{display:none!important} th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}} .visible-md{display:none!important} tr.visible-md{display:none!important} th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}} .visible-lg{display:none!important} tr.visible-lg{display:none!important} th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}} .hidden-xs{display:block!important} tr.hidden-xs{display:table-row!important} th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs{display:none!important}tr.hidden-xs{display:none!important}th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm{display:none!important}tr.hidden-xs.hidden-sm{display:none!important}th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md{display:none!important}tr.hidden-xs.hidden-md{display:none!important}th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg{display:none!important}tr.hidden-xs.hidden-lg{display:none!important}th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}} .hidden-sm{display:block!important} tr.hidden-sm{display:table-row!important} th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs{display:none!important}tr.hidden-sm.hidden-xs{display:none!important}th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}tr.hidden-sm{display:none!important}th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md{display:none!important}tr.hidden-sm.hidden-md{display:none!important}th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg{display:none!important}tr.hidden-sm.hidden-lg{display:none!important}th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}} .hidden-md{display:block!important} tr.hidden-md{display:table-row!important} th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs{display:none!important}tr.hidden-md.hidden-xs{display:none!important}th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm{display:none!important}tr.hidden-md.hidden-sm{display:none!important}th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}tr.hidden-md{display:none!important}th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg{display:none!important}tr.hidden-md.hidden-lg{display:none!important}th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}} .hidden-lg{display:block!important} tr.hidden-lg{display:table-row!important} th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs{display:none!important}tr.hidden-lg.hidden-xs{display:none!important}th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm{display:none!important}tr.hidden-lg.hidden-sm{display:none!important}th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md{display:none!important}tr.hidden-lg.hidden-md{display:none!important}th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg{display:none!important}tr.hidden-lg{display:none!important}th.hidden-lg,td.hidden-lg{display:none!important}} .visible-print{display:none!important} tr.visible-print{display:none!important} th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print{display:none!important}tr.hidden-print{display:none!important}th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/assets/css/lib/bootstrap-3.3.7.css b/assets/css/lib/bootstrap-3.3.7.css new file mode 100644 index 0000000..1e9eec8 --- /dev/null +++ b/assets/css/lib/bootstrap-3.3.7.css @@ -0,0 +1,6757 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../../fonts/glyphicons-halflings-regular.eot'); + src: url('../../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-green { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-green:focus, +.btn-green.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-green:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-green:active, +.btn-green.active, +.open > .dropdown-toggle.btn-green { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-green:active:hover, +.btn-green.active:hover, +.open > .dropdown-toggle.btn-green:hover, +.btn-green:active:focus, +.btn-green.active:focus, +.open > .dropdown-toggle.btn-green:focus, +.btn-green:active.focus, +.btn-green.active.focus, +.open > .dropdown-toggle.btn-green.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-green:active, +.btn-green.active, +.open > .dropdown-toggle.btn-green { + background-image: none; +} +.btn-green.disabled:hover, +.btn-green[disabled]:hover, +fieldset[disabled] .btn-green:hover, +.btn-green.disabled:focus, +.btn-green[disabled]:focus, +fieldset[disabled] .btn-green:focus, +.btn-green.disabled.focus, +.btn-green[disabled].focus, +fieldset[disabled] .btn-green.focus { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-green .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-orange { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-orange:focus, +.btn-orange.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-orange:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-orange:active, +.btn-orange.active, +.open > .dropdown-toggle.btn-orange { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-orange:active:hover, +.btn-orange.active:hover, +.open > .dropdown-toggle.btn-orange:hover, +.btn-orange:active:focus, +.btn-orange.active:focus, +.open > .dropdown-toggle.btn-orange:focus, +.btn-orange:active.focus, +.btn-orange.active.focus, +.open > .dropdown-toggle.btn-orange.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-orange:active, +.btn-orange.active, +.open > .dropdown-toggle.btn-orange { + background-image: none; +} +.btn-orange.disabled:hover, +.btn-orange[disabled]:hover, +fieldset[disabled] .btn-orange:hover, +.btn-orange.disabled:focus, +.btn-orange[disabled]:focus, +fieldset[disabled] .btn-orange:focus, +.btn-orange.disabled.focus, +.btn-orange[disabled].focus, +fieldset[disabled] .btn-orange.focus { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-orange .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-red { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-red:focus, +.btn-red.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-red:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-red:active, +.btn-red.active, +.open > .dropdown-toggle.btn-red { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-red:active:hover, +.btn-red.active:hover, +.open > .dropdown-toggle.btn-red:hover, +.btn-red:active:focus, +.btn-red.active:focus, +.open > .dropdown-toggle.btn-red:focus, +.btn-red:active.focus, +.btn-red.active.focus, +.open > .dropdown-toggle.btn-red.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-red:active, +.btn-red.active, +.open > .dropdown-toggle.btn-red { + background-image: none; +} +.btn-red.disabled:hover, +.btn-red[disabled]:hover, +fieldset[disabled] .btn-red:hover, +.btn-red.disabled:focus, +.btn-red[disabled]:focus, +fieldset[disabled] .btn-red:focus, +.btn-red.disabled.focus, +.btn-red[disabled].focus, +fieldset[disabled] .btn-red.focus { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-red .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/assets/css/lib/bootstrap-3.3.7.min.css b/assets/css/lib/bootstrap-3.3.7.min.css new file mode 100644 index 0000000..1985a06 --- /dev/null +++ b/assets/css/lib/bootstrap-3.3.7.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../../fonts/glyphicons-halflings-regular.eot);src:url(../../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-green{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-green.focus,.btn-green:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-green:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-green.active,.btn-green:active,.open>.dropdown-toggle.btn-green{color:#fff;background-color:#449d44;border-color:#398439}.btn-green.active.focus,.btn-green.active:focus,.btn-green.active:hover,.btn-green:active.focus,.btn-green:active:focus,.btn-green:active:hover,.open>.dropdown-toggle.btn-green.focus,.open>.dropdown-toggle.btn-green:focus,.open>.dropdown-toggle.btn-green:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-green.active,.btn-green:active,.open>.dropdown-toggle.btn-green{background-image:none}.btn-green.disabled.focus,.btn-green.disabled:focus,.btn-green.disabled:hover,.btn-green[disabled].focus,.btn-green[disabled]:focus,.btn-green[disabled]:hover,fieldset[disabled] .btn-green.focus,fieldset[disabled] .btn-green:focus,fieldset[disabled] .btn-green:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-green .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-orange{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-orange.focus,.btn-orange:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-orange:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-orange.active,.btn-orange:active,.open>.dropdown-toggle.btn-orange{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-orange.active.focus,.btn-orange.active:focus,.btn-orange.active:hover,.btn-orange:active.focus,.btn-orange:active:focus,.btn-orange:active:hover,.open>.dropdown-toggle.btn-orange.focus,.open>.dropdown-toggle.btn-orange:focus,.open>.dropdown-toggle.btn-orange:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-orange.active,.btn-orange:active,.open>.dropdown-toggle.btn-orange{background-image:none}.btn-orange.disabled.focus,.btn-orange.disabled:focus,.btn-orange.disabled:hover,.btn-orange[disabled].focus,.btn-orange[disabled]:focus,.btn-orange[disabled]:hover,fieldset[disabled] .btn-orange.focus,fieldset[disabled] .btn-orange:focus,fieldset[disabled] .btn-orange:hover{background-color:#f0ad4e;border-color:#eea236}.btn-orange .badge{color:#f0ad4e;background-color:#fff}.btn-red{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-red.focus,.btn-red:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-red:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-red.active,.btn-red:active,.open>.dropdown-toggle.btn-red{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-red.active.focus,.btn-red.active:focus,.btn-red.active:hover,.btn-red:active.focus,.btn-red:active:focus,.btn-red:active:hover,.open>.dropdown-toggle.btn-red.focus,.open>.dropdown-toggle.btn-red:focus,.open>.dropdown-toggle.btn-red:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-red.active,.btn-red:active,.open>.dropdown-toggle.btn-red{background-image:none}.btn-red.disabled.focus,.btn-red.disabled:focus,.btn-red.disabled:hover,.btn-red[disabled].focus,.btn-red[disabled]:focus,.btn-red[disabled]:hover,fieldset[disabled] .btn-red.focus,fieldset[disabled] .btn-red:focus,fieldset[disabled] .btn-red:hover{background-color:#d9534f;border-color:#d43f3a}.btn-red .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/assets/css/lib/bootstrap-datetimepicker.min.css b/assets/css/lib/bootstrap-datetimepicker.min.css new file mode 100644 index 0000000..5291211 --- /dev/null +++ b/assets/css/lib/bootstrap-datetimepicker.min.css @@ -0,0 +1 @@ +.bootstrap-datetimepicker-widget{list-style:none}.bootstrap-datetimepicker-widget.dropdown-menu{margin:2px 0;padding:4px;width:19em}@media (min-width:768px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:992px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:1200px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}.bootstrap-datetimepicker-widget.dropdown-menu:before,.bootstrap-datetimepicker-widget.dropdown-menu:after{content:'';display:inline-block;position:absolute}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);top:-7px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:after{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid white;top:-6px;left:8px}.bootstrap-datetimepicker-widget.dropdown-menu.top:before{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);bottom:-7px;left:6px}.bootstrap-datetimepicker-widget.dropdown-menu.top:after{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid white;bottom:-6px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget .list-unstyled{margin:0}.bootstrap-datetimepicker-widget a[data-action]{padding:6px 0}.bootstrap-datetimepicker-widget a[data-action]:active{box-shadow:none}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:54px;font-weight:bold;font-size:1.2em;margin:0}.bootstrap-datetimepicker-widget button[data-action]{padding:6px}.bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Increment Hours"}.bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Increment Minutes"}.bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Decrement Hours"}.bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Decrement Minutes"}.bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Show Hours"}.bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Show Minutes"}.bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Toggle AM/PM"}.bootstrap-datetimepicker-widget .btn[data-action="clear"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Clear the picker"}.bootstrap-datetimepicker-widget .btn[data-action="today"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Set the date to today"}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget .picker-switch::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Toggle Date and Time Screens"}.bootstrap-datetimepicker-widget .picker-switch td{padding:0;margin:0;height:auto;width:auto;line-height:inherit}.bootstrap-datetimepicker-widget .picker-switch td span{line-height:2.5;height:2.5em;width:100%}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget table td,.bootstrap-datetimepicker-widget table th{text-align:center;border-radius:4px}.bootstrap-datetimepicker-widget table th{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table th.picker-switch{width:145px}.bootstrap-datetimepicker-widget table th.disabled,.bootstrap-datetimepicker-widget table th.disabled:hover{background:none;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget table th.prev::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Previous Month"}.bootstrap-datetimepicker-widget table th.next::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Next Month"}.bootstrap-datetimepicker-widget table thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#eee}.bootstrap-datetimepicker-widget table td{height:54px;line-height:54px;width:54px}.bootstrap-datetimepicker-widget table td.cw{font-size:.8em;height:20px;line-height:20px;color:#777}.bootstrap-datetimepicker-widget table td.day{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table td.day:hover,.bootstrap-datetimepicker-widget table td.hour:hover,.bootstrap-datetimepicker-widget table td.minute:hover,.bootstrap-datetimepicker-widget table td.second:hover{background:#eee;cursor:pointer}.bootstrap-datetimepicker-widget table td.old,.bootstrap-datetimepicker-widget table td.new{color:#777}.bootstrap-datetimepicker-widget table td.today{position:relative}.bootstrap-datetimepicker-widget table td.today:before{content:'';display:inline-block;border:solid transparent;border-width:0 0 7px 7px;border-bottom-color:#337ab7;border-top-color:rgba(0,0,0,0.2);position:absolute;bottom:4px;right:4px}.bootstrap-datetimepicker-widget table td.active,.bootstrap-datetimepicker-widget table td.active:hover{background-color:#337ab7;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget table td.active.today:before{border-bottom-color:#fff}.bootstrap-datetimepicker-widget table td.disabled,.bootstrap-datetimepicker-widget table td.disabled:hover{background:none;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget table td span{display:inline-block;width:54px;height:54px;line-height:54px;margin:2px 1.5px;cursor:pointer;border-radius:4px}.bootstrap-datetimepicker-widget table td span:hover{background:#eee}.bootstrap-datetimepicker-widget table td span.active{background-color:#337ab7;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget table td span.old{color:#777}.bootstrap-datetimepicker-widget table td span.disabled,.bootstrap-datetimepicker-widget table td span.disabled:hover{background:none;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget.usetwentyfour td.hour{height:27px;line-height:27px}.bootstrap-datetimepicker-widget.wider{width:21em}.bootstrap-datetimepicker-widget .datepicker-decades .decade{line-height:1.8em !important}.input-group.date .input-group-addon{cursor:pointer}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0} \ No newline at end of file diff --git a/assets/css/lib/bootstrap-tagsinput.css b/assets/css/lib/bootstrap-tagsinput.css new file mode 100644 index 0000000..b31f01c --- /dev/null +++ b/assets/css/lib/bootstrap-tagsinput.css @@ -0,0 +1,55 @@ +.bootstrap-tagsinput { + background-color: #fff; + border: 1px solid #ccc; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + display: inline-block; + padding: 4px 6px; + color: #555; + vertical-align: middle; + border-radius: 4px; + max-width: 100%; + line-height: 22px; + cursor: text; +} +.bootstrap-tagsinput input { + border: none; + box-shadow: none; + outline: none; + background-color: transparent; + padding: 0 6px; + margin: 0; + width: auto; + max-width: inherit; +} +.bootstrap-tagsinput.form-control input::-moz-placeholder { + color: #777; + opacity: 1; +} +.bootstrap-tagsinput.form-control input:-ms-input-placeholder { + color: #777; +} +.bootstrap-tagsinput.form-control input::-webkit-input-placeholder { + color: #777; +} +.bootstrap-tagsinput input:focus { + border: none; + box-shadow: none; +} +.bootstrap-tagsinput .tag { + margin-right: 2px; + color: white; +} +.bootstrap-tagsinput .tag [data-role="remove"] { + margin-left: 8px; + cursor: pointer; +} +.bootstrap-tagsinput .tag [data-role="remove"]:after { + content: "x"; + padding: 0px 2px; +} +.bootstrap-tagsinput .tag [data-role="remove"]:hover { + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} +.bootstrap-tagsinput .tag [data-role="remove"]:hover:active { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} diff --git a/assets/css/lib/bootstrap-tagsinput.min.css b/assets/css/lib/bootstrap-tagsinput.min.css new file mode 100644 index 0000000..5379d27 --- /dev/null +++ b/assets/css/lib/bootstrap-tagsinput.min.css @@ -0,0 +1 @@ +.bootstrap-tagsinput{background-color:#fff;border:1px solid #ccc;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);display:inline-block;padding:4px 6px;color:#555;vertical-align:middle;border-radius:4px;max-width:100%;line-height:22px;cursor:text}.bootstrap-tagsinput input,.bootstrap-tagsinput input:focus{border:none;box-shadow:none}.bootstrap-tagsinput input{outline:0;background-color:transparent;padding:0 6px;margin:0;width:auto;max-width:inherit}.bootstrap-tagsinput.form-control input::-moz-placeholder{color:#777;opacity:1}.bootstrap-tagsinput.form-control input:-ms-input-placeholder{color:#777}.bootstrap-tagsinput.form-control input::-webkit-input-placeholder{color:#777}.bootstrap-tagsinput .tag{margin-right:2px;color:#fff}.bootstrap-tagsinput .tag [data-role=remove]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role=remove]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role=remove]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.bootstrap-tagsinput .tag [data-role=remove]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)} \ No newline at end of file diff --git a/assets/css/lib/bootstrap.min.css b/assets/css/lib/bootstrap.min.css new file mode 100644 index 0000000..8826912 --- /dev/null +++ b/assets/css/lib/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.1.3 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(2.25rem + 2px);padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::after,.was-validated .custom-file-input:valid~.custom-file-label::after{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::after,.was-validated .custom-file-input:invalid~.custom-file-label::after{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-label::after{border-color:#80bdff}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-dialog-centered::before{display:block;height:calc(100vh - (.5rem * 2));content:""}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-dialog-centered::before{height:calc(100vh - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-item-next,.carousel-item-prev,.carousel-item.active{transition:none}}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/assets/css/lib/content-tools/content-tools.min.css b/assets/css/lib/content-tools/content-tools.min.css new file mode 100644 index 0000000..a8e55e1 --- /dev/null +++ b/assets/css/lib/content-tools/content-tools.min.css @@ -0,0 +1 @@ +/*! ContentTools v1.6.9 by Anthony Blackshaw (https://github.com/anthonyjb) */.ce--dragging,.ce--resizing{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ce--dragging{cursor:move!important}.ce--resizing{cursor:nwse-resize!important}.ce-element--type-image,.ce-element--type-video{background-repeat:no-repeat;position:relative;cursor:pointer;z-index:1}.ce-element--type-image:after,.ce-element--type-image:before,.ce-element--type-video:after,.ce-element--type-video:before{background:rgba(0,0,0,.5);border-radius:2px;color:#fff;display:none;font-family:arial,sans-serif;font-size:10px;line-height:10px;padding:4px 4px 3px;position:absolute}.ce-element--type-image:before,.ce-element--type-video:before{content:attr(data-ce-size);right:10px;top:10px}.ce-element--type-image.ce-element--over:before,.ce-element--type-image.ce-element--resizing:before,.ce-element--type-video.ce-element--over:before,.ce-element--type-video.ce-element--resizing:before{display:block}.ce-element--type-image{background-position:0 0;background-size:cover}.ce-element--type-image:after{background:transparent;content:"";display:block;left:0;position:relative;top:0;height:100%;width:100%}.ce-element--type-video{background:#333 url(/assets/css/lib/content-tools//assets/css/lib/content-tools/images/video.svg) 50%/auto 48px no-repeat}.ce-element--type-video:after{bottom:10px;content:attr(data-ce-title);display:block;left:10px}.ce-element--empty:after{content:"...";display:inline-block;font-style:italic;opacity:.5}.ce-element--empty[data-ce-placeholder]:after{content:attr(data-ce-placeholder)}.ce-element--dragging{background-color:rgba(51,51,51,.1)!important;opacity:.5;z-index:-1}.ce-element--dragging.ce-element--type-image,.ce-element--dragging.ce-element--type-video{background-color:#333!important;opacity:1;outline-color:rgba(51,51,51,.1)!important}.ce-element--drop{position:relative!important}.ce-element--drop:before{background:#f39c12 url(/assets/css/lib/content-tools/images/drop-vert-above.svg) 50%/auto 32px repeat;bottom:0;content:""!important;left:0;opacity:.8;position:absolute;right:0;top:0;z-index:9}.ce-element--drop-below:before{transform:rotate(180deg)}.ce-element--drop-left:before{background-image:url(/assets/css/lib/content-tools/images/drop-horz.svg);transform:rotate(0deg)}.ce-element--drop-right:before{background-image:url(/assets/css/lib/content-tools/images/drop-horz.svg);transform:rotate(180deg)}.ce-element--drop.ce-element--type-table-row{background:#f39c12 url(/assets/css/lib/content-tools/images/drop-vert-above.svg) 50%/auto 32px repeat}.ce-element--drop.ce-element--type-table-row:before{display:none}.ce-element--drop.ce-element--type-table-row.ce-element--drop-below{background:#f39c12 url(/assets/css/lib/content-tools/images/drop-vert-below.svg) 50%/auto 32px repeat}.ce-element--focused,.ce-element--over{background-color:rgba(243,156,18,.1);outline:none}.ce-element--focused.ce-element--type-image,.ce-element--focused.ce-element--type-image-fixture,.ce-element--focused.ce-element--type-video,.ce-element--over.ce-element--type-image,.ce-element--over.ce-element--type-image-fixture,.ce-element--over.ce-element--type-video{background-color:#333;outline:4px solid rgba(243,156,18,.35)}.ce-element--resize-top-left{cursor:nw-resize}.ce-element--resize-top-right{cursor:ne-resize}.ce-element--resize-bottom-right{cursor:se-resize}.ce-element--resize-bottom-left{cursor:sw-resize}.ce-drag-helper{background:#fff;border-radius:2px;box-shadow:0 3px 3px rgba(0,0,0,.25);color:#4e4e4e;font:arial,sans-serif;font-size:12px;height:120px;left:0;line-height:135%;margin:5px 0 0 5px;overflow:hidden;padding:15px;position:absolute;top:0;width:120px;word-wrap:break-word;z-index:9}.ce-drag-helper:before{background:#2980b9;color:#fff;content:attr(data-ce-type);display:block;font-family:arial,sans-serif;font-size:10px;line-height:10px;padding:4px 4px 3px;position:absolute;right:0;top:0}.ce-drag-helper--type-list-item-text:after,.ce-drag-helper--type-list:after,.ce-drag-helper--type-pre-text:after,.ce-drag-helper--type-table-row:after,.ce-drag-helper--type-table:after,.ce-drag-helper--type-text:after{background-image:linear-gradient(hsla(0,0%,100%,0),#fff 66%);bottom:0;content:"";display:block;height:40px;left:0;position:absolute;width:100%}.ce-drag-helper--type-image{background-repeat:no-repeat;background-size:cover}.ce-element--type-image,.ce-element--type-video{display:block;margin-left:auto;margin-right:auto}.ce-element--type-image.align-left,.ce-element--type-video.align-left{clear:none;float:left}.ce-element--type-image.align-right,.ce-element--type-video.align-right{clear:none;float:right}.ce-measure{display:block!important}@font-face{font-family:icon;src:url(/assets/css/lib/content-tools/images/icons.woff);font-weight:400;font-style:normal}.ct-widget,.ct-widget *{box-sizing:border-box}.ct-widget * a,.ct-widget * b,.ct-widget * caption,.ct-widget * div,.ct-widget * form,.ct-widget * i fieldset,.ct-widget * iframe,.ct-widget * label,.ct-widget * legend,.ct-widget * span,.ct-widget * table,.ct-widget * tbody,.ct-widget * td,.ct-widget * tfoot,.ct-widget * th,.ct-widget * thead,.ct-widget * tr,.ct-widget a,.ct-widget b,.ct-widget caption,.ct-widget div,.ct-widget form,.ct-widget i fieldset,.ct-widget iframe,.ct-widget label,.ct-widget legend,.ct-widget span,.ct-widget table,.ct-widget tbody,.ct-widget td,.ct-widget tfoot,.ct-widget th,.ct-widget thead,.ct-widget tr{border:0;font-size:100%;font:inherit;margin:0;padding:0;vertical-align:baseline}.ct-widget * ol,.ct-widget * ul,.ct-widget ol,.ct-widget ul{list-style:none}.ct-widget * table,.ct-widget table{border-collapse:collapse;border-spacing:0}.ct-widget{opacity:0;font-family:arial,sans-serif;font-size:14px;line-height:18px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;z-index:9999}.ct-widget,.ct-widget--active{transition-property:opacity;transition-duration:.25s;transition-timing-function:ease-in}.ct-widget--active{opacity:1}.ct-widget .ct-attribute{border-bottom:1px solid #eee;height:48px;vertical-align:top}.ct-widget .ct-attribute:after{clear:both;content:"";display:table}.ct-widget .ct-attribute__name{background:#f6f6f6;border:none;color:#646464;float:left;height:47px;outline:none;padding:0 16px;font-family:arial,sans-serif;font-size:14px;line-height:48px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:25%}.ct-widget .ct-attribute__name--invalid{color:#e74c3c}.ct-widget .ct-attribute__value{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#fff;border:none;color:#646464;float:right;height:47px;outline:none;padding:0 16px;font-family:arial,sans-serif;font-size:14px;line-height:48px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:75%}.ct-widget .ct-crop-marks{height:320px;left:73px;position:absolute;top:0;width:427px}.ct-widget .ct-crop-marks__clipper{height:100%;overflow:hidden;position:relative;width:100%}.ct-widget .ct-crop-marks__ruler--top-left{position:absolute}.ct-widget .ct-crop-marks__ruler--top-left:after{border:1px solid hsla(0,0%,100%,.5);border-bottom:none;border-right:none;box-shadow:-1px -1px 1px rgba(0,0,0,.25),inset 1px 1px 1px rgba(0,0,0,.25);content:"";height:999px;left:0;position:absolute;top:0;width:999px}.ct-widget .ct-crop-marks__ruler--bottom-right{position:absolute}.ct-widget .ct-crop-marks__ruler--bottom-right:after{border:1px solid hsla(0,0%,100%,.5);border-top:none;border-left:none;bottom:0;box-shadow:1px 1px 1px rgba(0,0,0,.25),inset -1px -1px 1px rgba(0,0,0,.25);content:"";height:999px;position:absolute;right:0;width:999px}.ct-widget .ct-crop-marks__handle{background:#2980b9;border:1px solid #409ad5;border-radius:7px;cursor:pointer;height:15px;margin-left:-7px;margin-top:-7px;position:absolute;width:15px}.ct-widget .ct-crop-marks__handle--bottom-right{margin-left:-8px;margin-top:-8px}.ct-widget .ct-crop-marks__handle:hover{background:#2e8ece}@keyframes a{0%{transform:translate(-50%,-50%) rotate(0deg);transform:transform}to{transform:translate(-50%,-50%) rotate(359deg);transform:transform}}.ct-widget.ct-dialog{background:#fff;box-shadow:0 8px 8px rgba(0,0,0,.35);border-radius:2px;height:480px;left:50%;margin-left:-350px;margin-top:-240px;position:fixed;top:50%;width:700px;z-index:10099}.ct-widget.ct-dialog--busy .ct-dialog__busy{display:block}.ct-widget.ct-dialog--busy .ct-dialog__body{opacity:.1}.ct-widget .ct-dialog__header{color:#a4a4a4;border-bottom:1px solid #eee;height:48px;padding:0 16px;position:relative}.ct-widget .ct-dialog__caption{font-family:arial,sans-serif;font-size:18px}.ct-widget .ct-dialog__caption,.ct-widget .ct-dialog__close{line-height:48px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ct-widget .ct-dialog__close{border-left:1px solid #eee;cursor:pointer;height:48px;position:absolute;right:0;text-align:center;top:0;font-family:icon;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;width:48px}.ct-widget .ct-dialog__close:before{content:"\ea0f"}.ct-widget .ct-dialog__close:hover:before{color:#646464}.ct-widget .ct-dialog__body{margin:auto;width:572px}.ct-widget .ct-dialog__view{height:320px;margin-top:32px}.ct-widget .ct-dialog__controls{margin-top:16px}.ct-widget .ct-dialog__controls:after{clear:both;content:"";display:table}.ct-widget .ct-dialog__busy{display:none;position:absolute}.ct-widget .ct-dialog__busy:before{animation:a 5s linear;animation-iteration-count:infinite;animation-fill-mode:forwards;color:#a4a4a4;content:"\e994";left:50%;position:fixed;top:50%;font-family:icon;font-size:80px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ct-widget .ct-control-group{font-size:0}.ct-widget .ct-control-group--center{text-align:center}.ct-widget .ct-control-group--left{float:left}.ct-widget .ct-control-group--right{float:right}.ct-widget .ct-control{margin-left:16px;position:relative}.ct-widget .ct-control:first-child{margin-left:0}.ct-widget .ct-control--icon{color:#a4a4a4;cursor:pointer;display:inline-block;height:32px;line-height:32px;text-align:center;font-family:icon;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;width:32px}.ct-widget .ct-control--icon,.ct-widget .ct-control--icon:after{border-radius:2px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ct-widget .ct-control--icon:after{background:#000;color:#fff;content:attr(data-ct-tooltip);display:block;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;left:-26.5px;opacity:0;padding:0 8px;position:absolute;bottom:37px;font-family:arial,sans-serif;font-size:12px;line-height:20px;visibility:hidden;width:85px;word-break:break-word}.ct-widget .ct-control--icon:hover:after{opacity:.8;visibility:visible;transition-property:opacity;transition-duration:0s;transition-timing-function:ease-in;transition-delay:2s}.ct-widget .ct-control--icon:before{content:""}.ct-widget .ct-control--icon:hover{background:#eee;color:#646464}.ct-widget .ct-control--active,.ct-widget .ct-control--on{background:#a4a4a4;color:#fff}.ct-widget .ct-control--active:hover,.ct-widget .ct-control--on:hover{background:#646464;color:#fff}.ct-widget .ct-control--rotate-ccw:before{content:"\e965"}.ct-widget .ct-control--rotate-cw:before{content:"\e966"}.ct-widget .ct-control--crop:before{content:"\ea57"}.ct-widget .ct-control--remove:before{content:"\e9ac"}.ct-widget .ct-control--styles:before{content:"\e90b"}.ct-widget .ct-control--attributes:before{content:"\e994"}.ct-widget .ct-control--code:before{content:"\ea80"}.ct-widget .ct-control--icon.ct-control--muted{cursor:default}.ct-widget .ct-control--icon.ct-control--muted:before{opacity:.5}.ct-widget .ct-control--icon.ct-control--muted:hover{color:#a4a4a4;background:transparent}.ct-widget .ct-control--text{background:#2980b9;border-radius:2px;color:#fff;cursor:pointer;display:inline-block;font-weight:700;height:32px;overflow:hidden;padding:0 8px;text-align:center;text-overflow:ellipsis;font-family:arial,sans-serif;font-size:14px;line-height:32px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top;width:100px}.ct-widget .ct-control--text:hover{background:#2e8ece}.ct-widget .ct-control--apply,.ct-widget .ct-control--insert,.ct-widget .ct-control--ok{background:#27ae60}.ct-widget .ct-control--apply:hover,.ct-widget .ct-control--insert:hover,.ct-widget .ct-control--ok:hover{background:#2cc36b}.ct-widget .ct-control--cancel,.ct-widget .ct-control--clear{background:#e74c3c}.ct-widget .ct-control--cancel:hover,.ct-widget .ct-control--clear:hover{background:#ea6153}.ct-widget .ct-control--text.ct-control--muted{background:#ccc;cursor:default}.ct-widget .ct-control--text.ct-control--muted:hover{background:#ccc}.ct-widget .ct-control--upload{overflow:hidden}.ct-widget.ct-image-dialog--empty .ct-control--cancel,.ct-widget.ct-image-dialog--empty .ct-control--clear,.ct-widget.ct-image-dialog--empty .ct-control--crop,.ct-widget.ct-image-dialog--empty .ct-control--insert,.ct-widget.ct-image-dialog--empty .ct-control--rotate-ccw,.ct-widget.ct-image-dialog--empty .ct-control--rotate-cw,.ct-widget.ct-image-dialog--empty .ct-progress-bar,.ct-widget.ct-image-dialog--populated .ct-control--cancel,.ct-widget.ct-image-dialog--populated .ct-control--upload,.ct-widget.ct-image-dialog--populated .ct-progress-bar,.ct-widget.ct-image-dialog--uploading .ct-control--clear,.ct-widget.ct-image-dialog--uploading .ct-control--crop,.ct-widget.ct-image-dialog--uploading .ct-control--insert,.ct-widget.ct-image-dialog--uploading .ct-control--rotate-ccw,.ct-widget.ct-image-dialog--uploading .ct-control--rotate-cw,.ct-widget.ct-image-dialog--uploading .ct-control--upload{display:none}.ct-widget .ct-image-dialog__view{background:#eee;position:relative}.ct-widget .ct-image-dialog__view:empty{font-family:icon;font-size:80px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:320px;text-align:center}.ct-widget .ct-image-dialog__view:empty:before{color:#fff;content:"\e90d"}.ct-widget .ct-image-dialog__image{background-color:transparent;background-position:50%;background-repeat:no-repeat;background-size:contain;height:100%;width:100%}.ct-widget .ct-image-dialog__file-upload{cursor:pointer;font-size:400px;left:0;opacity:0;position:absolute;top:0}.ct-widget.ct-properties-dialog--attributes .ct-properties-dialog__attributes,.ct-widget.ct-properties-dialog--styles .ct-properties-dialog__styles{display:block}.ct-widget.ct-properties-dialog--styles .ct-properties-dialog__styles:empty:before{color:#a4a4a4;content:attr(data-ct-empty);display:block;font-style:italic;margin-top:20px;text-align:center}.ct-widget.ct-properties-dialog--code .ct-properties-dialog__code{display:block}.ct-widget .ct-properties-dialog__view{border:1px solid #ddd;overflow:auto}.ct-widget .ct-properties-dialog__attributes,.ct-widget .ct-properties-dialog__code,.ct-widget .ct-properties-dialog__styles{display:none}.ct-widget .ct-properties-dialog__inner-html{border:none;display:block;font-family:courier,Bitstream Vera Sans Mono,Consolas,Courier,monospace;height:318px;padding:16px;outline:none;resize:none;width:100%}.ct-widget .ct-properties-dialog__inner-html--invalid{color:#e74c3c}.ct-widget .ct-table-dialog__view{border:1px solid #ddd;overflow:auto}.ct-widget .ct-video-dialog__preview:empty{background:#eee;font-family:icon;font-size:80px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:320px;text-align:center}.ct-widget .ct-video-dialog__preview:empty:before{color:#fff;content:"\ea98"}.ct-widget .ct-video-dialog__input{border:none;border-bottom:1px solid #eee;height:32px;line-height:32px;outline:none;padding:0 4px;font-family:arial,sans-serif;font-size:14px;line-height:18px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top;width:456px}.ct-widget .ct-video-dialog__input:focus{border-bottom:1px solid #e1e1e1}.ct-widget.ct-anchored-dialog{border-bottom:2px solid #27ae60;box-shadow:0 3px 3px rgba(0,0,0,.35);font-size:0;height:34px;left:0;margin-left:-160px;margin-top:-48px;position:absolute;top:0;width:320px;z-index:10099}.ct-widget.ct-anchored-dialog:after{border:16px solid hsla(0,0%,100%,0);border-top-color:#27ae60;content:"";left:144px;position:absolute;top:34px}.ct-widget .ct-anchored-dialog__input{border:none;color:#646464;outline:none;font-family:arial,sans-serif;font-size:14px;padding:0 8px 0 16px;vertical-align:top;width:256px}.ct-widget .ct-anchored-dialog__button,.ct-widget .ct-anchored-dialog__input{height:32px;line-height:32px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ct-widget .ct-anchored-dialog__button{background:#27ae60;cursor:pointer;display:inline-block;text-align:center;font-family:icon;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;width:32px}.ct-widget .ct-anchored-dialog__button:before{color:#fff;content:"\ea10"}.ct-widget .ct-anchored-dialog__button:hover{background:#2cc36b}.ct-widget .ct-anchored-dialog__target-button{background:#fff;cursor:pointer;display:inline-block;height:32px;line-height:32px;text-align:center;font-family:icon;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:32px}.ct-widget .ct-anchored-dialog__target-button:before{color:#a4a4a4;content:"\ea7d"}.ct-widget .ct-anchored-dialog__target-button:hover:before{color:#b1b1b1}.ct-widget .ct-anchored-dialog__target-button--active:before{color:#27ae60}.ct-widget .ct-anchored-dialog__target-button--active:hover:before{color:#2cc36b}@keyframes b{0%{opacity:0;font-size:32px;transform:font-size}25%{font-size:320px;opacity:1;transform:all}50%{font-size:320px;opacity:1;transform:all}75%{font-size:320px;opacity:1;transform:all}to{opacity:0;transform:all}}@keyframes c{0%{opacity:1;transform:opacity}99%{opacity:1;transform:opacity}to{opacity:0;transform:opacity}}.ct-widget.ct-flash{color:hsla(0,0%,100%,.9);height:0;left:0;position:fixed;font-family:icon;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;top:0;width:0;z-index:10999}.ct-widget.ct-flash:before{left:50%;opacity:0;position:fixed;text-shadow:0 0 20px rgba(0,0,0,.5);top:50%;transform:translate(-50%,-50%)}.ct-widget.ct-flash--active{animation:c 2s ease-in;animation-iteration-count:1;animation-fill-mode:forwards}.ct-widget.ct-flash--active:before{animation:b 2s ease-in;animation-iteration-count:1;animation-fill-mode:forwards;font-size:320px;opacity:1}.ct-widget.ct-flash--ok:before{content:"\ea10"}.ct-widget.ct-flash--no:before{content:"\ea0f"}.ct-widget .ct-grip{cursor:move;font-size:0;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ct-widget .ct-grip__bump{background:rgba(70,70,70,.15);border-radius:12px;display:inline-block;height:12px;margin-left:12px;width:12px}.ct-widget .ct-grip__bump:first-child{margin-left:0}@keyframes d{0%{transform:rotate(0deg);transform:transform}to{transform:rotate(359deg);transform:transform}}.ct-widget.ct-ignition{left:16px;position:fixed;top:16px}.ct-widget.ct-ignition .ct-ignition__button{display:none}.ct-widget.ct-ignition--editing .ct-ignition__button--cancel,.ct-widget.ct-ignition--editing .ct-ignition__button--confirm,.ct-widget.ct-ignition--ready .ct-ignition__button--edit{display:block}.ct-widget.ct-ignition--busy .ct-ignition__button{display:none}.ct-widget.ct-ignition--busy .ct-ignition__button--busy{display:block}.ct-widget .ct-ignition__button{border-radius:24px;content:"";cursor:pointer;display:block;height:48px;line-height:48px;opacity:.9;position:absolute;text-align:center;font-family:icon;font-size:24px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:48px}.ct-widget .ct-ignition__button:before{color:#fff}.ct-widget .ct-ignition__button--busy{animation:d 5s linear;animation-iteration-count:infinite;animation-fill-mode:forwards;background:#646464;cursor:default}.ct-widget .ct-ignition__button--busy:before{content:"\e994"}.ct-widget .ct-ignition__button--busy:hover{background:#646464}.ct-widget .ct-ignition__button--confirm{background:#27ae60}.ct-widget .ct-ignition__button--confirm:before{content:"\ea10"}.ct-widget .ct-ignition__button--confirm:hover{background:#2cc36b}.ct-widget .ct-ignition__button--cancel{background:#e74c3c;left:64px}.ct-widget .ct-ignition__button--cancel:before{content:"\ea0f"}.ct-widget .ct-ignition__button--cancel:hover{background:#ea6153}.ct-widget .ct-ignition__button--edit{background:#2980b9}.ct-widget .ct-ignition__button--edit:before{content:"\e905";transition-property:transform;transition-duration:.1s;transition-timing-function:ease-in}.ct-widget .ct-ignition__button--edit:hover{background:#2e8ece}.ct-widget .ct-ignition__button--edit:hover:before{display:inline-block;transform:rotate(-15deg)}.ct-widget.ct-inspector{background:hsla(0,0%,91%,.2);border-top:1px solid hsla(0,0%,100%,.1);bottom:0;height:32px;left:0;overflow:hidden;padding:3px 16px 0;position:fixed;width:100%}.ct-widget .ct-inspector__tags{width:calc(100% - 128px)}.ct-widget .ct-inspector__tags:after{clear:both;content:"";display:table}.ct-widget .ct-inspector__tags:before{color:#464646;content:"\ea80";display:block;float:left;height:24px;line-height:24px;margin-right:16px;text-align:center;font-family:icon;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:24px}.ct-widget .ct-inspector__counter{border-left:1px solid rgba(0,0,0,.1);height:24px;line-height:24px;margin-right:16px;position:absolute;right:0;text-align:right;top:3px;width:128px}.ct-widget .ct-tag{background-color:#2980b9;border-radius:2px 0 0 2px;color:#fff;cursor:pointer;float:left;font-weight:700;height:24px;line-height:24px;margin-left:24px;padding:0 8px;position:relative;text-shadow:0 1px 0 rgba(0,0,0,.35)}.ct-widget .ct-tag:after{border-style:solid;border-bottom:12px solid rgba(255,0,0,0);border-left:12px solid #2980b9;border-right:none;border-top:12px solid rgba(255,0,0,0);content:"";display:block;height:24px;bottom:0;right:-24px;position:absolute;width:24px;-moz-transform:scale(.9999)}.ct-widget .ct-tag:first-child{margin-left:0}.ct-widget .ct-tag:hover{background-color:#4aa3df}.ct-widget .ct-tag:hover:after{border-left-color:#4aa3df}.ct-widget .ct-tag:first-child{background-color:#8e44ad}.ct-widget .ct-tag:first-child:after{border-left-color:#8e44ad}.ct-widget .ct-tag:first-child:hover{background-color:#9b50ba}.ct-widget .ct-tag:first-child:hover:after{border-left-color:#9b50ba}.ct-widget .ct-tag:nth-child(2){background-color:#2980b9}.ct-widget .ct-tag:nth-child(2):after{border-left-color:#2980b9}.ct-widget .ct-tag:nth-child(2):hover{background-color:#2e8ece}.ct-widget .ct-tag:nth-child(2):hover:after{border-left-color:#2e8ece}.ct-widget .ct-tag:nth-child(3){background-color:#27ae60}.ct-widget .ct-tag:nth-child(3):after{border-left-color:#27ae60}.ct-widget .ct-tag:nth-child(3):hover{background-color:#2cc36b}.ct-widget .ct-tag:nth-child(3):hover:after{border-left-color:#2cc36b}.ct-widget .ct-tag:nth-child(4){background-color:#d35400}.ct-widget .ct-tag:nth-child(4):after{border-left-color:#d35400}.ct-widget .ct-tag:nth-child(4):hover{background-color:#ed5e00}.ct-widget .ct-tag:nth-child(4):hover:after{border-left-color:#ed5e00}.ct-widget .ct-tag:nth-child(5){background-color:#f39c12}.ct-widget .ct-tag:nth-child(5):after{border-left-color:#f39c12}.ct-widget .ct-tag:nth-child(5):hover{background-color:#f4a62a}.ct-widget .ct-tag:nth-child(5):hover:after{border-left-color:#f4a62a}.ct-widget .ct-tag:nth-child(6){background-color:#16a085}.ct-widget .ct-tag:nth-child(6):after{border-left-color:#16a085}.ct-widget .ct-tag:nth-child(6):hover{background-color:#19b698}.ct-widget .ct-tag:nth-child(6):hover:after{border-left-color:#19b698}.ct-widget.ct-modal{background:rgba(0,0,0,.7);height:0;left:0;position:fixed;top:0;width:0;z-index:10009}.ct-widget.ct-modal--transparent{background:transparent}.ct-widget--active.ct-modal{height:100%;width:100%}.ct-widget .ct-progress-bar{border:1px solid #eee;height:32px;line-height:32px;padding:1px;width:456px}.ct-widget .ct-progress-bar__progress{background:#2980b9;height:28px}.ct-widget .ct-section{border-bottom:1px solid #eee;color:#bdbdbd;cursor:pointer;font-style:italic;height:48px;padding:0 16px;font-family:arial,sans-serif;font-size:16px;line-height:48px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ct-widget .ct-section:after{clear:both;content:"";display:table}.ct-widget .ct-section:hover{background:#f6f6f6}.ct-widget .ct-section--applied{color:#646464;font-style:normal}.ct-widget .ct-section--applied .ct-section__switch{background-color:#27ae60;border:1px solid #1e8449}.ct-widget .ct-section--applied .ct-section__switch:before{left:25px;transition-property:left;transition-duration:.1s;transition-timing-function:ease-in}.ct-widget .ct-section--contains-input .ct-section__label{width:75%}.ct-widget .ct-section__label{float:left;overflow:hidden;text-overflow:ellipsis;width:472px;white-space:nowrap}.ct-widget .ct-section__switch{background-color:#ccc;border:1px solid #b3b3b3;border-radius:12px;box-shadow:inset 0 0 2px rgba(0,0,0,.1);float:right;height:24px;margin-top:12px;position:relative;width:48px}.ct-widget .ct-section__switch:before{background:#fff;border-radius:10px;content:"";height:20px;left:1px;position:absolute;top:1px;transition-property:left;transition-duration:.1s;transition-timing-function:ease-in;width:20px}.ct-widget .ct-section__input{background:#fff;border:none;color:#646464;float:right;height:47px;outline:none;padding:0 16px;text-align:right;font-family:arial,sans-serif;font-size:14px;line-height:48px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:25%}.ct-widget .ct-section__input--invalid{color:#e74c3c}.ct-widget.ct-toolbox{background:hsla(0,0%,91%,.9);border:1px solid hsla(0,0%,100%,.5);box-shadow:0 3px 3px rgba(0,0,0,.35);left:128px;padding:8px;position:fixed;top:128px;width:138px}.ct-widget.ct-toolbox--dragging{opacity:.5}.ct-widget .ct-toolbox__grip{padding:8px 0}.ct-widget .ct-tool-group{padding:4px 0}.ct-widget .ct-tool-group:after{clear:both;content:"";display:table}.ct-widget .ct-tool-group:first-child{padding-top:0}.ct-widget .ct-tool{color:#464646;cursor:pointer;float:left;height:32px;margin:4px;margin-right:4px;position:relative;text-align:center;font-family:icon;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;speak:none;text-transform:none;width:32px}.ct-widget .ct-tool,.ct-widget .ct-tool:after{border-radius:2px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ct-widget .ct-tool:after{background:#000;color:#fff;content:attr(data-ct-tooltip);display:block;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;left:-26.5px;opacity:0;padding:0 8px;position:absolute;bottom:37px;font-family:arial,sans-serif;font-size:12px;line-height:20px;visibility:hidden;width:85px;word-break:break-word}.ct-widget .ct-tool:hover:after{opacity:.8;visibility:visible;transition-property:opacity;transition-duration:0s;transition-timing-function:ease-in;transition-delay:2s}.ct-widget .ct-tool:before{line-height:32px}.ct-widget .ct-tool:nth-child(3n){margin-right:0}.ct-widget .ct-tool:hover{background:hsla(0,0%,100%,.5)}.ct-widget .ct-tool--disabled{color:rgba(70,70,70,.33)}.ct-widget .ct-tool--disabled:hover{background:transparent}.ct-widget .ct-tool--down{box-shadow:inset 0 1px 3px rgba(0,0,0,.25);line-height:34px}.ct-widget .ct-tool--down,.ct-widget .ct-tool--down:hover{background:rgba(0,0,0,.025)}.ct-widget .ct-tool--applied{background:rgba(0,0,0,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.25)}.ct-widget .ct-tool--applied:hover{background:rgba(0,0,0,.15)}.ct-widget .ct-tool--bold:before{content:"\ea62"}.ct-widget .ct-tool--heading:before{content:"H";font-weight:700}.ct-widget .ct-tool--subheading:before{content:"H"}.ct-widget .ct-tool--paragraph:before{content:"P"}.ct-widget .ct-tool--preformatted:before{content:"\ea80"}.ct-widget .ct-tool--italic:before{content:"\ea64"}.ct-widget .ct-tool--link:before{content:"\e9cb"}.ct-widget .ct-tool--align-left:before{content:"\ea77"}.ct-widget .ct-tool--align-center:before{content:"\ea78"}.ct-widget .ct-tool--align-right:before{content:"\ea79"}.ct-widget .ct-tool--unordered-list:before{content:"\e9ba"}.ct-widget .ct-tool--ordered-list:before{content:"\e9b9"}.ct-widget .ct-tool--table:before{content:"\ea71"}.ct-widget .ct-tool--indent:before{content:"\ea7b"}.ct-widget .ct-tool--unindent:before{content:"\ea7c"}.ct-widget .ct-tool--line-break:before{content:"\ea6e"}.ct-widget .ct-tool--image:before{content:"\e90d"}.ct-widget .ct-tool--video:before{content:"\ea98"}.ct-widget .ct-tool--undo:before{content:"\e965"}.ct-widget .ct-tool--redo:before{content:"\e966"}.ct-widget .ct-tool--remove:before{content:"\e9ac"}@keyframes e{0%{outline-color:hsla(0,0%,100%,0);transform:background-color}25%{outline-color:#f39c12;transform:background-color}50%{outline-color:#f39c12;transform:background-color}to{outline-color:hsla(0,0%,100%,0);transform:background-color}}.ct-app,.ct-app *,.ct-app :after,.ct-app :before{box-sizing:border-box}.ct--highlight{outline:4px solid #f39c12;animation:e .5s ease-in;animation-iteration-count:infinite;animation-fill-mode:forwards}.ct--no-scroll{overflow:hidden}.ct--pseudo-select{background:rgba(0,0,0,.1)} \ No newline at end of file diff --git a/assets/css/lib/content-tools/images/drop-horz.svg b/assets/css/lib/content-tools/images/drop-horz.svg new file mode 100644 index 0000000..ed091cb --- /dev/null +++ b/assets/css/lib/content-tools/images/drop-horz.svg @@ -0,0 +1,34 @@ + + + + + + + \ No newline at end of file diff --git a/assets/css/lib/content-tools/images/drop-vert-above.svg b/assets/css/lib/content-tools/images/drop-vert-above.svg new file mode 100644 index 0000000..69902fe --- /dev/null +++ b/assets/css/lib/content-tools/images/drop-vert-above.svg @@ -0,0 +1,34 @@ + + + + + + + \ No newline at end of file diff --git a/assets/css/lib/content-tools/images/drop-vert-below.svg b/assets/css/lib/content-tools/images/drop-vert-below.svg new file mode 100644 index 0000000..a2553fd --- /dev/null +++ b/assets/css/lib/content-tools/images/drop-vert-below.svg @@ -0,0 +1,34 @@ + + + + + + + \ No newline at end of file diff --git a/assets/css/lib/content-tools/images/icons.woff b/assets/css/lib/content-tools/images/icons.woff new file mode 100644 index 0000000..9dc5f33 Binary files /dev/null and b/assets/css/lib/content-tools/images/icons.woff differ diff --git a/assets/css/lib/content-tools/images/video.svg b/assets/css/lib/content-tools/images/video.svg new file mode 100644 index 0000000..403690b --- /dev/null +++ b/assets/css/lib/content-tools/images/video.svg @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/assets/css/lib/dataTables.bootstrap.css b/assets/css/lib/dataTables.bootstrap.css new file mode 100644 index 0000000..c69b231 --- /dev/null +++ b/assets/css/lib/dataTables.bootstrap.css @@ -0,0 +1,185 @@ +table.dataTable { + clear: both; + margin-top: 6px !important; + margin-bottom: 6px !important; + max-width: none !important; + border-collapse: separate !important; +} +table.dataTable td, +table.dataTable th { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +table.dataTable td.dataTables_empty, +table.dataTable th.dataTables_empty { + text-align: center; +} +table.dataTable.nowrap th, +table.dataTable.nowrap td { + white-space: nowrap; +} + +div.dataTables_wrapper div.dataTables_length label { + font-weight: normal; + text-align: left; + white-space: nowrap; +} +div.dataTables_wrapper div.dataTables_length select { + width: 75px; + display: inline-block; +} +div.dataTables_wrapper div.dataTables_filter { + text-align: right; +} +div.dataTables_wrapper div.dataTables_filter label { + font-weight: normal; + white-space: nowrap; + text-align: left; +} +div.dataTables_wrapper div.dataTables_filter input { + margin-left: 0.5em; + display: inline-block; + width: auto; +} +div.dataTables_wrapper div.dataTables_info { + padding-top: 8px; + white-space: nowrap; +} +div.dataTables_wrapper div.dataTables_paginate { + margin: 0; + white-space: nowrap; + text-align: right; +} +div.dataTables_wrapper div.dataTables_paginate ul.pagination { + margin: 2px 0; + white-space: nowrap; +} +div.dataTables_wrapper div.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 200px; + margin-left: -100px; + margin-top: -26px; + text-align: center; + padding: 1em 0; +} + +table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting, +table.dataTable thead > tr > td.sorting_asc, +table.dataTable thead > tr > td.sorting_desc, +table.dataTable thead > tr > td.sorting { + padding-right: 30px; +} +table.dataTable thead > tr > th:active, +table.dataTable thead > tr > td:active { + outline: none; +} +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting_asc_disabled, +table.dataTable thead .sorting_desc_disabled { + cursor: pointer; + position: relative; +} +table.dataTable thead .sorting:after, +table.dataTable thead .sorting_asc:after, +table.dataTable thead .sorting_desc:after, +table.dataTable thead .sorting_asc_disabled:after, +table.dataTable thead .sorting_desc_disabled:after { + position: absolute; + bottom: 8px; + right: 8px; + display: block; + font-family: 'FontAwesome'; + opacity: 0.5; +} +table.dataTable thead .sorting:after { + opacity: 0.2; + content: "\e150"; + /* sort */ +} +table.dataTable thead .sorting_asc:after { + content: "\f106"; + /* sort-by-attributes */ +} +table.dataTable thead .sorting_desc:after { + content: "\f107"; + /* sort-by-attributes-alt */ +} +table.dataTable thead .sorting_asc_disabled:after, +table.dataTable thead .sorting_desc_disabled:after { + color: #eee; +} + +div.dataTables_scrollHead table.dataTable { + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody table { + border-top: none; + margin-top: 0 !important; + margin-bottom: 0 !important; +} +div.dataTables_scrollBody table thead .sorting:after, +div.dataTables_scrollBody table thead .sorting_asc:after, +div.dataTables_scrollBody table thead .sorting_desc:after { + display: none; +} +div.dataTables_scrollBody table tbody tr:first-child th, +div.dataTables_scrollBody table tbody tr:first-child td { + border-top: none; +} + +div.dataTables_scrollFoot table { + margin-top: 0 !important; + border-top: none; +} + +@media screen and (max-width: 767px) { + div.dataTables_wrapper div.dataTables_length, + div.dataTables_wrapper div.dataTables_filter, + div.dataTables_wrapper div.dataTables_info, + div.dataTables_wrapper div.dataTables_paginate { + text-align: center; + } +} +table.dataTable.table-condensed > thead > tr > th { + padding-right: 20px; +} +table.dataTable.table-condensed .sorting:after, +table.dataTable.table-condensed .sorting_asc:after, +table.dataTable.table-condensed .sorting_desc:after { + top: 6px; + right: 6px; +} + +table.table-bordered.dataTable th, +table.table-bordered.dataTable td { + border-left-width: 0; +} +table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child, +table.table-bordered.dataTable td:last-child, +table.table-bordered.dataTable td:last-child { + border-right-width: 0; +} +table.table-bordered.dataTable tbody th, +table.table-bordered.dataTable tbody td { + border-bottom-width: 0; +} + +div.dataTables_scrollHead table.table-bordered { + border-bottom-width: 0; +} + +div.table-responsive > div.dataTables_wrapper > div.row { + margin: 0; +} +div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:first-child { + padding-left: 0; +} +div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:last-child { + padding-right: 0; +} diff --git a/assets/css/lib/dataTables.bootstrap.min.css b/assets/css/lib/dataTables.bootstrap.min.css new file mode 100644 index 0000000..16ed637 --- /dev/null +++ b/assets/css/lib/dataTables.bootstrap.min.css @@ -0,0 +1 @@ +table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0} diff --git a/assets/css/lib/datatables.min.alt.css b/assets/css/lib/datatables.min.alt.css new file mode 100644 index 0000000..abe3043 --- /dev/null +++ b/assets/css/lib/datatables.min.alt.css @@ -0,0 +1,28 @@ +/* + * This combined file was created by the DataTables downloader builder: + * https://datatables.net/download + * + * To rebuild or modify this file with the latest versions of the included + * software please visit: + * https://datatables.net/download/#bs-3.3.7/dt-1.10.15/fh-3.1.2/r-2.1.1 + * + * Included libraries: + * Bootstrap 3.3.7, DataTables 1.10.15, FixedHeader 3.1.2, Responsive 2.1.1 + */ + +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(Bootstrap-3.3.7/fonts/glyphicons-halflings-regular.eot);src:url(Bootstrap-3.3.7/fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(Bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(Bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff) format('woff'),url(Bootstrap-3.3.7/fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(Bootstrap-3.3.7/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ + +table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_desc:after{display:none}div.dataTables_scrollBody>table>tbody>tr:first-child>th,div.dataTables_scrollBody>table>tbody>tr:first-child>td{border-top:none}div.dataTables_scrollFoot>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0} + + +table.dataTable.fixedHeader-floating,table.dataTable.fixedHeader-locked{background-color:white;margin-top:0 !important;margin-bottom:0 !important}table.dataTable.fixedHeader-floating{position:fixed !important}table.dataTable.fixedHeader-locked{position:absolute !important}@media print{table.fixedHeader-floating{display:none}} + + +table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child,table.dataTable.dtr-inline.collapsed>tbody>tr>th:first-child{position:relative;padding-left:30px;cursor:pointer}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th:first-child:before{top:9px;left:4px;height:14px;width:14px;display:block;position:absolute;color:white;border:2px solid white;border-radius:14px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:center;font-family:'Courier New', Courier, monospace;line-height:14px;content:'+';background-color:#337ab7}table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th:first-child:before{content:'-';background-color:#d33333}table.dataTable.dtr-inline.collapsed>tbody>tr.child td:before{display:none}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child{padding-left:27px}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child:before,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child:before{top:5px;left:4px;height:14px;width:14px;border-radius:14px;line-height:14px;text-indent:3px}table.dataTable.dtr-column>tbody>tr>td.control,table.dataTable.dtr-column>tbody>tr>th.control{position:relative;cursor:pointer}table.dataTable.dtr-column>tbody>tr>td.control:before,table.dataTable.dtr-column>tbody>tr>th.control:before{top:50%;left:50%;height:16px;width:16px;margin-top:-10px;margin-left:-10px;display:block;position:absolute;color:white;border:2px solid white;border-radius:14px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:center;font-family:'Courier New', Courier, monospace;line-height:14px;content:'+';background-color:#337ab7}table.dataTable.dtr-column>tbody>tr.parent td.control:before,table.dataTable.dtr-column>tbody>tr.parent th.control:before{content:'-';background-color:#d33333}table.dataTable>tbody>tr.child{padding:0.5em 1em}table.dataTable>tbody>tr.child:hover{background:transparent !important}table.dataTable>tbody>tr.child ul.dtr-details{display:inline-block;list-style-type:none;margin:0;padding:0}table.dataTable>tbody>tr.child ul.dtr-details li{border-bottom:1px solid #efefef;padding:0.5em 0}table.dataTable>tbody>tr.child ul.dtr-details li:first-child{padding-top:0}table.dataTable>tbody>tr.child ul.dtr-details li:last-child{border-bottom:none}table.dataTable>tbody>tr.child span.dtr-title{display:inline-block;min-width:75px;font-weight:bold}div.dtr-modal{position:fixed;box-sizing:border-box;top:0;left:0;height:100%;width:100%;z-index:100;padding:10em 1em}div.dtr-modal div.dtr-modal-display{position:absolute;top:0;left:0;bottom:0;right:0;width:50%;height:50%;overflow:auto;margin:auto;z-index:102;overflow:auto;background-color:#f5f5f7;border:1px solid black;border-radius:0.5em;box-shadow:0 12px 30px rgba(0,0,0,0.6)}div.dtr-modal div.dtr-modal-content{position:relative;padding:1em}div.dtr-modal div.dtr-modal-close{position:absolute;top:6px;right:6px;width:22px;height:22px;border:1px solid #eaeaea;background-color:#f9f9f9;text-align:center;border-radius:3px;cursor:pointer;z-index:12}div.dtr-modal div.dtr-modal-close:hover{background-color:#eaeaea}div.dtr-modal div.dtr-modal-background{position:fixed;top:0;left:0;right:0;bottom:0;z-index:101;background:rgba(0,0,0,0.6)}@media screen and (max-width: 767px){div.dtr-modal div.dtr-modal-display{width:95%}}div.dtr-bs-modal table.table tr:first-child td{border-top:none} + + diff --git a/assets/css/lib/datatables.min.css b/assets/css/lib/datatables.min.css new file mode 100644 index 0000000..3ecce7a --- /dev/null +++ b/assets/css/lib/datatables.min.css @@ -0,0 +1,21 @@ +/* + * This combined file was created by the DataTables downloader builder: + * https://datatables.net/download + * + * To rebuild or modify this file with the latest versions of the included + * software please visit: + * https://datatables.net/download/#bs/dt-1.10.16/fh-3.1.3/r-2.2.1 + * + * Included libraries: + * DataTables 1.10.16, FixedHeader 3.1.3, Responsive 2.2.1 + */ + +table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_desc:after{display:none}div.dataTables_scrollBody>table>tbody>tr:first-child>th,div.dataTables_scrollBody>table>tbody>tr:first-child>td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0} + + +table.dataTable.fixedHeader-floating,table.dataTable.fixedHeader-locked{background-color:white;margin-top:0 !important;margin-bottom:0 !important}table.dataTable.fixedHeader-floating{position:fixed !important}table.dataTable.fixedHeader-locked{position:absolute !important}@media print{table.fixedHeader-floating{display:none}} + + +table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr[role="row"]>td:first-child,table.dataTable.dtr-inline.collapsed>tbody>tr[role="row"]>th:first-child{position:relative;padding-left:30px;cursor:pointer}table.dataTable.dtr-inline.collapsed>tbody>tr[role="row"]>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr[role="row"]>th:first-child:before{top:9px;left:4px;height:14px;width:14px;display:block;position:absolute;color:white;border:2px solid white;border-radius:14px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:'Courier New', Courier, monospace;line-height:14px;content:'+';background-color:#337ab7}table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th:first-child:before{content:'-';background-color:#d33333}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child{padding-left:27px}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child:before,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child:before{top:5px;left:4px;height:14px;width:14px;border-radius:14px;line-height:14px;text-indent:3px}table.dataTable.dtr-column>tbody>tr>td.control,table.dataTable.dtr-column>tbody>tr>th.control{position:relative;cursor:pointer}table.dataTable.dtr-column>tbody>tr>td.control:before,table.dataTable.dtr-column>tbody>tr>th.control:before{top:50%;left:50%;height:16px;width:16px;margin-top:-10px;margin-left:-10px;display:block;position:absolute;color:white;border:2px solid white;border-radius:14px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:'Courier New', Courier, monospace;line-height:14px;content:'+';background-color:#337ab7}table.dataTable.dtr-column>tbody>tr.parent td.control:before,table.dataTable.dtr-column>tbody>tr.parent th.control:before{content:'-';background-color:#d33333}table.dataTable>tbody>tr.child{padding:0.5em 1em}table.dataTable>tbody>tr.child:hover{background:transparent !important}table.dataTable>tbody>tr.child ul.dtr-details{display:inline-block;list-style-type:none;margin:0;padding:0}table.dataTable>tbody>tr.child ul.dtr-details>li{border-bottom:1px solid #efefef;padding:0.5em 0}table.dataTable>tbody>tr.child ul.dtr-details>li:first-child{padding-top:0}table.dataTable>tbody>tr.child ul.dtr-details>li:last-child{border-bottom:none}table.dataTable>tbody>tr.child span.dtr-title{display:inline-block;min-width:75px;font-weight:bold}div.dtr-modal{position:fixed;box-sizing:border-box;top:0;left:0;height:100%;width:100%;z-index:100;padding:10em 1em}div.dtr-modal div.dtr-modal-display{position:absolute;top:0;left:0;bottom:0;right:0;width:50%;height:50%;overflow:auto;margin:auto;z-index:102;overflow:auto;background-color:#f5f5f7;border:1px solid black;border-radius:0.5em;box-shadow:0 12px 30px rgba(0,0,0,0.6)}div.dtr-modal div.dtr-modal-content{position:relative;padding:1em}div.dtr-modal div.dtr-modal-close{position:absolute;top:6px;right:6px;width:22px;height:22px;border:1px solid #eaeaea;background-color:#f9f9f9;text-align:center;border-radius:3px;cursor:pointer;z-index:12}div.dtr-modal div.dtr-modal-close:hover{background-color:#eaeaea}div.dtr-modal div.dtr-modal-background{position:fixed;top:0;left:0;right:0;bottom:0;z-index:101;background:rgba(0,0,0,0.6)}@media screen and (max-width: 767px){div.dtr-modal div.dtr-modal-display{width:95%}}div.dtr-bs-modal table.table tr:first-child td{border-top:none} + + diff --git a/assets/css/lib/default.min.css b/assets/css/lib/default.min.css new file mode 100644 index 0000000..ac58478 --- /dev/null +++ b/assets/css/lib/default.min.css @@ -0,0 +1 @@ +.medium-toolbar-arrow-under:after{border-color:#242424 transparent transparent;top:50px}.medium-toolbar-arrow-over:before{border-color:transparent transparent #242424;top:-8px}.medium-editor-toolbar{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.75));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.75));border:1px solid #000;border-radius:5px;box-shadow:0 0 3px #000}.medium-editor-toolbar li button{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.89));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.89));border:0;border-right:1px solid #000;border-left:1px solid #333;border-left:1px solid rgba(255,255,255,.1);box-shadow:0 2px 2px rgba(0,0,0,.3);color:#fff;height:50px;min-width:50px;-webkit-transition:background-color .2s ease-in;transition:background-color .2s ease-in}.medium-editor-toolbar li button:hover{background-color:#000;color:#ff0}.medium-editor-toolbar li .medium-editor-button-first{border-bottom-left-radius:5px;border-top-left-radius:5px}.medium-editor-toolbar li .medium-editor-button-last{border-bottom-right-radius:5px;border-top-right-radius:5px}.medium-editor-toolbar li .medium-editor-button-active{background-color:#000;background:-webkit-linear-gradient(top,#242424,rgba(0,0,0,.89));background:linear-gradient(to bottom,#242424,rgba(0,0,0,.89));color:#fff}.medium-editor-toolbar-form{background:#242424;border-radius:5px;color:#999}.medium-editor-toolbar-form .medium-editor-toolbar-input{background:#242424;box-sizing:border-box;color:#ccc;height:50px}.medium-editor-toolbar-form a{color:#fff}.medium-editor-toolbar-anchor-preview{background:#242424;border-radius:5px;color:#fff}.medium-editor-placeholder:after{color:#b3b3b1} \ No newline at end of file diff --git a/assets/css/lib/editor-theme.min.css b/assets/css/lib/editor-theme.min.css new file mode 100644 index 0000000..b97ec7d --- /dev/null +++ b/assets/css/lib/editor-theme.min.css @@ -0,0 +1 @@ +.medium-toolbar-arrow-under:after{top:60px;border-color:#57ad68 transparent transparent}.medium-toolbar-arrow-over:before{top:-8px;border-color:transparent transparent #57ad68}.medium-editor-toolbar{background-color:#57ad68}.medium-editor-toolbar li{padding:0}.medium-editor-toolbar li button{min-width:60px;height:60px;border:none;border-right:1px solid #9ccea6;background-color:transparent;color:#fff;-webkit-transition:background-color .2s ease-in,color .2s ease-in;transition:background-color .2s ease-in,color .2s ease-in}.medium-editor-toolbar li button:hover{background-color:#346a3f;color:#fff}.medium-editor-toolbar li .medium-editor-button-active{background-color:#23482a;color:#fff}.medium-editor-toolbar li .medium-editor-button-last{border-right:none}.medium-editor-toolbar-form .medium-editor-toolbar-input{height:60px;background:#57ad68;color:#fff}.medium-editor-toolbar-form .medium-editor-toolbar-input::-webkit-input-placeholder{color:#fff;color:rgba(255,255,255,.8)}.medium-editor-toolbar-form .medium-editor-toolbar-input:-moz-placeholder{color:#fff;color:rgba(255,255,255,.8)}.medium-editor-toolbar-form .medium-editor-toolbar-input::-moz-placeholder{color:#fff;color:rgba(255,255,255,.8)}.medium-editor-toolbar-form .medium-editor-toolbar-input:-ms-input-placeholder{color:#fff;color:rgba(255,255,255,.8)}.medium-editor-toolbar-form a{color:#fff}.medium-editor-toolbar-anchor-preview{background:#57ad68;color:#fff}.medium-editor-placeholder:after{color:#9ccea6} \ No newline at end of file diff --git a/assets/css/lib/editor.min.css b/assets/css/lib/editor.min.css new file mode 100644 index 0000000..e46f81c --- /dev/null +++ b/assets/css/lib/editor.min.css @@ -0,0 +1 @@ +.medium-editor-anchor-preview,.medium-editor-toolbar{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;z-index:2000}@-webkit-keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}.medium-editor-anchor-preview{left:0;line-height:1.4;max-width:280px;position:absolute;text-align:center;top:0;word-break:break-all;word-wrap:break-word;visibility:hidden}.medium-editor-anchor-preview a{color:#fff;display:inline-block;margin:5px 5px 10px}.medium-editor-placeholder-relative:after,.medium-editor-placeholder:after{content:attr(data-placeholder)!important;white-space:pre;padding:inherit;margin:inherit;font-style:italic}.medium-editor-anchor-preview-active{visibility:visible}.medium-editor-dragover{background:#ddd}.medium-editor-image-loading{-webkit-animation:medium-editor-image-loading 1s infinite ease-in-out;animation:medium-editor-image-loading 1s infinite ease-in-out;background-color:#333;border-radius:100%;display:inline-block;height:40px;width:40px}.medium-editor-placeholder{position:relative}.medium-editor-placeholder:after{position:absolute;left:0;top:0}.medium-editor-placeholder-relative,.medium-editor-placeholder-relative:after{position:relative}.medium-toolbar-arrow-over:before,.medium-toolbar-arrow-under:after{border-style:solid;content:'';display:block;height:0;left:50%;margin-left:-8px;position:absolute;width:0}.medium-toolbar-arrow-under:after{border-width:8px 8px 0}.medium-toolbar-arrow-over:before{border-width:0 8px 8px;top:-8px}.medium-editor-toolbar{left:0;position:absolute;top:0;visibility:hidden}.medium-editor-toolbar ul{margin:0;padding:0}.medium-editor-toolbar li{float:left;list-style:none;margin:0;padding:0}.medium-editor-toolbar li button{box-sizing:border-box;cursor:pointer;display:block;font-size:14px;line-height:1.33;margin:0;padding:15px;text-decoration:none}.medium-editor-toolbar li button:focus{outline:0}.medium-editor-toolbar li .medium-editor-action-underline{text-decoration:underline}.medium-editor-toolbar li .medium-editor-action-pre{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;font-weight:100;padding:15px 0}.medium-editor-toolbar-active{visibility:visible}.medium-editor-sticky-toolbar{position:fixed;top:1px}.medium-editor-relative-toolbar{position:relative}.medium-editor-toolbar-active.medium-editor-stalker-toolbar{-webkit-animation:medium-editor-pop-upwards 160ms forwards linear;animation:medium-editor-pop-upwards 160ms forwards linear}.medium-editor-action-bold{font-weight:bolder}.medium-editor-action-italic{font-style:italic}.medium-editor-toolbar-form{display:none}.medium-editor-toolbar-form a,.medium-editor-toolbar-form input{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.medium-editor-toolbar-form .medium-editor-toolbar-form-row{line-height:14px;margin-left:5px;padding-bottom:5px}.medium-editor-toolbar-form .medium-editor-toolbar-input,.medium-editor-toolbar-form label{border:none;box-sizing:border-box;font-size:14px;margin:0;padding:6px;width:316px;display:inline-block}.medium-editor-toolbar-form .medium-editor-toolbar-input:focus,.medium-editor-toolbar-form label:focus{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;box-shadow:none;outline:0}.medium-editor-toolbar-form a{display:inline-block;font-size:24px;font-weight:bolder;margin:0 10px;text-decoration:none}.medium-editor-toolbar-form-active{display:block}.medium-editor-toolbar-actions:after{clear:both;content:"";display:table}.medium-editor-element{word-wrap:break-word;min-height:30px}.medium-editor-element img{max-width:100%}.medium-editor-element sub{vertical-align:sub}.medium-editor-element sup{vertical-align:super}.medium-editor-hidden{display:none} \ No newline at end of file diff --git a/assets/css/lib/fixedHeader.bootstrap.css b/assets/css/lib/fixedHeader.bootstrap.css new file mode 100644 index 0000000..98b09b0 --- /dev/null +++ b/assets/css/lib/fixedHeader.bootstrap.css @@ -0,0 +1,20 @@ +table.dataTable.fixedHeader-floating, +table.dataTable.fixedHeader-locked { + background-color: white; + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +table.dataTable.fixedHeader-floating { + position: fixed !important; +} + +table.dataTable.fixedHeader-locked { + position: absolute !important; +} + +@media print { + table.fixedHeader-floating { + display: none; + } +} diff --git a/assets/css/lib/fixedHeader.bootstrap.min.css b/assets/css/lib/fixedHeader.bootstrap.min.css new file mode 100644 index 0000000..68f8167 --- /dev/null +++ b/assets/css/lib/fixedHeader.bootstrap.min.css @@ -0,0 +1 @@ +table.dataTable.fixedHeader-floating,table.dataTable.fixedHeader-locked{background-color:white;margin-top:0 !important;margin-bottom:0 !important}table.dataTable.fixedHeader-floating{position:fixed !important}table.dataTable.fixedHeader-locked{position:absolute !important}@media print{table.fixedHeader-floating{display:none}} diff --git a/assets/css/lib/flag-icon.min.css b/assets/css/lib/flag-icon.min.css new file mode 100644 index 0000000..d511371 --- /dev/null +++ b/assets/css/lib/flag-icon.min.css @@ -0,0 +1 @@ +.flag-icon,.flag-icon-background{background-size:contain;background-position:50%;background-repeat:no-repeat}.flag-icon{position:relative;display:inline-block;width:1.33333333em;line-height:1em}.flag-icon:before{content:"\00a0"}.flag-icon.squared{width:1em}.flag-icon.rounded{border-radius:100%!important;}.flag-icon-ad{background-image:url(/assets/flags/4x3/ad.svg)}.flag-icon-ad.squared{background-image:url(/assets/flags/1x1/ad.svg)}.flag-icon-ae{background-image:url(/assets/flags/4x3/ae.svg)}.flag-icon-ae.squared{background-image:url(/assets/flags/1x1/ae.svg)}.flag-icon-af{background-image:url(/assets/flags/4x3/af.svg)}.flag-icon-af.squared{background-image:url(/assets/flags/1x1/af.svg)}.flag-icon-ag{background-image:url(/assets/flags/4x3/ag.svg)}.flag-icon-ag.squared{background-image:url(/assets/flags/1x1/ag.svg)}.flag-icon-ai{background-image:url(/assets/flags/4x3/ai.svg)}.flag-icon-ai.squared{background-image:url(/assets/flags/1x1/ai.svg)}.flag-icon-al{background-image:url(/assets/flags/4x3/al.svg)}.flag-icon-al.squared{background-image:url(/assets/flags/1x1/al.svg)}.flag-icon-am{background-image:url(/assets/flags/4x3/am.svg)}.flag-icon-am.squared{background-image:url(/assets/flags/1x1/am.svg)}.flag-icon-ao{background-image:url(/assets/flags/4x3/ao.svg)}.flag-icon-ao.squared{background-image:url(/assets/flags/1x1/ao.svg)}.flag-icon-aq{background-image:url(/assets/flags/4x3/aq.svg)}.flag-icon-aq.squared{background-image:url(/assets/flags/1x1/aq.svg)}.flag-icon-ar{background-image:url(/assets/flags/4x3/ar.svg)}.flag-icon-ar.squared{background-image:url(/assets/flags/1x1/ar.svg)}.flag-icon-as{background-image:url(/assets/flags/4x3/as.svg)}.flag-icon-as.squared{background-image:url(/assets/flags/1x1/as.svg)}.flag-icon-at{background-image:url(/assets/flags/4x3/at.svg)}.flag-icon-at.squared{background-image:url(/assets/flags/1x1/at.svg)}.flag-icon-au{background-image:url(/assets/flags/4x3/au.svg)}.flag-icon-au.squared{background-image:url(/assets/flags/1x1/au.svg)}.flag-icon-aw{background-image:url(/assets/flags/4x3/aw.svg)}.flag-icon-aw.squared{background-image:url(/assets/flags/1x1/aw.svg)}.flag-icon-ax{background-image:url(/assets/flags/4x3/ax.svg)}.flag-icon-ax.squared{background-image:url(/assets/flags/1x1/ax.svg)}.flag-icon-az{background-image:url(/assets/flags/4x3/az.svg)}.flag-icon-az.squared{background-image:url(/assets/flags/1x1/az.svg)}.flag-icon-ba{background-image:url(/assets/flags/4x3/ba.svg)}.flag-icon-ba.squared{background-image:url(/assets/flags/1x1/ba.svg)}.flag-icon-bb{background-image:url(/assets/flags/4x3/bb.svg)}.flag-icon-bb.squared{background-image:url(/assets/flags/1x1/bb.svg)}.flag-icon-bd{background-image:url(/assets/flags/4x3/bd.svg)}.flag-icon-bd.squared{background-image:url(/assets/flags/1x1/bd.svg)}.flag-icon-be{background-image:url(/assets/flags/4x3/be.svg)}.flag-icon-be.squared{background-image:url(/assets/flags/1x1/be.svg)}.flag-icon-bf{background-image:url(/assets/flags/4x3/bf.svg)}.flag-icon-bf.squared{background-image:url(/assets/flags/1x1/bf.svg)}.flag-icon-bg{background-image:url(/assets/flags/4x3/bg.svg)}.flag-icon-bg.squared{background-image:url(/assets/flags/1x1/bg.svg)}.flag-icon-bh{background-image:url(/assets/flags/4x3/bh.svg)}.flag-icon-bh.squared{background-image:url(/assets/flags/1x1/bh.svg)}.flag-icon-bi{background-image:url(/assets/flags/4x3/bi.svg)}.flag-icon-bi.squared{background-image:url(/assets/flags/1x1/bi.svg)}.flag-icon-bj{background-image:url(/assets/flags/4x3/bj.svg)}.flag-icon-bj.squared{background-image:url(/assets/flags/1x1/bj.svg)}.flag-icon-bl{background-image:url(/assets/flags/4x3/bl.svg)}.flag-icon-bl.squared{background-image:url(/assets/flags/1x1/bl.svg)}.flag-icon-bm{background-image:url(/assets/flags/4x3/bm.svg)}.flag-icon-bm.squared{background-image:url(/assets/flags/1x1/bm.svg)}.flag-icon-bn{background-image:url(/assets/flags/4x3/bn.svg)}.flag-icon-bn.squared{background-image:url(/assets/flags/1x1/bn.svg)}.flag-icon-bo{background-image:url(/assets/flags/4x3/bo.svg)}.flag-icon-bo.squared{background-image:url(/assets/flags/1x1/bo.svg)}.flag-icon-bq{background-image:url(/assets/flags/4x3/bq.svg)}.flag-icon-bq.squared{background-image:url(/assets/flags/1x1/bq.svg)}.flag-icon-br{background-image:url(/assets/flags/4x3/br.svg)}.flag-icon-br.squared{background-image:url(/assets/flags/1x1/br.svg)}.flag-icon-bs{background-image:url(/assets/flags/4x3/bs.svg)}.flag-icon-bs.squared{background-image:url(/assets/flags/1x1/bs.svg)}.flag-icon-bt{background-image:url(/assets/flags/4x3/bt.svg)}.flag-icon-bt.squared{background-image:url(/assets/flags/1x1/bt.svg)}.flag-icon-bv{background-image:url(/assets/flags/4x3/bv.svg)}.flag-icon-bv.squared{background-image:url(/assets/flags/1x1/bv.svg)}.flag-icon-bw{background-image:url(/assets/flags/4x3/bw.svg)}.flag-icon-bw.squared{background-image:url(/assets/flags/1x1/bw.svg)}.flag-icon-by{background-image:url(/assets/flags/4x3/by.svg)}.flag-icon-by.squared{background-image:url(/assets/flags/1x1/by.svg)}.flag-icon-bz{background-image:url(/assets/flags/4x3/bz.svg)}.flag-icon-bz.squared{background-image:url(/assets/flags/1x1/bz.svg)}.flag-icon-ca{background-image:url(/assets/flags/4x3/ca.svg)}.flag-icon-ca.squared{background-image:url(/assets/flags/1x1/ca.svg)}.flag-icon-cc{background-image:url(/assets/flags/4x3/cc.svg)}.flag-icon-cc.squared{background-image:url(/assets/flags/1x1/cc.svg)}.flag-icon-cd{background-image:url(/assets/flags/4x3/cd.svg)}.flag-icon-cd.squared{background-image:url(/assets/flags/1x1/cd.svg)}.flag-icon-cf{background-image:url(/assets/flags/4x3/cf.svg)}.flag-icon-cf.squared{background-image:url(/assets/flags/1x1/cf.svg)}.flag-icon-cg{background-image:url(/assets/flags/4x3/cg.svg)}.flag-icon-cg.squared{background-image:url(/assets/flags/1x1/cg.svg)}.flag-icon-ch{background-image:url(/assets/flags/4x3/ch.svg)}.flag-icon-ch.squared{background-image:url(/assets/flags/1x1/ch.svg)}.flag-icon-ci{background-image:url(/assets/flags/4x3/ci.svg)}.flag-icon-ci.squared{background-image:url(/assets/flags/1x1/ci.svg)}.flag-icon-ck{background-image:url(/assets/flags/4x3/ck.svg)}.flag-icon-ck.squared{background-image:url(/assets/flags/1x1/ck.svg)}.flag-icon-cl{background-image:url(/assets/flags/4x3/cl.svg)}.flag-icon-cl.squared{background-image:url(/assets/flags/1x1/cl.svg)}.flag-icon-cm{background-image:url(/assets/flags/4x3/cm.svg)}.flag-icon-cm.squared{background-image:url(/assets/flags/1x1/cm.svg)}.flag-icon-cn{background-image:url(/assets/flags/4x3/cn.svg)}.flag-icon-cn.squared{background-image:url(/assets/flags/1x1/cn.svg)}.flag-icon-co{background-image:url(/assets/flags/4x3/co.svg)}.flag-icon-co.squared{background-image:url(/assets/flags/1x1/co.svg)}.flag-icon-cr{background-image:url(/assets/flags/4x3/cr.svg)}.flag-icon-cr.squared{background-image:url(/assets/flags/1x1/cr.svg)}.flag-icon-cu{background-image:url(/assets/flags/4x3/cu.svg)}.flag-icon-cu.squared{background-image:url(/assets/flags/1x1/cu.svg)}.flag-icon-cv{background-image:url(/assets/flags/4x3/cv.svg)}.flag-icon-cv.squared{background-image:url(/assets/flags/1x1/cv.svg)}.flag-icon-cw{background-image:url(/assets/flags/4x3/cw.svg)}.flag-icon-cw.squared{background-image:url(/assets/flags/1x1/cw.svg)}.flag-icon-cx{background-image:url(/assets/flags/4x3/cx.svg)}.flag-icon-cx.squared{background-image:url(/assets/flags/1x1/cx.svg)}.flag-icon-cy{background-image:url(/assets/flags/4x3/cy.svg)}.flag-icon-cy.squared{background-image:url(/assets/flags/1x1/cy.svg)}.flag-icon-cz{background-image:url(/assets/flags/4x3/cz.svg)}.flag-icon-cz.squared{background-image:url(/assets/flags/1x1/cz.svg)}.flag-icon-de{background-image:url(/assets/flags/4x3/de.svg)}.flag-icon-de.squared{background-image:url(/assets/flags/1x1/de.svg)}.flag-icon-dj{background-image:url(/assets/flags/4x3/dj.svg)}.flag-icon-dj.squared{background-image:url(/assets/flags/1x1/dj.svg)}.flag-icon-dk{background-image:url(/assets/flags/4x3/dk.svg)}.flag-icon-dk.squared{background-image:url(/assets/flags/1x1/dk.svg)}.flag-icon-dm{background-image:url(/assets/flags/4x3/dm.svg)}.flag-icon-dm.squared{background-image:url(/assets/flags/1x1/dm.svg)}.flag-icon-do{background-image:url(/assets/flags/4x3/do.svg)}.flag-icon-do.squared{background-image:url(/assets/flags/1x1/do.svg)}.flag-icon-dz{background-image:url(/assets/flags/4x3/dz.svg)}.flag-icon-dz.squared{background-image:url(/assets/flags/1x1/dz.svg)}.flag-icon-ec{background-image:url(/assets/flags/4x3/ec.svg)}.flag-icon-ec.squared{background-image:url(/assets/flags/1x1/ec.svg)}.flag-icon-ee{background-image:url(/assets/flags/4x3/ee.svg)}.flag-icon-ee.squared{background-image:url(/assets/flags/1x1/ee.svg)}.flag-icon-eg{background-image:url(/assets/flags/4x3/eg.svg)}.flag-icon-eg.squared{background-image:url(/assets/flags/1x1/eg.svg)}.flag-icon-eh{background-image:url(/assets/flags/4x3/eh.svg)}.flag-icon-eh.squared{background-image:url(/assets/flags/1x1/eh.svg)}.flag-icon-er{background-image:url(/assets/flags/4x3/er.svg)}.flag-icon-er.squared{background-image:url(/assets/flags/1x1/er.svg)}.flag-icon-es{background-image:url(/assets/flags/4x3/es.svg)}.flag-icon-es.squared{background-image:url(/assets/flags/1x1/es.svg)}.flag-icon-et{background-image:url(/assets/flags/4x3/et.svg)}.flag-icon-et.squared{background-image:url(/assets/flags/1x1/et.svg)}.flag-icon-fi{background-image:url(/assets/flags/4x3/fi.svg)}.flag-icon-fi.squared{background-image:url(/assets/flags/1x1/fi.svg)}.flag-icon-fj{background-image:url(/assets/flags/4x3/fj.svg)}.flag-icon-fj.squared{background-image:url(/assets/flags/1x1/fj.svg)}.flag-icon-fk{background-image:url(/assets/flags/4x3/fk.svg)}.flag-icon-fk.squared{background-image:url(/assets/flags/1x1/fk.svg)}.flag-icon-fm{background-image:url(/assets/flags/4x3/fm.svg)}.flag-icon-fm.squared{background-image:url(/assets/flags/1x1/fm.svg)}.flag-icon-fo{background-image:url(/assets/flags/4x3/fo.svg)}.flag-icon-fo.squared{background-image:url(/assets/flags/1x1/fo.svg)}.flag-icon-fr{background-image:url(/assets/flags/4x3/fr.svg)}.flag-icon-fr.squared{background-image:url(/assets/flags/1x1/fr.svg)}.flag-icon-ga{background-image:url(/assets/flags/4x3/ga.svg)}.flag-icon-ga.squared{background-image:url(/assets/flags/1x1/ga.svg)}.flag-icon-gb,.flag-icon-en{background-image:url(/assets/flags/4x3/gb.svg)}.flag-icon-gb.squared,.flag-icon-en.squared{background-image:url(/assets/flags/1x1/gb.svg)}.flag-icon-gd{background-image:url(/assets/flags/4x3/gd.svg)}.flag-icon-gd.squared{background-image:url(/assets/flags/1x1/gd.svg)}.flag-icon-ge{background-image:url(/assets/flags/4x3/ge.svg)}.flag-icon-ge.squared{background-image:url(/assets/flags/1x1/ge.svg)}.flag-icon-gf{background-image:url(/assets/flags/4x3/gf.svg)}.flag-icon-gf.squared{background-image:url(/assets/flags/1x1/gf.svg)}.flag-icon-gg{background-image:url(/assets/flags/4x3/gg.svg)}.flag-icon-gg.squared{background-image:url(/assets/flags/1x1/gg.svg)}.flag-icon-gh{background-image:url(/assets/flags/4x3/gh.svg)}.flag-icon-gh.squared{background-image:url(/assets/flags/1x1/gh.svg)}.flag-icon-gi{background-image:url(/assets/flags/4x3/gi.svg)}.flag-icon-gi.squared{background-image:url(/assets/flags/1x1/gi.svg)}.flag-icon-gl{background-image:url(/assets/flags/4x3/gl.svg)}.flag-icon-gl.squared{background-image:url(/assets/flags/1x1/gl.svg)}.flag-icon-gm{background-image:url(/assets/flags/4x3/gm.svg)}.flag-icon-gm.squared{background-image:url(/assets/flags/1x1/gm.svg)}.flag-icon-gn{background-image:url(/assets/flags/4x3/gn.svg)}.flag-icon-gn.squared{background-image:url(/assets/flags/1x1/gn.svg)}.flag-icon-gp{background-image:url(/assets/flags/4x3/gp.svg)}.flag-icon-gp.squared{background-image:url(/assets/flags/1x1/gp.svg)}.flag-icon-gq{background-image:url(/assets/flags/4x3/gq.svg)}.flag-icon-gq.squared{background-image:url(/assets/flags/1x1/gq.svg)}.flag-icon-gr{background-image:url(/assets/flags/4x3/gr.svg)}.flag-icon-gr.squared{background-image:url(/assets/flags/1x1/gr.svg)}.flag-icon-gs{background-image:url(/assets/flags/4x3/gs.svg)}.flag-icon-gs.squared{background-image:url(/assets/flags/1x1/gs.svg)}.flag-icon-gt{background-image:url(/assets/flags/4x3/gt.svg)}.flag-icon-gt.squared{background-image:url(/assets/flags/1x1/gt.svg)}.flag-icon-gu{background-image:url(/assets/flags/4x3/gu.svg)}.flag-icon-gu.squared{background-image:url(/assets/flags/1x1/gu.svg)}.flag-icon-gw{background-image:url(/assets/flags/4x3/gw.svg)}.flag-icon-gw.squared{background-image:url(/assets/flags/1x1/gw.svg)}.flag-icon-gy{background-image:url(/assets/flags/4x3/gy.svg)}.flag-icon-gy.squared{background-image:url(/assets/flags/1x1/gy.svg)}.flag-icon-hk{background-image:url(/assets/flags/4x3/hk.svg)}.flag-icon-hk.squared{background-image:url(/assets/flags/1x1/hk.svg)}.flag-icon-hm{background-image:url(/assets/flags/4x3/hm.svg)}.flag-icon-hm.squared{background-image:url(/assets/flags/1x1/hm.svg)}.flag-icon-hn{background-image:url(/assets/flags/4x3/hn.svg)}.flag-icon-hn.squared{background-image:url(/assets/flags/1x1/hn.svg)}.flag-icon-hr{background-image:url(/assets/flags/4x3/hr.svg)}.flag-icon-hr.squared{background-image:url(/assets/flags/1x1/hr.svg)}.flag-icon-ht{background-image:url(/assets/flags/4x3/ht.svg)}.flag-icon-ht.squared{background-image:url(/assets/flags/1x1/ht.svg)}.flag-icon-hu{background-image:url(/assets/flags/4x3/hu.svg)}.flag-icon-hu.squared{background-image:url(/assets/flags/1x1/hu.svg)}.flag-icon-id{background-image:url(/assets/flags/4x3/id.svg)}.flag-icon-id.squared{background-image:url(/assets/flags/1x1/id.svg)}.flag-icon-ie{background-image:url(/assets/flags/4x3/ie.svg)}.flag-icon-ie.squared{background-image:url(/assets/flags/1x1/ie.svg)}.flag-icon-il{background-image:url(/assets/flags/4x3/il.svg)}.flag-icon-il.squared{background-image:url(/assets/flags/1x1/il.svg)}.flag-icon-im{background-image:url(/assets/flags/4x3/im.svg)}.flag-icon-im.squared{background-image:url(/assets/flags/1x1/im.svg)}.flag-icon-in{background-image:url(/assets/flags/4x3/in.svg)}.flag-icon-in.squared{background-image:url(/assets/flags/1x1/in.svg)}.flag-icon-io{background-image:url(/assets/flags/4x3/io.svg)}.flag-icon-io.squared{background-image:url(/assets/flags/1x1/io.svg)}.flag-icon-iq{background-image:url(/assets/flags/4x3/iq.svg)}.flag-icon-iq.squared{background-image:url(/assets/flags/1x1/iq.svg)}.flag-icon-ir{background-image:url(/assets/flags/4x3/ir.svg)}.flag-icon-ir.squared{background-image:url(/assets/flags/1x1/ir.svg)}.flag-icon-is{background-image:url(/assets/flags/4x3/is.svg)}.flag-icon-is.squared{background-image:url(/assets/flags/1x1/is.svg)}.flag-icon-it{background-image:url(/assets/flags/4x3/it.svg)}.flag-icon-it.squared{background-image:url(/assets/flags/1x1/it.svg)}.flag-icon-je{background-image:url(/assets/flags/4x3/je.svg)}.flag-icon-je.squared{background-image:url(/assets/flags/1x1/je.svg)}.flag-icon-jm{background-image:url(/assets/flags/4x3/jm.svg)}.flag-icon-jm.squared{background-image:url(/assets/flags/1x1/jm.svg)}.flag-icon-jo{background-image:url(/assets/flags/4x3/jo.svg)}.flag-icon-jo.squared{background-image:url(/assets/flags/1x1/jo.svg)}.flag-icon-jp{background-image:url(/assets/flags/4x3/jp.svg)}.flag-icon-jp.squared{background-image:url(/assets/flags/1x1/jp.svg)}.flag-icon-ke{background-image:url(/assets/flags/4x3/ke.svg)}.flag-icon-ke.squared{background-image:url(/assets/flags/1x1/ke.svg)}.flag-icon-kg{background-image:url(/assets/flags/4x3/kg.svg)}.flag-icon-kg.squared{background-image:url(/assets/flags/1x1/kg.svg)}.flag-icon-kh{background-image:url(/assets/flags/4x3/kh.svg)}.flag-icon-kh.squared{background-image:url(/assets/flags/1x1/kh.svg)}.flag-icon-ki{background-image:url(/assets/flags/4x3/ki.svg)}.flag-icon-ki.squared{background-image:url(/assets/flags/1x1/ki.svg)}.flag-icon-km{background-image:url(/assets/flags/4x3/km.svg)}.flag-icon-km.squared{background-image:url(/assets/flags/1x1/km.svg)}.flag-icon-kn{background-image:url(/assets/flags/4x3/kn.svg)}.flag-icon-kn.squared{background-image:url(/assets/flags/1x1/kn.svg)}.flag-icon-kp{background-image:url(/assets/flags/4x3/kp.svg)}.flag-icon-kp.squared{background-image:url(/assets/flags/1x1/kp.svg)}.flag-icon-kr{background-image:url(/assets/flags/4x3/kr.svg)}.flag-icon-kr.squared{background-image:url(/assets/flags/1x1/kr.svg)}.flag-icon-kw{background-image:url(/assets/flags/4x3/kw.svg)}.flag-icon-kw.squared{background-image:url(/assets/flags/1x1/kw.svg)}.flag-icon-ky{background-image:url(/assets/flags/4x3/ky.svg)}.flag-icon-ky.squared{background-image:url(/assets/flags/1x1/ky.svg)}.flag-icon-kz{background-image:url(/assets/flags/4x3/kz.svg)}.flag-icon-kz.squared{background-image:url(/assets/flags/1x1/kz.svg)}.flag-icon-la{background-image:url(/assets/flags/4x3/la.svg)}.flag-icon-la.squared{background-image:url(/assets/flags/1x1/la.svg)}.flag-icon-lb{background-image:url(/assets/flags/4x3/lb.svg)}.flag-icon-lb.squared{background-image:url(/assets/flags/1x1/lb.svg)}.flag-icon-lc{background-image:url(/assets/flags/4x3/lc.svg)}.flag-icon-lc.squared{background-image:url(/assets/flags/1x1/lc.svg)}.flag-icon-li{background-image:url(/assets/flags/4x3/li.svg)}.flag-icon-li.squared{background-image:url(/assets/flags/1x1/li.svg)}.flag-icon-lk{background-image:url(/assets/flags/4x3/lk.svg)}.flag-icon-lk.squared{background-image:url(/assets/flags/1x1/lk.svg)}.flag-icon-lr{background-image:url(/assets/flags/4x3/lr.svg)}.flag-icon-lr.squared{background-image:url(/assets/flags/1x1/lr.svg)}.flag-icon-ls{background-image:url(/assets/flags/4x3/ls.svg)}.flag-icon-ls.squared{background-image:url(/assets/flags/1x1/ls.svg)}.flag-icon-lt{background-image:url(/assets/flags/4x3/lt.svg)}.flag-icon-lt.squared{background-image:url(/assets/flags/1x1/lt.svg)}.flag-icon-lu{background-image:url(/assets/flags/4x3/lu.svg)}.flag-icon-lu.squared{background-image:url(/assets/flags/1x1/lu.svg)}.flag-icon-lv{background-image:url(/assets/flags/4x3/lv.svg)}.flag-icon-lv.squared{background-image:url(/assets/flags/1x1/lv.svg)}.flag-icon-ly{background-image:url(/assets/flags/4x3/ly.svg)}.flag-icon-ly.squared{background-image:url(/assets/flags/1x1/ly.svg)}.flag-icon-ma{background-image:url(/assets/flags/4x3/ma.svg)}.flag-icon-ma.squared{background-image:url(/assets/flags/1x1/ma.svg)}.flag-icon-mc{background-image:url(/assets/flags/4x3/mc.svg)}.flag-icon-mc.squared{background-image:url(/assets/flags/1x1/mc.svg)}.flag-icon-md{background-image:url(/assets/flags/4x3/md.svg)}.flag-icon-md.squared{background-image:url(/assets/flags/1x1/md.svg)}.flag-icon-me{background-image:url(/assets/flags/4x3/me.svg)}.flag-icon-me.squared{background-image:url(/assets/flags/1x1/me.svg)}.flag-icon-mf{background-image:url(/assets/flags/4x3/mf.svg)}.flag-icon-mf.squared{background-image:url(/assets/flags/1x1/mf.svg)}.flag-icon-mg{background-image:url(/assets/flags/4x3/mg.svg)}.flag-icon-mg.squared{background-image:url(/assets/flags/1x1/mg.svg)}.flag-icon-mh{background-image:url(/assets/flags/4x3/mh.svg)}.flag-icon-mh.squared{background-image:url(/assets/flags/1x1/mh.svg)}.flag-icon-mk{background-image:url(/assets/flags/4x3/mk.svg)}.flag-icon-mk.squared{background-image:url(/assets/flags/1x1/mk.svg)}.flag-icon-ml{background-image:url(/assets/flags/4x3/ml.svg)}.flag-icon-ml.squared{background-image:url(/assets/flags/1x1/ml.svg)}.flag-icon-mm{background-image:url(/assets/flags/4x3/mm.svg)}.flag-icon-mm.squared{background-image:url(/assets/flags/1x1/mm.svg)}.flag-icon-mn{background-image:url(/assets/flags/4x3/mn.svg)}.flag-icon-mn.squared{background-image:url(/assets/flags/1x1/mn.svg)}.flag-icon-mo{background-image:url(/assets/flags/4x3/mo.svg)}.flag-icon-mo.squared{background-image:url(/assets/flags/1x1/mo.svg)}.flag-icon-mp{background-image:url(/assets/flags/4x3/mp.svg)}.flag-icon-mp.squared{background-image:url(/assets/flags/1x1/mp.svg)}.flag-icon-mq{background-image:url(/assets/flags/4x3/mq.svg)}.flag-icon-mq.squared{background-image:url(/assets/flags/1x1/mq.svg)}.flag-icon-mr{background-image:url(/assets/flags/4x3/mr.svg)}.flag-icon-mr.squared{background-image:url(/assets/flags/1x1/mr.svg)}.flag-icon-ms{background-image:url(/assets/flags/4x3/ms.svg)}.flag-icon-ms.squared{background-image:url(/assets/flags/1x1/ms.svg)}.flag-icon-mt{background-image:url(/assets/flags/4x3/mt.svg)}.flag-icon-mt.squared{background-image:url(/assets/flags/1x1/mt.svg)}.flag-icon-mu{background-image:url(/assets/flags/4x3/mu.svg)}.flag-icon-mu.squared{background-image:url(/assets/flags/1x1/mu.svg)}.flag-icon-mv{background-image:url(/assets/flags/4x3/mv.svg)}.flag-icon-mv.squared{background-image:url(/assets/flags/1x1/mv.svg)}.flag-icon-mw{background-image:url(/assets/flags/4x3/mw.svg)}.flag-icon-mw.squared{background-image:url(/assets/flags/1x1/mw.svg)}.flag-icon-mx{background-image:url(/assets/flags/4x3/mx.svg)}.flag-icon-mx.squared{background-image:url(/assets/flags/1x1/mx.svg)}.flag-icon-my{background-image:url(/assets/flags/4x3/my.svg)}.flag-icon-my.squared{background-image:url(/assets/flags/1x1/my.svg)}.flag-icon-mz{background-image:url(/assets/flags/4x3/mz.svg)}.flag-icon-mz.squared{background-image:url(/assets/flags/1x1/mz.svg)}.flag-icon-na{background-image:url(/assets/flags/4x3/na.svg)}.flag-icon-na.squared{background-image:url(/assets/flags/1x1/na.svg)}.flag-icon-nc{background-image:url(/assets/flags/4x3/nc.svg)}.flag-icon-nc.squared{background-image:url(/assets/flags/1x1/nc.svg)}.flag-icon-ne{background-image:url(/assets/flags/4x3/ne.svg)}.flag-icon-ne.squared{background-image:url(/assets/flags/1x1/ne.svg)}.flag-icon-nf{background-image:url(/assets/flags/4x3/nf.svg)}.flag-icon-nf.squared{background-image:url(/assets/flags/1x1/nf.svg)}.flag-icon-ng{background-image:url(/assets/flags/4x3/ng.svg)}.flag-icon-ng.squared{background-image:url(/assets/flags/1x1/ng.svg)}.flag-icon-ni{background-image:url(/assets/flags/4x3/ni.svg)}.flag-icon-ni.squared{background-image:url(/assets/flags/1x1/ni.svg)}.flag-icon-nl{background-image:url(/assets/flags/4x3/nl.svg)}.flag-icon-nl.squared{background-image:url(/assets/flags/1x1/nl.svg)}.flag-icon-no{background-image:url(/assets/flags/4x3/no.svg)}.flag-icon-no.squared{background-image:url(/assets/flags/1x1/no.svg)}.flag-icon-np{background-image:url(/assets/flags/4x3/np.svg)}.flag-icon-np.squared{background-image:url(/assets/flags/1x1/np.svg)}.flag-icon-nr{background-image:url(/assets/flags/4x3/nr.svg)}.flag-icon-nr.squared{background-image:url(/assets/flags/1x1/nr.svg)}.flag-icon-nu{background-image:url(/assets/flags/4x3/nu.svg)}.flag-icon-nu.squared{background-image:url(/assets/flags/1x1/nu.svg)}.flag-icon-nz{background-image:url(/assets/flags/4x3/nz.svg)}.flag-icon-nz.squared{background-image:url(/assets/flags/1x1/nz.svg)}.flag-icon-om{background-image:url(/assets/flags/4x3/om.svg)}.flag-icon-om.squared{background-image:url(/assets/flags/1x1/om.svg)}.flag-icon-pa{background-image:url(/assets/flags/4x3/pa.svg)}.flag-icon-pa.squared{background-image:url(/assets/flags/1x1/pa.svg)}.flag-icon-pe{background-image:url(/assets/flags/4x3/pe.svg)}.flag-icon-pe.squared{background-image:url(/assets/flags/1x1/pe.svg)}.flag-icon-pf{background-image:url(/assets/flags/4x3/pf.svg)}.flag-icon-pf.squared{background-image:url(/assets/flags/1x1/pf.svg)}.flag-icon-pg{background-image:url(/assets/flags/4x3/pg.svg)}.flag-icon-pg.squared{background-image:url(/assets/flags/1x1/pg.svg)}.flag-icon-ph{background-image:url(/assets/flags/4x3/ph.svg)}.flag-icon-ph.squared{background-image:url(/assets/flags/1x1/ph.svg)}.flag-icon-pk{background-image:url(/assets/flags/4x3/pk.svg)}.flag-icon-pk.squared{background-image:url(/assets/flags/1x1/pk.svg)}.flag-icon-pl{background-image:url(/assets/flags/4x3/pl.svg)}.flag-icon-pl.squared{background-image:url(/assets/flags/1x1/pl.svg)}.flag-icon-pm{background-image:url(/assets/flags/4x3/pm.svg)}.flag-icon-pm.squared{background-image:url(/assets/flags/1x1/pm.svg)}.flag-icon-pn{background-image:url(/assets/flags/4x3/pn.svg)}.flag-icon-pn.squared{background-image:url(/assets/flags/1x1/pn.svg)}.flag-icon-pr{background-image:url(/assets/flags/4x3/pr.svg)}.flag-icon-pr.squared{background-image:url(/assets/flags/1x1/pr.svg)}.flag-icon-ps{background-image:url(/assets/flags/4x3/ps.svg)}.flag-icon-ps.squared{background-image:url(/assets/flags/1x1/ps.svg)}.flag-icon-pt{background-image:url(/assets/flags/4x3/pt.svg)}.flag-icon-pt.squared{background-image:url(/assets/flags/1x1/pt.svg)}.flag-icon-pw{background-image:url(/assets/flags/4x3/pw.svg)}.flag-icon-pw.squared{background-image:url(/assets/flags/1x1/pw.svg)}.flag-icon-py{background-image:url(/assets/flags/4x3/py.svg)}.flag-icon-py.squared{background-image:url(/assets/flags/1x1/py.svg)}.flag-icon-qa{background-image:url(/assets/flags/4x3/qa.svg)}.flag-icon-qa.squared{background-image:url(/assets/flags/1x1/qa.svg)}.flag-icon-re{background-image:url(/assets/flags/4x3/re.svg)}.flag-icon-re.squared{background-image:url(/assets/flags/1x1/re.svg)}.flag-icon-ro{background-image:url(/assets/flags/4x3/ro.svg)}.flag-icon-ro.squared{background-image:url(/assets/flags/1x1/ro.svg)}.flag-icon-rs{background-image:url(/assets/flags/4x3/rs.svg)}.flag-icon-rs.squared{background-image:url(/assets/flags/1x1/rs.svg)}.flag-icon-ru{background-image:url(/assets/flags/4x3/ru.svg)}.flag-icon-ru.squared{background-image:url(/assets/flags/1x1/ru.svg)}.flag-icon-rw{background-image:url(/assets/flags/4x3/rw.svg)}.flag-icon-rw.squared{background-image:url(/assets/flags/1x1/rw.svg)}.flag-icon-sa{background-image:url(/assets/flags/4x3/sa.svg)}.flag-icon-sa.squared{background-image:url(/assets/flags/1x1/sa.svg)}.flag-icon-sb{background-image:url(/assets/flags/4x3/sb.svg)}.flag-icon-sb.squared{background-image:url(/assets/flags/1x1/sb.svg)}.flag-icon-sc{background-image:url(/assets/flags/4x3/sc.svg)}.flag-icon-sc.squared{background-image:url(/assets/flags/1x1/sc.svg)}.flag-icon-sd{background-image:url(/assets/flags/4x3/sd.svg)}.flag-icon-sd.squared{background-image:url(/assets/flags/1x1/sd.svg)}.flag-icon-se{background-image:url(/assets/flags/4x3/se.svg)}.flag-icon-se.squared{background-image:url(/assets/flags/1x1/se.svg)}.flag-icon-sg{background-image:url(/assets/flags/4x3/sg.svg)}.flag-icon-sg.squared{background-image:url(/assets/flags/1x1/sg.svg)}.flag-icon-sh{background-image:url(/assets/flags/4x3/sh.svg)}.flag-icon-sh.squared{background-image:url(/assets/flags/1x1/sh.svg)}.flag-icon-si{background-image:url(/assets/flags/4x3/si.svg)}.flag-icon-si.squared{background-image:url(/assets/flags/1x1/si.svg)}.flag-icon-sj{background-image:url(/assets/flags/4x3/sj.svg)}.flag-icon-sj.squared{background-image:url(/assets/flags/1x1/sj.svg)}.flag-icon-sk{background-image:url(/assets/flags/4x3/sk.svg)}.flag-icon-sk.squared{background-image:url(/assets/flags/1x1/sk.svg)}.flag-icon-sl{background-image:url(/assets/flags/4x3/sl.svg)}.flag-icon-sl.squared{background-image:url(/assets/flags/1x1/sl.svg)}.flag-icon-sm{background-image:url(/assets/flags/4x3/sm.svg)}.flag-icon-sm.squared{background-image:url(/assets/flags/1x1/sm.svg)}.flag-icon-sn{background-image:url(/assets/flags/4x3/sn.svg)}.flag-icon-sn.squared{background-image:url(/assets/flags/1x1/sn.svg)}.flag-icon-so{background-image:url(/assets/flags/4x3/so.svg)}.flag-icon-so.squared{background-image:url(/assets/flags/1x1/so.svg)}.flag-icon-sr{background-image:url(/assets/flags/4x3/sr.svg)}.flag-icon-sr.squared{background-image:url(/assets/flags/1x1/sr.svg)}.flag-icon-ss{background-image:url(/assets/flags/4x3/ss.svg)}.flag-icon-ss.squared{background-image:url(/assets/flags/1x1/ss.svg)}.flag-icon-st{background-image:url(/assets/flags/4x3/st.svg)}.flag-icon-st.squared{background-image:url(/assets/flags/1x1/st.svg)}.flag-icon-sv{background-image:url(/assets/flags/4x3/sv.svg)}.flag-icon-sv.squared{background-image:url(/assets/flags/1x1/sv.svg)}.flag-icon-sx{background-image:url(/assets/flags/4x3/sx.svg)}.flag-icon-sx.squared{background-image:url(/assets/flags/1x1/sx.svg)}.flag-icon-sy{background-image:url(/assets/flags/4x3/sy.svg)}.flag-icon-sy.squared{background-image:url(/assets/flags/1x1/sy.svg)}.flag-icon-sz{background-image:url(/assets/flags/4x3/sz.svg)}.flag-icon-sz.squared{background-image:url(/assets/flags/1x1/sz.svg)}.flag-icon-tc{background-image:url(/assets/flags/4x3/tc.svg)}.flag-icon-tc.squared{background-image:url(/assets/flags/1x1/tc.svg)}.flag-icon-td{background-image:url(/assets/flags/4x3/td.svg)}.flag-icon-td.squared{background-image:url(/assets/flags/1x1/td.svg)}.flag-icon-tf{background-image:url(/assets/flags/4x3/tf.svg)}.flag-icon-tf.squared{background-image:url(/assets/flags/1x1/tf.svg)}.flag-icon-tg{background-image:url(/assets/flags/4x3/tg.svg)}.flag-icon-tg.squared{background-image:url(/assets/flags/1x1/tg.svg)}.flag-icon-th{background-image:url(/assets/flags/4x3/th.svg)}.flag-icon-th.squared{background-image:url(/assets/flags/1x1/th.svg)}.flag-icon-tj{background-image:url(/assets/flags/4x3/tj.svg)}.flag-icon-tj.squared{background-image:url(/assets/flags/1x1/tj.svg)}.flag-icon-tk{background-image:url(/assets/flags/4x3/tk.svg)}.flag-icon-tk.squared{background-image:url(/assets/flags/1x1/tk.svg)}.flag-icon-tl{background-image:url(/assets/flags/4x3/tl.svg)}.flag-icon-tl.squared{background-image:url(/assets/flags/1x1/tl.svg)}.flag-icon-tm{background-image:url(/assets/flags/4x3/tm.svg)}.flag-icon-tm.squared{background-image:url(/assets/flags/1x1/tm.svg)}.flag-icon-tn{background-image:url(/assets/flags/4x3/tn.svg)}.flag-icon-tn.squared{background-image:url(/assets/flags/1x1/tn.svg)}.flag-icon-to{background-image:url(/assets/flags/4x3/to.svg)}.flag-icon-to.squared{background-image:url(/assets/flags/1x1/to.svg)}.flag-icon-tr{background-image:url(/assets/flags/4x3/tr.svg)}.flag-icon-tr.squared{background-image:url(/assets/flags/1x1/tr.svg)}.flag-icon-tt{background-image:url(/assets/flags/4x3/tt.svg)}.flag-icon-tt.squared{background-image:url(/assets/flags/1x1/tt.svg)}.flag-icon-tv{background-image:url(/assets/flags/4x3/tv.svg)}.flag-icon-tv.squared{background-image:url(/assets/flags/1x1/tv.svg)}.flag-icon-tw{background-image:url(/assets/flags/4x3/tw.svg)}.flag-icon-tw.squared{background-image:url(/assets/flags/1x1/tw.svg)}.flag-icon-tz{background-image:url(/assets/flags/4x3/tz.svg)}.flag-icon-tz.squared{background-image:url(/assets/flags/1x1/tz.svg)}.flag-icon-ua{background-image:url(/assets/flags/4x3/ua.svg)}.flag-icon-ua.squared{background-image:url(/assets/flags/1x1/ua.svg)}.flag-icon-ug{background-image:url(/assets/flags/4x3/ug.svg)}.flag-icon-ug.squared{background-image:url(/assets/flags/1x1/ug.svg)}.flag-icon-um{background-image:url(/assets/flags/4x3/um.svg)}.flag-icon-um.squared{background-image:url(/assets/flags/1x1/um.svg)}.flag-icon-us{background-image:url(/assets/flags/4x3/us.svg)}.flag-icon-us.squared{background-image:url(/assets/flags/1x1/us.svg)}.flag-icon-uy{background-image:url(/assets/flags/4x3/uy.svg)}.flag-icon-uy.squared{background-image:url(/assets/flags/1x1/uy.svg)}.flag-icon-uz{background-image:url(/assets/flags/4x3/uz.svg)}.flag-icon-uz.squared{background-image:url(/assets/flags/1x1/uz.svg)}.flag-icon-va{background-image:url(/assets/flags/4x3/va.svg)}.flag-icon-va.squared{background-image:url(/assets/flags/1x1/va.svg)}.flag-icon-vc{background-image:url(/assets/flags/4x3/vc.svg)}.flag-icon-vc.squared{background-image:url(/assets/flags/1x1/vc.svg)}.flag-icon-ve{background-image:url(/assets/flags/4x3/ve.svg)}.flag-icon-ve.squared{background-image:url(/assets/flags/1x1/ve.svg)}.flag-icon-vg{background-image:url(/assets/flags/4x3/vg.svg)}.flag-icon-vg.squared{background-image:url(/assets/flags/1x1/vg.svg)}.flag-icon-vi{background-image:url(/assets/flags/4x3/vi.svg)}.flag-icon-vi.squared{background-image:url(/assets/flags/1x1/vi.svg)}.flag-icon-vn{background-image:url(/assets/flags/4x3/vn.svg)}.flag-icon-vn.squared{background-image:url(/assets/flags/1x1/vn.svg)}.flag-icon-vu{background-image:url(/assets/flags/4x3/vu.svg)}.flag-icon-vu.squared{background-image:url(/assets/flags/1x1/vu.svg)}.flag-icon-wf{background-image:url(/assets/flags/4x3/wf.svg)}.flag-icon-wf.squared{background-image:url(/assets/flags/1x1/wf.svg)}.flag-icon-ws{background-image:url(/assets/flags/4x3/ws.svg)}.flag-icon-ws.squared{background-image:url(/assets/flags/1x1/ws.svg)}.flag-icon-ye{background-image:url(/assets/flags/4x3/ye.svg)}.flag-icon-ye.squared{background-image:url(/assets/flags/1x1/ye.svg)}.flag-icon-yt{background-image:url(/assets/flags/4x3/yt.svg)}.flag-icon-yt.squared{background-image:url(/assets/flags/1x1/yt.svg)}.flag-icon-za{background-image:url(/assets/flags/4x3/za.svg)}.flag-icon-za.squared{background-image:url(/assets/flags/1x1/za.svg)}.flag-icon-zm{background-image:url(/assets/flags/4x3/zm.svg)}.flag-icon-zm.squared{background-image:url(/assets/flags/1x1/zm.svg)}.flag-icon-zw{background-image:url(/assets/flags/4x3/zw.svg)}.flag-icon-zw.squared{background-image:url(/assets/flags/1x1/zw.svg)}.flag-icon-eu{background-image:url(/assets/flags/4x3/eu.svg)}.flag-icon-eu.squared{background-image:url(/assets/flags/1x1/eu.svg)}.flag-icon-gb-eng{background-image:url(/assets/flags/4x3/gb-eng.svg)}.flag-icon-gb-eng.squared{background-image:url(/assets/flags/1x1/gb-eng.svg)}.flag-icon-gb-nir{background-image:url(/assets/flags/4x3/gb-nir.svg)}.flag-icon-gb-nir.squared{background-image:url(/assets/flags/1x1/gb-nir.svg)}.flag-icon-gb-sct{background-image:url(/assets/flags/4x3/gb-sct.svg)}.flag-icon-gb-sct.squared{background-image:url(/assets/flags/1x1/gb-sct.svg)}.flag-icon-gb-wls{background-image:url(/assets/flags/4x3/gb-wls.svg)}.flag-icon-gb-wls.squared{background-image:url(/assets/flags/1x1/gb-wls.svg)}.flag-icon-un{background-image:url(/assets/flags/4x3/un.svg)}.flag-icon-un.squared{background-image:url(/assets/flags/1x1/un.svg)} \ No newline at end of file diff --git a/assets/css/lib/font-awesome.css b/assets/css/lib/font-awesome.css new file mode 100644 index 0000000..87bbe7d --- /dev/null +++ b/assets/css/lib/font-awesome.css @@ -0,0 +1,2092 @@ +/*! + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@font-face { + font-family: 'FontAwesome'; + src: url('../../fonts/fontawesome-webfont.eot?v=4.6.3'); + src: url('../../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'), url('../../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'), url('../../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'), url('../../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'), url('../../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} +.fa-lg { + font-size: 1.33333333em; + line-height: .75em; + vertical-align: -15% +} +.fa-2x { + font-size: 2em +} +.fa-3x { + font-size: 3em +} +.fa-4x { + font-size: 4em +} +.fa-5x { + font-size: 5em +} +.fa-fw { + width: 1.28571429em; + text-align: center +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none +} +.fa-ul>li { + position: relative +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: .14285714em; + text-align: center +} +.fa-li.fa-lg { + left: -1.85714286em +} +.fa-border { + padding: .2em .25em .15em; + border: solid .08em #eee; + border-radius: .1em +} +.fa-pull-left { + float: left +} +.fa-pull-right { + float: right +} +.fa.fa-pull-left { + margin-right: .3em +} +.fa.fa-pull-right { + margin-left: .3em +} +.pull-right { + float: right +} +.pull-left { + float: left +} +.fa.pull-left { + margin-right: .3em +} +.fa.pull-right { + margin-left: .3em +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8) +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg) + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg) + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg) + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg) + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg) +} +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg) +} +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg) +} +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1) +} +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1) +} +:root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical { + filter: none +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle +} +.fa-stack-1x, .fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center +} +.fa-stack-1x { + line-height: inherit +} +.fa-stack-2x { + font-size: 2em +} +.fa-inverse { + color: #fff +} +.fa-glass:before { + content: "\f000" +} +.fa-music:before { + content: "\f001" +} +.fa-search:before { + content: "\f002" +} +.fa-envelope-o:before { + content: "\f003" +} +.fa-heart:before { + content: "\f004" +} +.fa-star:before { + content: "\f005" +} +.fa-star-o:before { + content: "\f006" +} +.fa-user:before { + content: "\f007" +} +.fa-film:before { + content: "\f008" +} +.fa-th-large:before { + content: "\f009" +} +.fa-th:before { + content: "\f00a" +} +.fa-th-list:before { + content: "\f00b" +} +.fa-check:before { + content: "\f00c" +} +.fa-remove:before, .fa-close:before, .fa-times:before { + content: "\f00d" +} +.fa-search-plus:before { + content: "\f00e" +} +.fa-search-minus:before { + content: "\f010" +} +.fa-power-off:before { + content: "\f011" +} +.fa-signal:before { + content: "\f012" +} +.fa-gear:before, .fa-cog:before { + content: "\f013" +} +.fa-trash-o:before { + content: "\f014" +} +.fa-home:before { + content: "\f015" +} +.fa-file-o:before { + content: "\f016" +} +.fa-clock-o:before { + content: "\f017" +} +.fa-road:before { + content: "\f018" +} +.fa-download:before { + content: "\f019" +} +.fa-arrow-circle-o-down:before { + content: "\f01a" +} +.fa-arrow-circle-o-up:before { + content: "\f01b" +} +.fa-inbox:before { + content: "\f01c" +} +.fa-play-circle-o:before { + content: "\f01d" +} +.fa-rotate-right:before, .fa-repeat:before { + content: "\f01e" +} +.fa-refresh:before { + content: "\f021" +} +.fa-list-alt:before { + content: "\f022" +} +.fa-lock:before { + content: "\f023" +} +.fa-flag:before { + content: "\f024" +} +.fa-headphones:before { + content: "\f025" +} +.fa-volume-off:before { + content: "\f026" +} +.fa-volume-down:before { + content: "\f027" +} +.fa-volume-up:before { + content: "\f028" +} +.fa-qrcode:before { + content: "\f029" +} +.fa-barcode:before { + content: "\f02a" +} +.fa-tag:before { + content: "\f02b" +} +.fa-tags:before { + content: "\f02c" +} +.fa-book:before { + content: "\f02d" +} +.fa-bookmark:before { + content: "\f02e" +} +.fa-print:before { + content: "\f02f" +} +.fa-camera:before { + content: "\f030" +} +.fa-font:before { + content: "\f031" +} +.fa-bold:before { + content: "\f032" +} +.fa-italic:before { + content: "\f033" +} +.fa-text-height:before { + content: "\f034" +} +.fa-text-width:before { + content: "\f035" +} +.fa-align-left:before { + content: "\f036" +} +.fa-align-center:before { + content: "\f037" +} +.fa-align-right:before { + content: "\f038" +} +.fa-align-justify:before { + content: "\f039" +} +.fa-list:before { + content: "\f03a" +} +.fa-dedent:before, .fa-outdent:before { + content: "\f03b" +} +.fa-indent:before { + content: "\f03c" +} +.fa-video-camera:before { + content: "\f03d" +} +.fa-photo:before, .fa-image:before, .fa-picture-o:before { + content: "\f03e" +} +.fa-pencil:before { + content: "\f040" +} +.fa-map-marker:before { + content: "\f041" +} +.fa-adjust:before { + content: "\f042" +} +.fa-tint:before { + content: "\f043" +} +.fa-edit:before, .fa-pencil-square-o:before { + content: "\f044" +} +.fa-share-square-o:before { + content: "\f045" +} +.fa-check-square-o:before { + content: "\f046" +} +.fa-arrows:before { + content: "\f047" +} +.fa-step-backward:before { + content: "\f048" +} +.fa-fast-backward:before { + content: "\f049" +} +.fa-backward:before { + content: "\f04a" +} +.fa-play:before { + content: "\f04b" +} +.fa-pause:before { + content: "\f04c" +} +.fa-stop:before { + content: "\f04d" +} +.fa-forward:before { + content: "\f04e" +} +.fa-fast-forward:before { + content: "\f050" +} +.fa-step-forward:before { + content: "\f051" +} +.fa-eject:before { + content: "\f052" +} +.fa-chevron-left:before { + content: "\f053" +} +.fa-chevron-right:before { + content: "\f054" +} +.fa-plus-circle:before { + content: "\f055" +} +.fa-minus-circle:before { + content: "\f056" +} +.fa-times-circle:before { + content: "\f057" +} +.fa-check-circle:before { + content: "\f058" +} +.fa-question-circle:before { + content: "\f059" +} +.fa-info-circle:before { + content: "\f05a" +} +.fa-crosshairs:before { + content: "\f05b" +} +.fa-times-circle-o:before { + content: "\f05c" +} +.fa-check-circle-o:before { + content: "\f05d" +} +.fa-ban:before { + content: "\f05e" +} +.fa-arrow-left:before { + content: "\f060" +} +.fa-arrow-right:before { + content: "\f061" +} +.fa-arrow-up:before { + content: "\f062" +} +.fa-arrow-down:before { + content: "\f063" +} +.fa-mail-forward:before, .fa-share:before { + content: "\f064" +} +.fa-expand:before { + content: "\f065" +} +.fa-compress:before { + content: "\f066" +} +.fa-plus:before { + content: "\f067" +} +.fa-minus:before { + content: "\f068" +} +.fa-asterisk:before { + content: "\f069" +} +.fa-exclamation-circle:before { + content: "\f06a" +} +.fa-gift:before { + content: "\f06b" +} +.fa-leaf:before { + content: "\f06c" +} +.fa-fire:before { + content: "\f06d" +} +.fa-eye:before { + content: "\f06e" +} +.fa-eye-slash:before { + content: "\f070" +} +.fa-warning:before, .fa-exclamation-triangle:before { + content: "\f071" +} +.fa-plane:before { + content: "\f072" +} +.fa-calendar:before { + content: "\f073" +} +.fa-random:before { + content: "\f074" +} +.fa-comment:before { + content: "\f075" +} +.fa-magnet:before { + content: "\f076" +} +.fa-chevron-up:before { + content: "\f077" +} +.fa-chevron-down:before { + content: "\f078" +} +.fa-retweet:before { + content: "\f079" +} +.fa-shopping-cart:before { + content: "\f07a" +} +.fa-folder:before { + content: "\f07b" +} +.fa-folder-open:before { + content: "\f07c" +} +.fa-arrows-v:before { + content: "\f07d" +} +.fa-arrows-h:before { + content: "\f07e" +} +.fa-bar-chart-o:before, .fa-bar-chart:before { + content: "\f080" +} +.fa-twitter-square:before { + content: "\f081" +} +.fa-facebook-square:before { + content: "\f082" +} +.fa-camera-retro:before { + content: "\f083" +} +.fa-key:before { + content: "\f084" +} +.fa-gears:before, .fa-cogs:before { + content: "\f085" +} +.fa-comments:before { + content: "\f086" +} +.fa-thumbs-o-up:before { + content: "\f087" +} +.fa-thumbs-o-down:before { + content: "\f088" +} +.fa-star-half:before { + content: "\f089" +} +.fa-heart-o:before { + content: "\f08a" +} +.fa-sign-out:before { + content: "\f08b" +} +.fa-linkedin-square:before { + content: "\f08c" +} +.fa-thumb-tack:before { + content: "\f08d" +} +.fa-external-link:before { + content: "\f08e" +} +.fa-sign-in:before { + content: "\f090" +} +.fa-trophy:before { + content: "\f091" +} +.fa-github-square:before { + content: "\f092" +} +.fa-upload:before { + content: "\f093" +} +.fa-lemon-o:before { + content: "\f094" +} +.fa-phone:before { + content: "\f095" +} +.fa-square-o:before { + content: "\f096" +} +.fa-bookmark-o:before { + content: "\f097" +} +.fa-phone-square:before { + content: "\f098" +} +.fa-twitter:before { + content: "\f099" +} +.fa-facebook-f:before, .fa-facebook:before { + content: "\f09a" +} +.fa-github:before { + content: "\f09b" +} +.fa-unlock:before { + content: "\f09c" +} +.fa-credit-card:before { + content: "\f09d" +} +.fa-feed:before, .fa-rss:before { + content: "\f09e" +} +.fa-hdd-o:before { + content: "\f0a0" +} +.fa-bullhorn:before { + content: "\f0a1" +} +.fa-bell:before { + content: "\f0f3" +} +.fa-certificate:before { + content: "\f0a3" +} +.fa-hand-o-right:before { + content: "\f0a4" +} +.fa-hand-o-left:before { + content: "\f0a5" +} +.fa-hand-o-up:before { + content: "\f0a6" +} +.fa-hand-o-down:before { + content: "\f0a7" +} +.fa-arrow-circle-left:before { + content: "\f0a8" +} +.fa-arrow-circle-right:before { + content: "\f0a9" +} +.fa-arrow-circle-up:before { + content: "\f0aa" +} +.fa-arrow-circle-down:before { + content: "\f0ab" +} +.fa-globe:before { + content: "\f0ac" +} +.fa-wrench:before { + content: "\f0ad" +} +.fa-tasks:before { + content: "\f0ae" +} +.fa-filter:before { + content: "\f0b0" +} +.fa-briefcase:before { + content: "\f0b1" +} +.fa-arrows-alt:before { + content: "\f0b2" +} +.fa-group:before, .fa-users:before { + content: "\f0c0" +} +.fa-chain:before, .fa-link:before { + content: "\f0c1" +} +.fa-cloud:before { + content: "\f0c2" +} +.fa-flask:before { + content: "\f0c3" +} +.fa-cut:before, .fa-scissors:before { + content: "\f0c4" +} +.fa-copy:before, .fa-files-o:before { + content: "\f0c5" +} +.fa-paperclip:before { + content: "\f0c6" +} +.fa-save:before, .fa-floppy-o:before { + content: "\f0c7" +} +.fa-square:before { + content: "\f0c8" +} +.fa-navicon:before, .fa-reorder:before, .fa-bars:before { + content: "\f0c9" +} +.fa-list-ul:before { + content: "\f0ca" +} +.fa-list-ol:before { + content: "\f0cb" +} +.fa-strikethrough:before { + content: "\f0cc" +} +.fa-underline:before { + content: "\f0cd" +} +.fa-table:before { + content: "\f0ce" +} +.fa-magic:before { + content: "\f0d0" +} +.fa-truck:before { + content: "\f0d1" +} +.fa-pinterest:before { + content: "\f0d2" +} +.fa-pinterest-square:before { + content: "\f0d3" +} +.fa-google-plus-square:before { + content: "\f0d4" +} +.fa-google-plus:before { + content: "\f0d5" +} +.fa-money:before { + content: "\f0d6" +} +.fa-caret-down:before { + content: "\f0d7" +} +.fa-caret-up:before { + content: "\f0d8" +} +.fa-caret-left:before { + content: "\f0d9" +} +.fa-caret-right:before { + content: "\f0da" +} +.fa-columns:before { + content: "\f0db" +} +.fa-unsorted:before, .fa-sort:before { + content: "\f0dc" +} +.fa-sort-down:before, .fa-sort-desc:before { + content: "\f0dd" +} +.fa-sort-up:before, .fa-sort-asc:before { + content: "\f0de" +} +.fa-envelope:before { + content: "\f0e0" +} +.fa-linkedin:before { + content: "\f0e1" +} +.fa-rotate-left:before, .fa-undo:before { + content: "\f0e2" +} +.fa-legal:before, .fa-gavel:before { + content: "\f0e3" +} +.fa-dashboard:before, .fa-tachometer:before { + content: "\f0e4" +} +.fa-comment-o:before { + content: "\f0e5" +} +.fa-comments-o:before { + content: "\f0e6" +} +.fa-flash:before, .fa-bolt:before { + content: "\f0e7" +} +.fa-sitemap:before { + content: "\f0e8" +} +.fa-umbrella:before { + content: "\f0e9" +} +.fa-paste:before, .fa-clipboard:before { + content: "\f0ea" +} +.fa-lightbulb-o:before { + content: "\f0eb" +} +.fa-exchange:before { + content: "\f0ec" +} +.fa-cloud-download:before { + content: "\f0ed" +} +.fa-cloud-upload:before { + content: "\f0ee" +} +.fa-user-md:before { + content: "\f0f0" +} +.fa-stethoscope:before { + content: "\f0f1" +} +.fa-suitcase:before { + content: "\f0f2" +} +.fa-bell-o:before { + content: "\f0a2" +} +.fa-coffee:before { + content: "\f0f4" +} +.fa-cutlery:before { + content: "\f0f5" +} +.fa-file-text-o:before { + content: "\f0f6" +} +.fa-building-o:before { + content: "\f0f7" +} +.fa-hospital-o:before { + content: "\f0f8" +} +.fa-ambulance:before { + content: "\f0f9" +} +.fa-medkit:before { + content: "\f0fa" +} +.fa-fighter-jet:before { + content: "\f0fb" +} +.fa-beer:before { + content: "\f0fc" +} +.fa-h-square:before { + content: "\f0fd" +} +.fa-plus-square:before { + content: "\f0fe" +} +.fa-angle-double-left:before { + content: "\f100" +} +.fa-angle-double-right:before { + content: "\f101" +} +.fa-angle-double-up:before { + content: "\f102" +} +.fa-angle-double-down:before { + content: "\f103" +} +.fa-angle-left:before { + content: "\f104" +} +.fa-angle-right:before { + content: "\f105" +} +.fa-angle-up:before { + content: "\f106" +} +.fa-angle-down:before { + content: "\f107" +} +.fa-desktop:before { + content: "\f108" +} +.fa-laptop:before { + content: "\f109" +} +.fa-tablet:before { + content: "\f10a" +} +.fa-mobile-phone:before, .fa-mobile:before { + content: "\f10b" +} +.fa-circle-o:before { + content: "\f10c" +} +.fa-quote-left:before { + content: "\f10d" +} +.fa-quote-right:before { + content: "\f10e" +} +.fa-spinner:before { + content: "\f110" +} +.fa-circle:before { + content: "\f111" +} +.fa-mail-reply:before, .fa-reply:before { + content: "\f112" +} +.fa-github-alt:before { + content: "\f113" +} +.fa-folder-o:before { + content: "\f114" +} +.fa-folder-open-o:before { + content: "\f115" +} +.fa-smile-o:before { + content: "\f118" +} +.fa-frown-o:before { + content: "\f119" +} +.fa-meh-o:before { + content: "\f11a" +} +.fa-gamepad:before { + content: "\f11b" +} +.fa-keyboard-o:before { + content: "\f11c" +} +.fa-flag-o:before { + content: "\f11d" +} +.fa-flag-checkered:before { + content: "\f11e" +} +.fa-terminal:before { + content: "\f120" +} +.fa-code:before { + content: "\f121" +} +.fa-mail-reply-all:before, .fa-reply-all:before { + content: "\f122" +} +.fa-star-half-empty:before, .fa-star-half-full:before, .fa-star-half-o:before { + content: "\f123" +} +.fa-location-arrow:before { + content: "\f124" +} +.fa-crop:before { + content: "\f125" +} +.fa-code-fork:before { + content: "\f126" +} +.fa-unlink:before, .fa-chain-broken:before { + content: "\f127" +} +.fa-question:before { + content: "\f128" +} +.fa-info:before { + content: "\f129" +} +.fa-exclamation:before { + content: "\f12a" +} +.fa-superscript:before { + content: "\f12b" +} +.fa-subscript:before { + content: "\f12c" +} +.fa-eraser:before { + content: "\f12d" +} +.fa-puzzle-piece:before { + content: "\f12e" +} +.fa-microphone:before { + content: "\f130" +} +.fa-microphone-slash:before { + content: "\f131" +} +.fa-shield:before { + content: "\f132" +} +.fa-calendar-o:before { + content: "\f133" +} +.fa-fire-extinguisher:before { + content: "\f134" +} +.fa-rocket:before { + content: "\f135" +} +.fa-maxcdn:before { + content: "\f136" +} +.fa-chevron-circle-left:before { + content: "\f137" +} +.fa-chevron-circle-right:before { + content: "\f138" +} +.fa-chevron-circle-up:before { + content: "\f139" +} +.fa-chevron-circle-down:before { + content: "\f13a" +} +.fa-html5:before { + content: "\f13b" +} +.fa-css3:before { + content: "\f13c" +} +.fa-anchor:before { + content: "\f13d" +} +.fa-unlock-alt:before { + content: "\f13e" +} +.fa-bullseye:before { + content: "\f140" +} +.fa-ellipsis-h:before { + content: "\f141" +} +.fa-ellipsis-v:before { + content: "\f142" +} +.fa-rss-square:before { + content: "\f143" +} +.fa-play-circle:before { + content: "\f144" +} +.fa-ticket:before { + content: "\f145" +} +.fa-minus-square:before { + content: "\f146" +} +.fa-minus-square-o:before { + content: "\f147" +} +.fa-level-up:before { + content: "\f148" +} +.fa-level-down:before { + content: "\f149" +} +.fa-check-square:before { + content: "\f14a" +} +.fa-pencil-square:before { + content: "\f14b" +} +.fa-external-link-square:before { + content: "\f14c" +} +.fa-share-square:before { + content: "\f14d" +} +.fa-compass:before { + content: "\f14e" +} +.fa-toggle-down:before, .fa-caret-square-o-down:before { + content: "\f150" +} +.fa-toggle-up:before, .fa-caret-square-o-up:before { + content: "\f151" +} +.fa-toggle-right:before, .fa-caret-square-o-right:before { + content: "\f152" +} +.fa-euro:before, .fa-eur:before { + content: "\f153" +} +.fa-gbp:before { + content: "\f154" +} +.fa-dollar:before, .fa-usd:before { + content: "\f155" +} +.fa-rupee:before, .fa-inr:before { + content: "\f156" +} +.fa-cny:before, .fa-rmb:before, .fa-yen:before, .fa-jpy:before { + content: "\f157" +} +.fa-ruble:before, .fa-rouble:before, .fa-rub:before { + content: "\f158" +} +.fa-won:before, .fa-krw:before { + content: "\f159" +} +.fa-bitcoin:before, .fa-btc:before { + content: "\f15a" +} +.fa-file:before { + content: "\f15b" +} +.fa-file-text:before { + content: "\f15c" +} +.fa-sort-alpha-asc:before { + content: "\f15d" +} +.fa-sort-alpha-desc:before { + content: "\f15e" +} +.fa-sort-amount-asc:before { + content: "\f160" +} +.fa-sort-amount-desc:before { + content: "\f161" +} +.fa-sort-numeric-asc:before { + content: "\f162" +} +.fa-sort-numeric-desc:before { + content: "\f163" +} +.fa-thumbs-up:before { + content: "\f164" +} +.fa-thumbs-down:before { + content: "\f165" +} +.fa-youtube-square:before { + content: "\f166" +} +.fa-youtube:before { + content: "\f167" +} +.fa-xing:before { + content: "\f168" +} +.fa-xing-square:before { + content: "\f169" +} +.fa-youtube-play:before { + content: "\f16a" +} +.fa-dropbox:before { + content: "\f16b" +} +.fa-stack-overflow:before { + content: "\f16c" +} +.fa-instagram:before { + content: "\f16d" +} +.fa-flickr:before { + content: "\f16e" +} +.fa-adn:before { + content: "\f170" +} +.fa-bitbucket:before { + content: "\f171" +} +.fa-bitbucket-square:before { + content: "\f172" +} +.fa-tumblr:before { + content: "\f173" +} +.fa-tumblr-square:before { + content: "\f174" +} +.fa-long-arrow-down:before { + content: "\f175" +} +.fa-long-arrow-up:before { + content: "\f176" +} +.fa-long-arrow-left:before { + content: "\f177" +} +.fa-long-arrow-right:before { + content: "\f178" +} +.fa-apple:before { + content: "\f179" +} +.fa-windows:before { + content: "\f17a" +} +.fa-android:before { + content: "\f17b" +} +.fa-linux:before { + content: "\f17c" +} +.fa-dribbble:before { + content: "\f17d" +} +.fa-skype:before { + content: "\f17e" +} +.fa-foursquare:before { + content: "\f180" +} +.fa-trello:before { + content: "\f181" +} +.fa-female:before { + content: "\f182" +} +.fa-male:before { + content: "\f183" +} +.fa-gittip:before, .fa-gratipay:before { + content: "\f184" +} +.fa-sun-o:before { + content: "\f185" +} +.fa-moon-o:before { + content: "\f186" +} +.fa-archive:before { + content: "\f187" +} +.fa-bug:before { + content: "\f188" +} +.fa-vk:before { + content: "\f189" +} +.fa-weibo:before { + content: "\f18a" +} +.fa-renren:before { + content: "\f18b" +} +.fa-pagelines:before { + content: "\f18c" +} +.fa-stack-exchange:before { + content: "\f18d" +} +.fa-arrow-circle-o-right:before { + content: "\f18e" +} +.fa-arrow-circle-o-left:before { + content: "\f190" +} +.fa-toggle-left:before, .fa-caret-square-o-left:before { + content: "\f191" +} +.fa-dot-circle-o:before { + content: "\f192" +} +.fa-wheelchair:before { + content: "\f193" +} +.fa-vimeo-square:before { + content: "\f194" +} +.fa-turkish-lira:before, .fa-try:before { + content: "\f195" +} +.fa-plus-square-o:before { + content: "\f196" +} +.fa-space-shuttle:before { + content: "\f197" +} +.fa-slack:before { + content: "\f198" +} +.fa-envelope-square:before { + content: "\f199" +} +.fa-wordpress:before { + content: "\f19a" +} +.fa-openid:before { + content: "\f19b" +} +.fa-institution:before, .fa-bank:before, .fa-university:before { + content: "\f19c" +} +.fa-mortar-board:before, .fa-graduation-cap:before { + content: "\f19d" +} +.fa-yahoo:before { + content: "\f19e" +} +.fa-google:before { + content: "\f1a0" +} +.fa-reddit:before { + content: "\f1a1" +} +.fa-reddit-square:before { + content: "\f1a2" +} +.fa-stumbleupon-circle:before { + content: "\f1a3" +} +.fa-stumbleupon:before { + content: "\f1a4" +} +.fa-delicious:before { + content: "\f1a5" +} +.fa-digg:before { + content: "\f1a6" +} +.fa-pied-piper-pp:before { + content: "\f1a7" +} +.fa-pied-piper-alt:before { + content: "\f1a8" +} +.fa-drupal:before { + content: "\f1a9" +} +.fa-joomla:before { + content: "\f1aa" +} +.fa-language:before { + content: "\f1ab" +} +.fa-fax:before { + content: "\f1ac" +} +.fa-building:before { + content: "\f1ad" +} +.fa-child:before { + content: "\f1ae" +} +.fa-paw:before { + content: "\f1b0" +} +.fa-spoon:before { + content: "\f1b1" +} +.fa-cube:before { + content: "\f1b2" +} +.fa-cubes:before { + content: "\f1b3" +} +.fa-behance:before { + content: "\f1b4" +} +.fa-behance-square:before { + content: "\f1b5" +} +.fa-steam:before { + content: "\f1b6" +} +.fa-steam-square:before { + content: "\f1b7" +} +.fa-recycle:before { + content: "\f1b8" +} +.fa-automobile:before, .fa-car:before { + content: "\f1b9" +} +.fa-cab:before, .fa-taxi:before { + content: "\f1ba" +} +.fa-tree:before { + content: "\f1bb" +} +.fa-spotify:before { + content: "\f1bc" +} +.fa-deviantart:before { + content: "\f1bd" +} +.fa-soundcloud:before { + content: "\f1be" +} +.fa-database:before { + content: "\f1c0" +} +.fa-file-pdf-o:before { + content: "\f1c1" +} +.fa-file-word-o:before { + content: "\f1c2" +} +.fa-file-excel-o:before { + content: "\f1c3" +} +.fa-file-powerpoint-o:before { + content: "\f1c4" +} +.fa-file-photo-o:before, .fa-file-picture-o:before, .fa-file-image-o:before { + content: "\f1c5" +} +.fa-file-zip-o:before, .fa-file-archive-o:before { + content: "\f1c6" +} +.fa-file-sound-o:before, .fa-file-audio-o:before { + content: "\f1c7" +} +.fa-file-movie-o:before, .fa-file-video-o:before { + content: "\f1c8" +} +.fa-file-code-o:before { + content: "\f1c9" +} +.fa-vine:before { + content: "\f1ca" +} +.fa-codepen:before { + content: "\f1cb" +} +.fa-jsfiddle:before { + content: "\f1cc" +} +.fa-life-bouy:before, .fa-life-buoy:before, .fa-life-saver:before, .fa-support:before, .fa-life-ring:before { + content: "\f1cd" +} +.fa-circle-o-notch:before { + content: "\f1ce" +} +.fa-ra:before, .fa-resistance:before, .fa-rebel:before { + content: "\f1d0" +} +.fa-ge:before, .fa-empire:before { + content: "\f1d1" +} +.fa-git-square:before { + content: "\f1d2" +} +.fa-git:before { + content: "\f1d3" +} +.fa-y-combinator-square:before, .fa-yc-square:before, .fa-hacker-news:before { + content: "\f1d4" +} +.fa-tencent-weibo:before { + content: "\f1d5" +} +.fa-qq:before { + content: "\f1d6" +} +.fa-wechat:before, .fa-weixin:before { + content: "\f1d7" +} +.fa-send:before, .fa-paper-plane:before { + content: "\f1d8" +} +.fa-send-o:before, .fa-paper-plane-o:before { + content: "\f1d9" +} +.fa-history:before { + content: "\f1da" +} +.fa-circle-thin:before { + content: "\f1db" +} +.fa-header:before { + content: "\f1dc" +} +.fa-paragraph:before { + content: "\f1dd" +} +.fa-sliders:before { + content: "\f1de" +} +.fa-share-alt:before { + content: "\f1e0" +} +.fa-share-alt-square:before { + content: "\f1e1" +} +.fa-bomb:before { + content: "\f1e2" +} +.fa-soccer-ball-o:before, .fa-futbol-o:before { + content: "\f1e3" +} +.fa-tty:before { + content: "\f1e4" +} +.fa-binoculars:before { + content: "\f1e5" +} +.fa-plug:before { + content: "\f1e6" +} +.fa-slideshare:before { + content: "\f1e7" +} +.fa-twitch:before { + content: "\f1e8" +} +.fa-yelp:before { + content: "\f1e9" +} +.fa-newspaper-o:before { + content: "\f1ea" +} +.fa-wifi:before { + content: "\f1eb" +} +.fa-calculator:before { + content: "\f1ec" +} +.fa-paypal:before { + content: "\f1ed" +} +.fa-google-wallet:before { + content: "\f1ee" +} +.fa-cc-visa:before { + content: "\f1f0" +} +.fa-cc-mastercard:before { + content: "\f1f1" +} +.fa-cc-discover:before { + content: "\f1f2" +} +.fa-cc-amex:before { + content: "\f1f3" +} +.fa-cc-paypal:before { + content: "\f1f4" +} +.fa-cc-stripe:before { + content: "\f1f5" +} +.fa-bell-slash:before { + content: "\f1f6" +} +.fa-bell-slash-o:before { + content: "\f1f7" +} +.fa-trash:before { + content: "\f1f8" +} +.fa-copyright:before { + content: "\f1f9" +} +.fa-at:before { + content: "\f1fa" +} +.fa-eyedropper:before { + content: "\f1fb" +} +.fa-paint-brush:before { + content: "\f1fc" +} +.fa-birthday-cake:before { + content: "\f1fd" +} +.fa-area-chart:before { + content: "\f1fe" +} +.fa-pie-chart:before { + content: "\f200" +} +.fa-line-chart:before { + content: "\f201" +} +.fa-lastfm:before { + content: "\f202" +} +.fa-lastfm-square:before { + content: "\f203" +} +.fa-toggle-off:before { + content: "\f204" +} +.fa-toggle-on:before { + content: "\f205" +} +.fa-bicycle:before { + content: "\f206" +} +.fa-bus:before { + content: "\f207" +} +.fa-ioxhost:before { + content: "\f208" +} +.fa-angellist:before { + content: "\f209" +} +.fa-cc:before { + content: "\f20a" +} +.fa-shekel:before, .fa-sheqel:before, .fa-ils:before { + content: "\f20b" +} +.fa-meanpath:before { + content: "\f20c" +} +.fa-buysellads:before { + content: "\f20d" +} +.fa-connectdevelop:before { + content: "\f20e" +} +.fa-dashcube:before { + content: "\f210" +} +.fa-forumbee:before { + content: "\f211" +} +.fa-leanpub:before { + content: "\f212" +} +.fa-sellsy:before { + content: "\f213" +} +.fa-shirtsinbulk:before { + content: "\f214" +} +.fa-simplybuilt:before { + content: "\f215" +} +.fa-skyatlas:before { + content: "\f216" +} +.fa-cart-plus:before { + content: "\f217" +} +.fa-cart-arrow-down:before { + content: "\f218" +} +.fa-diamond:before { + content: "\f219" +} +.fa-ship:before { + content: "\f21a" +} +.fa-user-secret:before { + content: "\f21b" +} +.fa-motorcycle:before { + content: "\f21c" +} +.fa-street-view:before { + content: "\f21d" +} +.fa-heartbeat:before { + content: "\f21e" +} +.fa-venus:before { + content: "\f221" +} +.fa-mars:before { + content: "\f222" +} +.fa-mercury:before { + content: "\f223" +} +.fa-intersex:before, .fa-transgender:before { + content: "\f224" +} +.fa-transgender-alt:before { + content: "\f225" +} +.fa-venus-double:before { + content: "\f226" +} +.fa-mars-double:before { + content: "\f227" +} +.fa-venus-mars:before { + content: "\f228" +} +.fa-mars-stroke:before { + content: "\f229" +} +.fa-mars-stroke-v:before { + content: "\f22a" +} +.fa-mars-stroke-h:before { + content: "\f22b" +} +.fa-neuter:before { + content: "\f22c" +} +.fa-genderless:before { + content: "\f22d" +} +.fa-facebook-official:before { + content: "\f230" +} +.fa-pinterest-p:before { + content: "\f231" +} +.fa-whatsapp:before { + content: "\f232" +} +.fa-server:before { + content: "\f233" +} +.fa-user-plus:before { + content: "\f234" +} +.fa-user-times:before { + content: "\f235" +} +.fa-hotel:before, .fa-bed:before { + content: "\f236" +} +.fa-viacoin:before { + content: "\f237" +} +.fa-train:before { + content: "\f238" +} +.fa-subway:before { + content: "\f239" +} +.fa-medium:before { + content: "\f23a" +} +.fa-yc:before, .fa-y-combinator:before { + content: "\f23b" +} +.fa-optin-monster:before { + content: "\f23c" +} +.fa-opencart:before { + content: "\f23d" +} +.fa-expeditedssl:before { + content: "\f23e" +} +.fa-battery-4:before, .fa-battery-full:before { + content: "\f240" +} +.fa-battery-3:before, .fa-battery-three-quarters:before { + content: "\f241" +} +.fa-battery-2:before, .fa-battery-half:before { + content: "\f242" +} +.fa-battery-1:before, .fa-battery-quarter:before { + content: "\f243" +} +.fa-battery-0:before, .fa-battery-empty:before { + content: "\f244" +} +.fa-mouse-pointer:before { + content: "\f245" +} +.fa-i-cursor:before { + content: "\f246" +} +.fa-object-group:before { + content: "\f247" +} +.fa-object-ungroup:before { + content: "\f248" +} +.fa-sticky-note:before { + content: "\f249" +} +.fa-sticky-note-o:before { + content: "\f24a" +} +.fa-cc-jcb:before { + content: "\f24b" +} +.fa-cc-diners-club:before { + content: "\f24c" +} +.fa-clone:before { + content: "\f24d" +} +.fa-balance-scale:before { + content: "\f24e" +} +.fa-hourglass-o:before { + content: "\f250" +} +.fa-hourglass-1:before, .fa-hourglass-start:before { + content: "\f251" +} +.fa-hourglass-2:before, .fa-hourglass-half:before { + content: "\f252" +} +.fa-hourglass-3:before, .fa-hourglass-end:before { + content: "\f253" +} +.fa-hourglass:before { + content: "\f254" +} +.fa-hand-grab-o:before, .fa-hand-rock-o:before { + content: "\f255" +} +.fa-hand-stop-o:before, .fa-hand-paper-o:before { + content: "\f256" +} +.fa-hand-scissors-o:before { + content: "\f257" +} +.fa-hand-lizard-o:before { + content: "\f258" +} +.fa-hand-spock-o:before { + content: "\f259" +} +.fa-hand-pointer-o:before { + content: "\f25a" +} +.fa-hand-peace-o:before { + content: "\f25b" +} +.fa-trademark:before { + content: "\f25c" +} +.fa-registered:before { + content: "\f25d" +} +.fa-creative-commons:before { + content: "\f25e" +} +.fa-gg:before { + content: "\f260" +} +.fa-gg-circle:before { + content: "\f261" +} +.fa-tripadvisor:before { + content: "\f262" +} +.fa-odnoklassniki:before { + content: "\f263" +} +.fa-odnoklassniki-square:before { + content: "\f264" +} +.fa-get-pocket:before { + content: "\f265" +} +.fa-wikipedia-w:before { + content: "\f266" +} +.fa-safari:before { + content: "\f267" +} +.fa-chrome:before { + content: "\f268" +} +.fa-firefox:before { + content: "\f269" +} +.fa-opera:before { + content: "\f26a" +} +.fa-internet-explorer:before { + content: "\f26b" +} +.fa-tv:before, .fa-television:before { + content: "\f26c" +} +.fa-contao:before { + content: "\f26d" +} +.fa-500px:before { + content: "\f26e" +} +.fa-amazon:before { + content: "\f270" +} +.fa-calendar-plus-o:before { + content: "\f271" +} +.fa-calendar-minus-o:before { + content: "\f272" +} +.fa-calendar-times-o:before { + content: "\f273" +} +.fa-calendar-check-o:before { + content: "\f274" +} +.fa-industry:before { + content: "\f275" +} +.fa-map-pin:before { + content: "\f276" +} +.fa-map-signs:before { + content: "\f277" +} +.fa-map-o:before { + content: "\f278" +} +.fa-map:before { + content: "\f279" +} +.fa-commenting:before { + content: "\f27a" +} +.fa-commenting-o:before { + content: "\f27b" +} +.fa-houzz:before { + content: "\f27c" +} +.fa-vimeo:before { + content: "\f27d" +} +.fa-black-tie:before { + content: "\f27e" +} +.fa-fonticons:before { + content: "\f280" +} +.fa-reddit-alien:before { + content: "\f281" +} +.fa-edge:before { + content: "\f282" +} +.fa-credit-card-alt:before { + content: "\f283" +} +.fa-codiepie:before { + content: "\f284" +} +.fa-modx:before { + content: "\f285" +} +.fa-fort-awesome:before { + content: "\f286" +} +.fa-usb:before { + content: "\f287" +} +.fa-product-hunt:before { + content: "\f288" +} +.fa-mixcloud:before { + content: "\f289" +} +.fa-scribd:before { + content: "\f28a" +} +.fa-pause-circle:before { + content: "\f28b" +} +.fa-pause-circle-o:before { + content: "\f28c" +} +.fa-stop-circle:before { + content: "\f28d" +} +.fa-stop-circle-o:before { + content: "\f28e" +} +.fa-shopping-bag:before { + content: "\f290" +} +.fa-shopping-basket:before { + content: "\f291" +} +.fa-hashtag:before { + content: "\f292" +} +.fa-bluetooth:before { + content: "\f293" +} +.fa-bluetooth-b:before { + content: "\f294" +} +.fa-percent:before { + content: "\f295" +} +.fa-gitlab:before { + content: "\f296" +} +.fa-wpbeginner:before { + content: "\f297" +} +.fa-wpforms:before { + content: "\f298" +} +.fa-envira:before { + content: "\f299" +} +.fa-universal-access:before { + content: "\f29a" +} +.fa-wheelchair-alt:before { + content: "\f29b" +} +.fa-question-circle-o:before { + content: "\f29c" +} +.fa-blind:before { + content: "\f29d" +} +.fa-audio-description:before { + content: "\f29e" +} +.fa-volume-control-phone:before { + content: "\f2a0" +} +.fa-braille:before { + content: "\f2a1" +} +.fa-assistive-listening-systems:before { + content: "\f2a2" +} +.fa-asl-interpreting:before, .fa-american-sign-language-interpreting:before { + content: "\f2a3" +} +.fa-deafness:before, .fa-hard-of-hearing:before, .fa-deaf:before { + content: "\f2a4" +} +.fa-glide:before { + content: "\f2a5" +} +.fa-glide-g:before { + content: "\f2a6" +} +.fa-signing:before, .fa-sign-language:before { + content: "\f2a7" +} +.fa-low-vision:before { + content: "\f2a8" +} +.fa-viadeo:before { + content: "\f2a9" +} +.fa-viadeo-square:before { + content: "\f2aa" +} +.fa-snapchat:before { + content: "\f2ab" +} +.fa-snapchat-ghost:before { + content: "\f2ac" +} +.fa-snapchat-square:before { + content: "\f2ad" +} +.fa-pied-piper:before { + content: "\f2ae" +} +.fa-first-order:before { + content: "\f2b0" +} +.fa-yoast:before { + content: "\f2b1" +} +.fa-themeisle:before { + content: "\f2b2" +} +.fa-google-plus-circle:before, .fa-google-plus-official:before { + content: "\f2b3" +} +.fa-fa:before, .fa-font-awesome:before { + content: "\f2b4" +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0 +} +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto +} diff --git a/assets/css/lib/font-awesome.min.css b/assets/css/lib/font-awesome.min.css new file mode 100644 index 0000000..7a55a65 --- /dev/null +++ b/assets/css/lib/font-awesome.min.css @@ -0,0 +1 @@ +@font-face{font-family:'FontAwesome';src:url('/assets/fonts/fontawesome-webfont.eot?v=4.6.3');src:url('/assets/fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'),url('/assets/fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'),url('/assets/fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'),url('/assets/fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'),url('/assets/fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale} .fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%} .fa-2x{font-size:2em} .fa-3x{font-size:3em} .fa-4x{font-size:4em} .fa-5x{font-size:5em} .fa-fw{width:1.28571429em;text-align:center} .fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none} .fa-ul>li{position:relative} .fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center} .fa-li.fa-lg{left:-1.85714286em} .fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em} .fa-pull-left{float:left} .fa-pull-right{float:right} .fa.fa-pull-left{margin-right:.3em} .fa.fa-pull-right{margin-left:.3em} .pull-right{float:right} .pull-left{float:left} .fa.pull-left{margin-right:.3em} .fa.pull-right{margin-left:.3em} .fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear} .fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)} @-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}} @keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}} .fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)} .fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)} .fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)} .fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)} .fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)} :root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none} .fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle} .fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center} .fa-stack-1x{line-height:inherit} .fa-stack-2x{font-size:2em} .fa-inverse{color:#fff} .fa-glass:before{content:"\f000"} .fa-music:before{content:"\f001"} .fa-search:before{content:"\f002"} .fa-envelope-o:before{content:"\f003"} .fa-heart:before{content:"\f004"} .fa-star:before{content:"\f005"} .fa-star-o:before{content:"\f006"} .fa-user:before{content:"\f007"} .fa-film:before{content:"\f008"} .fa-th-large:before{content:"\f009"} .fa-th:before{content:"\f00a"} .fa-th-list:before{content:"\f00b"} .fa-check:before{content:"\f00c"} .fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"} .fa-search-plus:before{content:"\f00e"} .fa-search-minus:before{content:"\f010"} .fa-power-off:before{content:"\f011"} .fa-signal:before{content:"\f012"} .fa-gear:before,.fa-cog:before{content:"\f013"} .fa-trash-o:before{content:"\f014"} .fa-home:before{content:"\f015"} .fa-file-o:before{content:"\f016"} .fa-clock-o:before{content:"\f017"} .fa-road:before{content:"\f018"} .fa-download:before{content:"\f019"} .fa-arrow-circle-o-down:before{content:"\f01a"} .fa-arrow-circle-o-up:before{content:"\f01b"} .fa-inbox:before{content:"\f01c"} .fa-play-circle-o:before{content:"\f01d"} .fa-rotate-right:before,.fa-repeat:before{content:"\f01e"} .fa-refresh:before{content:"\f021"} .fa-list-alt:before{content:"\f022"} .fa-lock:before{content:"\f023"} .fa-flag:before{content:"\f024"} .fa-headphones:before{content:"\f025"} .fa-volume-off:before{content:"\f026"} .fa-volume-down:before{content:"\f027"} .fa-volume-up:before{content:"\f028"} .fa-qrcode:before{content:"\f029"} .fa-barcode:before{content:"\f02a"} .fa-tag:before{content:"\f02b"} .fa-tags:before{content:"\f02c"} .fa-book:before{content:"\f02d"} .fa-bookmark:before{content:"\f02e"} .fa-print:before{content:"\f02f"} .fa-camera:before{content:"\f030"} .fa-font:before{content:"\f031"} .fa-bold:before{content:"\f032"} .fa-italic:before{content:"\f033"} .fa-text-height:before{content:"\f034"} .fa-text-width:before{content:"\f035"} .fa-align-left:before{content:"\f036"} .fa-align-center:before{content:"\f037"} .fa-align-right:before{content:"\f038"} .fa-align-justify:before{content:"\f039"} .fa-list:before{content:"\f03a"} .fa-dedent:before,.fa-outdent:before{content:"\f03b"} .fa-indent:before{content:"\f03c"} .fa-video-camera:before{content:"\f03d"} .fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"} .fa-pencil:before{content:"\f040"} .fa-map-marker:before{content:"\f041"} .fa-adjust:before{content:"\f042"} .fa-tint:before{content:"\f043"} .fa-edit:before,.fa-pencil-square-o:before{content:"\f044"} .fa-share-square-o:before{content:"\f045"} .fa-check-square-o:before{content:"\f046"} .fa-arrows:before{content:"\f047"} .fa-step-backward:before{content:"\f048"} .fa-fast-backward:before{content:"\f049"} .fa-backward:before{content:"\f04a"} .fa-play:before{content:"\f04b"} .fa-pause:before{content:"\f04c"} .fa-stop:before{content:"\f04d"} .fa-forward:before{content:"\f04e"} .fa-fast-forward:before{content:"\f050"} .fa-step-forward:before{content:"\f051"} .fa-eject:before{content:"\f052"} .fa-chevron-left:before{content:"\f053"} .fa-chevron-right:before{content:"\f054"} .fa-plus-circle:before{content:"\f055"} .fa-minus-circle:before{content:"\f056"} .fa-times-circle:before{content:"\f057"} .fa-check-circle:before{content:"\f058"} .fa-question-circle:before{content:"\f059"} .fa-info-circle:before{content:"\f05a"} .fa-crosshairs:before{content:"\f05b"} .fa-times-circle-o:before{content:"\f05c"} .fa-check-circle-o:before{content:"\f05d"} .fa-ban:before{content:"\f05e"} .fa-arrow-left:before{content:"\f060"} .fa-arrow-right:before{content:"\f061"} .fa-arrow-up:before{content:"\f062"} .fa-arrow-down:before{content:"\f063"} .fa-mail-forward:before,.fa-share:before{content:"\f064"} .fa-expand:before{content:"\f065"} .fa-compress:before{content:"\f066"} .fa-plus:before{content:"\f067"} .fa-minus:before{content:"\f068"} .fa-asterisk:before{content:"\f069"} .fa-exclamation-circle:before{content:"\f06a"} .fa-gift:before{content:"\f06b"} .fa-leaf:before{content:"\f06c"} .fa-fire:before{content:"\f06d"} .fa-eye:before{content:"\f06e"} .fa-eye-slash:before{content:"\f070"} .fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"} .fa-plane:before{content:"\f072"} .fa-calendar:before{content:"\f073"} .fa-random:before{content:"\f074"} .fa-comment:before{content:"\f075"} .fa-magnet:before{content:"\f076"} .fa-chevron-up:before{content:"\f077"} .fa-chevron-down:before{content:"\f078"} .fa-retweet:before{content:"\f079"} .fa-shopping-cart:before{content:"\f07a"} .fa-folder:before{content:"\f07b"} .fa-folder-open:before{content:"\f07c"} .fa-arrows-v:before{content:"\f07d"} .fa-arrows-h:before{content:"\f07e"} .fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"} .fa-twitter-square:before{content:"\f081"} .fa-facebook-square:before{content:"\f082"} .fa-camera-retro:before{content:"\f083"} .fa-key:before{content:"\f084"} .fa-gears:before,.fa-cogs:before{content:"\f085"} .fa-comments:before{content:"\f086"} .fa-thumbs-o-up:before{content:"\f087"} .fa-thumbs-o-down:before{content:"\f088"} .fa-star-half:before{content:"\f089"} .fa-heart-o:before{content:"\f08a"} .fa-sign-out:before{content:"\f08b"} .fa-linkedin-square:before{content:"\f08c"} .fa-thumb-tack:before{content:"\f08d"} .fa-external-link:before{content:"\f08e"} .fa-sign-in:before{content:"\f090"} .fa-trophy:before{content:"\f091"} .fa-github-square:before{content:"\f092"} .fa-upload:before{content:"\f093"} .fa-lemon-o:before{content:"\f094"} .fa-phone:before{content:"\f095"} .fa-square-o:before{content:"\f096"} .fa-bookmark-o:before{content:"\f097"} .fa-phone-square:before{content:"\f098"} .fa-twitter:before{content:"\f099"} .fa-facebook-f:before,.fa-facebook:before{content:"\f09a"} .fa-github:before{content:"\f09b"} .fa-unlock:before{content:"\f09c"} .fa-credit-card:before{content:"\f09d"} .fa-feed:before,.fa-rss:before{content:"\f09e"} .fa-hdd-o:before{content:"\f0a0"} .fa-bullhorn:before{content:"\f0a1"} .fa-bell:before{content:"\f0f3"} .fa-certificate:before{content:"\f0a3"} .fa-hand-o-right:before{content:"\f0a4"} .fa-hand-o-left:before{content:"\f0a5"} .fa-hand-o-up:before{content:"\f0a6"} .fa-hand-o-down:before{content:"\f0a7"} .fa-arrow-circle-left:before{content:"\f0a8"} .fa-arrow-circle-right:before{content:"\f0a9"} .fa-arrow-circle-up:before{content:"\f0aa"} .fa-arrow-circle-down:before{content:"\f0ab"} .fa-globe:before{content:"\f0ac"} .fa-wrench:before{content:"\f0ad"} .fa-tasks:before{content:"\f0ae"} .fa-filter:before{content:"\f0b0"} .fa-briefcase:before{content:"\f0b1"} .fa-arrows-alt:before{content:"\f0b2"} .fa-group:before,.fa-users:before{content:"\f0c0"} .fa-chain:before,.fa-link:before{content:"\f0c1"} .fa-cloud:before{content:"\f0c2"} .fa-flask:before{content:"\f0c3"} .fa-cut:before,.fa-scissors:before{content:"\f0c4"} .fa-copy:before,.fa-files-o:before{content:"\f0c5"} .fa-paperclip:before{content:"\f0c6"} .fa-save:before,.fa-floppy-o:before{content:"\f0c7"} .fa-square:before{content:"\f0c8"} .fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"} .fa-list-ul:before{content:"\f0ca"} .fa-list-ol:before{content:"\f0cb"} .fa-strikethrough:before{content:"\f0cc"} .fa-underline:before{content:"\f0cd"} .fa-table:before{content:"\f0ce"} .fa-magic:before{content:"\f0d0"} .fa-truck:before{content:"\f0d1"} .fa-pinterest:before{content:"\f0d2"} .fa-pinterest-square:before{content:"\f0d3"} .fa-google-plus-square:before{content:"\f0d4"} .fa-google-plus:before{content:"\f0d5"} .fa-money:before{content:"\f0d6"} .fa-caret-down:before{content:"\f0d7"} .fa-caret-up:before{content:"\f0d8"} .fa-caret-left:before{content:"\f0d9"} .fa-caret-right:before{content:"\f0da"} .fa-columns:before{content:"\f0db"} .fa-unsorted:before,.fa-sort:before{content:"\f0dc"} .fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"} .fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"} .fa-envelope:before{content:"\f0e0"} .fa-linkedin:before{content:"\f0e1"} .fa-rotate-left:before,.fa-undo:before{content:"\f0e2"} .fa-legal:before,.fa-gavel:before{content:"\f0e3"} .fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"} .fa-comment-o:before{content:"\f0e5"} .fa-comments-o:before{content:"\f0e6"} .fa-flash:before,.fa-bolt:before{content:"\f0e7"} .fa-sitemap:before{content:"\f0e8"} .fa-umbrella:before{content:"\f0e9"} .fa-paste:before,.fa-clipboard:before{content:"\f0ea"} .fa-lightbulb-o:before{content:"\f0eb"} .fa-exchange:before{content:"\f0ec"} .fa-cloud-download:before{content:"\f0ed"} .fa-cloud-upload:before{content:"\f0ee"} .fa-user-md:before{content:"\f0f0"} .fa-stethoscope:before{content:"\f0f1"} .fa-suitcase:before{content:"\f0f2"} .fa-bell-o:before{content:"\f0a2"} .fa-coffee:before{content:"\f0f4"} .fa-cutlery:before{content:"\f0f5"} .fa-file-text-o:before{content:"\f0f6"} .fa-building-o:before{content:"\f0f7"} .fa-hospital-o:before{content:"\f0f8"} .fa-ambulance:before{content:"\f0f9"} .fa-medkit:before{content:"\f0fa"} .fa-fighter-jet:before{content:"\f0fb"} .fa-beer:before{content:"\f0fc"} .fa-h-square:before{content:"\f0fd"} .fa-plus-square:before{content:"\f0fe"} .fa-angle-double-left:before{content:"\f100"} .fa-angle-double-right:before{content:"\f101"} .fa-angle-double-up:before{content:"\f102"} .fa-angle-double-down:before{content:"\f103"} .fa-angle-left:before{content:"\f104"} .fa-angle-right:before{content:"\f105"} .fa-angle-up:before{content:"\f106"} .fa-angle-down:before{content:"\f107"} .fa-desktop:before{content:"\f108"} .fa-laptop:before{content:"\f109"} .fa-tablet:before{content:"\f10a"} .fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"} .fa-circle-o:before{content:"\f10c"} .fa-quote-left:before{content:"\f10d"} .fa-quote-right:before{content:"\f10e"} .fa-spinner:before{content:"\f110"} .fa-circle:before{content:"\f111"} .fa-mail-reply:before,.fa-reply:before{content:"\f112"} .fa-github-alt:before{content:"\f113"} .fa-folder-o:before{content:"\f114"} .fa-folder-open-o:before{content:"\f115"} .fa-smile-o:before{content:"\f118"} .fa-frown-o:before{content:"\f119"} .fa-meh-o:before{content:"\f11a"} .fa-gamepad:before{content:"\f11b"} .fa-keyboard-o:before{content:"\f11c"} .fa-flag-o:before{content:"\f11d"} .fa-flag-checkered:before{content:"\f11e"} .fa-terminal:before{content:"\f120"} .fa-code:before{content:"\f121"} .fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"} .fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"} .fa-location-arrow:before{content:"\f124"} .fa-crop:before{content:"\f125"} .fa-code-fork:before{content:"\f126"} .fa-unlink:before,.fa-chain-broken:before{content:"\f127"} .fa-question:before{content:"\f128"} .fa-info:before{content:"\f129"} .fa-exclamation:before{content:"\f12a"} .fa-superscript:before{content:"\f12b"} .fa-subscript:before{content:"\f12c"} .fa-eraser:before{content:"\f12d"} .fa-puzzle-piece:before{content:"\f12e"} .fa-microphone:before{content:"\f130"} .fa-microphone-slash:before{content:"\f131"} .fa-shield:before{content:"\f132"} .fa-calendar-o:before{content:"\f133"} .fa-fire-extinguisher:before{content:"\f134"} .fa-rocket:before{content:"\f135"} .fa-maxcdn:before{content:"\f136"} .fa-chevron-circle-left:before{content:"\f137"} .fa-chevron-circle-right:before{content:"\f138"} .fa-chevron-circle-up:before{content:"\f139"} .fa-chevron-circle-down:before{content:"\f13a"} .fa-html5:before{content:"\f13b"} .fa-css3:before{content:"\f13c"} .fa-anchor:before{content:"\f13d"} .fa-unlock-alt:before{content:"\f13e"} .fa-bullseye:before{content:"\f140"} .fa-ellipsis-h:before{content:"\f141"} .fa-ellipsis-v:before{content:"\f142"} .fa-rss-square:before{content:"\f143"} .fa-play-circle:before{content:"\f144"} .fa-ticket:before{content:"\f145"} .fa-minus-square:before{content:"\f146"} .fa-minus-square-o:before{content:"\f147"} .fa-level-up:before{content:"\f148"} .fa-level-down:before{content:"\f149"} .fa-check-square:before{content:"\f14a"} .fa-pencil-square:before{content:"\f14b"} .fa-external-link-square:before{content:"\f14c"} .fa-share-square:before{content:"\f14d"} .fa-compass:before{content:"\f14e"} .fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"} .fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"} .fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"} .fa-euro:before,.fa-eur:before{content:"\f153"} .fa-gbp:before{content:"\f154"} .fa-dollar:before,.fa-usd:before{content:"\f155"} .fa-rupee:before,.fa-inr:before{content:"\f156"} .fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"} .fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"} .fa-won:before,.fa-krw:before{content:"\f159"} .fa-bitcoin:before,.fa-btc:before{content:"\f15a"} .fa-file:before{content:"\f15b"} .fa-file-text:before{content:"\f15c"} .fa-sort-alpha-asc:before{content:"\f15d"} .fa-sort-alpha-desc:before{content:"\f15e"} .fa-sort-amount-asc:before{content:"\f160"} .fa-sort-amount-desc:before{content:"\f161"} .fa-sort-numeric-asc:before{content:"\f162"} .fa-sort-numeric-desc:before{content:"\f163"} .fa-thumbs-up:before{content:"\f164"} .fa-thumbs-down:before{content:"\f165"} .fa-youtube-square:before{content:"\f166"} .fa-youtube:before{content:"\f167"} .fa-xing:before{content:"\f168"} .fa-xing-square:before{content:"\f169"} .fa-youtube-play:before{content:"\f16a"} .fa-dropbox:before{content:"\f16b"} .fa-stack-overflow:before{content:"\f16c"} .fa-instagram:before{content:"\f16d"} .fa-flickr:before{content:"\f16e"} .fa-adn:before{content:"\f170"} .fa-bitbucket:before{content:"\f171"} .fa-bitbucket-square:before{content:"\f172"} .fa-tumblr:before{content:"\f173"} .fa-tumblr-square:before{content:"\f174"} .fa-long-arrow-down:before{content:"\f175"} .fa-long-arrow-up:before{content:"\f176"} .fa-long-arrow-left:before{content:"\f177"} .fa-long-arrow-right:before{content:"\f178"} .fa-apple:before{content:"\f179"} .fa-windows:before{content:"\f17a"} .fa-android:before{content:"\f17b"} .fa-linux:before{content:"\f17c"} .fa-dribbble:before{content:"\f17d"} .fa-skype:before{content:"\f17e"} .fa-foursquare:before{content:"\f180"} .fa-trello:before{content:"\f181"} .fa-female:before{content:"\f182"} .fa-male:before{content:"\f183"} .fa-gittip:before,.fa-gratipay:before{content:"\f184"} .fa-sun-o:before{content:"\f185"} .fa-moon-o:before{content:"\f186"} .fa-archive:before{content:"\f187"} .fa-bug:before{content:"\f188"} .fa-vk:before{content:"\f189"} .fa-weibo:before{content:"\f18a"} .fa-renren:before{content:"\f18b"} .fa-pagelines:before{content:"\f18c"} .fa-stack-exchange:before{content:"\f18d"} .fa-arrow-circle-o-right:before{content:"\f18e"} .fa-arrow-circle-o-left:before{content:"\f190"} .fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"} .fa-dot-circle-o:before{content:"\f192"} .fa-wheelchair:before{content:"\f193"} .fa-vimeo-square:before{content:"\f194"} .fa-turkish-lira:before,.fa-try:before{content:"\f195"} .fa-plus-square-o:before{content:"\f196"} .fa-space-shuttle:before{content:"\f197"} .fa-slack:before{content:"\f198"} .fa-envelope-square:before{content:"\f199"} .fa-wordpress:before{content:"\f19a"} .fa-openid:before{content:"\f19b"} .fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"} .fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"} .fa-yahoo:before{content:"\f19e"} .fa-google:before{content:"\f1a0"} .fa-reddit:before{content:"\f1a1"} .fa-reddit-square:before{content:"\f1a2"} .fa-stumbleupon-circle:before{content:"\f1a3"} .fa-stumbleupon:before{content:"\f1a4"} .fa-delicious:before{content:"\f1a5"} .fa-digg:before{content:"\f1a6"} .fa-pied-piper-pp:before{content:"\f1a7"} .fa-pied-piper-alt:before{content:"\f1a8"} .fa-drupal:before{content:"\f1a9"} .fa-joomla:before{content:"\f1aa"} .fa-language:before{content:"\f1ab"} .fa-fax:before{content:"\f1ac"} .fa-building:before{content:"\f1ad"} .fa-child:before{content:"\f1ae"} .fa-paw:before{content:"\f1b0"} .fa-spoon:before{content:"\f1b1"} .fa-cube:before{content:"\f1b2"} .fa-cubes:before{content:"\f1b3"} .fa-behance:before{content:"\f1b4"} .fa-behance-square:before{content:"\f1b5"} .fa-steam:before{content:"\f1b6"} .fa-steam-square:before{content:"\f1b7"} .fa-recycle:before{content:"\f1b8"} .fa-automobile:before,.fa-car:before{content:"\f1b9"} .fa-cab:before,.fa-taxi:before{content:"\f1ba"} .fa-tree:before{content:"\f1bb"} .fa-spotify:before{content:"\f1bc"} .fa-deviantart:before{content:"\f1bd"} .fa-soundcloud:before{content:"\f1be"} .fa-database:before{content:"\f1c0"} .fa-file-pdf-o:before{content:"\f1c1"} .fa-file-word-o:before{content:"\f1c2"} .fa-file-excel-o:before{content:"\f1c3"} .fa-file-powerpoint-o:before{content:"\f1c4"} .fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"} .fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"} .fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"} .fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"} .fa-file-code-o:before{content:"\f1c9"} .fa-vine:before{content:"\f1ca"} .fa-codepen:before{content:"\f1cb"} .fa-jsfiddle:before{content:"\f1cc"} .fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"} .fa-circle-o-notch:before{content:"\f1ce"} .fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"} .fa-ge:before,.fa-empire:before{content:"\f1d1"} .fa-git-square:before{content:"\f1d2"} .fa-git:before{content:"\f1d3"} .fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"} .fa-tencent-weibo:before{content:"\f1d5"} .fa-qq:before{content:"\f1d6"} .fa-wechat:before,.fa-weixin:before{content:"\f1d7"} .fa-send:before,.fa-paper-plane:before{content:"\f1d8"} .fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"} .fa-history:before{content:"\f1da"} .fa-circle-thin:before{content:"\f1db"} .fa-header:before{content:"\f1dc"} .fa-paragraph:before{content:"\f1dd"} .fa-sliders:before{content:"\f1de"} .fa-share-alt:before{content:"\f1e0"} .fa-share-alt-square:before{content:"\f1e1"} .fa-bomb:before{content:"\f1e2"} .fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"} .fa-tty:before{content:"\f1e4"} .fa-binoculars:before{content:"\f1e5"} .fa-plug:before{content:"\f1e6"} .fa-slideshare:before{content:"\f1e7"} .fa-twitch:before{content:"\f1e8"} .fa-yelp:before{content:"\f1e9"} .fa-newspaper-o:before{content:"\f1ea"} .fa-wifi:before{content:"\f1eb"} .fa-calculator:before{content:"\f1ec"} .fa-paypal:before{content:"\f1ed"} .fa-google-wallet:before{content:"\f1ee"} .fa-cc-visa:before{content:"\f1f0"} .fa-cc-mastercard:before{content:"\f1f1"} .fa-cc-discover:before{content:"\f1f2"} .fa-cc-amex:before{content:"\f1f3"} .fa-cc-paypal:before{content:"\f1f4"} .fa-cc-stripe:before{content:"\f1f5"} .fa-bell-slash:before{content:"\f1f6"} .fa-bell-slash-o:before{content:"\f1f7"} .fa-trash:before{content:"\f1f8"} .fa-copyright:before{content:"\f1f9"} .fa-at:before{content:"\f1fa"} .fa-eyedropper:before{content:"\f1fb"} .fa-paint-brush:before{content:"\f1fc"} .fa-birthday-cake:before{content:"\f1fd"} .fa-area-chart:before{content:"\f1fe"} .fa-pie-chart:before{content:"\f200"} .fa-line-chart:before{content:"\f201"} .fa-lastfm:before{content:"\f202"} .fa-lastfm-square:before{content:"\f203"} .fa-toggle-off:before{content:"\f204"} .fa-toggle-on:before{content:"\f205"} .fa-bicycle:before{content:"\f206"} .fa-bus:before{content:"\f207"} .fa-ioxhost:before{content:"\f208"} .fa-angellist:before{content:"\f209"} .fa-cc:before{content:"\f20a"} .fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"} .fa-meanpath:before{content:"\f20c"} .fa-buysellads:before{content:"\f20d"} .fa-connectdevelop:before{content:"\f20e"} .fa-dashcube:before{content:"\f210"} .fa-forumbee:before{content:"\f211"} .fa-leanpub:before{content:"\f212"} .fa-sellsy:before{content:"\f213"} .fa-shirtsinbulk:before{content:"\f214"} .fa-simplybuilt:before{content:"\f215"} .fa-skyatlas:before{content:"\f216"} .fa-cart-plus:before{content:"\f217"} .fa-cart-arrow-down:before{content:"\f218"} .fa-diamond:before{content:"\f219"} .fa-ship:before{content:"\f21a"} .fa-user-secret:before{content:"\f21b"} .fa-motorcycle:before{content:"\f21c"} .fa-street-view:before{content:"\f21d"} .fa-heartbeat:before{content:"\f21e"} .fa-venus:before{content:"\f221"} .fa-mars:before{content:"\f222"} .fa-mercury:before{content:"\f223"} .fa-intersex:before,.fa-transgender:before{content:"\f224"} .fa-transgender-alt:before{content:"\f225"} .fa-venus-double:before{content:"\f226"} .fa-mars-double:before{content:"\f227"} .fa-venus-mars:before{content:"\f228"} .fa-mars-stroke:before{content:"\f229"} .fa-mars-stroke-v:before{content:"\f22a"} .fa-mars-stroke-h:before{content:"\f22b"} .fa-neuter:before{content:"\f22c"} .fa-genderless:before{content:"\f22d"} .fa-facebook-official:before{content:"\f230"} .fa-pinterest-p:before{content:"\f231"} .fa-whatsapp:before{content:"\f232"} .fa-server:before{content:"\f233"} .fa-user-plus:before{content:"\f234"} .fa-user-times:before{content:"\f235"} .fa-hotel:before,.fa-bed:before{content:"\f236"} .fa-viacoin:before{content:"\f237"} .fa-train:before{content:"\f238"} .fa-subway:before{content:"\f239"} .fa-medium:before{content:"\f23a"} .fa-yc:before,.fa-y-combinator:before{content:"\f23b"} .fa-optin-monster:before{content:"\f23c"} .fa-opencart:before{content:"\f23d"} .fa-expeditedssl:before{content:"\f23e"} .fa-battery-4:before,.fa-battery-full:before{content:"\f240"} .fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"} .fa-battery-2:before,.fa-battery-half:before{content:"\f242"} .fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"} .fa-battery-0:before,.fa-battery-empty:before{content:"\f244"} .fa-mouse-pointer:before{content:"\f245"} .fa-i-cursor:before{content:"\f246"} .fa-object-group:before{content:"\f247"} .fa-object-ungroup:before{content:"\f248"} .fa-sticky-note:before{content:"\f249"} .fa-sticky-note-o:before{content:"\f24a"} .fa-cc-jcb:before{content:"\f24b"} .fa-cc-diners-club:before{content:"\f24c"} .fa-clone:before{content:"\f24d"} .fa-balance-scale:before{content:"\f24e"} .fa-hourglass-o:before{content:"\f250"} .fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"} .fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"} .fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"} .fa-hourglass:before{content:"\f254"} .fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"} .fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"} .fa-hand-scissors-o:before{content:"\f257"} .fa-hand-lizard-o:before{content:"\f258"} .fa-hand-spock-o:before{content:"\f259"} .fa-hand-pointer-o:before{content:"\f25a"} .fa-hand-peace-o:before{content:"\f25b"} .fa-trademark:before{content:"\f25c"} .fa-registered:before{content:"\f25d"} .fa-creative-commons:before{content:"\f25e"} .fa-gg:before{content:"\f260"} .fa-gg-circle:before{content:"\f261"} .fa-tripadvisor:before{content:"\f262"} .fa-odnoklassniki:before{content:"\f263"} .fa-odnoklassniki-square:before{content:"\f264"} .fa-get-pocket:before{content:"\f265"} .fa-wikipedia-w:before{content:"\f266"} .fa-safari:before{content:"\f267"} .fa-chrome:before{content:"\f268"} .fa-firefox:before{content:"\f269"} .fa-opera:before{content:"\f26a"} .fa-internet-explorer:before{content:"\f26b"} .fa-tv:before,.fa-television:before{content:"\f26c"} .fa-contao:before{content:"\f26d"} .fa-500px:before{content:"\f26e"} .fa-amazon:before{content:"\f270"} .fa-calendar-plus-o:before{content:"\f271"} .fa-calendar-minus-o:before{content:"\f272"} .fa-calendar-times-o:before{content:"\f273"} .fa-calendar-check-o:before{content:"\f274"} .fa-industry:before{content:"\f275"} .fa-map-pin:before{content:"\f276"} .fa-map-signs:before{content:"\f277"} .fa-map-o:before{content:"\f278"} .fa-map:before{content:"\f279"} .fa-commenting:before{content:"\f27a"} .fa-commenting-o:before{content:"\f27b"} .fa-houzz:before{content:"\f27c"} .fa-vimeo:before{content:"\f27d"} .fa-black-tie:before{content:"\f27e"} .fa-fonticons:before{content:"\f280"} .fa-reddit-alien:before{content:"\f281"} .fa-edge:before{content:"\f282"} .fa-credit-card-alt:before{content:"\f283"} .fa-codiepie:before{content:"\f284"} .fa-modx:before{content:"\f285"} .fa-fort-awesome:before{content:"\f286"} .fa-usb:before{content:"\f287"} .fa-product-hunt:before{content:"\f288"} .fa-mixcloud:before{content:"\f289"} .fa-scribd:before{content:"\f28a"} .fa-pause-circle:before{content:"\f28b"} .fa-pause-circle-o:before{content:"\f28c"} .fa-stop-circle:before{content:"\f28d"} .fa-stop-circle-o:before{content:"\f28e"} .fa-shopping-bag:before{content:"\f290"} .fa-shopping-basket:before{content:"\f291"} .fa-hashtag:before{content:"\f292"} .fa-bluetooth:before{content:"\f293"} .fa-bluetooth-b:before{content:"\f294"} .fa-percent:before{content:"\f295"} .fa-gitlab:before{content:"\f296"} .fa-wpbeginner:before{content:"\f297"} .fa-wpforms:before{content:"\f298"} .fa-envira:before{content:"\f299"} .fa-universal-access:before{content:"\f29a"} .fa-wheelchair-alt:before{content:"\f29b"} .fa-question-circle-o:before{content:"\f29c"} .fa-blind:before{content:"\f29d"} .fa-audio-description:before{content:"\f29e"} .fa-volume-control-phone:before{content:"\f2a0"} .fa-braille:before{content:"\f2a1"} .fa-assistive-listening-systems:before{content:"\f2a2"} .fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"} .fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"} .fa-glide:before{content:"\f2a5"} .fa-glide-g:before{content:"\f2a6"} .fa-signing:before,.fa-sign-language:before{content:"\f2a7"} .fa-low-vision:before{content:"\f2a8"} .fa-viadeo:before{content:"\f2a9"} .fa-viadeo-square:before{content:"\f2aa"} .fa-snapchat:before{content:"\f2ab"} .fa-snapchat-ghost:before{content:"\f2ac"} .fa-snapchat-square:before{content:"\f2ad"} .fa-pied-piper:before{content:"\f2ae"} .fa-first-order:before{content:"\f2b0"} .fa-yoast:before{content:"\f2b1"} .fa-themeisle:before{content:"\f2b2"} .fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"} .fa-fa:before,.fa-font-awesome:before{content:"\f2b4"} .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0} .sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} \ No newline at end of file diff --git a/assets/css/lib/fontawesome-all-5.2.0.min.css b/assets/css/lib/fontawesome-all-5.2.0.min.css new file mode 100644 index 0000000..e7f4f62 --- /dev/null +++ b/assets/css/lib/fontawesome-all-5.2.0.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:a 2s infinite linear}.fa-pulse{animation:a 1s infinite steps(8)}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-concierge-bell:before{content:"\f562"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-dice:before{content:"\f522"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-r-project:before{content:"\f4f7"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skull:before{content:"\f54c"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;src:url(../../webfonts/fa-brands-400.eot);src:url(../../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../../webfonts/fa-brands-400.woff2) format("woff2"),url(../../webfonts/fa-brands-400.woff) format("woff"),url(../../webfonts/fa-brands-400.ttf) format("truetype"),url(../../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;src:url(../../webfonts/fa-regular-400.eot);src:url(../../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../../webfonts/fa-regular-400.woff2) format("woff2"),url(../../webfonts/fa-regular-400.woff) format("woff"),url(../../webfonts/fa-regular-400.ttf) format("truetype"),url(../../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;src:url(../../webfonts/fa-solid-900.eot);src:url(../../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../../webfonts/fa-solid-900.woff2) format("woff2"),url(../../webfonts/fa-solid-900.woff) format("woff"),url(../../webfonts/fa-solid-900.ttf) format("truetype"),url(../../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/assets/css/lib/fontawesome-all.min.css b/assets/css/lib/fontawesome-all.min.css new file mode 100644 index 0000000..a45c1bc --- /dev/null +++ b/assets/css/lib/fontawesome-all.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crosshairs:before{content:"\f05b"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-excel:before{content:"\f1c3"}.fa-file-image:before{content:"\f1c5"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-firstdraft:before{content:"\f3a1"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frown:before{content:"\f119"}.fa-futbol:before{content:"\f1e3"}.fa-gamepad:before{content:"\f11b"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-male:before{content:"\f183"}.fa-map:before{content:"\f279"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-maxcdn:before{content:"\f136"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-meh:before{content:"\f11a"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-moon:before{content:"\f186"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-rupee-sign:before{content:"\f156"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shower:before{content:"\f2cc"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smoking:before{content:"\f48d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-spotify:before{content:"\f1bc"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-strava:before{content:"\f428"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-circle:before{content:"\f2bd"}.fa-user-md:before{content:"\f0f0"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-warehouse:before{content:"\f494"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../../webfonts/fa-brands-400.eot);src:url(../../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../../webfonts/fa-brands-400.woff2) format("woff2"),url(../../webfonts/fa-brands-400.woff) format("woff"),url(../../webfonts/fa-brands-400.ttf) format("truetype"),url(../../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../../webfonts/fa-regular-400.eot);src:url(../../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../../webfonts/fa-regular-400.woff2) format("woff2"),url(../../webfonts/fa-regular-400.woff) format("woff"),url(../../webfonts/fa-regular-400.ttf) format("truetype"),url(../../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../../webfonts/fa-solid-900.eot);src:url(../../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../../webfonts/fa-solid-900.woff2) format("woff2"),url(../../webfonts/fa-solid-900.woff) format("woff"),url(../../webfonts/fa-solid-900.ttf) format("truetype"),url(../../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:Font Awesome\ 5 Free}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/assets/css/lib/fullcalendar.css b/assets/css/lib/fullcalendar.css new file mode 100644 index 0000000..81e9c1e --- /dev/null +++ b/assets/css/lib/fullcalendar.css @@ -0,0 +1,1260 @@ +/*! + * FullCalendar v2.7.3 Stylesheet + * Docs & License: http://fullcalendar.io/ + * (c) 2016 Adam Shaw + */ + + +.fc { + direction: ltr; + text-align: left; +} + +.fc-rtl { + text-align: right; +} + +body .fc { /* extra precedence to overcome jqui */ + font-size: 1em; +} + + +/* Colors +--------------------------------------------------------------------------------------------------*/ + +.fc-unthemed th, +.fc-unthemed td, +.fc-unthemed thead, +.fc-unthemed tbody, +.fc-unthemed .fc-divider, +.fc-unthemed .fc-row, +.fc-unthemed .fc-content, /* for gutter border */ +.fc-unthemed .fc-popover { + border-color: #ddd; +} + +.fc-unthemed .fc-popover { + background-color: #fff; +} + +.fc-unthemed .fc-divider, +.fc-unthemed .fc-popover .fc-header { + background: #eee; +} + +.fc-unthemed .fc-popover .fc-header .fc-close { + color: #666; +} + +.fc-unthemed .fc-today { + background: #fcf8e3; +} + +.fc-highlight { /* when user is selecting cells */ + background: #bce8f1; + opacity: .3; + filter: alpha(opacity=30); /* for IE */ +} + +.fc-bgevent { /* default look for background events */ + background: rgb(143, 223, 130); + opacity: .3; + filter: alpha(opacity=30); /* for IE */ +} + +.fc-nonbusiness { /* default look for non-business-hours areas */ + /* will inherit .fc-bgevent's styles */ + background: #d7d7d7; +} + + +/* Icons (inline elements with styled text that mock arrow icons) +--------------------------------------------------------------------------------------------------*/ + +.fc-icon { + display: inline-block; + height: 1em; + line-height: 1em; + font-size: 1em; + text-align: center; + overflow: hidden; + font-family: "Courier New", Courier, monospace; + + /* don't allow browser text-selection */ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + +/* +Acceptable font-family overrides for individual icons: + "Arial", sans-serif + "Times New Roman", serif + +NOTE: use percentage font sizes or else old IE chokes +*/ + +.fc-icon:after { + position: relative; +} + +.fc-icon-left-single-arrow:after { + content: "\02039"; + font-weight: bold; + font-size: 200%; + top: -7%; +} + +.fc-icon-right-single-arrow:after { + content: "\0203A"; + font-weight: bold; + font-size: 200%; + top: -7%; +} + +.fc-icon-left-double-arrow:after { + content: "\000AB"; + font-size: 160%; + top: -7%; +} + +.fc-icon-right-double-arrow:after { + content: "\000BB"; + font-size: 160%; + top: -7%; +} + +.fc-icon-left-triangle:after { + content: "\25C4"; + font-size: 125%; + top: 3%; +} + +.fc-icon-right-triangle:after { + content: "\25BA"; + font-size: 125%; + top: 3%; +} + +.fc-icon-down-triangle:after { + content: "\25BC"; + font-size: 125%; + top: 2%; +} + +.fc-icon-x:after { + content: "\000D7"; + font-size: 200%; + top: 6%; +} + + +/* Buttons (styled ' + ) + .click(function(ev) { + // don't process clicks for disabled buttons + if (!button.hasClass(tm + '-state-disabled')) { + + buttonClick(ev); + + // after the click action, if the button becomes the "active" tab, or disabled, + // it should never have a hover class, so remove it now. + if ( + button.hasClass(tm + '-state-active') || + button.hasClass(tm + '-state-disabled') + ) { + button.removeClass(tm + '-state-hover'); + } + } + }) + .mousedown(function() { + // the *down* effect (mouse pressed in). + // only on buttons that are not the "active" tab, or disabled + button + .not('.' + tm + '-state-active') + .not('.' + tm + '-state-disabled') + .addClass(tm + '-state-down'); + }) + .mouseup(function() { + // undo the *down* effect + button.removeClass(tm + '-state-down'); + }) + .hover( + function() { + // the *hover* effect. + // only on buttons that are not the "active" tab, or disabled + button + .not('.' + tm + '-state-active') + .not('.' + tm + '-state-disabled') + .addClass(tm + '-state-hover'); + }, + function() { + // undo the *hover* effect + button + .removeClass(tm + '-state-hover') + .removeClass(tm + '-state-down'); // if mouseleave happens before mouseup + } + ); + + groupChildren = groupChildren.add(button); + } + } + }); + + if (isOnlyButtons) { + groupChildren + .first().addClass(tm + '-corner-left').end() + .last().addClass(tm + '-corner-right').end(); + } + + if (groupChildren.length > 1) { + groupEl = $('
                '); + if (isOnlyButtons) { + groupEl.addClass('fc-button-group'); + } + groupEl.append(groupChildren); + sectionEl.append(groupEl); + } + else { + sectionEl.append(groupChildren); // 1 or 0 children + } + }); + } + + return sectionEl; + } + + + function updateTitle(text) { + el.find('h2').text(text); + } + + + function activateButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .addClass(tm + '-state-active'); + } + + + function deactivateButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .removeClass(tm + '-state-active'); + } + + + function disableButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .attr('disabled', 'disabled') + .addClass(tm + '-state-disabled'); + } + + + function enableButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .removeAttr('disabled') + .removeClass(tm + '-state-disabled'); + } + + + function getViewsWithButtons() { + return viewsWithButtons; + } + +} + +;; + +FC.sourceNormalizers = []; +FC.sourceFetchers = []; + +var ajaxDefaults = { + dataType: 'json', + cache: false +}; + +var eventGUID = 1; + + +function EventManager(options) { // assumed to be a calendar + var t = this; + + + // exports + t.isFetchNeeded = isFetchNeeded; + t.fetchEvents = fetchEvents; + t.addEventSource = addEventSource; + t.removeEventSource = removeEventSource; + t.updateEvent = updateEvent; + t.renderEvent = renderEvent; + t.removeEvents = removeEvents; + t.clientEvents = clientEvents; + t.mutateEvent = mutateEvent; + t.normalizeEventDates = normalizeEventDates; + t.normalizeEventTimes = normalizeEventTimes; + + + // imports + var reportEvents = t.reportEvents; + + + // locals + var stickySource = { events: [] }; + var sources = [ stickySource ]; + var rangeStart, rangeEnd; + var currentFetchID = 0; + var pendingSourceCnt = 0; + var cache = []; // holds events that have already been expanded + + + $.each( + (options.events ? [ options.events ] : []).concat(options.eventSources || []), + function(i, sourceInput) { + var source = buildEventSource(sourceInput); + if (source) { + sources.push(source); + } + } + ); + + + + /* Fetching + -----------------------------------------------------------------------------*/ + + + // start and end are assumed to be unzoned + function isFetchNeeded(start, end) { + return !rangeStart || // nothing has been fetched yet? + start < rangeStart || end > rangeEnd; // is part of the new range outside of the old range? + } + + + function fetchEvents(start, end) { + rangeStart = start; + rangeEnd = end; + cache = []; + var fetchID = ++currentFetchID; + var len = sources.length; + pendingSourceCnt = len; + for (var i=0; i= eventStart && range.end <= eventEnd; + } + + + // Does the event's date range intersect with the given range? + // start/end already assumed to have stripped zones :( + function eventIntersectsRange(event, range) { + var eventStart = event.start.clone().stripZone(); + var eventEnd = t.getEventEnd(event).stripZone(); + + return range.start < eventEnd && range.end > eventStart; + } + + + t.getEventCache = function() { + return cache; + }; + +} + + +// hook for external libs to manipulate event properties upon creation. +// should manipulate the event in-place. +Calendar.prototype.normalizeEvent = function(event) { +}; + + +// Returns a list of events that the given event should be compared against when being considered for a move to +// the specified span. Attached to the Calendar's prototype because EventManager is a mixin for a Calendar. +Calendar.prototype.getPeerEvents = function(span, event) { + var cache = this.getEventCache(); + var peerEvents = []; + var i, otherEvent; + + for (i = 0; i < cache.length; i++) { + otherEvent = cache[i]; + if ( + !event || + event._id !== otherEvent._id // don't compare the event to itself or other related [repeating] events + ) { + peerEvents.push(otherEvent); + } + } + + return peerEvents; +}; + + +// updates the "backup" properties, which are preserved in order to compute diffs later on. +function backupEventDates(event) { + event._allDay = event.allDay; + event._start = event.start.clone(); + event._end = event.end ? event.end.clone() : null; +} + +;; + +/* An abstract class for the "basic" views, as well as month view. Renders one or more rows of day cells. +----------------------------------------------------------------------------------------------------------------------*/ +// It is a manager for a DayGrid subcomponent, which does most of the heavy lifting. +// It is responsible for managing width/height. + +var BasicView = FC.BasicView = View.extend({ + + scroller: null, + + dayGridClass: DayGrid, // class the dayGrid will be instantiated from (overridable by subclasses) + dayGrid: null, // the main subcomponent that does most of the heavy lifting + + dayNumbersVisible: false, // display day numbers on each day cell? + weekNumbersVisible: false, // display week numbers along the side? + + weekNumberWidth: null, // width of all the week-number cells running down the side + + headContainerEl: null, // div that hold's the dayGrid's rendered date header + headRowEl: null, // the fake row element of the day-of-week header + + + initialize: function() { + this.dayGrid = this.instantiateDayGrid(); + + this.scroller = new Scroller({ + overflowX: 'hidden', + overflowY: 'auto' + }); + }, + + + // Generates the DayGrid object this view needs. Draws from this.dayGridClass + instantiateDayGrid: function() { + // generate a subclass on the fly with BasicView-specific behavior + // TODO: cache this subclass + var subclass = this.dayGridClass.extend(basicDayGridMethods); + + return new subclass(this); + }, + + + // Sets the display range and computes all necessary dates + setRange: function(range) { + View.prototype.setRange.call(this, range); // call the super-method + + this.dayGrid.breakOnWeeks = /year|month|week/.test(this.intervalUnit); // do before setRange + this.dayGrid.setRange(range); + }, + + + // Compute the value to feed into setRange. Overrides superclass. + computeRange: function(date) { + var range = View.prototype.computeRange.call(this, date); // get value from the super-method + + // year and month views should be aligned with weeks. this is already done for week + if (/year|month/.test(range.intervalUnit)) { + range.start.startOf('week'); + range.start = this.skipHiddenDays(range.start); + + // make end-of-week if not already + if (range.end.weekday()) { + range.end.add(1, 'week').startOf('week'); + range.end = this.skipHiddenDays(range.end, -1, true); // exclusively move backwards + } + } + + return range; + }, + + + // Renders the view into `this.el`, which should already be assigned + renderDates: function() { + + this.dayNumbersVisible = this.dayGrid.rowCnt > 1; // TODO: make grid responsible + this.weekNumbersVisible = this.opt('weekNumbers'); + this.dayGrid.numbersVisible = this.dayNumbersVisible || this.weekNumbersVisible; + + this.el.addClass('fc-basic-view').html(this.renderSkeletonHtml()); + this.renderHead(); + + this.scroller.render(); + var dayGridContainerEl = this.scroller.el.addClass('fc-day-grid-container'); + var dayGridEl = $('
                ').appendTo(dayGridContainerEl); + this.el.find('.fc-body > tr > td').append(dayGridContainerEl); + + this.dayGrid.setElement(dayGridEl); + this.dayGrid.renderDates(this.hasRigidRows()); + }, + + + // render the day-of-week headers + renderHead: function() { + this.headContainerEl = + this.el.find('.fc-head-container') + .html(this.dayGrid.renderHeadHtml()); + this.headRowEl = this.headContainerEl.find('.fc-row'); + }, + + + // Unrenders the content of the view. Since we haven't separated skeleton rendering from date rendering, + // always completely kill the dayGrid's rendering. + unrenderDates: function() { + this.dayGrid.unrenderDates(); + this.dayGrid.removeElement(); + this.scroller.destroy(); + }, + + + renderBusinessHours: function() { + this.dayGrid.renderBusinessHours(); + }, + + + // Builds the HTML skeleton for the view. + // The day-grid component will render inside of a container defined by this HTML. + renderSkeletonHtml: function() { + return '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
                '; + }, + + + // Generates an HTML attribute string for setting the width of the week number column, if it is known + weekNumberStyleAttr: function() { + if (this.weekNumberWidth !== null) { + return 'style="width:' + this.weekNumberWidth + 'px"'; + } + return ''; + }, + + + // Determines whether each row should have a constant height + hasRigidRows: function() { + var eventLimit = this.opt('eventLimit'); + return eventLimit && typeof eventLimit !== 'number'; + }, + + + /* Dimensions + ------------------------------------------------------------------------------------------------------------------*/ + + + // Refreshes the horizontal dimensions of the view + updateWidth: function() { + if (this.weekNumbersVisible) { + // Make sure all week number cells running down the side have the same width. + // Record the width for cells created later. + this.weekNumberWidth = matchCellWidths( + this.el.find('.fc-week-number') + ); + } + }, + + + // Adjusts the vertical dimensions of the view to the specified values + setHeight: function(totalHeight, isAuto) { + var eventLimit = this.opt('eventLimit'); + var scrollerHeight; + var scrollbarWidths; + + // reset all heights to be natural + this.scroller.clear(); + uncompensateScroll(this.headRowEl); + + this.dayGrid.removeSegPopover(); // kill the "more" popover if displayed + + // is the event limit a constant level number? + if (eventLimit && typeof eventLimit === 'number') { + this.dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after + } + + // distribute the height to the rows + // (totalHeight is a "recommended" value if isAuto) + scrollerHeight = this.computeScrollerHeight(totalHeight); + this.setGridHeight(scrollerHeight, isAuto); + + // is the event limit dynamically calculated? + if (eventLimit && typeof eventLimit !== 'number') { + this.dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set + } + + if (!isAuto) { // should we force dimensions of the scroll container? + + this.scroller.setHeight(scrollerHeight); + scrollbarWidths = this.scroller.getScrollbarWidths(); + + if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars? + + compensateScroll(this.headRowEl, scrollbarWidths); + + // doing the scrollbar compensation might have created text overflow which created more height. redo + scrollerHeight = this.computeScrollerHeight(totalHeight); + this.scroller.setHeight(scrollerHeight); + } + + // guarantees the same scrollbar widths + this.scroller.lockOverflow(scrollbarWidths); + } + }, + + + // given a desired total height of the view, returns what the height of the scroller should be + computeScrollerHeight: function(totalHeight) { + return totalHeight - + subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller + }, + + + // Sets the height of just the DayGrid component in this view + setGridHeight: function(height, isAuto) { + if (isAuto) { + undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding + } + else { + distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows + } + }, + + + /* Scroll + ------------------------------------------------------------------------------------------------------------------*/ + + + queryScroll: function() { + return this.scroller.getScrollTop(); + }, + + + setScroll: function(top) { + this.scroller.setScrollTop(top); + }, + + + /* Hit Areas + ------------------------------------------------------------------------------------------------------------------*/ + // forward all hit-related method calls to dayGrid + + + prepareHits: function() { + this.dayGrid.prepareHits(); + }, + + + releaseHits: function() { + this.dayGrid.releaseHits(); + }, + + + queryHit: function(left, top) { + return this.dayGrid.queryHit(left, top); + }, + + + getHitSpan: function(hit) { + return this.dayGrid.getHitSpan(hit); + }, + + + getHitEl: function(hit) { + return this.dayGrid.getHitEl(hit); + }, + + + /* Events + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders the given events onto the view and populates the segments array + renderEvents: function(events) { + this.dayGrid.renderEvents(events); + + this.updateHeight(); // must compensate for events that overflow the row + }, + + + // Retrieves all segment objects that are rendered in the view + getEventSegs: function() { + return this.dayGrid.getEventSegs(); + }, + + + // Unrenders all event elements and clears internal segment data + unrenderEvents: function() { + this.dayGrid.unrenderEvents(); + + // we DON'T need to call updateHeight() because: + // A) a renderEvents() call always happens after this, which will eventually call updateHeight() + // B) in IE8, this causes a flash whenever events are rerendered + }, + + + /* Dragging (for both events and external elements) + ------------------------------------------------------------------------------------------------------------------*/ + + + // A returned value of `true` signals that a mock "helper" event has been rendered. + renderDrag: function(dropLocation, seg) { + return this.dayGrid.renderDrag(dropLocation, seg); + }, + + + unrenderDrag: function() { + this.dayGrid.unrenderDrag(); + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a selection + renderSelection: function(span) { + this.dayGrid.renderSelection(span); + }, + + + // Unrenders a visual indications of a selection + unrenderSelection: function() { + this.dayGrid.unrenderSelection(); + } + +}); + + +// Methods that will customize the rendering behavior of the BasicView's dayGrid +var basicDayGridMethods = { + + + // Generates the HTML that will go before the day-of week header cells + renderHeadIntroHtml: function() { + var view = this.view; + + if (view.weekNumbersVisible) { + return '' + + '' + + '' + // needed for matchCellWidths + htmlEscape(view.opt('weekNumberTitle')) + + '' + + ''; + } + + return ''; + }, + + + // Generates the HTML that will go before content-skeleton cells that display the day/week numbers + renderNumberIntroHtml: function(row) { + var view = this.view; + + if (view.weekNumbersVisible) { + return '' + + '' + + '' + // needed for matchCellWidths + this.getCellDate(row, 0).format('w') + + '' + + ''; + } + + return ''; + }, + + + // Generates the HTML that goes before the day bg cells for each day-row + renderBgIntroHtml: function() { + var view = this.view; + + if (view.weekNumbersVisible) { + return ''; + } + + return ''; + }, + + + // Generates the HTML that goes before every other type of row generated by DayGrid. + // Affects helper-skeleton and highlight-skeleton rows. + renderIntroHtml: function() { + var view = this.view; + + if (view.weekNumbersVisible) { + return ''; + } + + return ''; + } + +}; + +;; + +/* A month view with day cells running in rows (one-per-week) and columns +----------------------------------------------------------------------------------------------------------------------*/ + +var MonthView = FC.MonthView = BasicView.extend({ + + // Produces information about what range to display + computeRange: function(date) { + var range = BasicView.prototype.computeRange.call(this, date); // get value from super-method + var rowCnt; + + // ensure 6 weeks + if (this.isFixedWeeks()) { + rowCnt = Math.ceil(range.end.diff(range.start, 'weeks', true)); // could be partial weeks due to hiddenDays + range.end.add(6 - rowCnt, 'weeks'); + } + + return range; + }, + + + // Overrides the default BasicView behavior to have special multi-week auto-height logic + setGridHeight: function(height, isAuto) { + + isAuto = isAuto || this.opt('weekMode') === 'variable'; // LEGACY: weekMode is deprecated + + // if auto, make the height of each row the height that it would be if there were 6 weeks + if (isAuto) { + height *= this.rowCnt / 6; + } + + distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows + }, + + + isFixedWeeks: function() { + var weekMode = this.opt('weekMode'); // LEGACY: weekMode is deprecated + if (weekMode) { + return weekMode === 'fixed'; // if any other type of weekMode, assume NOT fixed + } + + return this.opt('fixedWeekCount'); + } + +}); + +;; + +fcViews.basic = { + 'class': BasicView +}; + +fcViews.basicDay = { + type: 'basic', + duration: { days: 1 } +}; + +fcViews.basicWeek = { + type: 'basic', + duration: { weeks: 1 } +}; + +fcViews.month = { + 'class': MonthView, + duration: { months: 1 }, // important for prev/next + defaults: { + fixedWeekCount: true + } +}; +;; + +/* An abstract class for all agenda-related views. Displays one more columns with time slots running vertically. +----------------------------------------------------------------------------------------------------------------------*/ +// Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on). +// Responsible for managing width/height. + +var AgendaView = FC.AgendaView = View.extend({ + + scroller: null, + + timeGridClass: TimeGrid, // class used to instantiate the timeGrid. subclasses can override + timeGrid: null, // the main time-grid subcomponent of this view + + dayGridClass: DayGrid, // class used to instantiate the dayGrid. subclasses can override + dayGrid: null, // the "all-day" subcomponent. if all-day is turned off, this will be null + + axisWidth: null, // the width of the time axis running down the side + + headContainerEl: null, // div that hold's the timeGrid's rendered date header + noScrollRowEls: null, // set of fake row elements that must compensate when scroller has scrollbars + + // when the time-grid isn't tall enough to occupy the given height, we render an
                underneath + bottomRuleEl: null, + + + initialize: function() { + this.timeGrid = this.instantiateTimeGrid(); + + if (this.opt('allDaySlot')) { // should we display the "all-day" area? + this.dayGrid = this.instantiateDayGrid(); // the all-day subcomponent of this view + } + + this.scroller = new Scroller({ + overflowX: 'hidden', + overflowY: 'auto' + }); + }, + + + // Instantiates the TimeGrid object this view needs. Draws from this.timeGridClass + instantiateTimeGrid: function() { + var subclass = this.timeGridClass.extend(agendaTimeGridMethods); + + return new subclass(this); + }, + + + // Instantiates the DayGrid object this view might need. Draws from this.dayGridClass + instantiateDayGrid: function() { + var subclass = this.dayGridClass.extend(agendaDayGridMethods); + + return new subclass(this); + }, + + + /* Rendering + ------------------------------------------------------------------------------------------------------------------*/ + + + // Sets the display range and computes all necessary dates + setRange: function(range) { + View.prototype.setRange.call(this, range); // call the super-method + + this.timeGrid.setRange(range); + if (this.dayGrid) { + this.dayGrid.setRange(range); + } + }, + + + // Renders the view into `this.el`, which has already been assigned + renderDates: function() { + + this.el.addClass('fc-agenda-view').html(this.renderSkeletonHtml()); + this.renderHead(); + + this.scroller.render(); + var timeGridWrapEl = this.scroller.el.addClass('fc-time-grid-container'); + var timeGridEl = $('
                ').appendTo(timeGridWrapEl); + this.el.find('.fc-body > tr > td').append(timeGridWrapEl); + + this.timeGrid.setElement(timeGridEl); + this.timeGrid.renderDates(); + + // the
                that sometimes displays under the time-grid + this.bottomRuleEl = $('
                ') + .appendTo(this.timeGrid.el); // inject it into the time-grid + + if (this.dayGrid) { + this.dayGrid.setElement(this.el.find('.fc-day-grid')); + this.dayGrid.renderDates(); + + // have the day-grid extend it's coordinate area over the
                dividing the two grids + this.dayGrid.bottomCoordPadding = this.dayGrid.el.next('hr').outerHeight(); + } + + this.noScrollRowEls = this.el.find('.fc-row:not(.fc-scroller *)'); // fake rows not within the scroller + }, + + + // render the day-of-week headers + renderHead: function() { + this.headContainerEl = + this.el.find('.fc-head-container') + .html(this.timeGrid.renderHeadHtml()); + }, + + + // Unrenders the content of the view. Since we haven't separated skeleton rendering from date rendering, + // always completely kill each grid's rendering. + unrenderDates: function() { + this.timeGrid.unrenderDates(); + this.timeGrid.removeElement(); + + if (this.dayGrid) { + this.dayGrid.unrenderDates(); + this.dayGrid.removeElement(); + } + + this.scroller.destroy(); + }, + + + // Builds the HTML skeleton for the view. + // The day-grid and time-grid components will render inside containers defined by this HTML. + renderSkeletonHtml: function() { + return '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
                ' + + (this.dayGrid ? + '
                ' + + '
                ' : + '' + ) + + '
                '; + }, + + + // Generates an HTML attribute string for setting the width of the axis, if it is known + axisStyleAttr: function() { + if (this.axisWidth !== null) { + return 'style="width:' + this.axisWidth + 'px"'; + } + return ''; + }, + + + /* Business Hours + ------------------------------------------------------------------------------------------------------------------*/ + + + renderBusinessHours: function() { + this.timeGrid.renderBusinessHours(); + + if (this.dayGrid) { + this.dayGrid.renderBusinessHours(); + } + }, + + + unrenderBusinessHours: function() { + this.timeGrid.unrenderBusinessHours(); + + if (this.dayGrid) { + this.dayGrid.unrenderBusinessHours(); + } + }, + + + /* Now Indicator + ------------------------------------------------------------------------------------------------------------------*/ + + + getNowIndicatorUnit: function() { + return this.timeGrid.getNowIndicatorUnit(); + }, + + + renderNowIndicator: function(date) { + this.timeGrid.renderNowIndicator(date); + }, + + + unrenderNowIndicator: function() { + this.timeGrid.unrenderNowIndicator(); + }, + + + /* Dimensions + ------------------------------------------------------------------------------------------------------------------*/ + + + updateSize: function(isResize) { + this.timeGrid.updateSize(isResize); + + View.prototype.updateSize.call(this, isResize); // call the super-method + }, + + + // Refreshes the horizontal dimensions of the view + updateWidth: function() { + // make all axis cells line up, and record the width so newly created axis cells will have it + this.axisWidth = matchCellWidths(this.el.find('.fc-axis')); + }, + + + // Adjusts the vertical dimensions of the view to the specified values + setHeight: function(totalHeight, isAuto) { + var eventLimit; + var scrollerHeight; + var scrollbarWidths; + + // reset all dimensions back to the original state + this.bottomRuleEl.hide(); // .show() will be called later if this
                is necessary + this.scroller.clear(); // sets height to 'auto' and clears overflow + uncompensateScroll(this.noScrollRowEls); + + // limit number of events in the all-day area + if (this.dayGrid) { + this.dayGrid.removeSegPopover(); // kill the "more" popover if displayed + + eventLimit = this.opt('eventLimit'); + if (eventLimit && typeof eventLimit !== 'number') { + eventLimit = AGENDA_ALL_DAY_EVENT_LIMIT; // make sure "auto" goes to a real number + } + if (eventLimit) { + this.dayGrid.limitRows(eventLimit); + } + } + + if (!isAuto) { // should we force dimensions of the scroll container? + + scrollerHeight = this.computeScrollerHeight(totalHeight); + this.scroller.setHeight(scrollerHeight); + scrollbarWidths = this.scroller.getScrollbarWidths(); + + if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars? + + // make the all-day and header rows lines up + compensateScroll(this.noScrollRowEls, scrollbarWidths); + + // the scrollbar compensation might have changed text flow, which might affect height, so recalculate + // and reapply the desired height to the scroller. + scrollerHeight = this.computeScrollerHeight(totalHeight); + this.scroller.setHeight(scrollerHeight); + } + + // guarantees the same scrollbar widths + this.scroller.lockOverflow(scrollbarWidths); + + // if there's any space below the slats, show the horizontal rule. + // this won't cause any new overflow, because lockOverflow already called. + if (this.timeGrid.getTotalSlatHeight() < scrollerHeight) { + this.bottomRuleEl.show(); + } + } + }, + + + // given a desired total height of the view, returns what the height of the scroller should be + computeScrollerHeight: function(totalHeight) { + return totalHeight - + subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller + }, + + + /* Scroll + ------------------------------------------------------------------------------------------------------------------*/ + + + // Computes the initial pre-configured scroll state prior to allowing the user to change it + computeInitialScroll: function() { + var scrollTime = moment.duration(this.opt('scrollTime')); + var top = this.timeGrid.computeTimeTop(scrollTime); + + // zoom can give weird floating-point values. rather scroll a little bit further + top = Math.ceil(top); + + if (top) { + top++; // to overcome top border that slots beyond the first have. looks better + } + + return top; + }, + + + queryScroll: function() { + return this.scroller.getScrollTop(); + }, + + + setScroll: function(top) { + this.scroller.setScrollTop(top); + }, + + + /* Hit Areas + ------------------------------------------------------------------------------------------------------------------*/ + // forward all hit-related method calls to the grids (dayGrid might not be defined) + + + prepareHits: function() { + this.timeGrid.prepareHits(); + if (this.dayGrid) { + this.dayGrid.prepareHits(); + } + }, + + + releaseHits: function() { + this.timeGrid.releaseHits(); + if (this.dayGrid) { + this.dayGrid.releaseHits(); + } + }, + + + queryHit: function(left, top) { + var hit = this.timeGrid.queryHit(left, top); + + if (!hit && this.dayGrid) { + hit = this.dayGrid.queryHit(left, top); + } + + return hit; + }, + + + getHitSpan: function(hit) { + // TODO: hit.component is set as a hack to identify where the hit came from + return hit.component.getHitSpan(hit); + }, + + + getHitEl: function(hit) { + // TODO: hit.component is set as a hack to identify where the hit came from + return hit.component.getHitEl(hit); + }, + + + /* Events + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders events onto the view and populates the View's segment array + renderEvents: function(events) { + var dayEvents = []; + var timedEvents = []; + var daySegs = []; + var timedSegs; + var i; + + // separate the events into all-day and timed + for (i = 0; i < events.length; i++) { + if (events[i].allDay) { + dayEvents.push(events[i]); + } + else { + timedEvents.push(events[i]); + } + } + + // render the events in the subcomponents + timedSegs = this.timeGrid.renderEvents(timedEvents); + if (this.dayGrid) { + daySegs = this.dayGrid.renderEvents(dayEvents); + } + + // the all-day area is flexible and might have a lot of events, so shift the height + this.updateHeight(); + }, + + + // Retrieves all segment objects that are rendered in the view + getEventSegs: function() { + return this.timeGrid.getEventSegs().concat( + this.dayGrid ? this.dayGrid.getEventSegs() : [] + ); + }, + + + // Unrenders all event elements and clears internal segment data + unrenderEvents: function() { + + // unrender the events in the subcomponents + this.timeGrid.unrenderEvents(); + if (this.dayGrid) { + this.dayGrid.unrenderEvents(); + } + + // we DON'T need to call updateHeight() because: + // A) a renderEvents() call always happens after this, which will eventually call updateHeight() + // B) in IE8, this causes a flash whenever events are rerendered + }, + + + /* Dragging (for events and external elements) + ------------------------------------------------------------------------------------------------------------------*/ + + + // A returned value of `true` signals that a mock "helper" event has been rendered. + renderDrag: function(dropLocation, seg) { + if (dropLocation.start.hasTime()) { + return this.timeGrid.renderDrag(dropLocation, seg); + } + else if (this.dayGrid) { + return this.dayGrid.renderDrag(dropLocation, seg); + } + }, + + + unrenderDrag: function() { + this.timeGrid.unrenderDrag(); + if (this.dayGrid) { + this.dayGrid.unrenderDrag(); + } + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a selection + renderSelection: function(span) { + if (span.start.hasTime() || span.end.hasTime()) { + this.timeGrid.renderSelection(span); + } + else if (this.dayGrid) { + this.dayGrid.renderSelection(span); + } + }, + + + // Unrenders a visual indications of a selection + unrenderSelection: function() { + this.timeGrid.unrenderSelection(); + if (this.dayGrid) { + this.dayGrid.unrenderSelection(); + } + } + +}); + + +// Methods that will customize the rendering behavior of the AgendaView's timeGrid +// TODO: move into TimeGrid +var agendaTimeGridMethods = { + + + // Generates the HTML that will go before the day-of week header cells + renderHeadIntroHtml: function() { + var view = this.view; + var weekText; + + if (view.opt('weekNumbers')) { + weekText = this.start.format(view.opt('smallWeekFormat')); + + return '' + + '' + + '' + // needed for matchCellWidths + htmlEscape(weekText) + + '' + + ''; + } + else { + return ''; + } + }, + + + // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column. + renderBgIntroHtml: function() { + var view = this.view; + + return ''; + }, + + + // Generates the HTML that goes before all other types of cells. + // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid. + renderIntroHtml: function() { + var view = this.view; + + return ''; + } + +}; + + +// Methods that will customize the rendering behavior of the AgendaView's dayGrid +var agendaDayGridMethods = { + + + // Generates the HTML that goes before the all-day cells + renderBgIntroHtml: function() { + var view = this.view; + + return '' + + '' + + '' + // needed for matchCellWidths + (view.opt('allDayHtml') || htmlEscape(view.opt('allDayText'))) + + '' + + ''; + }, + + + // Generates the HTML that goes before all other types of cells. + // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid. + renderIntroHtml: function() { + var view = this.view; + + return ''; + } + +}; + +;; + +var AGENDA_ALL_DAY_EVENT_LIMIT = 5; + +// potential nice values for the slot-duration and interval-duration +// from largest to smallest +var AGENDA_STOCK_SUB_DURATIONS = [ + { hours: 1 }, + { minutes: 30 }, + { minutes: 15 }, + { seconds: 30 }, + { seconds: 15 } +]; + +fcViews.agenda = { + 'class': AgendaView, + defaults: { + allDaySlot: true, + allDayText: 'all-day', + slotDuration: '00:30:00', + minTime: '00:00:00', + maxTime: '24:00:00', + slotEventOverlap: true // a bad name. confused with overlap/constraint system + } +}; + +fcViews.agendaDay = { + type: 'agenda', + duration: { days: 1 } +}; + +fcViews.agendaWeek = { + type: 'agenda', + duration: { weeks: 1 } +}; +;; + +return FC; // export for Node/CommonJS +}); \ No newline at end of file diff --git a/assets/js/fullcalendar/fullcalendar.min.js b/assets/js/fullcalendar/fullcalendar.min.js new file mode 100644 index 0000000..f273802 --- /dev/null +++ b/assets/js/fullcalendar/fullcalendar.min.js @@ -0,0 +1,9 @@ +/*! + * FullCalendar v2.7.3 + * Docs & License: http://fullcalendar.io/ + * (c) 2016 Adam Shaw + */ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){function c(a){return W(a,Xa)}function d(b){var c,d={views:b.views||{}};return a.each(b,function(b,e){"views"!=b&&(a.isPlainObject(e)&&!/(time|duration|interval)$/i.test(b)&&-1==a.inArray(b,Xa)?(c=null,a.each(e,function(a,e){/^(month|week|day|default|basic(Week|Day)?|agenda(Week|Day)?)$/.test(a)?(d.views[a]||(d.views[a]={}),d.views[a][b]=e):(c||(c={}),c[a]=e)}),c&&(d[b]=c)):d[b]=e)}),d}function e(a,b){b.left&&a.css({"border-left-width":1,"margin-left":b.left-1}),b.right&&a.css({"border-right-width":1,"margin-right":b.right-1})}function f(a){a.css({"margin-left":"","margin-right":"","border-left-width":"","border-right-width":""})}function g(){a("body").addClass("fc-not-allowed")}function h(){a("body").removeClass("fc-not-allowed")}function i(b,c,d){var e=Math.floor(c/b.length),f=Math.floor(c-e*(b.length-1)),g=[],h=[],i=[],k=0;j(b),b.each(function(c,d){var j=c===b.length-1?f:e,l=a(d).outerHeight(!0);j>l?(g.push(d),h.push(l),i.push(a(d).height())):k+=l}),d&&(c-=k,e=Math.floor(c/g.length),f=Math.floor(c-e*(g.length-1))),a(g).each(function(b,c){var d=b===g.length-1?f:e,j=h[b],k=i[b],l=d-(j-k);d>j&&a(c).height(l)})}function j(a){a.height("")}function k(b){var c=0;return b.find("> span").each(function(b,d){var e=a(d).outerWidth();e>c&&(c=e)}),c++,b.width(c),c}function l(a,b){var c,d=a.add(b);return d.css({position:"relative",left:-1}),c=a.outerHeight()-b.outerHeight(),d.css({position:"",left:""}),c}function m(b){var c=b.css("position"),d=b.parents().filter(function(){var b=a(this);return/(auto|scroll)/.test(b.css("overflow")+b.css("overflow-y")+b.css("overflow-x"))}).eq(0);return"fixed"!==c&&d.length?d:a(b[0].ownerDocument||document)}function n(a,b){var c=a.offset(),d=c.left-(b?b.left:0),e=c.top-(b?b.top:0);return{left:d,right:d+a.outerWidth(),top:e,bottom:e+a.outerHeight()}}function o(a,b){var c=a.offset(),d=q(a),e=c.left+t(a,"border-left-width")+d.left-(b?b.left:0),f=c.top+t(a,"border-top-width")+d.top-(b?b.top:0);return{left:e,right:e+a[0].clientWidth,top:f,bottom:f+a[0].clientHeight}}function p(a,b){var c=a.offset(),d=c.left+t(a,"border-left-width")+t(a,"padding-left")-(b?b.left:0),e=c.top+t(a,"border-top-width")+t(a,"padding-top")-(b?b.top:0);return{left:d,right:d+a.width(),top:e,bottom:e+a.height()}}function q(a){var b=a.innerWidth()-a[0].clientWidth,c={left:0,right:0,top:0,bottom:a.innerHeight()-a[0].clientHeight};return r()&&"rtl"==a.css("direction")?c.left=b:c.right=b,c}function r(){return null===Ya&&(Ya=s()),Ya}function s(){var b=a("
                ").css({position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}).appendTo("body"),c=b.children(),d=c.offset().left>b.offset().left;return b.remove(),d}function t(a,b){return parseFloat(a.css(b))||0}function u(a){return 1==a.which&&!a.ctrlKey}function v(a){if(void 0!==a.pageX)return a.pageX;var b=a.originalEvent.touches;return b?b[0].pageX:void 0}function w(a){if(void 0!==a.pageY)return a.pageY;var b=a.originalEvent.touches;return b?b[0].pageY:void 0}function x(a){return/^touch/.test(a.type)}function y(a){a.addClass("fc-unselectable").on("selectstart",z)}function z(a){a.preventDefault()}function A(a){return window.addEventListener?(window.addEventListener("scroll",a,!0),!0):!1}function B(a){return window.removeEventListener?(window.removeEventListener("scroll",a,!0),!0):!1}function C(a,b){var c={left:Math.max(a.left,b.left),right:Math.min(a.right,b.right),top:Math.max(a.top,b.top),bottom:Math.min(a.bottom,b.bottom)};return c.lefti&&j>g?(g>=i?(c=g.clone(),e=!0):(c=i.clone(),e=!1),j>=h?(d=h.clone(),f=!0):(d=j.clone(),f=!1),{start:c,end:d,isStart:e,isEnd:f}):void 0}function L(a,c){return b.duration({days:a.clone().stripTime().diff(c.clone().stripTime(),"days"),ms:a.time()-c.time()})}function M(a,c){return b.duration({days:a.clone().stripTime().diff(c.clone().stripTime(),"days")})}function N(a,c,d){return b.duration(Math.round(a.diff(c,d,!0)),d)}function O(a,b){var c,d,e;for(c=0;c<$a.length&&(d=$a[c],e=P(d,a,b),!(e>=1&&ha(e)));c++);return d}function P(a,c,d){return null!=d?d.diff(c,a,!0):b.isDuration(c)?c.as(a):c.end.diff(c.start,a,!0)}function Q(a,b,c){var d;return T(c)?(b-a)/c:(d=c.asMonths(),Math.abs(d)>=1&&ha(d)?b.diff(a,"months",!0)/d:b.diff(a,"days",!0)/c.asDays())}function R(a,b){var c,d;return T(a)||T(b)?a/b:(c=a.asMonths(),d=b.asMonths(),Math.abs(c)>=1&&ha(c)&&Math.abs(d)>=1&&ha(d)?c/d:a.asDays()/b.asDays())}function S(a,c){var d;return T(a)?b.duration(a*c):(d=a.asMonths(),Math.abs(d)>=1&&ha(d)?b.duration({months:d*c}):b.duration({days:a.asDays()*c}))}function T(a){return Boolean(a.hours()||a.minutes()||a.seconds()||a.milliseconds())}function U(a){return"[object Date]"===Object.prototype.toString.call(a)||a instanceof Date}function V(a){return/^\d+\:\d+(?:\:\d+\.?(?:\d{3})?)?$/.test(a)}function W(a,b){var c,d,e,f,g,h,i={};if(b)for(c=0;c=0;f--)if(g=a[f][d],"object"==typeof g)e.unshift(g);else if(void 0!==g){i[d]=g;break}e.length&&(i[d]=W(e))}for(c=a.length-1;c>=0;c--){h=a[c];for(d in h)d in i||(i[d]=h[d])}return i}function X(a){var b=function(){};return b.prototype=a,new b}function Y(a,b){for(var c in a)$(a,c)&&(b[c]=a[c])}function Z(a,b){var c,d,e=["constructor","toString","valueOf"];for(c=0;c/g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"
                ")}function da(a){return a.replace(/&.*?;/g,"")}function ea(b){var c=[];return a.each(b,function(a,b){null!=b&&c.push(a+":"+b)}),c.join(";")}function fa(a){return a.charAt(0).toUpperCase()+a.slice(1)}function ga(a,b){return a-b}function ha(a){return a%1===0}function ia(a,b){var c=a[b];return function(){return c.apply(a,arguments)}}function ja(a,b,c){var d,e,f,g,h,i=function(){var j=+new Date-g;b>j?d=setTimeout(i,b-j):(d=null,c||(h=a.apply(f,e),f=e=null))};return function(){f=this,e=arguments,g=+new Date;var j=c&&!d;return d||(d=setTimeout(i,b)),j&&(h=a.apply(f,e),f=e=null),h}}function ka(c,d,e){var f,g,h,i,j=c[0],k=1==c.length&&"string"==typeof j;return b.isMoment(j)?(i=b.apply(null,c),ma(j,i)):U(j)||void 0===j?i=b.apply(null,c):(f=!1,g=!1,k?db.test(j)?(j+="-01",c=[j],f=!0,g=!0):(h=eb.exec(j))&&(f=!h[5],g=!0):a.isArray(j)&&(g=!0),i=d||f?b.utc.apply(b,c):b.apply(null,c),f?(i._ambigTime=!0,i._ambigZone=!0):e&&(g?i._ambigZone=!0:k&&(i.utcOffset?i.utcOffset(j):i.zone(j)))),i._fullCalendar=!0,i}function la(a,c){var d,e,f=!1,g=!1,h=a.length,i=[];for(d=0;h>d;d++)e=a[d],b.isMoment(e)||(e=Va.moment.parseZone(e)),f=f||e._ambigTime,g=g||e._ambigZone,i.push(e);for(d=0;h>d;d++)e=i[d],c||!f||e._ambigTime?g&&!e._ambigZone&&(i[d]=e.clone().stripZone()):i[d]=e.clone().stripTime();return i}function ma(a,b){a._ambigTime?b._ambigTime=!0:b._ambigTime&&(b._ambigTime=!1),a._ambigZone?b._ambigZone=!0:b._ambigZone&&(b._ambigZone=!1)}function na(a,b){a.year(b[0]||0).month(b[1]||0).date(b[2]||0).hours(b[3]||0).minutes(b[4]||0).seconds(b[5]||0).milliseconds(b[6]||0)}function oa(a,b){return gb.format.call(a,b)}function pa(a,b){return qa(a,va(b))}function qa(a,b){var c,d="";for(c=0;cg&&(f=ua(a,b,j,k,c[h]),f!==!1);h--)m=f+m;for(i=g;h>=i;i++)n+=ra(a,c[i]),o+=ra(b,c[i]);return(n||o)&&(p=e?o+d+n:n+d+o),l+p+m}function ua(a,b,c,d,e){var f,g;return"string"==typeof e?e:(f=e.token)&&(g=ib[f.charAt(0)],g&&c.isSame(d,g))?oa(a,f):!1}function va(a){return a in jb?jb[a]:jb[a]=wa(a)}function wa(a){for(var b,c=[],d=/\[([^\]]*)\]|\(([^\)]*)\)|(LTS|LT|(\w)\4*o?)|([^\w\[\(]+)/g;b=d.exec(a);)b[1]?c.push(b[1]):b[2]?c.push({maybe:wa(b[2])}):b[3]?c.push({token:b[3]}):b[5]&&c.push(b[5]);return c}function xa(){}function ya(a,b){var c;return $(b,"constructor")&&(c=b.constructor),"function"!=typeof c&&(c=b.constructor=function(){a.apply(this,arguments)}),c.prototype=X(a.prototype),Y(b,c.prototype),Z(b,c.prototype),Y(a,c),c}function za(a,b){Y(b,a.prototype)}function Aa(a,b){return a||b?a&&b?a.component===b.component&&Ba(a,b)&&Ba(b,a):!1:!0}function Ba(a,b){for(var c in a)if(!/^(component|left|right|top|bottom)$/.test(c)&&a[c]!==b[c])return!1;return!0}function Ca(a){var b=Ea(a);return"background"===b||"inverse-background"===b}function Da(a){return"inverse-background"===Ea(a)}function Ea(a){return ba((a.source||{}).rendering,a.rendering)}function Fa(a){var b,c,d={};for(b=0;b=a.leftCol)return!0;return!1}function Ja(a,b){return a.leftCol-b.leftCol}function Ka(a){var b,c,d,e=[];for(b=0;bb.top&&a.top").prependTo(c),R=N.header=new Sa(N,O),S=R.render(),S&&c.prepend(S),i(O.defaultView),O.handleWindowResize&&(Y=ja(m,O.windowResizeDelay),a(window).resize(Y))}function g(){V&&V.removeElement(),R.removeElement(),T.remove(),c.removeClass("fc fc-ltr fc-rtl fc-unthemed ui-widget"),Y&&a(window).unbind("resize",Y)}function h(){return c.is(":visible")}function i(b){ca++,V&&b&&V.type!==b&&(R.deactivateButton(V.type),H(),V.removeElement(),V=N.view=null),!V&&b&&(V=N.view=ba[b]||(ba[b]=N.instantiateView(b)),V.setElement(a("
                ").appendTo(T)),R.activateButton(b)),V&&(Z=V.massageCurrentDate(Z),V.displaying&&Z.isWithin(V.intervalStart,V.intervalEnd)||h()&&(V.display(Z),I(),u(),v(),q())),I(),ca--}function j(a){return h()?(a&&l(),ca++,V.updateSize(!0),ca--,!0):void 0}function k(){h()&&l()}function l(){W="number"==typeof O.contentHeight?O.contentHeight:"number"==typeof O.height?O.height-(S?S.outerHeight(!0):0):Math.round(T.width()/Math.max(O.aspectRatio,.5))}function m(a){!ca&&a.target===window&&V.start&&j(!0)&&V.trigger("windowResize",aa)}function n(){p(),r()}function o(){h()&&(H(),V.displayEvents(da),I())}function p(){H(),V.clearEvents(),I()}function q(){!O.lazyFetching||$(V.start,V.end)?r():o()}function r(){_(V.start,V.end)}function s(a){da=a,o()}function t(){o()}function u(){R.updateTitle(V.title)}function v(){var a=N.getNow();a.isWithin(V.intervalStart,V.intervalEnd)?R.disableButton("today"):R.enableButton("today")}function w(a,b){V.select(N.buildSelectSpan.apply(N,arguments))}function x(){V&&V.unselect()}function y(){Z=V.computePrevDate(Z),i()}function z(){Z=V.computeNextDate(Z),i()}function A(){Z.add(-1,"years"),i()}function B(){Z.add(1,"years"),i()}function C(){Z=N.getNow(),i()}function D(a){Z=N.moment(a).stripZone(),i()}function E(a){Z.add(b.duration(a)),i()}function F(a,b){var c;b=b||"day",c=N.getViewSpec(b)||N.getUnitViewSpec(b),Z=a.clone(),i(c?c.type:null)}function G(){return N.applyTimezone(Z)}function H(){T.css({width:"100%",height:T.height(),overflow:"hidden"})}function I(){T.css({width:"",height:"",overflow:""})}function J(){return N}function K(){return V}function L(a,b){return void 0===b?O[a]:void("height"!=a&&"contentHeight"!=a&&"aspectRatio"!=a||(O[a]=b,j(!0)))}function M(a,b){var c=Array.prototype.slice.call(arguments,2);return b=b||aa,this.triggerWith(a,b,c),O[a]?O[a].apply(b,c):void 0}var N=this;N.initOptions(d||{});var O=this.options;N.render=e,N.destroy=g,N.refetchEvents=n,N.reportEvents=s,N.reportEventChange=t,N.rerenderEvents=o,N.changeView=i,N.select=w,N.unselect=x,N.prev=y,N.next=z,N.prevYear=A,N.nextYear=B,N.today=C,N.gotoDate=D,N.incrementDate=E,N.zoomTo=F,N.getDate=G,N.getCalendar=J,N.getView=K,N.option=L,N.trigger=M;var P=X(Ra(O.lang));if(O.monthNames&&(P._months=O.monthNames),O.monthNamesShort&&(P._monthsShort=O.monthNamesShort),O.dayNames&&(P._weekdays=O.dayNames),O.dayNamesShort&&(P._weekdaysShort=O.dayNamesShort),null!=O.firstDay){var Q=X(P._week);Q.dow=O.firstDay,P._week=Q}P._fullCalendar_weekCalc=function(a){return"function"==typeof a?a:"local"===a?a:"iso"===a||"ISO"===a?"ISO":void 0}(O.weekNumberCalculation),N.defaultAllDayEventDuration=b.duration(O.defaultAllDayEventDuration),N.defaultTimedEventDuration=b.duration(O.defaultTimedEventDuration),N.moment=function(){var a;return"local"===O.timezone?(a=Va.moment.apply(null,arguments),a.hasTime()&&a.local()):a="UTC"===O.timezone?Va.moment.utc.apply(null,arguments):Va.moment.parseZone.apply(null,arguments),"_locale"in a?a._locale=P:a._lang=P,a},N.getIsAmbigTimezone=function(){return"local"!==O.timezone&&"UTC"!==O.timezone},N.applyTimezone=function(a){if(!a.hasTime())return a.clone();var b,c=N.moment(a.toArray()),d=a.time()-c.time();return d&&(b=c.clone().add(d),a.time()-b.time()===0&&(c=b)),c},N.getNow=function(){var a=O.now;return"function"==typeof a&&(a=a()),N.moment(a).stripZone()},N.getEventEnd=function(a){return a.end?a.end.clone():N.getDefaultEventEnd(a.allDay,a.start)},N.getDefaultEventEnd=function(a,b){var c=b.clone();return a?c.stripTime().add(N.defaultAllDayEventDuration):c.add(N.defaultTimedEventDuration),N.getIsAmbigTimezone()&&c.stripZone(),c},N.humanizeDuration=function(a){return(a.locale||a.lang).call(a,O.lang).humanize()},Ta.call(N,O);var R,S,T,U,V,W,Y,Z,$=N.isFetchNeeded,_=N.fetchEvents,aa=c[0],ba={},ca=0,da=[];Z=null!=O.defaultDate?N.moment(O.defaultDate).stripZone():N.getNow(),N.getSuggestedViewHeight=function(){return void 0===W&&k(),W},N.isHeightAuto=function(){return"auto"===O.contentHeight||"auto"===O.height},N.freezeContentHeight=H,N.unfreezeContentHeight=I,N.initialize()}function Qa(b){a.each(Cb,function(a,c){null==b[a]&&(b[a]=c(b))})}function Ra(a){var c=b.localeData||b.langData;return c.call(b,a)||c.call(b,"en")}function Sa(b,c){function d(){var b=c.header;return n=c.theme?"ui":"fc",b?o=a("
                ").append(f("left")).append(f("right")).append(f("center")).append('
                '):void 0}function e(){o.remove(),o=a()}function f(d){var e=a('
                '),f=c.header[d];return f&&a.each(f.split(" "),function(d){var f,g=a(),h=!0;a.each(this.split(","),function(d,e){var f,i,j,k,l,m,o,q,r,s;"title"==e?(g=g.add(a("

                 

                ")),h=!1):((f=(b.options.customButtons||{})[e])?(j=function(a){f.click&&f.click.call(s[0],a)},k="",l=f.text):(i=b.getViewSpec(e))?(j=function(){b.changeView(e)},p.push(e),k=i.buttonTextOverride,l=i.buttonTextDefault):b[e]&&(j=function(){b[e]()},k=(b.overrides.buttonText||{})[e],l=c.buttonText[e]),j&&(m=f?f.themeIcon:c.themeButtonIcons[e],o=f?f.icon:c.buttonIcons[e],q=k?ca(k):m&&c.theme?"":o&&!c.theme?"":ca(l),r=["fc-"+e+"-button",n+"-button",n+"-state-default"],s=a('").click(function(a){s.hasClass(n+"-state-disabled")||(j(a),(s.hasClass(n+"-state-active")||s.hasClass(n+"-state-disabled"))&&s.removeClass(n+"-state-hover"))}).mousedown(function(){s.not("."+n+"-state-active").not("."+n+"-state-disabled").addClass(n+"-state-down")}).mouseup(function(){s.removeClass(n+"-state-down")}).hover(function(){s.not("."+n+"-state-active").not("."+n+"-state-disabled").addClass(n+"-state-hover")},function(){s.removeClass(n+"-state-hover").removeClass(n+"-state-down")}),g=g.add(s)))}),h&&g.first().addClass(n+"-corner-left").end().last().addClass(n+"-corner-right").end(),g.length>1?(f=a("
                "),h&&f.addClass("fc-button-group"),f.append(g),e.append(f)):e.append(g)}),e}function g(a){o.find("h2").text(a)}function h(a){o.find(".fc-"+a+"-button").addClass(n+"-state-active")}function i(a){o.find(".fc-"+a+"-button").removeClass(n+"-state-active")}function j(a){o.find(".fc-"+a+"-button").attr("disabled","disabled").addClass(n+"-state-disabled")}function k(a){o.find(".fc-"+a+"-button").removeAttr("disabled").removeClass(n+"-state-disabled")}function l(){return p}var m=this;m.render=d,m.removeElement=e,m.updateTitle=g,m.activateButton=h,m.deactivateButton=i,m.disableButton=j,m.enableButton=k,m.getViewsWithButtons=l;var n,o=a(),p=[]}function Ta(c){function d(a,b){return!I||I>a||b>J}function e(a,b){I=a,J=b,S=[];var c=++Q,d=P.length;R=d;for(var e=0;d>e;e++)f(P[e],c)}function f(b,c){g(b,function(d){var e,f,g,h=a.isArray(b.events);if(c==Q){if(d)for(e=0;e=c&&b.end<=d}function G(a,b){var c=a.start.clone().stripZone(),d=H.getEventEnd(a).stripZone();return b.startc}var H=this;H.isFetchNeeded=d,H.fetchEvents=e,H.addEventSource=h,H.removeEventSource=j,H.updateEvent=m,H.renderEvent=p,H.removeEvents=q,H.clientEvents=r,H.mutateEvent=x,H.normalizeEventDates=u,H.normalizeEventTimes=v;var I,J,K=H.reportEvents,O={events:[]},P=[O],Q=0,R=0,S=[];a.each((c.events?[c.events]:[]).concat(c.eventSources||[]),function(a,b){var c=i(b);c&&P.push(c)}),H.getBusinessHoursEvents=z,H.isEventSpanAllowed=A,H.isExternalSpanAllowed=B,H.isSelectionSpanAllowed=C,H.getEventCache=function(){return S}}function Ua(a){a._allDay=a.allDay,a._start=a.start.clone(),a._end=a.end?a.end.clone():null}var Va=a.fullCalendar={version:"2.7.3",internalApiVersion:4},Wa=Va.views={};a.fn.fullCalendar=function(b){var c=Array.prototype.slice.call(arguments,1),d=this;return this.each(function(e,f){var g,h=a(f),i=h.data("fullCalendar");"string"==typeof b?i&&a.isFunction(i[b])&&(g=i[b].apply(i,c),e||(d=g),"destroy"===b&&h.removeData("fullCalendar")):i||(i=new yb(h,b),h.data("fullCalendar",i),i.render())}),d};var Xa=["header","buttonText","buttonIcons","themeButtonIcons"];Va.intersectRanges=K,Va.applyAll=aa,Va.debounce=ja,Va.isInt=ha,Va.htmlEscape=ca,Va.cssToStr=ea,Va.proxy=ia,Va.capitaliseFirstLetter=fa,Va.getOuterRect=n,Va.getClientRect=o,Va.getContentRect=p,Va.getScrollbarWidths=q;var Ya=null;Va.preventDefault=z,Va.intersectRects=C,Va.parseFieldSpecs=G,Va.compareByFieldSpecs=H,Va.compareByFieldSpec=I,Va.flexibleCompare=J,Va.computeIntervalUnit=O,Va.divideRangeByDuration=Q,Va.divideDurationByDuration=R,Va.multiplyDuration=S,Va.durationHasTime=T;var Za=["sun","mon","tue","wed","thu","fri","sat"],$a=["year","month","week","day","hour","minute","second","millisecond"];Va.log=function(){var a=window.console;return a&&a.log?a.log.apply(a,arguments):void 0},Va.warn=function(){var a=window.console;return a&&a.warn?a.warn.apply(a,arguments):Va.log.apply(Va,arguments)};var _a,ab,bb,cb={}.hasOwnProperty,db=/^\s*\d{4}-\d\d$/,eb=/^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/,fb=b.fn,gb=a.extend({},fb);Va.moment=function(){return ka(arguments)},Va.moment.utc=function(){var a=ka(arguments,!0);return a.hasTime()&&a.utc(),a},Va.moment.parseZone=function(){return ka(arguments,!0,!0)},fb.clone=function(){var a=gb.clone.apply(this,arguments);return ma(this,a),this._fullCalendar&&(a._fullCalendar=!0),a},fb.week=fb.weeks=function(a){var b=(this._locale||this._lang)._fullCalendar_weekCalc;return null==a&&"function"==typeof b?b(this):"ISO"===b?gb.isoWeek.apply(this,arguments):gb.week.apply(this,arguments)},fb.time=function(a){if(!this._fullCalendar)return gb.time.apply(this,arguments);if(null==a)return b.duration({hours:this.hours(),minutes:this.minutes(),seconds:this.seconds(),milliseconds:this.milliseconds()});this._ambigTime=!1,b.isDuration(a)||b.isMoment(a)||(a=b.duration(a));var c=0;return b.isDuration(a)&&(c=24*Math.floor(a.asDays())),this.hours(c+a.hours()).minutes(a.minutes()).seconds(a.seconds()).milliseconds(a.milliseconds())},fb.stripTime=function(){var a;return this._ambigTime||(a=this.toArray(),this.utc(),ab(this,a.slice(0,3)),this._ambigTime=!0,this._ambigZone=!0),this},fb.hasTime=function(){return!this._ambigTime},fb.stripZone=function(){var a,b;return this._ambigZone||(a=this.toArray(),b=this._ambigTime,this.utc(),ab(this,a),this._ambigTime=b||!1,this._ambigZone=!0),this},fb.hasZone=function(){return!this._ambigZone},fb.local=function(){var a=this.toArray(),b=this._ambigZone;return gb.local.apply(this,arguments),this._ambigTime=!1,this._ambigZone=!1,b&&bb(this,a),this},fb.utc=function(){return gb.utc.apply(this,arguments),this._ambigTime=!1,this._ambigZone=!1,this},a.each(["zone","utcOffset"],function(a,b){gb[b]&&(fb[b]=function(a){return null!=a&&(this._ambigTime=!1,this._ambigZone=!1),gb[b].apply(this,arguments)})}),fb.format=function(){return this._fullCalendar&&arguments[0]?pa(this,arguments[0]):this._ambigTime?oa(this,"YYYY-MM-DD"):this._ambigZone?oa(this,"YYYY-MM-DD[T]HH:mm:ss"):gb.format.apply(this,arguments)},fb.toISOString=function(){return this._ambigTime?oa(this,"YYYY-MM-DD"):this._ambigZone?oa(this,"YYYY-MM-DD[T]HH:mm:ss"):gb.toISOString.apply(this,arguments)},fb.isWithin=function(a,b){var c=la([this,a,b]);return c[0]>=c[1]&&c[0]a;a++)b=arguments[a],c-1>a&&za(this,b);return ya(this,b||{})},xa.mixin=function(a){za(this,a)};var kb=Va.EmitterMixin={on:function(b,c){var d=function(a,b){return c.apply(b.context||this,b.args||[])};return c.guid||(c.guid=a.guid++),d.guid=c.guid,a(this).on(b,d),this},off:function(b,c){return a(this).off(b,c),this},trigger:function(b){var c=Array.prototype.slice.call(arguments,1);return a(this).triggerHandler(b,{args:c}),this},triggerWith:function(b,c,d){return a(this).triggerHandler(b,{context:c,args:d}),this}},lb=Va.ListenerMixin=function(){var b=0,c={listenerId:null,listenTo:function(b,c,d){if("object"==typeof c)for(var e in c)c.hasOwnProperty(e)&&this.listenTo(b,e,c[e]);else"string"==typeof c&&b.on(c+"."+this.getListenerNamespace(),a.proxy(d,this))},stopListeningTo:function(a,b){a.off((b||"")+"."+this.getListenerNamespace())},getListenerNamespace:function(){return null==this.listenerId&&(this.listenerId=b++),"_listener"+this.listenerId}};return c}(),mb={isIgnoringMouse:!1,delayUnignoreMouse:null,initMouseIgnoring:function(a){this.delayUnignoreMouse=ja(ia(this,"unignoreMouse"),a||1e3)},tempIgnoreMouse:function(){this.isIgnoringMouse=!0,this.delayUnignoreMouse()},unignoreMouse:function(){this.isIgnoringMouse=!1; +}},nb=xa.extend(lb,{isHidden:!0,options:null,el:null,margin:10,constructor:function(a){this.options=a||{}},show:function(){this.isHidden&&(this.el||this.render(),this.el.show(),this.position(),this.isHidden=!1,this.trigger("show"))},hide:function(){this.isHidden||(this.el.hide(),this.isHidden=!0,this.trigger("hide"))},render:function(){var b=this,c=this.options;this.el=a('
                ').addClass(c.className||"").css({top:0,left:0}).append(c.content).appendTo(c.parentEl),this.el.on("click",".fc-close",function(){b.hide()}),c.autoHide&&this.listenTo(a(document),"mousedown",this.documentMousedown)},documentMousedown:function(b){this.el&&!a(b.target).closest(this.el).length&&this.hide()},removeElement:function(){this.hide(),this.el&&(this.el.remove(),this.el=null),this.stopListeningTo(a(document),"mousedown")},position:function(){var b,c,d,e,f,g=this.options,h=this.el.offsetParent().offset(),i=this.el.outerWidth(),j=this.el.outerHeight(),k=a(window),l=m(this.el);e=g.top||0,f=void 0!==g.left?g.left:void 0!==g.right?g.right-i:0,l.is(window)||l.is(document)?(l=k,b=0,c=0):(d=l.offset(),b=d.top,c=d.left),b+=k.scrollTop(),c+=k.scrollLeft(),g.viewportConstrain!==!1&&(e=Math.min(e,b+l.outerHeight()-j-this.margin),e=Math.max(e,b+this.margin),f=Math.min(f,c+l.outerWidth()-i-this.margin),f=Math.max(f,c+this.margin)),this.el.css({top:e-h.top,left:f-h.left})},trigger:function(a){this.options[a]&&this.options[a].apply(this,Array.prototype.slice.call(arguments,1))}}),ob=Va.CoordCache=xa.extend({els:null,forcedOffsetParentEl:null,origin:null,boundingRect:null,isHorizontal:!1,isVertical:!1,lefts:null,rights:null,tops:null,bottoms:null,constructor:function(b){this.els=a(b.els),this.isHorizontal=b.isHorizontal,this.isVertical=b.isVertical,this.forcedOffsetParentEl=b.offsetParent?a(b.offsetParent):null},build:function(){var a=this.forcedOffsetParentEl||this.els.eq(0).offsetParent();this.origin=a.offset(),this.boundingRect=this.queryBoundingRect(),this.isHorizontal&&this.buildElHorizontals(),this.isVertical&&this.buildElVerticals()},clear:function(){this.origin=null,this.boundingRect=null,this.lefts=null,this.rights=null,this.tops=null,this.bottoms=null},ensureBuilt:function(){this.origin||this.build()},queryBoundingRect:function(){var a=m(this.els.eq(0));return a.is(document)?void 0:o(a)},buildElHorizontals:function(){var b=[],c=[];this.els.each(function(d,e){var f=a(e),g=f.offset().left,h=f.outerWidth();b.push(g),c.push(g+h)}),this.lefts=b,this.rights=c},buildElVerticals:function(){var b=[],c=[];this.els.each(function(d,e){var f=a(e),g=f.offset().top,h=f.outerHeight();b.push(g),c.push(g+h)}),this.tops=b,this.bottoms=c},getHorizontalIndex:function(a){this.ensureBuilt();var b,c=this.boundingRect,d=this.lefts,e=this.rights,f=d.length;if(!c||a>=c.left&&ab;b++)if(a>=d[b]&&a=c.top&&ab;b++)if(a>=d[b]&&a=e*e&&this.handleDistanceSurpassed(a)),this.isDragging&&this.handleDrag(c,d,a)},handleDrag:function(a,b,c){this.trigger("drag",a,b,c),this.updateAutoScroll(c)},endDrag:function(a){this.isDragging&&(this.isDragging=!1,this.handleDragEnd(a))},handleDragEnd:function(a){this.trigger("dragEnd",a),this.destroyHrefHack()},startDelay:function(a){var b=this;this.delay?this.delayTimeoutId=setTimeout(function(){b.handleDelayEnd(a)},this.delay):this.handleDelayEnd(a)},handleDelayEnd:function(a){this.isDelayEnded=!0,this.isDistanceSurpassed&&this.startDrag(a)},handleDistanceSurpassed:function(a){this.isDistanceSurpassed=!0,this.isDelayEnded&&this.startDrag(a)},handleTouchMove:function(a){this.isDragging&&a.preventDefault(),this.handleMove(a)},handleMouseMove:function(a){this.handleMove(a)},handleTouchScroll:function(a){this.isDragging||this.endInteraction(a,!0)},initHrefHack:function(){var a=this.subjectEl;(this.subjectHref=a?a.attr("href"):null)&&a.removeAttr("href")},destroyHrefHack:function(){var a=this.subjectEl,b=this.subjectHref;setTimeout(function(){b&&a.attr("href",b)},0)},trigger:function(a){this.options[a]&&this.options[a].apply(this,Array.prototype.slice.call(arguments,1)),this["_"+a]&&this["_"+a].apply(this,Array.prototype.slice.call(arguments,1))}});pb.mixin({isAutoScroll:!1,scrollBounds:null,scrollTopVel:null,scrollLeftVel:null,scrollIntervalId:null,scrollSensitivity:30,scrollSpeed:200,scrollIntervalMs:50,initAutoScroll:function(){var a=this.scrollEl;this.isAutoScroll=this.options.scroll&&a&&!a.is(window)&&!a.is(document),this.isAutoScroll&&this.listenTo(a,"scroll",ja(this.handleDebouncedScroll,100))},destroyAutoScroll:function(){this.endAutoScroll(),this.isAutoScroll&&this.stopListeningTo(this.scrollEl,"scroll")},computeScrollBounds:function(){this.isAutoScroll&&(this.scrollBounds=n(this.scrollEl))},updateAutoScroll:function(a){var b,c,d,e,f=this.scrollSensitivity,g=this.scrollBounds,h=0,i=0;g&&(b=(f-(w(a)-g.top))/f,c=(f-(g.bottom-w(a)))/f,d=(f-(v(a)-g.left))/f,e=(f-(g.right-v(a)))/f,b>=0&&1>=b?h=b*this.scrollSpeed*-1:c>=0&&1>=c&&(h=c*this.scrollSpeed),d>=0&&1>=d?i=d*this.scrollSpeed*-1:e>=0&&1>=e&&(i=e*this.scrollSpeed)),this.setScrollVel(h,i)},setScrollVel:function(a,b){this.scrollTopVel=a,this.scrollLeftVel=b,this.constrainScrollVel(),!this.scrollTopVel&&!this.scrollLeftVel||this.scrollIntervalId||(this.scrollIntervalId=setInterval(ia(this,"scrollIntervalFunc"),this.scrollIntervalMs))},constrainScrollVel:function(){var a=this.scrollEl;this.scrollTopVel<0?a.scrollTop()<=0&&(this.scrollTopVel=0):this.scrollTopVel>0&&a.scrollTop()+a[0].clientHeight>=a[0].scrollHeight&&(this.scrollTopVel=0),this.scrollLeftVel<0?a.scrollLeft()<=0&&(this.scrollLeftVel=0):this.scrollLeftVel>0&&a.scrollLeft()+a[0].clientWidth>=a[0].scrollWidth&&(this.scrollLeftVel=0)},scrollIntervalFunc:function(){var a=this.scrollEl,b=this.scrollIntervalMs/1e3;this.scrollTopVel&&a.scrollTop(a.scrollTop()+this.scrollTopVel*b),this.scrollLeftVel&&a.scrollLeft(a.scrollLeft()+this.scrollLeftVel*b),this.constrainScrollVel(),this.scrollTopVel||this.scrollLeftVel||this.endAutoScroll()},endAutoScroll:function(){this.scrollIntervalId&&(clearInterval(this.scrollIntervalId),this.scrollIntervalId=null,this.handleScrollEnd())},handleDebouncedScroll:function(){this.scrollIntervalId||this.handleScrollEnd()},handleScrollEnd:function(){}});var qb=pb.extend({component:null,origHit:null,hit:null,coordAdjust:null,constructor:function(a,b){pb.call(this,b),this.component=a},handleInteractionStart:function(a){var b,c,d,e=this.subjectEl;this.computeCoords(),a?(c={left:v(a),top:w(a)},d=c,e&&(b=n(e),d=D(d,b)),this.origHit=this.queryHit(d.left,d.top),e&&this.options.subjectCenter&&(this.origHit&&(b=C(this.origHit,b)||b),d=E(b)),this.coordAdjust=F(d,c)):(this.origHit=null,this.coordAdjust=null),pb.prototype.handleInteractionStart.apply(this,arguments)},computeCoords:function(){this.component.prepareHits(),this.computeScrollBounds()},handleDragStart:function(a){var b;pb.prototype.handleDragStart.apply(this,arguments),b=this.queryHit(v(a),w(a)),b&&this.handleHitOver(b)},handleDrag:function(a,b,c){var d;pb.prototype.handleDrag.apply(this,arguments),d=this.queryHit(v(c),w(c)),Aa(d,this.hit)||(this.hit&&this.handleHitOut(),d&&this.handleHitOver(d))},handleDragEnd:function(){this.handleHitDone(),pb.prototype.handleDragEnd.apply(this,arguments)},handleHitOver:function(a){var b=Aa(a,this.origHit);this.hit=a,this.trigger("hitOver",this.hit,b,this.origHit)},handleHitOut:function(){this.hit&&(this.trigger("hitOut",this.hit),this.handleHitDone(),this.hit=null)},handleHitDone:function(){this.hit&&this.trigger("hitDone",this.hit)},handleInteractionEnd:function(){pb.prototype.handleInteractionEnd.apply(this,arguments),this.origHit=null,this.hit=null,this.component.releaseHits()},handleScrollEnd:function(){pb.prototype.handleScrollEnd.apply(this,arguments),this.computeCoords()},queryHit:function(a,b){return this.coordAdjust&&(a+=this.coordAdjust.left,b+=this.coordAdjust.top),this.component.queryHit(a,b)}}),rb=xa.extend(lb,{options:null,sourceEl:null,el:null,parentEl:null,top0:null,left0:null,y0:null,x0:null,topDelta:null,leftDelta:null,isFollowing:!1,isHidden:!1,isAnimating:!1,constructor:function(b,c){this.options=c=c||{},this.sourceEl=b,this.parentEl=c.parentEl?a(c.parentEl):b.parent()},start:function(b){this.isFollowing||(this.isFollowing=!0,this.y0=w(b),this.x0=v(b),this.topDelta=0,this.leftDelta=0,this.isHidden||this.updatePosition(),x(b)?this.listenTo(a(document),"touchmove",this.handleMove):this.listenTo(a(document),"mousemove",this.handleMove))},stop:function(b,c){function d(){this.isAnimating=!1,e.removeElement(),this.top0=this.left0=null,c&&c()}var e=this,f=this.options.revertDuration;this.isFollowing&&!this.isAnimating&&(this.isFollowing=!1,this.stopListeningTo(a(document)),b&&f&&!this.isHidden?(this.isAnimating=!0,this.el.animate({top:this.top0,left:this.left0},{duration:f,complete:d})):d())},getEl:function(){var a=this.el;return a||(this.sourceEl.width(),a=this.el=this.sourceEl.clone().addClass(this.options.additionalClass||"").css({position:"absolute",visibility:"",display:this.isHidden?"none":"",margin:0,right:"auto",bottom:"auto",width:this.sourceEl.width(),height:this.sourceEl.height(),opacity:this.options.opacity||"",zIndex:this.options.zIndex}),a.addClass("fc-unselectable"),a.appendTo(this.parentEl)),a},removeElement:function(){this.el&&(this.el.remove(),this.el=null)},updatePosition:function(){var a,b;this.getEl(),null===this.top0&&(this.sourceEl.width(),a=this.sourceEl.offset(),b=this.el.offsetParent().offset(),this.top0=a.top-b.top,this.left0=a.left-b.left),this.el.css({top:this.top0+this.topDelta,left:this.left0+this.leftDelta})},handleMove:function(a){this.topDelta=w(a)-this.y0,this.leftDelta=v(a)-this.x0,this.isHidden||this.updatePosition()},hide:function(){this.isHidden||(this.isHidden=!0,this.el&&this.el.hide())},show:function(){this.isHidden&&(this.isHidden=!1,this.updatePosition(),this.getEl().show())}}),sb=Va.Grid=xa.extend(lb,mb,{view:null,isRTL:null,start:null,end:null,el:null,elsByFill:null,eventTimeFormat:null,displayEventTime:null,displayEventEnd:null,minResizeDuration:null,largeUnit:null,dayDragListener:null,segDragListener:null,segResizeListener:null,externalDragListener:null,constructor:function(a){this.view=a,this.isRTL=a.opt("isRTL"),this.elsByFill={},this.dayDragListener=this.buildDayDragListener(),this.initMouseIgnoring()},computeEventTimeFormat:function(){return this.view.opt("smallTimeFormat")},computeDisplayEventTime:function(){return!0},computeDisplayEventEnd:function(){return!0},setRange:function(a){this.start=a.start.clone(),this.end=a.end.clone(),this.rangeUpdated(),this.processRangeOptions()},rangeUpdated:function(){},processRangeOptions:function(){var a,b,c=this.view;this.eventTimeFormat=c.opt("eventTimeFormat")||c.opt("timeFormat")||this.computeEventTimeFormat(),a=c.opt("displayEventTime"),null==a&&(a=this.computeDisplayEventTime()),b=c.opt("displayEventEnd"),null==b&&(b=this.computeDisplayEventEnd()),this.displayEventTime=a,this.displayEventEnd=b},spanToSegs:function(a){},diffDates:function(a,b){return this.largeUnit?N(a,b,this.largeUnit):L(a,b)},prepareHits:function(){},releaseHits:function(){},queryHit:function(a,b){},getHitSpan:function(a){},getHitEl:function(a){},setElement:function(a){this.el=a,y(a),this.bindDayHandler("touchstart",this.dayTouchStart),this.bindDayHandler("mousedown",this.dayMousedown),this.bindSegHandlers(),this.bindGlobalHandlers()},bindDayHandler:function(b,c){var d=this;this.el.on(b,function(b){return a(b.target).is(".fc-event-container *, .fc-more")||a(b.target).closest(".fc-popover").length?void 0:c.call(d,b)})},removeElement:function(){this.unbindGlobalHandlers(),this.clearDragListeners(),this.el.remove()},renderSkeleton:function(){},renderDates:function(){},unrenderDates:function(){},bindGlobalHandlers:function(){this.listenTo(a(document),{dragstart:this.externalDragStart,sortstart:this.externalDragStart})},unbindGlobalHandlers:function(){this.stopListeningTo(a(document))},dayMousedown:function(a){this.isIgnoringMouse||this.dayDragListener.startInteraction(a,{})},dayTouchStart:function(a){var b=this.view;(b.isSelected||b.selectedEvent)&&this.tempIgnoreMouse(),this.dayDragListener.startInteraction(a,{delay:this.view.opt("longPressDelay")})},buildDayDragListener:function(){var a,b,c=this,d=this.view,e=d.opt("selectable"),f=new qb(this,{scroll:d.opt("dragScroll"),interactionStart:function(){a=f.origHit},dragStart:function(){d.unselect()},hitOver:function(d,f,h){h&&(f||(a=null),e&&(b=c.computeSelection(c.getHitSpan(h),c.getHitSpan(d)),b?c.renderSelection(b):b===!1&&g()))},hitOut:function(){a=null,b=null,c.unrenderSelection(),h()},interactionEnd:function(e,f){f||(a&&!c.isIgnoringMouse&&d.triggerDayClick(c.getHitSpan(a),c.getHitEl(a),e),b&&d.reportSelection(b,e),h())}});return f},clearDragListeners:function(){this.dayDragListener.endInteraction(),this.segDragListener&&this.segDragListener.endInteraction(),this.segResizeListener&&this.segResizeListener.endInteraction(),this.externalDragListener&&this.externalDragListener.endInteraction()},renderEventLocationHelper:function(a,b){var c=this.fabricateHelperEvent(a,b);return this.renderHelper(c,b)},fabricateHelperEvent:function(a,b){var c=b?X(b.event):{};return c.start=a.start.clone(),c.end=a.end?a.end.clone():null,c.allDay=null,this.view.calendar.normalizeEventDates(c),c.className=(c.className||[]).concat("fc-helper"),b||(c.editable=!1),c},renderHelper:function(a,b){},unrenderHelper:function(){},renderSelection:function(a){this.renderHighlight(a)},unrenderSelection:function(){this.unrenderHighlight()},computeSelection:function(a,b){var c=this.computeSelectionSpan(a,b);return c&&!this.view.calendar.isSelectionSpanAllowed(c)?!1:c},computeSelectionSpan:function(a,b){var c=[a.start,a.end,b.start,b.end];return c.sort(ga),{start:c[0].clone(),end:c[3].clone()}},renderHighlight:function(a){this.renderFill("highlight",this.spanToSegs(a))},unrenderHighlight:function(){this.unrenderFill("highlight")},highlightSegClasses:function(){return["fc-highlight"]},renderBusinessHours:function(){},unrenderBusinessHours:function(){},getNowIndicatorUnit:function(){},renderNowIndicator:function(a){},unrenderNowIndicator:function(){},renderFill:function(a,b){},unrenderFill:function(a){var b=this.elsByFill[a];b&&(b.remove(),delete this.elsByFill[a])},renderFillSegEls:function(b,c){var d,e=this,f=this[b+"SegEl"],g="",h=[];if(c.length){for(d=0;d"},getDayClasses:function(a){var b=this.view,c=b.calendar.getNow(),d=["fc-"+Za[a.day()]];return 1==b.intervalDuration.as("months")&&a.month()!=b.intervalStart.month()&&d.push("fc-other-month"),a.isSame(c,"day")?d.push("fc-today",b.highlightStateClass):c>a?d.push("fc-past"):d.push("fc-future"),d}});sb.mixin({mousedOverSeg:null,isDraggingSeg:!1,isResizingSeg:!1,isDraggingExternal:!1,segs:null,renderEvents:function(a){var b,c=[],d=[];for(b=0;b *",function(b){var e=a(this).data("fc-seg");return!e||d.isDraggingSeg||d.isResizingSeg?void 0:c.call(d,e,b)})},handleSegClick:function(a,b){return this.view.trigger("eventClick",a.el[0],a.event,b)},handleSegMouseover:function(a,b){this.isIgnoringMouse||this.mousedOverSeg||(this.mousedOverSeg=a,a.el.addClass("fc-allow-mouse-resize"),this.view.trigger("eventMouseover",a.el[0],a.event,b))},handleSegMouseout:function(a,b){b=b||{},this.mousedOverSeg&&(a=a||this.mousedOverSeg,this.mousedOverSeg=null,a.el.removeClass("fc-allow-mouse-resize"),this.view.trigger("eventMouseout",a.el[0],a.event,b))},handleSegMousedown:function(a,b){var c=this.startSegResize(a,b,{distance:5});!c&&this.view.isEventDraggable(a.event)&&this.buildSegDragListener(a).startInteraction(b,{distance:5})},handleSegTouchStart:function(a,b){var c,d=this.view,e=a.event,f=d.isEventSelected(e),g=d.isEventDraggable(e),h=d.isEventResizable(e),i=!1;f&&h&&(i=this.startSegResize(a,b)),i||!g&&!h||(c=g?this.buildSegDragListener(a):this.buildSegSelectListener(a),c.startInteraction(b,{delay:f?0:this.view.opt("longPressDelay")})),this.tempIgnoreMouse()},handleSegTouchEnd:function(a,b){this.tempIgnoreMouse()},startSegResize:function(b,c,d){return a(c.target).is(".fc-resizer")?(this.buildSegResizeListener(b,a(c.target).is(".fc-start-resizer")).startInteraction(c,d),!0):!1},buildSegDragListener:function(a){var b,c,d,e=this,f=this.view,i=f.calendar,j=a.el,k=a.event;if(this.segDragListener)return this.segDragListener;var l=this.segDragListener=new qb(f,{scroll:f.opt("dragScroll"),subjectEl:j,subjectCenter:!0,interactionStart:function(d){b=!1,c=new rb(a.el,{additionalClass:"fc-dragging",parentEl:f.el,opacity:l.isTouch?null:f.opt("dragOpacity"),revertDuration:f.opt("dragRevertDuration"),zIndex:2}),c.hide(),c.start(d)},dragStart:function(c){l.isTouch&&!f.isEventSelected(k)&&f.selectEvent(k),b=!0,e.handleSegMouseout(a,c),e.segDragStart(a,c),f.hideEvent(k)},hitOver:function(b,h,j){var m;a.hit&&(j=a.hit),d=e.computeEventDrop(j.component.getHitSpan(j),b.component.getHitSpan(b),k),d&&!i.isEventSpanAllowed(e.eventToSpan(d),k)&&(g(),d=null),d&&(m=f.renderDrag(d,a))?(m.addClass("fc-dragging"),l.isTouch||e.applyDragOpacity(m),c.hide()):c.show(),h&&(d=null)},hitOut:function(){f.unrenderDrag(),c.show(),d=null},hitDone:function(){h()},interactionEnd:function(g){c.stop(!d,function(){b&&(f.unrenderDrag(),f.showEvent(k),e.segDragStop(a,g)),d&&f.reportEventDrop(k,d,this.largeUnit,j,g)}),e.segDragListener=null}});return l},buildSegSelectListener:function(a){var b=this,c=this.view,d=a.event;if(this.segDragListener)return this.segDragListener;var e=this.segDragListener=new pb({dragStart:function(a){e.isTouch&&!c.isEventSelected(d)&&c.selectEvent(d)},interactionEnd:function(a){b.segDragListener=null}});return e},segDragStart:function(a,b){this.isDraggingSeg=!0,this.view.trigger("eventDragStart",a.el[0],a.event,b,{})},segDragStop:function(a,b){this.isDraggingSeg=!1,this.view.trigger("eventDragStop",a.el[0],a.event,b,{})},computeEventDrop:function(a,b,c){var d,e,f=this.view.calendar,g=a.start,h=b.start;return g.hasTime()===h.hasTime()?(d=this.diffDates(h,g),c.allDay&&T(d)?(e={start:c.start.clone(),end:f.getEventEnd(c),allDay:!1},f.normalizeEventTimes(e)):e={start:c.start.clone(),end:c.end?c.end.clone():null,allDay:c.allDay},e.start.add(d),e.end&&e.end.add(d)):e={start:h.clone(),end:null,allDay:!h.hasTime()},e},applyDragOpacity:function(a){var b=this.view.opt("dragOpacity");null!=b&&a.each(function(a,c){c.style.opacity=b})},externalDragStart:function(b,c){var d,e,f=this.view;f.opt("droppable")&&(d=a((c?c.item:null)||b.target),e=f.opt("dropAccept"),(a.isFunction(e)?e.call(d[0],d):d.is(e))&&(this.isDraggingExternal||this.listenToExternalDrag(d,b,c)))},listenToExternalDrag:function(a,b,c){var d,e=this,f=this.view.calendar,i=Ha(a),j=e.externalDragListener=new qb(this,{interactionStart:function(){e.isDraggingExternal=!0},hitOver:function(a){d=e.computeExternalDrop(a.component.getHitSpan(a),i),d&&!f.isExternalSpanAllowed(e.eventToSpan(d),d,i.eventProps)&&(g(),d=null),d&&e.renderDrag(d)},hitOut:function(){d=null},hitDone:function(){h(),e.unrenderDrag()},interactionEnd:function(b){d&&e.view.reportExternalDrop(i,d,a,b,c),e.isDraggingExternal=!1,e.externalDragListener=null}});j.startDrag(b)},computeExternalDrop:function(a,b){var c=this.view.calendar,d={start:c.applyTimezone(a.start),end:null};return b.startTime&&!d.start.hasTime()&&d.start.time(b.startTime),b.duration&&(d.end=d.start.clone().add(b.duration)),d},renderDrag:function(a,b){},unrenderDrag:function(){},buildSegResizeListener:function(a,b){var c,d,e=this,f=this.view,i=f.calendar,j=a.el,k=a.event,l=i.getEventEnd(k),m=this.segResizeListener=new qb(this,{scroll:f.opt("dragScroll"),subjectEl:j,interactionStart:function(){c=!1},dragStart:function(b){c=!0,e.handleSegMouseout(a,b),e.segResizeStart(a,b)},hitOver:function(c,h,j){var m=e.getHitSpan(j),n=e.getHitSpan(c);d=b?e.computeEventStartResize(m,n,k):e.computeEventEndResize(m,n,k),d&&(i.isEventSpanAllowed(e.eventToSpan(d),k)?d.start.isSame(k.start)&&d.end.isSame(l)&&(d=null):(g(),d=null)),d&&(f.hideEvent(k),e.renderEventResize(d,a))},hitOut:function(){d=null},hitDone:function(){e.unrenderEventResize(),f.showEvent(k),h()},interactionEnd:function(b){c&&e.segResizeStop(a,b),d&&f.reportEventResize(k,d,this.largeUnit,j,b),e.segResizeListener=null}});return m},segResizeStart:function(a,b){this.isResizingSeg=!0,this.view.trigger("eventResizeStart",a.el[0],a.event,b,{})},segResizeStop:function(a,b){this.isResizingSeg=!1,this.view.trigger("eventResizeStop",a.el[0],a.event,b,{})},computeEventStartResize:function(a,b,c){return this.computeEventResize("start",a,b,c)},computeEventEndResize:function(a,b,c){return this.computeEventResize("end",a,b,c)},computeEventResize:function(a,b,c,d){var e,f,g=this.view.calendar,h=this.diffDates(c[a],b[a]);return e={start:d.start.clone(),end:g.getEventEnd(d),allDay:d.allDay},e.allDay&&T(h)&&(e.allDay=!1,g.normalizeEventTimes(e)),e[a].add(h),e.start.isBefore(e.end)||(f=this.minResizeDuration||(d.allDay?g.defaultAllDayEventDuration:g.defaultTimedEventDuration),"start"==a?e.start=e.end.clone().subtract(f):e.end=e.start.clone().add(f)),e},renderEventResize:function(a,b){},unrenderEventResize:function(){},getEventTimeText:function(a,b,c){return null==b&&(b=this.eventTimeFormat),null==c&&(c=this.displayEventEnd),this.displayEventTime&&a.start.hasTime()?c&&a.end?this.view.formatRange(a,b):a.start.format(b):""},getSegClasses:function(a,b,c){var d=this.view,e=a.event,f=["fc-event",a.isStart?"fc-start":"fc-not-start",a.isEnd?"fc-end":"fc-not-end"].concat(e.className,e.source?e.source.className:[]);return b&&f.push("fc-draggable"),c&&f.push("fc-resizable"),d.isEventSelected(e)&&f.push("fc-selected"),f},getSegSkinCss:function(a){var b=a.event,c=this.view,d=b.source||{},e=b.color,f=d.color,g=c.opt("eventColor");return{"background-color":b.backgroundColor||e||d.backgroundColor||f||c.opt("eventBackgroundColor")||g,"border-color":b.borderColor||e||d.borderColor||f||c.opt("eventBorderColor")||g,color:b.textColor||d.textColor||c.opt("eventTextColor")}},eventToSegs:function(a){return this.eventsToSegs([a])},eventToSpan:function(a){return this.eventToSpans(a)[0]},eventToSpans:function(a){var b=this.eventToRange(a);return this.eventRangeToSpans(b,a)},eventsToSegs:function(b,c){var d=this,e=Fa(b),f=[];return a.each(e,function(a,b){var e,g=[];for(e=0;eh&&g.push({start:h,end:c.start}),h=c.end;return f>h&&g.push({start:h,end:f}),g},sortEventSegs:function(a){a.sort(ia(this,"compareEventSegs"))},compareEventSegs:function(a,b){return a.eventStartMS-b.eventStartMS||b.eventDurationMS-a.eventDurationMS||b.event.allDay-a.event.allDay||H(a.event,b.event,this.view.eventOrderSpecs)}}),Va.isBgEvent=Ca,Va.dataAttrPrefix="";var tb=Va.DayTableMixin={breakOnWeeks:!1,dayDates:null,dayIndices:null,daysPerRow:null,rowCnt:null,colCnt:null,colHeadFormat:null,updateDayTable:function(){for(var a,b,c,d=this.view,e=this.start.clone(),f=-1,g=[],h=[];e.isBefore(this.end);)d.isHiddenDay(e)?g.push(f+.5):(f++,g.push(f),h.push(e.clone())),e.add(1,"days");if(this.breakOnWeeks){for(b=h[0].day(),a=1;ac?b[0]-1:c>=b.length?b[b.length-1]+1:b[c]},computeColHeadFormat:function(){return this.rowCnt>1||this.colCnt>10?"ddd":this.colCnt>1?this.view.opt("dayOfMonthFormat"):"dddd"},sliceRangeByRow:function(a){var b,c,d,e,f,g=this.daysPerRow,h=this.view.computeDayRange(a),i=this.getDateDayIndex(h.start),j=this.getDateDayIndex(h.end.clone().subtract(1,"days")),k=[];for(b=0;b=e&&k.push({row:b,firstRowDayIndex:e-c,lastRowDayIndex:f-c,isStart:e===i,isEnd:f===j});return k},sliceRangeByDay:function(a){var b,c,d,e,f,g,h=this.daysPerRow,i=this.view.computeDayRange(a),j=this.getDateDayIndex(i.start),k=this.getDateDayIndex(i.end.clone().subtract(1,"days")),l=[];for(b=0;b=e;e++)f=Math.max(j,e),g=Math.min(k,e),f=Math.ceil(f),g=Math.floor(g),g>=f&&l.push({row:b,firstRowDayIndex:f-c,lastRowDayIndex:g-c,isStart:f===j,isEnd:g===k});return l},renderHeadHtml:function(){var a=this.view;return'
                '+this.renderHeadTrHtml()+"
                "},renderHeadIntroHtml:function(){return this.renderIntroHtml()},renderHeadTrHtml:function(){return""+(this.isRTL?"":this.renderHeadIntroHtml())+this.renderHeadDateCellsHtml()+(this.isRTL?this.renderHeadIntroHtml():"")+""},renderHeadDateCellsHtml:function(){var a,b,c=[];for(a=0;a1?' colspan="'+b+'"':"")+(c?" "+c:"")+">"+ca(a.format(this.colHeadFormat))+""},renderBgTrHtml:function(a){return""+(this.isRTL?"":this.renderBgIntroHtml(a))+this.renderBgCellsHtml(a)+(this.isRTL?this.renderBgIntroHtml(a):"")+""; +},renderBgIntroHtml:function(a){return this.renderIntroHtml()},renderBgCellsHtml:function(a){var b,c,d=[];for(b=0;b"},renderIntroHtml:function(){},bookendCells:function(a){var b=this.renderIntroHtml();b&&(this.isRTL?a.append(b):a.prepend(b))}},ub=Va.DayGrid=sb.extend(tb,{numbersVisible:!1,bottomCoordPadding:0,rowEls:null,cellEls:null,helperEls:null,rowCoordCache:null,colCoordCache:null,renderDates:function(a){var b,c,d=this.view,e=this.rowCnt,f=this.colCnt,g="";for(b=0;e>b;b++)g+=this.renderDayRowHtml(b,a);for(this.el.html(g),this.rowEls=this.el.find(".fc-row"),this.cellEls=this.el.find(".fc-day"),this.rowCoordCache=new ob({els:this.rowEls,isVertical:!0}),this.colCoordCache=new ob({els:this.cellEls.slice(0,this.colCnt),isHorizontal:!0}),b=0;e>b;b++)for(c=0;f>c;c++)d.trigger("dayRender",null,this.getCellDate(b,c),this.getCellEl(b,c))},unrenderDates:function(){this.removeSegPopover()},renderBusinessHours:function(){var a=this.view.calendar.getBusinessHoursEvents(!0),b=this.eventsToSegs(a);this.renderFill("businessHours",b,"bgevent")},renderDayRowHtml:function(a,b){var c=this.view,d=["fc-row","fc-week",c.widgetContentClass];return b&&d.push("fc-rigid"),'
                '+this.renderBgTrHtml(a)+'
                '+(this.numbersVisible?""+this.renderNumberTrHtml(a)+"":"")+"
                "},renderNumberTrHtml:function(a){return""+(this.isRTL?"":this.renderNumberIntroHtml(a))+this.renderNumberCellsHtml(a)+(this.isRTL?this.renderNumberIntroHtml(a):"")+""},renderNumberIntroHtml:function(a){return this.renderIntroHtml()},renderNumberCellsHtml:function(a){var b,c,d=[];for(b=0;b'+a.date()+""):""},computeEventTimeFormat:function(){return this.view.opt("extraSmallTimeFormat")},computeDisplayEventEnd:function(){return 1==this.colCnt},rangeUpdated:function(){this.updateDayTable()},spanToSegs:function(a){var b,c,d=this.sliceRangeByRow(a);for(b=0;b');g=c&&c.row===b?c.el.position().top:h.find(".fc-content-skeleton tbody").position().top,i.css("top",g).find("table").append(d[b].tbodyEl),h.append(i),e.push(i[0])}),this.helperEls=a(e)},unrenderHelper:function(){this.helperEls&&(this.helperEls.remove(),this.helperEls=null)},fillSegTag:"td",renderFill:function(b,c,d){var e,f,g,h=[];for(c=this.renderFillSegEls(b,c),e=0;e
                '),f=e.find("tr"),h>0&&f.append(''),f.append(c.el.attr("colspan",i-h)),g>i&&f.append(''),this.bookendCells(f),e}});ub.mixin({rowStructs:null,unrenderEvents:function(){this.removeSegPopover(),sb.prototype.unrenderEvents.apply(this,arguments)},getEventSegs:function(){return sb.prototype.getEventSegs.call(this).concat(this.popoverSegs||[])},renderBgSegs:function(b){var c=a.grep(b,function(a){return a.event.allDay});return sb.prototype.renderBgSegs.call(this,c)},renderFgSegs:function(b){var c;return b=this.renderFgSegEls(b),c=this.rowStructs=this.renderSegRows(b),this.rowEls.each(function(b,d){a(d).find(".fc-content-skeleton > table").append(c[b].tbodyEl)}),b},unrenderFgSegs:function(){for(var a,b=this.rowStructs||[];a=b.pop();)a.tbodyEl.remove();this.rowStructs=null},renderSegRows:function(a){var b,c,d=[];for(b=this.groupSegRows(a),c=0;c'+ca(c)+"")),d=''+(ca(f.title||"")||" ")+"",'
                '+(this.isRTL?d+" "+l:l+" "+d)+"
                "+(h?'
                ':"")+(i?'
                ':"")+""},renderSegRow:function(b,c){function d(b){for(;b>g;)k=(r[e-1]||[])[g],k?k.attr("rowspan",parseInt(k.attr("rowspan")||1,10)+1):(k=a(""),h.append(k)),q[e][g]=k,r[e][g]=k,g++}var e,f,g,h,i,j,k,l=this.colCnt,m=this.buildSegLevels(c),n=Math.max(1,m.length),o=a(""),p=[],q=[],r=[];for(e=0;n>e;e++){if(f=m[e],g=0,h=a(""),p.push([]),q.push([]),r.push([]),f)for(i=0;i').append(j.el),j.leftCol!=j.rightCol?k.attr("colspan",j.rightCol-j.leftCol+1):r[e][g]=k;g<=j.rightCol;)q[e][g]=k,p[e][g]=j,g++;h.append(k)}d(l),this.bookendCells(h),o.append(h)}return{row:b,tbodyEl:o,cellMatrix:q,segMatrix:p,segLevels:m,segs:c}},buildSegLevels:function(a){var b,c,d,e=[];for(this.sortEventSegs(a),b=0;b td > :first-child").each(c),e.position().top+f>h)return d;return!1},limitRow:function(b,c){function d(d){for(;d>w;)j=t.getCellSegs(b,w,c),j.length&&(m=f[c-1][w],s=t.renderMoreLink(b,w,j),r=a("
                ").append(s),m.append(r),v.push(r[0])),w++}var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t=this,u=this.rowStructs[b],v=[],w=0;if(c&&c').attr("rowspan",n),j=l[p],s=this.renderMoreLink(b,i.leftCol+p,[i].concat(j)),r=a("
                ").append(s),q.append(r),o.push(q[0]),v.push(q[0]);m.addClass("fc-limited").after(a(o)),g.push(m[0])}}d(this.colCnt),u.moreEls=a(v),u.limitedEls=a(g)}},unlimitRow:function(a){var b=this.rowStructs[a];b.moreEls&&(b.moreEls.remove(),b.moreEls=null),b.limitedEls&&(b.limitedEls.removeClass("fc-limited"),b.limitedEls=null)},renderMoreLink:function(b,c,d){var e=this,f=this.view;return a('').text(this.getMoreLinkText(d.length)).on("click",function(g){var h=f.opt("eventLimitClick"),i=e.getCellDate(b,c),j=a(this),k=e.getCellEl(b,c),l=e.getCellSegs(b,c),m=e.resliceDaySegs(l,i),n=e.resliceDaySegs(d,i);"function"==typeof h&&(h=f.trigger("eventLimitClick",null,{date:i,dayEl:k,moreEl:j,segs:m,hiddenSegs:n},g)),"popover"===h?e.showSegPopover(b,c,j,m):"string"==typeof h&&f.calendar.zoomTo(i,h)})},showSegPopover:function(a,b,c,d){var e,f,g=this,h=this.view,i=c.parent();e=1==this.rowCnt?h.el:this.rowEls.eq(a),f={className:"fc-more-popover",content:this.renderSegPopoverContent(a,b,d),parentEl:this.el,top:e.offset().top,autoHide:!0,viewportConstrain:h.opt("popoverViewportConstrain"),hide:function(){g.segPopover.removeElement(),g.segPopover=null,g.popoverSegs=null}},this.isRTL?f.right=i.offset().left+i.outerWidth()+1:f.left=i.offset().left-1,this.segPopover=new nb(f),this.segPopover.show()},renderSegPopoverContent:function(b,c,d){var e,f=this.view,g=f.opt("theme"),h=this.getCellDate(b,c).format(f.opt("dayPopoverFormat")),i=a('
                '+ca(h)+'
                '),j=i.find(".fc-event-container");for(d=this.renderFgSegEls(d,!0),this.popoverSegs=d,e=0;e'+this.renderBgTrHtml(0)+'
                '+this.renderSlatRowHtml()+"
                "},renderSlatRowHtml:function(){for(var a,c,d,e=this.view,f=this.isRTL,g="",h=b.duration(+this.minTime);h"+(c?""+ca(a.format(this.labelFormat))+"":"")+"",g+='"+(f?"":d)+''+(f?d:"")+"",h.add(this.slotDuration);return g},processOptions:function(){var c,d=this.view,e=d.opt("slotDuration"),f=d.opt("snapDuration");e=b.duration(e),f=f?b.duration(f):e,this.slotDuration=e,this.snapDuration=f,this.snapsPerSlot=e/f,this.minResizeDuration=f,this.minTime=b.duration(d.opt("minTime")),this.maxTime=b.duration(d.opt("maxTime")),c=d.opt("slotLabelFormat"),a.isArray(c)&&(c=c[c.length-1]),this.labelFormat=c||d.opt("axisFormat")||d.opt("smallTimeFormat"),c=d.opt("slotLabelInterval"),this.labelInterval=c?b.duration(c):this.computeLabelInterval(e)},computeLabelInterval:function(a){var c,d,e;for(c=Mb.length-1;c>=0;c--)if(d=b.duration(Mb[c]),e=R(d,a),ha(e)&&e>1)return d;return b.duration(a)},computeEventTimeFormat:function(){return this.view.opt("noMeridiemTimeFormat")},computeDisplayEventEnd:function(){return!0},prepareHits:function(){this.colCoordCache.build(),this.slatCoordCache.build()},releaseHits:function(){this.colCoordCache.clear()},queryHit:function(a,b){var c=this.snapsPerSlot,d=this.colCoordCache,e=this.slatCoordCache,f=d.getHorizontalIndex(a),g=e.getVerticalIndex(b);if(null!=f&&null!=g){var h=e.getTopOffset(g),i=e.getHeight(g),j=(b-h)/i,k=Math.floor(j*c),l=g*c+k,m=h+k/c*i,n=h+(k+1)/c*i;return{col:f,snap:l,component:this,left:d.getLeftOffset(f),right:d.getRightOffset(f),top:m,bottom:n}}},getHitSpan:function(a){var b,c=this.getCellDate(0,a.col),d=this.computeSnapTime(a.snap);return c.time(d),b=c.clone().add(this.snapDuration),{start:c,end:b}},getHitEl:function(a){return this.colEls.eq(a.col)},rangeUpdated:function(){this.updateDayTable()},computeSnapTime:function(a){return b.duration(this.minTime+this.snapDuration*a)},spanToSegs:function(a){var b,c=this.sliceRangeByTimes(a);for(b=0;b
                ').css("top",e).appendTo(this.colContainerEls.eq(d[c].col))[0]);d.length>0&&f.push(a('
                ').css("top",e).appendTo(this.el.find(".fc-content-skeleton"))[0]),this.nowIndicatorEls=a(f)},unrenderNowIndicator:function(){this.nowIndicatorEls&&(this.nowIndicatorEls.remove(),this.nowIndicatorEls=null)},renderSelection:function(a){this.view.opt("selectHelper")?this.renderEventLocationHelper(a):this.renderHighlight(a)},unrenderSelection:function(){this.unrenderHelper(),this.unrenderHighlight()},renderHighlight:function(a){this.renderHighlightSegs(this.spanToSegs(a))},unrenderHighlight:function(){this.unrenderHighlightSegs()}});vb.mixin({colContainerEls:null,fgContainerEls:null,bgContainerEls:null,helperContainerEls:null,highlightContainerEls:null,businessContainerEls:null,fgSegs:null,bgSegs:null,helperSegs:null,highlightSegs:null,businessSegs:null,renderContentSkeleton:function(){var b,c,d="";for(b=0;b
                ';c=a('
                '+d+"
                "),this.colContainerEls=c.find(".fc-content-col"),this.helperContainerEls=c.find(".fc-helper-container"),this.fgContainerEls=c.find(".fc-event-container:not(.fc-helper-container)"),this.bgContainerEls=c.find(".fc-bgevent-container"),this.highlightContainerEls=c.find(".fc-highlight-container"),this.businessContainerEls=c.find(".fc-business-container"),this.bookendCells(c.find("tr")),this.el.append(c)},renderFgSegs:function(a){return a=this.renderFgSegsIntoContainers(a,this.fgContainerEls),this.fgSegs=a,a},unrenderFgSegs:function(){this.unrenderNamedSegs("fgSegs")},renderHelperSegs:function(b,c){var d,e,f,g=[];for(b=this.renderFgSegsIntoContainers(b,this.helperContainerEls),d=0;d
                '+(c?'
                '+ca(c)+"
                ":"")+(g.title?'
                '+ca(g.title)+"
                ":"")+'
                '+(j?'
                ':"")+""},updateSegVerticals:function(a){this.computeSegVerticals(a),this.assignSegVerticals(a)},computeSegVerticals:function(a){var b,c;for(b=0;b1?"ll":"LL"},formatRange:function(a,b,c){var d=a.end;return d.hasTime()||(d=d.clone().subtract(1)),sa(a.start,d,b,c,this.opt("isRTL"))},setElement:function(a){this.el=a,this.bindGlobalHandlers()},removeElement:function(){this.clear(),this.isSkeletonRendered&&(this.unrenderSkeleton(),this.isSkeletonRendered=!1),this.unbindGlobalHandlers(),this.el.remove()},display:function(b){var c=this,d=null;return this.displaying&&(d=this.queryScroll()),this.calendar.freezeContentHeight(),this.clear().then(function(){return c.displaying=a.when(c.displayView(b)).then(function(){c.forceScroll(c.computeInitialScroll(d)),c.calendar.unfreezeContentHeight(),c.triggerRender()})})},clear:function(){var b=this,c=this.displaying;return c?c.then(function(){return b.displaying=null,b.clearEvents(),b.clearView()}):a.when()},displayView:function(a){this.isSkeletonRendered||(this.renderSkeleton(),this.isSkeletonRendered=!0),a&&this.setDate(a),this.render&&this.render(),this.renderDates(),this.updateSize(),this.renderBusinessHours(),this.startNowIndicator()},clearView:function(){this.unselect(),this.stopNowIndicator(),this.triggerUnrender(),this.unrenderBusinessHours(),this.unrenderDates(),this.destroy&&this.destroy()},renderSkeleton:function(){},unrenderSkeleton:function(){},renderDates:function(){},unrenderDates:function(){},triggerRender:function(){this.trigger("viewRender",this,this,this.el)},triggerUnrender:function(){this.trigger("viewDestroy",this,this,this.el)},bindGlobalHandlers:function(){this.listenTo(a(document),"mousedown",this.handleDocumentMousedown),this.listenTo(a(document),"touchstart",this.processUnselect)},unbindGlobalHandlers:function(){this.stopListeningTo(a(document))},initThemingProps:function(){var a=this.opt("theme")?"ui":"fc";this.widgetHeaderClass=a+"-widget-header",this.widgetContentClass=a+"-widget-content",this.highlightStateClass=a+"-state-highlight"},renderBusinessHours:function(){},unrenderBusinessHours:function(){},startNowIndicator:function(){var a,c,d,e=this;this.opt("nowIndicator")&&(a=this.getNowIndicatorUnit(),a&&(c=ia(this,"updateNowIndicator"),this.initialNowDate=this.calendar.getNow(),this.initialNowQueriedMs=+new Date,this.renderNowIndicator(this.initialNowDate),this.isNowIndicatorRendered=!0,d=this.initialNowDate.clone().startOf(a).add(1,a)-this.initialNowDate,this.nowIndicatorTimeoutID=setTimeout(function(){e.nowIndicatorTimeoutID=null,c(),d=+b.duration(1,a),d=Math.max(100,d),e.nowIndicatorIntervalID=setInterval(c,d)},d)))},updateNowIndicator:function(){this.isNowIndicatorRendered&&(this.unrenderNowIndicator(),this.renderNowIndicator(this.initialNowDate.clone().add(new Date-this.initialNowQueriedMs)))},stopNowIndicator:function(){this.isNowIndicatorRendered&&(this.nowIndicatorTimeoutID&&(clearTimeout(this.nowIndicatorTimeoutID),this.nowIndicatorTimeoutID=null),this.nowIndicatorIntervalID&&(clearTimeout(this.nowIndicatorIntervalID),this.nowIndicatorIntervalID=null),this.unrenderNowIndicator(),this.isNowIndicatorRendered=!1)},getNowIndicatorUnit:function(){},renderNowIndicator:function(a){},unrenderNowIndicator:function(){},updateSize:function(a){var b;a&&(b=this.queryScroll()),this.updateHeight(a),this.updateWidth(a),this.updateNowIndicator(),a&&this.setScroll(b)},updateWidth:function(a){},updateHeight:function(a){var b=this.calendar;this.setHeight(b.getSuggestedViewHeight(),b.isHeightAuto())},setHeight:function(a,b){},computeInitialScroll:function(a){return 0},queryScroll:function(){},setScroll:function(a){},forceScroll:function(a){var b=this;this.setScroll(a),setTimeout(function(){b.setScroll(a)},0)},displayEvents:function(a){var b=this.queryScroll();this.clearEvents(),this.renderEvents(a),this.isEventsRendered=!0,this.setScroll(b),this.triggerEventRender()},clearEvents:function(){var a;this.isEventsRendered&&(a=this.queryScroll(),this.triggerEventUnrender(),this.destroyEvents&&this.destroyEvents(),this.unrenderEvents(),this.setScroll(a),this.isEventsRendered=!1)},renderEvents:function(a){},unrenderEvents:function(){},triggerEventRender:function(){this.renderedEventSegEach(function(a){this.trigger("eventAfterRender",a.event,a.event,a.el)}),this.trigger("eventAfterAllRender")},triggerEventUnrender:function(){this.renderedEventSegEach(function(a){this.trigger("eventDestroy",a.event,a.event,a.el)})},resolveEventEl:function(b,c){var d=this.trigger("eventRender",b,b,c);return d===!1?c=null:d&&d!==!0&&(c=a(d)),c},showEvent:function(a){this.renderedEventSegEach(function(a){a.el.css("visibility","")},a)},hideEvent:function(a){this.renderedEventSegEach(function(a){a.el.css("visibility","hidden")},a)},renderedEventSegEach:function(a,b){var c,d=this.getEventSegs();for(c=0;cb;b++)(d[b]=-1!==a.inArray(b,c))||e++;if(!e)throw"invalid hiddenDays";this.isHiddenDayHash=d},isHiddenDay:function(a){return b.isMoment(a)&&(a=a.day()),this.isHiddenDayHash[a]},skipHiddenDays:function(a,b,c){var d=a.clone();for(b=b||1;this.isHiddenDayHash[(d.day()+(c?b:0)+7)%7];)d.add(b,"days");return d},computeDayRange:function(a){var b,c=a.start.clone().stripTime(),d=a.end,e=null;return d&&(e=d.clone().stripTime(),b=+d.time(),b&&b>=this.nextDayThreshold&&e.add(1,"days")),(!d||c>=e)&&(e=c.clone().add(1,"days")),{start:c,end:e}},isMultiDayEvent:function(a){var b=this.computeDayRange(a);return b.end.diff(b.start,"days")>1}}),xb=Va.Scroller=xa.extend({el:null,scrollEl:null,overflowX:null,overflowY:null,constructor:function(a){a=a||{},this.overflowX=a.overflowX||a.overflow||"auto",this.overflowY=a.overflowY||a.overflow||"auto"},render:function(){this.el=this.renderEl(),this.applyOverflow()},renderEl:function(){return this.scrollEl=a('
                ')},clear:function(){this.setHeight("auto"),this.applyOverflow()},destroy:function(){this.el.remove()},applyOverflow:function(){this.scrollEl.css({"overflow-x":this.overflowX,"overflow-y":this.overflowY})},lockOverflow:function(a){var b=this.overflowX,c=this.overflowY;a=a||this.getScrollbarWidths(),"auto"===b&&(b=a.top||a.bottom||this.scrollEl[0].scrollWidth-1>this.scrollEl[0].clientWidth?"scroll":"hidden"),"auto"===c&&(c=a.left||a.right||this.scrollEl[0].scrollHeight-1>this.scrollEl[0].clientHeight?"scroll":"hidden"),this.scrollEl.css({"overflow-x":b,"overflow-y":c})},setHeight:function(a){this.scrollEl.height(a)},getScrollTop:function(){return this.scrollEl.scrollTop()},setScrollTop:function(a){this.scrollEl.scrollTop(a)},getClientWidth:function(){return this.scrollEl[0].clientWidth},getClientHeight:function(){return this.scrollEl[0].clientHeight},getScrollbarWidths:function(){return q(this.scrollEl)}}),yb=Va.Calendar=xa.extend({dirDefaults:null,langDefaults:null,overrides:null,options:null,viewSpecCache:null,view:null,header:null,loadingLevel:0,constructor:Pa,initialize:function(){},initOptions:function(a){var b,e,f,g;a=d(a),b=a.lang,e=zb[b],e||(b=yb.defaults.lang,e=zb[b]||{}),f=ba(a.isRTL,e.isRTL,yb.defaults.isRTL),g=f?yb.rtlDefaults:{},this.dirDefaults=g,this.langDefaults=e,this.overrides=a,this.options=c([yb.defaults,g,e,a]),Qa(this.options),this.viewSpecCache={}},getViewSpec:function(a){var b=this.viewSpecCache;return b[a]||(b[a]=this.buildViewSpec(a))},getUnitViewSpec:function(b){var c,d,e;if(-1!=a.inArray(b,$a))for(c=this.header.getViewsWithButtons(),a.each(Va.views,function(a){c.push(a)}),d=0;d1,this.weekNumbersVisible=this.opt("weekNumbers"),this.dayGrid.numbersVisible=this.dayNumbersVisible||this.weekNumbersVisible,this.el.addClass("fc-basic-view").html(this.renderSkeletonHtml()),this.renderHead(),this.scroller.render();var b=this.scroller.el.addClass("fc-day-grid-container"),c=a('
                ').appendTo(b);this.el.find(".fc-body > tr > td").append(b),this.dayGrid.setElement(c),this.dayGrid.renderDates(this.hasRigidRows())},renderHead:function(){this.headContainerEl=this.el.find(".fc-head-container").html(this.dayGrid.renderHeadHtml()),this.headRowEl=this.headContainerEl.find(".fc-row")},unrenderDates:function(){this.dayGrid.unrenderDates(),this.dayGrid.removeElement(),this.scroller.destroy()},renderBusinessHours:function(){this.dayGrid.renderBusinessHours()},renderSkeletonHtml:function(){return'
                '},weekNumberStyleAttr:function(){return null!==this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},hasRigidRows:function(){var a=this.opt("eventLimit");return a&&"number"!=typeof a},updateWidth:function(){this.weekNumbersVisible&&(this.weekNumberWidth=k(this.el.find(".fc-week-number")))},setHeight:function(a,b){var c,d,g=this.opt("eventLimit");this.scroller.clear(),f(this.headRowEl),this.dayGrid.removeSegPopover(),g&&"number"==typeof g&&this.dayGrid.limitRows(g),c=this.computeScrollerHeight(a),this.setGridHeight(c,b),g&&"number"!=typeof g&&this.dayGrid.limitRows(g),b||(this.scroller.setHeight(c),d=this.scroller.getScrollbarWidths(),(d.left||d.right)&&(e(this.headRowEl,d),c=this.computeScrollerHeight(a),this.scroller.setHeight(c)),this.scroller.lockOverflow(d))},computeScrollerHeight:function(a){return a-l(this.el,this.scroller.el)},setGridHeight:function(a,b){b?j(this.dayGrid.rowEls):i(this.dayGrid.rowEls,a,!0)},queryScroll:function(){return this.scroller.getScrollTop()},setScroll:function(a){this.scroller.setScrollTop(a)},prepareHits:function(){this.dayGrid.prepareHits()},releaseHits:function(){this.dayGrid.releaseHits()},queryHit:function(a,b){return this.dayGrid.queryHit(a,b)},getHitSpan:function(a){return this.dayGrid.getHitSpan(a)},getHitEl:function(a){return this.dayGrid.getHitEl(a)},renderEvents:function(a){this.dayGrid.renderEvents(a),this.updateHeight()},getEventSegs:function(){return this.dayGrid.getEventSegs()},unrenderEvents:function(){this.dayGrid.unrenderEvents()},renderDrag:function(a,b){return this.dayGrid.renderDrag(a,b)},unrenderDrag:function(){this.dayGrid.unrenderDrag()},renderSelection:function(a){this.dayGrid.renderSelection(a)},unrenderSelection:function(){this.dayGrid.unrenderSelection()}}),Gb={renderHeadIntroHtml:function(){var a=this.view;return a.weekNumbersVisible?'"+ca(a.opt("weekNumberTitle"))+"":""},renderNumberIntroHtml:function(a){var b=this.view;return b.weekNumbersVisible?'"+this.getCellDate(a,0).format("w")+"":""},renderBgIntroHtml:function(){var a=this.view;return a.weekNumbersVisible?'":""},renderIntroHtml:function(){var a=this.view;return a.weekNumbersVisible?'":""}},Hb=Va.MonthView=Fb.extend({computeRange:function(a){var b,c=Fb.prototype.computeRange.call(this,a);return this.isFixedWeeks()&&(b=Math.ceil(c.end.diff(c.start,"weeks",!0)),c.end.add(6-b,"weeks")),c},setGridHeight:function(a,b){b=b||"variable"===this.opt("weekMode"),b&&(a*=this.rowCnt/6),i(this.dayGrid.rowEls,a,!b)},isFixedWeeks:function(){var a=this.opt("weekMode");return a?"fixed"===a:this.opt("fixedWeekCount")}});Wa.basic={"class":Fb},Wa.basicDay={type:"basic",duration:{days:1}},Wa.basicWeek={type:"basic",duration:{weeks:1}},Wa.month={"class":Hb,duration:{months:1},defaults:{fixedWeekCount:!0}};var Ib=Va.AgendaView=wb.extend({scroller:null,timeGridClass:vb,timeGrid:null,dayGridClass:ub,dayGrid:null,axisWidth:null,headContainerEl:null,noScrollRowEls:null,bottomRuleEl:null,initialize:function(){this.timeGrid=this.instantiateTimeGrid(),this.opt("allDaySlot")&&(this.dayGrid=this.instantiateDayGrid()),this.scroller=new xb({overflowX:"hidden",overflowY:"auto"})},instantiateTimeGrid:function(){var a=this.timeGridClass.extend(Jb);return new a(this)},instantiateDayGrid:function(){var a=this.dayGridClass.extend(Kb);return new a(this)},setRange:function(a){wb.prototype.setRange.call(this,a),this.timeGrid.setRange(a),this.dayGrid&&this.dayGrid.setRange(a)},renderDates:function(){this.el.addClass("fc-agenda-view").html(this.renderSkeletonHtml()),this.renderHead(),this.scroller.render();var b=this.scroller.el.addClass("fc-time-grid-container"),c=a('
                ').appendTo(b);this.el.find(".fc-body > tr > td").append(b),this.timeGrid.setElement(c),this.timeGrid.renderDates(),this.bottomRuleEl=a('
                ').appendTo(this.timeGrid.el),this.dayGrid&&(this.dayGrid.setElement(this.el.find(".fc-day-grid")),this.dayGrid.renderDates(),this.dayGrid.bottomCoordPadding=this.dayGrid.el.next("hr").outerHeight()),this.noScrollRowEls=this.el.find(".fc-row:not(.fc-scroller *)")},renderHead:function(){this.headContainerEl=this.el.find(".fc-head-container").html(this.timeGrid.renderHeadHtml())},unrenderDates:function(){this.timeGrid.unrenderDates(),this.timeGrid.removeElement(),this.dayGrid&&(this.dayGrid.unrenderDates(),this.dayGrid.removeElement()),this.scroller.destroy()},renderSkeletonHtml:function(){return'
                '+(this.dayGrid?'

                ':"")+"
                "},axisStyleAttr:function(){return null!==this.axisWidth?'style="width:'+this.axisWidth+'px"':""},renderBusinessHours:function(){this.timeGrid.renderBusinessHours(),this.dayGrid&&this.dayGrid.renderBusinessHours()},unrenderBusinessHours:function(){this.timeGrid.unrenderBusinessHours(),this.dayGrid&&this.dayGrid.unrenderBusinessHours()},getNowIndicatorUnit:function(){return this.timeGrid.getNowIndicatorUnit()},renderNowIndicator:function(a){this.timeGrid.renderNowIndicator(a)},unrenderNowIndicator:function(){this.timeGrid.unrenderNowIndicator()},updateSize:function(a){this.timeGrid.updateSize(a),wb.prototype.updateSize.call(this,a)},updateWidth:function(){this.axisWidth=k(this.el.find(".fc-axis"))},setHeight:function(a,b){var c,d,g;this.bottomRuleEl.hide(),this.scroller.clear(),f(this.noScrollRowEls),this.dayGrid&&(this.dayGrid.removeSegPopover(),c=this.opt("eventLimit"),c&&"number"!=typeof c&&(c=Lb),c&&this.dayGrid.limitRows(c)),b||(d=this.computeScrollerHeight(a),this.scroller.setHeight(d),g=this.scroller.getScrollbarWidths(),(g.left||g.right)&&(e(this.noScrollRowEls,g),d=this.computeScrollerHeight(a),this.scroller.setHeight(d)),this.scroller.lockOverflow(g),this.timeGrid.getTotalSlatHeight()"+ca(a)+""):'"},renderBgIntroHtml:function(){var a=this.view;return'"},renderIntroHtml:function(){var a=this.view;return'"}},Kb={renderBgIntroHtml:function(){var a=this.view;return'"+(a.opt("allDayHtml")||ca(a.opt("allDayText")))+""},renderIntroHtml:function(){var a=this.view;return'"}},Lb=5,Mb=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}];return Wa.agenda={"class":Ib,defaults:{allDaySlot:!0,allDayText:"all-day",slotDuration:"00:30:00",minTime:"00:00:00",maxTime:"24:00:00",slotEventOverlap:!0}},Wa.agendaDay={type:"agenda",duration:{days:1}},Wa.agendaWeek={type:"agenda",duration:{weeks:1}},Va}); \ No newline at end of file diff --git a/assets/js/fullcalendar/gcal.js b/assets/js/fullcalendar/gcal.js new file mode 100644 index 0000000..58b85c1 --- /dev/null +++ b/assets/js/fullcalendar/gcal.js @@ -0,0 +1,180 @@ +/*! + * FullCalendar v2.7.3 Google Calendar Plugin + * Docs & License: http://fullcalendar.io/ + * (c) 2016 Adam Shaw + */ + +(function(factory) { + if (typeof define === 'function' && define.amd) { + define([ 'jquery' ], factory); + } + else if (typeof exports === 'object') { // Node/CommonJS + module.exports = factory(require('jquery')); + } + else { + factory(jQuery); + } +})(function($) { + + +var API_BASE = 'https://www.googleapis.com/calendar/v3/calendars'; +var FC = $.fullCalendar; +var applyAll = FC.applyAll; + + +FC.sourceNormalizers.push(function(sourceOptions) { + var googleCalendarId = sourceOptions.googleCalendarId; + var url = sourceOptions.url; + var match; + + // if the Google Calendar ID hasn't been explicitly defined + if (!googleCalendarId && url) { + + // detect if the ID was specified as a single string. + // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars. + if (/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) { + googleCalendarId = url; + } + // try to scrape it out of a V1 or V3 API feed URL + else if ( + (match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(url)) || + (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(url)) + ) { + googleCalendarId = decodeURIComponent(match[1]); + } + + if (googleCalendarId) { + sourceOptions.googleCalendarId = googleCalendarId; + } + } + + + if (googleCalendarId) { // is this a Google Calendar? + + // make each Google Calendar source uneditable by default + if (sourceOptions.editable == null) { + sourceOptions.editable = false; + } + + // We want removeEventSource to work, but it won't know about the googleCalendarId primitive. + // Shoehorn it into the url, which will function as the unique primitive. Won't cause side effects. + // This hack is obsolete since 2.2.3, but keep it so this plugin file is compatible with old versions. + sourceOptions.url = googleCalendarId; + } +}); + + +FC.sourceFetchers.push(function(sourceOptions, start, end, timezone) { + if (sourceOptions.googleCalendarId) { + return transformOptions(sourceOptions, start, end, timezone, this); // `this` is the calendar + } +}); + + +function transformOptions(sourceOptions, start, end, timezone, calendar) { + var url = API_BASE + '/' + encodeURIComponent(sourceOptions.googleCalendarId) + '/events?callback=?'; // jsonp + var apiKey = sourceOptions.googleCalendarApiKey || calendar.options.googleCalendarApiKey; + var success = sourceOptions.success; + var data; + var timezoneArg; // populated when a specific timezone. escaped to Google's liking + + function reportError(message, apiErrorObjs) { + var errorObjs = apiErrorObjs || [ { message: message } ]; // to be passed into error handlers + + // call error handlers + (sourceOptions.googleCalendarError || $.noop).apply(calendar, errorObjs); + (calendar.options.googleCalendarError || $.noop).apply(calendar, errorObjs); + + // print error to debug console + FC.warn.apply(null, [ message ].concat(apiErrorObjs || [])); + } + + if (!apiKey) { + reportError("Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/"); + return {}; // an empty source to use instead. won't fetch anything. + } + + // The API expects an ISO8601 datetime with a time and timezone part. + // Since the calendar's timezone offset isn't always known, request the date in UTC and pad it by a day on each + // side, guaranteeing we will receive all events in the desired range, albeit a superset. + // .utc() will set a zone and give it a 00:00:00 time. + if (!start.hasZone()) { + start = start.clone().utc().add(-1, 'day'); + } + if (!end.hasZone()) { + end = end.clone().utc().add(1, 'day'); + } + + // when sending timezone names to Google, only accepts underscores, not spaces + if (timezone && timezone != 'local') { + timezoneArg = timezone.replace(' ', '_'); + } + + data = $.extend({}, sourceOptions.data || {}, { + key: apiKey, + timeMin: start.format(), + timeMax: end.format(), + timeZone: timezoneArg, + singleEvents: true, + maxResults: 9999 + }); + + return $.extend({}, sourceOptions, { + googleCalendarId: null, // prevents source-normalizing from happening again + url: url, + data: data, + startParam: false, // `false` omits this parameter. we already included it above + endParam: false, // same + timezoneParam: false, // same + success: function(data) { + var events = []; + var successArgs; + var successRes; + + if (data.error) { + reportError('Google Calendar API: ' + data.error.message, data.error.errors); + } + else if (data.items) { + $.each(data.items, function(i, entry) { + var url = entry.htmlLink || null; + + // make the URLs for each event show times in the correct timezone + if (timezoneArg && url !== null) { + url = injectQsComponent(url, 'ctz=' + timezoneArg); + } + + events.push({ + id: entry.id, + title: entry.summary, + start: entry.start.dateTime || entry.start.date, // try timed. will fall back to all-day + end: entry.end.dateTime || entry.end.date, // same + url: url, + location: entry.location, + description: entry.description + }); + }); + + // call the success handler(s) and allow it to return a new events array + successArgs = [ events ].concat(Array.prototype.slice.call(arguments, 1)); // forward other jq args + successRes = applyAll(success, this, successArgs); + if ($.isArray(successRes)) { + return successRes; + } + } + + return events; + } + }); +} + + +// Injects a string like "arg=value" into the querystring of a URL +function injectQsComponent(url, component) { + // inject it after the querystring but before the fragment + return url.replace(/(\?.*?)?(#|$)/, function(whole, qs, hash) { + return (qs ? qs + '&' : '?') + component + hash; + }); +} + + +}); diff --git a/assets/js/fullcalendar/lang-all.js b/assets/js/fullcalendar/lang-all.js new file mode 100644 index 0000000..7d7e251 --- /dev/null +++ b/assets/js/fullcalendar/lang-all.js @@ -0,0 +1,4 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}});return a}(),a.fullCalendar.datepickerLang("ar-ma","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("ar-ma",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}(),function(){!function(){"use strict";var a={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},c={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},d=(b.defineLocale||b.lang).call(b,"ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(a){return"م"===a},meridiem:function(a,b,c){return 12>a?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/،/g,",")},postformat:function(b){return b.replace(/\d/g,function(b){return a[b]}).replace(/,/g,"،")},week:{dow:6,doy:12}});return d}(),a.fullCalendar.datepickerLang("ar-sa","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("ar-sa",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"ar-tn",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("ar-tn","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("ar-tn",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}(),function(){!function(){"use strict";var a={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},c={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},d=function(a){return 0===a?0:1===a?1:2===a?2:a%100>=3&&10>=a%100?3:a%100>=11?4:5},e={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},f=function(a){return function(b,c,f,g){var h=d(b),i=e[a][d(b)];return 2===h&&(i=i[c?0:1]),i.replace(/%d/i,b)}},g=["كانون الثاني يناير","شباط فبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوفمبر","كانون الأول ديسمبر"],h=(b.defineLocale||b.lang).call(b,"ar",{months:g,monthsShort:g,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(a){return"م"===a},meridiem:function(a,b,c){return 12>a?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:f("s"),m:f("m"),mm:f("m"),h:f("h"),hh:f("h"),d:f("d"),dd:f("d"),M:f("M"),MM:f("M"),y:f("y"),yy:f("y")},preparse:function(a){return a.replace(/\u200f/g,"").replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/،/g,",")},postformat:function(b){return b.replace(/\d/g,function(b){return a[b]}).replace(/,/g,"،")},week:{dow:6,doy:12}});return h}(),a.fullCalendar.datepickerLang("ar","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("ar",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[В изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[В изминалия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дни",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}});return a}(),a.fullCalendar.datepickerLang("bg","bg",{closeText:"затвори",prevText:"<назад",nextText:"напред>",nextBigText:">>",currentText:"днес",monthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Яну","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Нов","Дек"],dayNames:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],dayNamesShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("bg",{buttonText:{month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",eventLimitText:function(a){return"+още "+a}})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd D MMMM YYYY H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(a,b){var c=1===a?"r":2===a?"n":3===a?"r":4===a?"t":"è";return"w"!==b&&"W"!==b||(c="a"),a+c},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("ca","ca",{closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("ca",{buttonText:{month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},allDayText:"Tot el dia",eventLimitText:"més"})}(),function(){!function(){"use strict";function a(a){return a>1&&5>a&&1!==~~(a/10)}function c(b,c,d,e){var f=b+" ";switch(d){case"s":return c||e?"pár sekund":"pár sekundami";case"m":return c?"minuta":e?"minutu":"minutou";case"mm":return c||e?f+(a(b)?"minuty":"minut"):f+"minutami";case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(a(b)?"hodiny":"hodin"):f+"hodinami";case"d":return c||e?"den":"dnem";case"dd":return c||e?f+(a(b)?"dny":"dní"):f+"dny";case"M":return c||e?"měsíc":"měsícem";case"MM":return c||e?f+(a(b)?"měsíce":"měsíců"):f+"měsíci";case"y":return c||e?"rok":"rokem";case"yy":return c||e?f+(a(b)?"roky":"let"):f+"lety"}}var d="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),e="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_"),f=(b.defineLocale||b.lang).call(b,"cs",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),shortMonthsParse:function(a){var b,c=[];for(b=0;12>b;b++)c[b]=new RegExp("^"+a[b]+"$","i");return c}(e),longMonthsParse:function(a){var b,c=[];for(b=0;12>b;b++)c[b]=new RegExp("^"+a[b]+"$","i");return c}(d),weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return f}(),a.fullCalendar.datepickerLang("cs","cs",{closeText:"Zavřít",prevText:"<Dříve",nextText:"Později>",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("cs",{buttonText:{month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},allDayText:"Celý den",eventLimitText:function(a){return"+další: "+a}})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY HH:mm"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I går kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("da","da",{closeText:"Luk",prevText:"<Forrige",nextText:"Næste>",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("da",{buttonText:{month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"flere"})}(),function(){!function(){"use strict";function a(a,b,c,d){var e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?e[c][0]:e[c][1]}var c=(b.defineLocale||b.lang).call(b,"de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return c}(),a.fullCalendar.datepickerLang("de-at","de",{closeText:"Schließen",prevText:"<Zurück",nextText:"Vor>",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("de-at",{buttonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(a){return"+ weitere "+a}})}(),function(){!function(){"use strict";function a(a,b,c,d){var e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?e[c][0]:e[c][1]}var c=(b.defineLocale||b.lang).call(b,"de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return c}(),a.fullCalendar.datepickerLang("de","de",{closeText:"Schließen",prevText:"<Zurück",nextText:"Vor>",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("de",{buttonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(a){return"+ weitere "+a}})}(),function(){!function(){"use strict";function a(a){return a instanceof Function||"[object Function]"===Object.prototype.toString.call(a)}var c=(b.defineLocale||b.lang).call(b,"el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(a,b){return/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[a.month()]:this._monthsNominativeEl[a.month()]},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(a,b,c){return a>11?c?"μμ":"ΜΜ":c?"πμ":"ΠΜ"},isPM:function(a){return"μ"===(a+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(b,c){var d=this._calendarEl[b],e=c&&c.hours();return a(d)&&(d=d.apply(c)),d.replace("{}",e%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"λίγα δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},ordinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}});return c}(),a.fullCalendar.datepickerLang("el","el",{closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Σήμερα",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("el",{buttonText:{month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},allDayText:"Ολοήμερο",eventLimitText:"περισσότερα"})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("en-au","en-AU",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("en-au")}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}});return a}(),a.fullCalendar.lang("en-ca")}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("en-gb","en-GB",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("en-gb")}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}});return a}(),a.fullCalendar.lang("en-ie")}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("en-nz","en-NZ",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("en-nz")}(),function(){!function(){"use strict";var a="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),c="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),d=(b.defineLocale||b.lang).call(b,"es",{ +months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(b,d){return/-MMM-/.test(d)?c[b.month()]:a[b.month()]},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return d}(),a.fullCalendar.datepickerLang("es","es",{closeText:"Cerrar",prevText:"<Ant",nextText:"Sig>",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("es",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo
                el día",eventLimitText:"más"})}(),function(){!function(){"use strict";var a={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},c={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"},d=(b.defineLocale||b.lang).call(b,"fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(a){return/بعد از ظهر/.test(a)},meridiem:function(a,b,c){return 12>a?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(a){return a.replace(/[۰-۹]/g,function(a){return c[a]}).replace(/،/g,",")},postformat:function(b){return b.replace(/\d/g,function(b){return a[b]}).replace(/,/g,"،")},ordinalParse:/\d{1,2}م/,ordinal:"%dم",week:{dow:6,doy:12}});return d}(),a.fullCalendar.datepickerLang("fa","fa",{closeText:"بستن",prevText:"<قبلی",nextText:"بعدی>",currentText:"امروز",monthNames:["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ی","د","س","چ","پ","ج","ش"],dayNamesMin:["ی","د","س","چ","پ","ج","ش"],weekHeader:"هف",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("fa",{buttonText:{month:"ماه",week:"هفته",day:"روز",list:"برنامه"},allDayText:"تمام روز",eventLimitText:function(a){return"بیش از "+a}})}(),function(){!function(){"use strict";function a(a,b,d,e){var f="";switch(d){case"s":return e?"muutaman sekunnin":"muutama sekunti";case"m":return e?"minuutin":"minuutti";case"mm":f=e?"minuutin":"minuuttia";break;case"h":return e?"tunnin":"tunti";case"hh":f=e?"tunnin":"tuntia";break;case"d":return e?"päivän":"päivä";case"dd":f=e?"päivän":"päivää";break;case"M":return e?"kuukauden":"kuukausi";case"MM":f=e?"kuukauden":"kuukautta";break;case"y":return e?"vuoden":"vuosi";case"yy":f=e?"vuoden":"vuotta"}return f=c(a,e)+" "+f}function c(a,b){return 10>a?b?e[a]:d[a]:a}var d="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),e=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",d[7],d[8],d[9]],f=(b.defineLocale||b.lang).call(b,"fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return f}(),a.fullCalendar.datepickerLang("fi","fi",{closeText:"Sulje",prevText:"«Edellinen",nextText:"Seuraava»",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"d.m.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("fi",{buttonText:{month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},allDayText:"Koko päivä",eventLimitText:"lisää"})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(a){return a+(1===a?"er":"e")}});return a}(),a.fullCalendar.datepickerLang("fr-ca","fr-CA",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("fr-ca",{buttonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la
                journée",eventLimitText:"en plus"})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"fr-ch",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(a){return a+(1===a?"er":"e")},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("fr-ch","fr-CH",{closeText:"Fermer",prevText:"<Préc",nextText:"Suiv>",currentText:"Courant",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sm",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("fr-ch",{buttonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la
                journée",eventLimitText:"en plus"})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("fr","fr",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("fr",{buttonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la
                journée",eventLimitText:"en plus"})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"he",{months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א_ב_ג_ד_ה_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[היום ב־]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[אתמול ב־]LT",lastWeek:"[ביום] dddd [האחרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(a){return 2===a?"שעתיים":a+" שעות"},d:"יום",dd:function(a){return 2===a?"יומיים":a+" ימים"},M:"חודש",MM:function(a){return 2===a?"חודשיים":a+" חודשים"},y:"שנה",yy:function(a){return 2===a?"שנתיים":a%10===0&&10!==a?a+" שנה":a+" שנים"}},meridiemParse:/אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,isPM:function(a){return/^(אחה"צ|אחרי הצהריים|בערב)$/.test(a)},meridiem:function(a,b,c){return 5>a?"לפנות בוקר":10>a?"בבוקר":12>a?c?'לפנה"צ':"לפני הצהריים":18>a?c?'אחה"צ':"אחרי הצהריים":"בערב"}});return a}(),a.fullCalendar.datepickerLang("he","he",{closeText:"סגור",prevText:"<הקודם",nextText:"הבא>",currentText:"היום",monthNames:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],monthNamesShort:["ינו","פבר","מרץ","אפר","מאי","יוני","יולי","אוג","ספט","אוק","נוב","דצמ"],dayNames:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],dayNamesShort:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],dayNamesMin:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("he",{defaultButtonText:{month:"חודש",week:"שבוע",day:"יום",list:"סדר יום"},weekNumberTitle:"שבוע",allDayText:"כל היום",eventLimitText:"אחר"})}(),function(){!function(){"use strict";var a={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"},d=(b.defineLocale||b.lang).call(b,"hi",{months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm बजे",LLLL:"dddd, D MMMM YYYY, A h:mm बजे"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(b){return b.replace(/\d/g,function(b){return a[b]})},meridiemParse:/रात|सुबह|दोपहर|शाम/,meridiemHour:function(a,b){return 12===a&&(a=0),"रात"===b?4>a?a:a+12:"सुबह"===b?a:"दोपहर"===b?a>=10?a:a+12:"शाम"===b?a+12:void 0},meridiem:function(a,b,c){return 4>a?"रात":10>a?"सुबह":17>a?"दोपहर":20>a?"शाम":"रात"},week:{dow:0,doy:6}});return d}(),a.fullCalendar.datepickerLang("hi","hi",{closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून","जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],monthNamesShort:["जन","फर","मार्च","अप्रेल","मई","जून","जूलाई","अग","सित","अक्ट","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],dayNamesMin:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],weekHeader:"हफ्ता",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("hi",{buttonText:{month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},allDayText:"सभी दिन",eventLimitText:function(a){return"+अधिक "+a}})}(),function(){!function(){"use strict";function a(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}var c=(b.defineLocale||b.lang).call(b,"hr",{months:{format:"siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:a,mm:a,h:a,hh:a,d:"dan",dd:a,M:"mjesec",MM:a,y:"godinu",yy:a},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return c}(),a.fullCalendar.datepickerLang("hr","hr",{closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("hr",{buttonText:{month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},allDayText:"Cijeli dan",eventLimitText:function(a){return"+ još "+a}})}(),function(){!function(){"use strict";function a(a,b,c,d){var e=a;switch(c){case"s":return d||b?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(d||b?" perc":" perce");case"mm":return e+(d||b?" perc":" perce");case"h":return"egy"+(d||b?" óra":" órája");case"hh":return e+(d||b?" óra":" órája");case"d":return"egy"+(d||b?" nap":" napja");case"dd":return e+(d||b?" nap":" napja");case"M":return"egy"+(d||b?" hónap":" hónapja");case"MM":return e+(d||b?" hónap":" hónapja");case"y":return"egy"+(d||b?" év":" éve");case"yy":return e+(d||b?" év":" éve")}return""}function c(a){return(a?"":"[múlt] ")+"["+d[this.day()]+"] LT[-kor]"}var d="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" "),e=(b.defineLocale||b.lang).call(b,"hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(a){return"u"===a.charAt(1).toLowerCase()},meridiem:function(a,b,c){return 12>a?c===!0?"de":"DE":c===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return c.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return c.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return e}(),a.fullCalendar.datepickerLang("hu","hu",{closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),a.fullCalendar.lang("hu",{buttonText:{month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},allDayText:"Egész nap",eventLimitText:"további"})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"siang"===b?a>=11?a:a+12:"sore"===b||"malam"===b?a+12:void 0},meridiem:function(a,b,c){return 11>a?"pagi":15>a?"siang":19>a?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return a}(),a.fullCalendar.datepickerLang("id","id",{closeText:"Tutup",prevText:"<mundur",nextText:"maju>",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("id",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayHtml:"Sehari
                penuh",eventLimitText:"lebih"})}(),function(){!function(){"use strict";function a(a){return a%100===11?!0:a%10!==1}function c(b,c,d,e){var f=b+" ";switch(d){case"s":return c||e?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return c?"mínúta":"mínútu";case"mm":return a(b)?f+(c||e?"mínútur":"mínútum"):c?f+"mínúta":f+"mínútu";case"hh":return a(b)?f+(c||e?"klukkustundir":"klukkustundum"):f+"klukkustund";case"d":return c?"dagur":e?"dag":"degi";case"dd":return a(b)?c?f+"dagar":f+(e?"daga":"dögum"):c?f+"dagur":f+(e?"dag":"degi");case"M":return c?"mánuður":e?"mánuð":"mánuði";case"MM":return a(b)?c?f+"mánuðir":f+(e?"mánuði":"mánuðum"):c?f+"mánuður":f+(e?"mánuð":"mánuði");case"y":return c||e?"ár":"ári";case"yy":return a(b)?f+(c||e?"ár":"árum"):f+(c||e?"ár":"ári")}}var d=(b.defineLocale||b.lang).call(b,"is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:c,m:c,mm:c,h:"klukkustund",hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return d}(),a.fullCalendar.datepickerLang("is","is",{closeText:"Loka",prevText:"< Fyrri",nextText:"Næsti >",currentText:"Í dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd.mm.yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("is",{buttonText:{month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},allDayHtml:"Allan
                daginn",eventLimitText:"meira"})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"Do_Lu_Ma_Me_Gi_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?"tra":"in")+" "+a},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("it","it",{closeText:"Chiudi",prevText:"<Prec",nextText:"Succ>",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("it",{buttonText:{month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},allDayHtml:"Tutto il
                giorno",eventLimitText:function(a){return"+altri "+a}})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"Ah時m分s秒",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah時m分",LLLL:"YYYY年M月D日Ah時m分 dddd"},meridiemParse:/午前|午後/i,isPM:function(a){return"午後"===a},meridiem:function(a,b,c){return 12>a?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},ordinalParse:/\d{1,2}日/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"日";default:return a}},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}});return a}(),a.fullCalendar.datepickerLang("ja","ja",{closeText:"閉じる",prevText:"<前",nextText:"次>",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),a.fullCalendar.lang("ja",{buttonText:{month:"月",week:"週",day:"日",list:"予定リスト"},allDayText:"終日",eventLimitText:function(a){return"他 "+a+" 件"}})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h시 m분",LTS:"A h시 m분 s초",L:"YYYY.MM.DD",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 A h시 m분",LLLL:"YYYY년 MMMM D일 dddd A h시 m분"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇 초",ss:"%d초",m:"일분",mm:"%d분",h:"한 시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한 달",MM:"%d달",y:"일 년",yy:"%d년"},ordinalParse:/\d{1,2}일/,ordinal:"%d일",meridiemParse:/오전|오후/,isPM:function(a){return"오후"===a},meridiem:function(a,b,c){return 12>a?"오전":"오후"}});return a}(),a.fullCalendar.datepickerLang("ko","ko",{closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"}),a.fullCalendar.lang("ko",{buttonText:{month:"월",week:"주",day:"일",list:"일정목록"},allDayText:"종일",eventLimitText:"개"})}(),function(){!function(){"use strict";function a(a,b,c,d){return b?"kelios sekundės":d?"kelių sekundžių":"kelias sekundes"}function c(a,b,c,d){return b?e(c)[0]:d?e(c)[1]:e(c)[2]}function d(a){return a%10===0||a>10&&20>a}function e(a){return g[a].split("_")}function f(a,b,f,g){var h=a+" ";return 1===a?h+c(a,b,f[0],g):b?h+(d(a)?e(f)[1]:e(f)[0]):g?h+e(f)[1]:h+(d(a)?e(f)[1]:e(f)[2])}var g={m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes", +h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"},h=(b.defineLocale||b.lang).call(b,"lt",{months:{format:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis".split("_")},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:a,m:c,mm:f,h:c,hh:f,d:c,dd:f,M:c,MM:f,y:c,yy:f},ordinalParse:/\d{1,2}-oji/,ordinal:function(a){return a+"-oji"},week:{dow:1,doy:4}});return h}(),a.fullCalendar.datepickerLang("lt","lt",{closeText:"Uždaryti",prevText:"<Atgal",nextText:"Pirmyn>",currentText:"Šiandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","šeš"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Še"],weekHeader:"SAV",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),a.fullCalendar.lang("lt",{buttonText:{month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},allDayText:"Visą dieną",eventLimitText:"daugiau"})}(),function(){!function(){"use strict";function a(a,b,c){return c?b%10===1&&11!==b?a[2]:a[3]:b%10===1&&11!==b?a[0]:a[1]}function c(b,c,d){return b+" "+a(f[d],b,c)}function d(b,c,d){return a(f[d],b,c)}function e(a,b){return b?"dažas sekundes":"dažām sekundēm"}var f={m:"minūtes_minūtēm_minūte_minūtes".split("_"),mm:"minūtes_minūtēm_minūte_minūtes".split("_"),h:"stundas_stundām_stunda_stundas".split("_"),hh:"stundas_stundām_stunda_stundas".split("_"),d:"dienas_dienām_diena_dienas".split("_"),dd:"dienas_dienām_diena_dienas".split("_"),M:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),MM:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")},g=(b.defineLocale||b.lang).call(b,"lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"pēc %s",past:"pirms %s",s:e,m:d,mm:c,h:d,hh:c,d:d,dd:c,M:d,MM:c,y:d,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return g}(),a.fullCalendar.datepickerLang("lv","lv",{closeText:"Aizvērt",prevText:"Iepr.",nextText:"Nāk.",currentText:"Šodien",monthNames:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],dayNames:["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Ned.",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("lv",{buttonText:{month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},allDayText:"Visu dienu",eventLimitText:function(a){return"+vēl "+a}})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("nb","nb",{closeText:"Lukk",prevText:"«Forrige",nextText:"Neste»",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("nb",{buttonText:{month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"til"})}(),function(){!function(){"use strict";var a="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),c="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),d=(b.defineLocale||b.lang).call(b,"nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(b,d){return/-MMM-/.test(d)?c[b.month()]:a[b.month()]},monthsParseExact:!0,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}});return d}(),a.fullCalendar.datepickerLang("nl","nl",{closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("nl",{buttonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra"})}(),function(){!function(){"use strict";function a(a){return 5>a%10&&a%10>1&&~~(a/10)%10!==1}function c(b,c,d){var e=b+" ";switch(d){case"m":return c?"minuta":"minutę";case"mm":return e+(a(b)?"minuty":"minut");case"h":return c?"godzina":"godzinę";case"hh":return e+(a(b)?"godziny":"godzin");case"MM":return e+(a(b)?"miesiące":"miesięcy");case"yy":return e+(a(b)?"lata":"lat")}}var d="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),e="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_"),f=(b.defineLocale||b.lang).call(b,"pl",{months:function(a,b){return""===b?"("+e[a.month()]+"|"+d[a.month()]+")":/D MMMM/.test(b)?e[a.month()]:d[a.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"nie_pon_wt_śr_czw_pt_sb".split("_"),weekdaysMin:"Nd_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:c,mm:c,h:c,hh:c,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:c,y:"rok",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return f}(),a.fullCalendar.datepickerLang("pl","pl",{closeText:"Zamknij",prevText:"<Poprzedni",nextText:"Następny>",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("pl",{buttonText:{month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},allDayText:"Cały dzień",eventLimitText:"więcej"})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"pt-br",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"poucos segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"});return a}(),a.fullCalendar.datepickerLang("pt-br","pt-BR",{closeText:"Fechar",prevText:"<Anterior",nextText:"Próximo>",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("pt-br",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},allDayText:"dia inteiro",eventLimitText:function(a){return"mais +"+a}})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"pt",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("pt","pt",{closeText:"Fechar",prevText:"Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("pt",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},allDayText:"Todo o dia",eventLimitText:"mais"})}(),function(){!function(){"use strict";function a(a,b,c){var d={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},e=" ";return(a%100>=20||a>=100&&a%100===0)&&(e=" de "),a+e+d[c]}var c=(b.defineLocale||b.lang).call(b,"ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:a,h:"o oră",hh:a,d:"o zi",dd:a,M:"o lună",MM:a,y:"un an",yy:a},week:{dow:1,doy:7}});return c}(),a.fullCalendar.datepickerLang("ro","ro",{closeText:"Închide",prevText:"« Luna precedentă",nextText:"Luna următoare »",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("ro",{buttonText:{prev:"precedentă",next:"următoare",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},allDayText:"Toată ziua",eventLimitText:function(a){return"+alte "+a}})}(),function(){!function(){"use strict";function a(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(b,c,d){var e={mm:c?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return"m"===d?c?"минута":"минуту":b+" "+a(e[d],+b)}var d=[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[йя]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i],e=(b.defineLocale||b.lang).call(b,"ru",{months:{format:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_"),standalone:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_")},monthsShort:{format:"янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.".split("_"),standalone:"янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.".split("_")},weekdays:{standalone:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),format:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_"),isFormat:/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/},weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:d,longMonthsParse:d,shortMonthsParse:d,monthsRegex:/^(сентябр[яь]|октябр[яь]|декабр[яь]|феврал[яь]|январ[яь]|апрел[яь]|августа?|ноябр[яь]|сент\.|февр\.|нояб\.|июнь|янв.|июль|дек.|авг.|апр.|марта|мар[.т]|окт.|июн[яь]|июл[яь]|ма[яй])/i,monthsShortRegex:/^(сентябр[яь]|октябр[яь]|декабр[яь]|феврал[яь]|январ[яь]|апрел[яь]|августа?|ноябр[яь]|сент\.|февр\.|нояб\.|июнь|янв.|июль|дек.|авг.|апр.|марта|мар[.т]|окт.|июн[яь]|июл[яь]|ма[яй])/i,monthsStrictRegex:/^(сентябр[яь]|октябр[яь]|декабр[яь]|феврал[яь]|январ[яь]|апрел[яь]|августа?|ноябр[яь]|марта?|июн[яь]|июл[яь]|ма[яй])/i,monthsShortStrictRegex:/^(нояб\.|февр\.|сент\.|июль|янв\.|июн[яь]|мар[.т]|авг\.|апр\.|окт\.|дек\.|ма[яй])/i,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Сегодня в] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT";switch(this.day()){case 0:return"[В следующее] dddd [в] LT";case 1:case 2:case 4:return"[В следующий] dddd [в] LT";case 3:case 5:case 6:return"[В следующую] dddd [в] LT"}},lastWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT";switch(this.day()){case 0:return"[В прошлое] dddd [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:c,mm:c,h:"час",hh:c,d:"день",dd:c,M:"месяц",MM:c,y:"год",yy:c},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(a){return/^(дня|вечера)$/.test(a)},meridiem:function(a,b,c){return 4>a?"ночи":12>a?"утра":17>a?"дня":"вечера"},ordinalParse:/\d{1,2}-(й|го|я)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":return a+"-й";case"D":return a+"-го";case"w":case"W":return a+"-я";default:return a}},week:{dow:1,doy:7}});return e}(),a.fullCalendar.datepickerLang("ru","ru",{closeText:"Закрыть",prevText:"<Пред",nextText:"След>",currentText:"Сегодня",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],dayNamesMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Нед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("ru",{buttonText:{month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},allDayText:"Весь день",eventLimitText:function(a){return"+ ещё "+a}})}(),function(){!function(){"use strict";function a(a){return a>1&&5>a}function c(b,c,d,e){var f=b+" ";switch(d){case"s":return c||e?"pár sekúnd":"pár sekundami";case"m":return c?"minúta":e?"minútu":"minútou";case"mm":return c||e?f+(a(b)?"minúty":"minút"):f+"minútami";case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(a(b)?"hodiny":"hodín"):f+"hodinami";case"d":return c||e?"deň":"dňom";case"dd":return c||e?f+(a(b)?"dni":"dní"):f+"dňami";case"M":return c||e?"mesiac":"mesiacom";case"MM":return c||e?f+(a(b)?"mesiace":"mesiacov"):f+"mesiacmi";case"y":return c||e?"rok":"rokom";case"yy":return c||e?f+(a(b)?"roky":"rokov"):f+"rokmi"}}var d="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),e="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_"),f=(b.defineLocale||b.lang).call(b,"sk",{months:d,monthsShort:e,weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return f}(),a.fullCalendar.datepickerLang("sk","sk",{closeText:"Zavrieť",prevText:"<Predchádzajúci",nextText:"Nasledujúci>",currentText:"Dnes",monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Št","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("sk",{buttonText:{month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},allDayText:"Celý deň",eventLimitText:function(a){return"+ďalšie: "+a}})}(),function(){!function(){"use strict";function a(a,b,c,d){var e=a+" ";switch(c){case"s":return b||d?"nekaj sekund":"nekaj sekundami";case"m":return b?"ena minuta":"eno minuto";case"mm":return e+=1===a?b?"minuta":"minuto":2===a?b||d?"minuti":"minutama":5>a?b||d?"minute":"minutami":b||d?"minut":"minutami";case"h":return b?"ena ura":"eno uro";case"hh":return e+=1===a?b?"ura":"uro":2===a?b||d?"uri":"urama":5>a?b||d?"ure":"urami":b||d?"ur":"urami";case"d":return b||d?"en dan":"enim dnem";case"dd":return e+=1===a?b||d?"dan":"dnem":2===a?b||d?"dni":"dnevoma":b||d?"dni":"dnevi";case"M":return b||d?"en mesec":"enim mesecem";case"MM":return e+=1===a?b||d?"mesec":"mesecem":2===a?b||d?"meseca":"mesecema":5>a?b||d?"mesece":"meseci":b||d?"mesecev":"meseci";case"y":return b||d?"eno leto":"enim letom";case"yy":return e+=1===a?b||d?"leto":"letom":2===a?b||d?"leti":"letoma":5>a?b||d?"leta":"leti":b||d?"let":"leti"}}var c=(b.defineLocale||b.lang).call(b,"sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prejšnjo] [nedeljo] [ob] LT";case 3:return"[prejšnjo] [sredo] [ob] LT";case 6:return"[prejšnjo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"pred %s",s:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return c}(),a.fullCalendar.datepickerLang("sl","sl",{closeText:"Zapri",prevText:"<Prejšnji",nextText:"Naslednji>",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","Če","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("sl",{buttonText:{month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},allDayText:"Ves dan",eventLimitText:"več"})}(),function(){!function(){"use strict";var a={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(b,c,d){var e=a.words[d];return 1===d.length?c?e[0]:e[1]:b+" "+a.correctGrammaticalCase(b,e)}},c=(b.defineLocale||b.lang).call(b,"sr-cyrl",{months:"јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар".split("_"),monthsShort:"јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.".split("_"),monthsParseExact:!0,weekdays:"недеља_понедељак_уторак_среда_четвртак_петак_субота".split("_"),weekdaysShort:"нед._пон._уто._сре._чет._пет._суб.".split("_"),weekdaysMin:"не_по_ут_ср_че_пе_су".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var a=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",m:a.translate,mm:a.translate,h:a.translate,hh:a.translate,d:"дан",dd:a.translate,M:"месец",MM:a.translate,y:"годину",yy:a.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return c}(),a.fullCalendar.datepickerLang("sr-cyrl","sr",{closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("sr-cyrl",{buttonText:{month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(a){return"+ још "+a}})}(),function(){!function(){"use strict";var a={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(b,c,d){var e=a.words[d];return 1===d.length?c?e[0]:e[1]:b+" "+a.correctGrammaticalCase(b,e)}},c=(b.defineLocale||b.lang).call(b,"sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){var a=["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:a.translate,mm:a.translate,h:a.translate,hh:a.translate,d:"dan",dd:a.translate,M:"mesec",MM:a.translate,y:"godinu",yy:a.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return c}(),a.fullCalendar.datepickerLang("sr","sr",{closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("sr",{buttonText:{month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(a){return"+ још "+a}})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"), +monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"[På] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"e":1===b?"a":2===b?"a":"e";return a+c},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("sv","sv",{closeText:"Stäng",prevText:"«Förra",nextText:"Nästa»",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","Må","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("sv",{buttonText:{month:"Månad",week:"Vecka",day:"Dag",list:"Program"},allDayText:"Heldag",eventLimitText:"till"})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา".split("_"),monthsParseExact:!0,weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H นาฬิกา m นาที",LTS:"H นาฬิกา m นาที s วินาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H นาฬิกา m นาที",LLLL:"วันddddที่ D MMMM YYYY เวลา H นาฬิกา m นาที"},meridiemParse:/ก่อนเที่ยง|หลังเที่ยง/,isPM:function(a){return"หลังเที่ยง"===a},meridiem:function(a,b,c){return 12>a?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}});return a}(),a.fullCalendar.datepickerLang("th","th",{closeText:"ปิด",prevText:"« ย้อน",nextText:"ถัดไป »",currentText:"วันนี้",monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthNamesShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("th",{buttonText:{month:"เดือน",week:"สัปดาห์",day:"วัน",list:"แผนงาน"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม"})}(),function(){!function(){"use strict";var a={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"},c=(b.defineLocale||b.lang).call(b,"tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(b){if(0===b)return b+"'ıncı";var c=b%10,d=b%100-c,e=b>=100?100:null;return b+(a[c]||a[d]||a[e])},week:{dow:1,doy:7}});return c}(),a.fullCalendar.datepickerLang("tr","tr",{closeText:"kapat",prevText:"<geri",nextText:"ileri>",currentText:"bugün",monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("tr",{buttonText:{next:"ileri",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},allDayText:"Tüm gün",eventLimitText:"daha fazla"})}(),function(){!function(){"use strict";function a(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(b,c,d){var e={mm:c?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:c?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return"m"===d?c?"хвилина":"хвилину":"h"===d?c?"година":"годину":b+" "+a(e[d],+b)}function d(a,b){var c={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")},d=/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(b)?"genitive":"nominative";return c[d][a.day()]}function e(a){return function(){return a+"о"+(11===this.hours()?"б":"")+"] LT"}}var f=(b.defineLocale||b.lang).call(b,"uk",{months:{format:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_"),standalone:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_")},monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:d,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., HH:mm",LLLL:"dddd, D MMMM YYYY р., HH:mm"},calendar:{sameDay:e("[Сьогодні "),nextDay:e("[Завтра "),lastDay:e("[Вчора "),nextWeek:e("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return e("[Минулої] dddd [").call(this);case 1:case 2:case 4:return e("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",m:c,mm:c,h:"годину",hh:c,d:"день",dd:c,M:"місяць",MM:c,y:"рік",yy:c},meridiemParse:/ночі|ранку|дня|вечора/,isPM:function(a){return/^(дня|вечора)$/.test(a)},meridiem:function(a,b,c){return 4>a?"ночі":12>a?"ранку":17>a?"дня":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a+"-й";case"D":return a+"-го";default:return a}},week:{dow:1,doy:7}});return f}(),a.fullCalendar.datepickerLang("uk","uk",{closeText:"Закрити",prevText:"<",nextText:">",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],dayNames:["неділя","понеділок","вівторок","середа","четвер","п’ятниця","субота"],dayNamesShort:["нед","пнд","вів","срд","чтв","птн","сбт"],dayNamesMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("uk",{buttonText:{month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},allDayText:"Увесь день",eventLimitText:function(a){return"+ще "+a+"..."}})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(a){return/^ch$/i.test(a)},meridiem:function(a,b,c){return 12>a?c?"sa":"SA":c?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("vi","vi",{closeText:"Đóng",prevText:"<Trước",nextText:"Tiếp>",currentText:"Hôm nay",monthNames:["Tháng Một","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("vi",{buttonText:{month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},allDayText:"Cả ngày",eventLimitText:function(a){return"+ thêm "+a}})}(),function(){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah点mm分",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日Ah点mm分",LLLL:"YYYY年MMMD日ddddAh点mm分",l:"YYYY-MM-DD",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日Ah点mm分",llll:"YYYY年MMMD日ddddAh点mm分"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上午"===b?a:"下午"===b||"晚上"===b?a+12:a>=11?a:a+12},meridiem:function(a,b,c){var d=100*a+b;return 600>d?"凌晨":900>d?"早上":1130>d?"上午":1230>d?"中午":1800>d?"下午":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var a,c;return a=b().startOf("week"),c=this.diff(a,"days")>=7?"[下]":"[本]",0===this.minutes()?c+"dddAh点整":c+"dddAh点mm"},lastWeek:function(){var a,c;return a=b().startOf("week"),c=this.unix()=11?a:a+12:"下午"===b||"晚上"===b?a+12:void 0},meridiem:function(a,b,c){var d=100*a+b;return 900>d?"早上":1130>d?"上午":1230>d?"中午":1800>d?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(日|月|週)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"日";case"M":return a+"月";case"w":case"W":return a+"週";default:return a}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",m:"1分鐘",mm:"%d分鐘",h:"1小時",hh:"%d小時",d:"1天",dd:"%d天",M:"1個月",MM:"%d個月",y:"1年",yy:"%d年"}});return a}(),a.fullCalendar.datepickerLang("zh-tw","zh-TW",{closeText:"關閉",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),a.fullCalendar.lang("zh-tw",{buttonText:{month:"月",week:"週",day:"天",list:"待辦事項"},allDayText:"全天",eventLimitText:"更多"})}(),(b.locale||b.lang).call(b,"en"),a.fullCalendar.lang("en"),a.datepicker&&a.datepicker.setDefaults(a.datepicker.regional[""])}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/ar-ma.js b/assets/js/fullcalendar/lang/ar-ma.js new file mode 100644 index 0000000..1679699 --- /dev/null +++ b/assets/js/fullcalendar/lang/ar-ma.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}});return a}(),a.fullCalendar.datepickerLang("ar-ma","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("ar-ma",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/ar-sa.js b/assets/js/fullcalendar/lang/ar-sa.js new file mode 100644 index 0000000..012368e --- /dev/null +++ b/assets/js/fullcalendar/lang/ar-sa.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},c={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},d=(b.defineLocale||b.lang).call(b,"ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(a){return"م"===a},meridiem:function(a,b,c){return 12>a?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/،/g,",")},postformat:function(b){return b.replace(/\d/g,function(b){return a[b]}).replace(/,/g,"،")},week:{dow:6,doy:12}});return d}(),a.fullCalendar.datepickerLang("ar-sa","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("ar-sa",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/ar-tn.js b/assets/js/fullcalendar/lang/ar-tn.js new file mode 100644 index 0000000..17620b6 --- /dev/null +++ b/assets/js/fullcalendar/lang/ar-tn.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"ar-tn",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("ar-tn","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("ar-tn",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/ar.js b/assets/js/fullcalendar/lang/ar.js new file mode 100644 index 0000000..63ac583 --- /dev/null +++ b/assets/js/fullcalendar/lang/ar.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},c={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},d=function(a){return 0===a?0:1===a?1:2===a?2:a%100>=3&&10>=a%100?3:a%100>=11?4:5},e={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},f=function(a){return function(b,c,f,g){var h=d(b),i=e[a][d(b)];return 2===h&&(i=i[c?0:1]),i.replace(/%d/i,b)}},g=["كانون الثاني يناير","شباط فبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوفمبر","كانون الأول ديسمبر"],h=(b.defineLocale||b.lang).call(b,"ar",{months:g,monthsShort:g,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(a){return"م"===a},meridiem:function(a,b,c){return 12>a?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:f("s"),m:f("m"),mm:f("m"),h:f("h"),hh:f("h"),d:f("d"),dd:f("d"),M:f("M"),MM:f("M"),y:f("y"),yy:f("y")},preparse:function(a){return a.replace(/\u200f/g,"").replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/،/g,",")},postformat:function(b){return b.replace(/\d/g,function(b){return a[b]}).replace(/,/g,"،")},week:{dow:6,doy:12}});return h}(),a.fullCalendar.datepickerLang("ar","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("ar",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/bg.js b/assets/js/fullcalendar/lang/bg.js new file mode 100644 index 0000000..35783b7 --- /dev/null +++ b/assets/js/fullcalendar/lang/bg.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[В изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[В изминалия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дни",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}});return a}(),a.fullCalendar.datepickerLang("bg","bg",{closeText:"затвори",prevText:"<назад",nextText:"напред>",nextBigText:">>",currentText:"днес",monthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Яну","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Нов","Дек"],dayNames:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],dayNamesShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("bg",{buttonText:{month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",eventLimitText:function(a){return"+още "+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/ca.js b/assets/js/fullcalendar/lang/ca.js new file mode 100644 index 0000000..641b020 --- /dev/null +++ b/assets/js/fullcalendar/lang/ca.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd D MMMM YYYY H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(a,b){var c=1===a?"r":2===a?"n":3===a?"r":4===a?"t":"è";return"w"!==b&&"W"!==b||(c="a"),a+c},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("ca","ca",{closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("ca",{buttonText:{month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},allDayText:"Tot el dia",eventLimitText:"més"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/cs.js b/assets/js/fullcalendar/lang/cs.js new file mode 100644 index 0000000..e4bcd9b --- /dev/null +++ b/assets/js/fullcalendar/lang/cs.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a){return a>1&&5>a&&1!==~~(a/10)}function c(b,c,d,e){var f=b+" ";switch(d){case"s":return c||e?"pár sekund":"pár sekundami";case"m":return c?"minuta":e?"minutu":"minutou";case"mm":return c||e?f+(a(b)?"minuty":"minut"):f+"minutami";case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(a(b)?"hodiny":"hodin"):f+"hodinami";case"d":return c||e?"den":"dnem";case"dd":return c||e?f+(a(b)?"dny":"dní"):f+"dny";case"M":return c||e?"měsíc":"měsícem";case"MM":return c||e?f+(a(b)?"měsíce":"měsíců"):f+"měsíci";case"y":return c||e?"rok":"rokem";case"yy":return c||e?f+(a(b)?"roky":"let"):f+"lety"}}var d="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),e="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_"),f=(b.defineLocale||b.lang).call(b,"cs",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),shortMonthsParse:function(a){var b,c=[];for(b=0;12>b;b++)c[b]=new RegExp("^"+a[b]+"$","i");return c}(e),longMonthsParse:function(a){var b,c=[];for(b=0;12>b;b++)c[b]=new RegExp("^"+a[b]+"$","i");return c}(d),weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return f}(),a.fullCalendar.datepickerLang("cs","cs",{closeText:"Zavřít",prevText:"<Dříve",nextText:"Později>",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("cs",{buttonText:{month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},allDayText:"Celý den",eventLimitText:function(a){return"+další: "+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/da.js b/assets/js/fullcalendar/lang/da.js new file mode 100644 index 0000000..10d6ffb --- /dev/null +++ b/assets/js/fullcalendar/lang/da.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY HH:mm"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I går kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("da","da",{closeText:"Luk",prevText:"<Forrige",nextText:"Næste>",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("da",{buttonText:{month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"flere"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/de-at.js b/assets/js/fullcalendar/lang/de-at.js new file mode 100644 index 0000000..80f80b0 --- /dev/null +++ b/assets/js/fullcalendar/lang/de-at.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a,b,c,d){var e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?e[c][0]:e[c][1]}var c=(b.defineLocale||b.lang).call(b,"de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return c}(),a.fullCalendar.datepickerLang("de-at","de",{closeText:"Schließen",prevText:"<Zurück",nextText:"Vor>",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("de-at",{buttonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(a){return"+ weitere "+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/de.js b/assets/js/fullcalendar/lang/de.js new file mode 100644 index 0000000..241aeb3 --- /dev/null +++ b/assets/js/fullcalendar/lang/de.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a,b,c,d){var e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?e[c][0]:e[c][1]}var c=(b.defineLocale||b.lang).call(b,"de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return c}(),a.fullCalendar.datepickerLang("de","de",{closeText:"Schließen",prevText:"<Zurück",nextText:"Vor>",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("de",{buttonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(a){return"+ weitere "+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/el.js b/assets/js/fullcalendar/lang/el.js new file mode 100644 index 0000000..85bc603 --- /dev/null +++ b/assets/js/fullcalendar/lang/el.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a){return a instanceof Function||"[object Function]"===Object.prototype.toString.call(a)}var c=(b.defineLocale||b.lang).call(b,"el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(a,b){return/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[a.month()]:this._monthsNominativeEl[a.month()]},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(a,b,c){return a>11?c?"μμ":"ΜΜ":c?"πμ":"ΠΜ"},isPM:function(a){return"μ"===(a+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(b,c){var d=this._calendarEl[b],e=c&&c.hours();return a(d)&&(d=d.apply(c)),d.replace("{}",e%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"λίγα δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},ordinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}});return c}(),a.fullCalendar.datepickerLang("el","el",{closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Σήμερα",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("el",{buttonText:{month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},allDayText:"Ολοήμερο",eventLimitText:"περισσότερα"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/en-au.js b/assets/js/fullcalendar/lang/en-au.js new file mode 100644 index 0000000..8bab41f --- /dev/null +++ b/assets/js/fullcalendar/lang/en-au.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("en-au","en-AU",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("en-au")}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/en-ca.js b/assets/js/fullcalendar/lang/en-ca.js new file mode 100644 index 0000000..1f4c0cf --- /dev/null +++ b/assets/js/fullcalendar/lang/en-ca.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}});return a}(),a.fullCalendar.lang("en-ca")}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/en-gb.js b/assets/js/fullcalendar/lang/en-gb.js new file mode 100644 index 0000000..ebd570d --- /dev/null +++ b/assets/js/fullcalendar/lang/en-gb.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("en-gb","en-GB",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("en-gb")}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/en-ie.js b/assets/js/fullcalendar/lang/en-ie.js new file mode 100644 index 0000000..1937a51 --- /dev/null +++ b/assets/js/fullcalendar/lang/en-ie.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}});return a}(),a.fullCalendar.lang("en-ie")}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/en-nz.js b/assets/js/fullcalendar/lang/en-nz.js new file mode 100644 index 0000000..ec70ad8 --- /dev/null +++ b/assets/js/fullcalendar/lang/en-nz.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("en-nz","en-NZ",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("en-nz")}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/es.js b/assets/js/fullcalendar/lang/es.js new file mode 100644 index 0000000..e20a545 --- /dev/null +++ b/assets/js/fullcalendar/lang/es.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),c="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),d=(b.defineLocale||b.lang).call(b,"es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(b,d){return/-MMM-/.test(d)?c[b.month()]:a[b.month()]},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return d}(),a.fullCalendar.datepickerLang("es","es",{closeText:"Cerrar",prevText:"<Ant",nextText:"Sig>",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("es",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo
                el día",eventLimitText:"más"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/fa.js b/assets/js/fullcalendar/lang/fa.js new file mode 100644 index 0000000..97dbd26 --- /dev/null +++ b/assets/js/fullcalendar/lang/fa.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},c={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"},d=(b.defineLocale||b.lang).call(b,"fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(a){return/بعد از ظهر/.test(a)},meridiem:function(a,b,c){return 12>a?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(a){return a.replace(/[۰-۹]/g,function(a){return c[a]}).replace(/،/g,",")},postformat:function(b){return b.replace(/\d/g,function(b){return a[b]}).replace(/,/g,"،")},ordinalParse:/\d{1,2}م/,ordinal:"%dم",week:{dow:6,doy:12}});return d}(),a.fullCalendar.datepickerLang("fa","fa",{closeText:"بستن",prevText:"<قبلی",nextText:"بعدی>",currentText:"امروز",monthNames:["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ی","د","س","چ","پ","ج","ش"],dayNamesMin:["ی","د","س","چ","پ","ج","ش"],weekHeader:"هف",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("fa",{buttonText:{month:"ماه",week:"هفته",day:"روز",list:"برنامه"},allDayText:"تمام روز",eventLimitText:function(a){return"بیش از "+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/fi.js b/assets/js/fullcalendar/lang/fi.js new file mode 100644 index 0000000..601943b --- /dev/null +++ b/assets/js/fullcalendar/lang/fi.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a,b,d,e){var f="";switch(d){case"s":return e?"muutaman sekunnin":"muutama sekunti";case"m":return e?"minuutin":"minuutti";case"mm":f=e?"minuutin":"minuuttia";break;case"h":return e?"tunnin":"tunti";case"hh":f=e?"tunnin":"tuntia";break;case"d":return e?"päivän":"päivä";case"dd":f=e?"päivän":"päivää";break;case"M":return e?"kuukauden":"kuukausi";case"MM":f=e?"kuukauden":"kuukautta";break;case"y":return e?"vuoden":"vuosi";case"yy":f=e?"vuoden":"vuotta"}return f=c(a,e)+" "+f}function c(a,b){return 10>a?b?e[a]:d[a]:a}var d="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),e=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",d[7],d[8],d[9]],f=(b.defineLocale||b.lang).call(b,"fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return f}(),a.fullCalendar.datepickerLang("fi","fi",{closeText:"Sulje",prevText:"«Edellinen",nextText:"Seuraava»",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"d.m.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("fi",{buttonText:{month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},allDayText:"Koko päivä",eventLimitText:"lisää"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/fr-ca.js b/assets/js/fullcalendar/lang/fr-ca.js new file mode 100644 index 0000000..3b0e298 --- /dev/null +++ b/assets/js/fullcalendar/lang/fr-ca.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(a){return a+(1===a?"er":"e")}});return a}(),a.fullCalendar.datepickerLang("fr-ca","fr-CA",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("fr-ca",{buttonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la
                journée",eventLimitText:"en plus"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/fr-ch.js b/assets/js/fullcalendar/lang/fr-ch.js new file mode 100644 index 0000000..b8c523d --- /dev/null +++ b/assets/js/fullcalendar/lang/fr-ch.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"fr-ch",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(a){return a+(1===a?"er":"e")},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("fr-ch","fr-CH",{closeText:"Fermer",prevText:"<Préc",nextText:"Suiv>",currentText:"Courant",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sm",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("fr-ch",{buttonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la
                journée",eventLimitText:"en plus"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/fr.js b/assets/js/fullcalendar/lang/fr.js new file mode 100644 index 0000000..f3c2eb8 --- /dev/null +++ b/assets/js/fullcalendar/lang/fr.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("fr","fr",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("fr",{buttonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la
                journée",eventLimitText:"en plus"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/he.js b/assets/js/fullcalendar/lang/he.js new file mode 100644 index 0000000..0612cc0 --- /dev/null +++ b/assets/js/fullcalendar/lang/he.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"he",{months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א_ב_ג_ד_ה_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[היום ב־]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[אתמול ב־]LT",lastWeek:"[ביום] dddd [האחרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(a){return 2===a?"שעתיים":a+" שעות"},d:"יום",dd:function(a){return 2===a?"יומיים":a+" ימים"},M:"חודש",MM:function(a){return 2===a?"חודשיים":a+" חודשים"},y:"שנה",yy:function(a){return 2===a?"שנתיים":a%10===0&&10!==a?a+" שנה":a+" שנים"}},meridiemParse:/אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,isPM:function(a){return/^(אחה"צ|אחרי הצהריים|בערב)$/.test(a)},meridiem:function(a,b,c){return 5>a?"לפנות בוקר":10>a?"בבוקר":12>a?c?'לפנה"צ':"לפני הצהריים":18>a?c?'אחה"צ':"אחרי הצהריים":"בערב"}});return a}(),a.fullCalendar.datepickerLang("he","he",{closeText:"סגור",prevText:"<הקודם",nextText:"הבא>",currentText:"היום",monthNames:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],monthNamesShort:["ינו","פבר","מרץ","אפר","מאי","יוני","יולי","אוג","ספט","אוק","נוב","דצמ"],dayNames:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],dayNamesShort:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],dayNamesMin:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("he",{defaultButtonText:{month:"חודש",week:"שבוע",day:"יום",list:"סדר יום"},weekNumberTitle:"שבוע",allDayText:"כל היום",eventLimitText:"אחר"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/hi.js b/assets/js/fullcalendar/lang/hi.js new file mode 100644 index 0000000..f9a1e9c --- /dev/null +++ b/assets/js/fullcalendar/lang/hi.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"},d=(b.defineLocale||b.lang).call(b,"hi",{months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm बजे",LLLL:"dddd, D MMMM YYYY, A h:mm बजे"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(b){return b.replace(/\d/g,function(b){return a[b]})},meridiemParse:/रात|सुबह|दोपहर|शाम/,meridiemHour:function(a,b){return 12===a&&(a=0),"रात"===b?4>a?a:a+12:"सुबह"===b?a:"दोपहर"===b?a>=10?a:a+12:"शाम"===b?a+12:void 0},meridiem:function(a,b,c){return 4>a?"रात":10>a?"सुबह":17>a?"दोपहर":20>a?"शाम":"रात"},week:{dow:0,doy:6}});return d}(),a.fullCalendar.datepickerLang("hi","hi",{closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून","जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],monthNamesShort:["जन","फर","मार्च","अप्रेल","मई","जून","जूलाई","अग","सित","अक्ट","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],dayNamesMin:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],weekHeader:"हफ्ता",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("hi",{buttonText:{month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},allDayText:"सभी दिन",eventLimitText:function(a){return"+अधिक "+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/hr.js b/assets/js/fullcalendar/lang/hr.js new file mode 100644 index 0000000..9ac4e7d --- /dev/null +++ b/assets/js/fullcalendar/lang/hr.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}var c=(b.defineLocale||b.lang).call(b,"hr",{months:{format:"siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:a,mm:a,h:a,hh:a,d:"dan",dd:a,M:"mjesec",MM:a,y:"godinu",yy:a},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return c}(),a.fullCalendar.datepickerLang("hr","hr",{closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("hr",{buttonText:{month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},allDayText:"Cijeli dan",eventLimitText:function(a){return"+ još "+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/hu.js b/assets/js/fullcalendar/lang/hu.js new file mode 100644 index 0000000..34ce7fe --- /dev/null +++ b/assets/js/fullcalendar/lang/hu.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a,b,c,d){var e=a;switch(c){case"s":return d||b?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(d||b?" perc":" perce");case"mm":return e+(d||b?" perc":" perce");case"h":return"egy"+(d||b?" óra":" órája");case"hh":return e+(d||b?" óra":" órája");case"d":return"egy"+(d||b?" nap":" napja");case"dd":return e+(d||b?" nap":" napja");case"M":return"egy"+(d||b?" hónap":" hónapja");case"MM":return e+(d||b?" hónap":" hónapja");case"y":return"egy"+(d||b?" év":" éve");case"yy":return e+(d||b?" év":" éve")}return""}function c(a){return(a?"":"[múlt] ")+"["+d[this.day()]+"] LT[-kor]"}var d="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" "),e=(b.defineLocale||b.lang).call(b,"hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(a){return"u"===a.charAt(1).toLowerCase()},meridiem:function(a,b,c){return 12>a?c===!0?"de":"DE":c===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return c.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return c.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return e}(),a.fullCalendar.datepickerLang("hu","hu",{closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),a.fullCalendar.lang("hu",{buttonText:{month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},allDayText:"Egész nap",eventLimitText:"további"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/id.js b/assets/js/fullcalendar/lang/id.js new file mode 100644 index 0000000..a11aa1b --- /dev/null +++ b/assets/js/fullcalendar/lang/id.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"siang"===b?a>=11?a:a+12:"sore"===b||"malam"===b?a+12:void 0},meridiem:function(a,b,c){return 11>a?"pagi":15>a?"siang":19>a?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return a}(),a.fullCalendar.datepickerLang("id","id",{closeText:"Tutup",prevText:"<mundur",nextText:"maju>",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("id",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayHtml:"Sehari
                penuh",eventLimitText:"lebih"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/is.js b/assets/js/fullcalendar/lang/is.js new file mode 100644 index 0000000..8a68dac --- /dev/null +++ b/assets/js/fullcalendar/lang/is.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a){return a%100===11?!0:a%10!==1}function c(b,c,d,e){var f=b+" ";switch(d){case"s":return c||e?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return c?"mínúta":"mínútu";case"mm":return a(b)?f+(c||e?"mínútur":"mínútum"):c?f+"mínúta":f+"mínútu";case"hh":return a(b)?f+(c||e?"klukkustundir":"klukkustundum"):f+"klukkustund";case"d":return c?"dagur":e?"dag":"degi";case"dd":return a(b)?c?f+"dagar":f+(e?"daga":"dögum"):c?f+"dagur":f+(e?"dag":"degi");case"M":return c?"mánuður":e?"mánuð":"mánuði";case"MM":return a(b)?c?f+"mánuðir":f+(e?"mánuði":"mánuðum"):c?f+"mánuður":f+(e?"mánuð":"mánuði");case"y":return c||e?"ár":"ári";case"yy":return a(b)?f+(c||e?"ár":"árum"):f+(c||e?"ár":"ári")}}var d=(b.defineLocale||b.lang).call(b,"is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:c,m:c,mm:c,h:"klukkustund",hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return d}(),a.fullCalendar.datepickerLang("is","is",{closeText:"Loka",prevText:"< Fyrri",nextText:"Næsti >",currentText:"Í dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd.mm.yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("is",{buttonText:{month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},allDayHtml:"Allan
                daginn",eventLimitText:"meira"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/it.js b/assets/js/fullcalendar/lang/it.js new file mode 100644 index 0000000..21ec787 --- /dev/null +++ b/assets/js/fullcalendar/lang/it.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"Do_Lu_Ma_Me_Gi_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?"tra":"in")+" "+a},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("it","it",{closeText:"Chiudi",prevText:"<Prec",nextText:"Succ>",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("it",{buttonText:{month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},allDayHtml:"Tutto il
                giorno",eventLimitText:function(a){return"+altri "+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/ja.js b/assets/js/fullcalendar/lang/ja.js new file mode 100644 index 0000000..3997e88 --- /dev/null +++ b/assets/js/fullcalendar/lang/ja.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"Ah時m分s秒",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah時m分",LLLL:"YYYY年M月D日Ah時m分 dddd"},meridiemParse:/午前|午後/i,isPM:function(a){return"午後"===a},meridiem:function(a,b,c){return 12>a?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},ordinalParse:/\d{1,2}日/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"日";default:return a}},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}});return a}(),a.fullCalendar.datepickerLang("ja","ja",{closeText:"閉じる",prevText:"<前",nextText:"次>",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),a.fullCalendar.lang("ja",{buttonText:{month:"月",week:"週",day:"日",list:"予定リスト"},allDayText:"終日",eventLimitText:function(a){return"他 "+a+" 件"}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/ko.js b/assets/js/fullcalendar/lang/ko.js new file mode 100644 index 0000000..7cd235d --- /dev/null +++ b/assets/js/fullcalendar/lang/ko.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h시 m분",LTS:"A h시 m분 s초",L:"YYYY.MM.DD",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 A h시 m분",LLLL:"YYYY년 MMMM D일 dddd A h시 m분"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇 초",ss:"%d초",m:"일분",mm:"%d분",h:"한 시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한 달",MM:"%d달",y:"일 년",yy:"%d년"},ordinalParse:/\d{1,2}일/,ordinal:"%d일",meridiemParse:/오전|오후/,isPM:function(a){return"오후"===a},meridiem:function(a,b,c){return 12>a?"오전":"오후"}});return a}(),a.fullCalendar.datepickerLang("ko","ko",{closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"}),a.fullCalendar.lang("ko",{buttonText:{month:"월",week:"주",day:"일",list:"일정목록"},allDayText:"종일",eventLimitText:"개"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/lt.js b/assets/js/fullcalendar/lang/lt.js new file mode 100644 index 0000000..2389bf6 --- /dev/null +++ b/assets/js/fullcalendar/lang/lt.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a,b,c,d){return b?"kelios sekundės":d?"kelių sekundžių":"kelias sekundes"}function c(a,b,c,d){return b?e(c)[0]:d?e(c)[1]:e(c)[2]}function d(a){return a%10===0||a>10&&20>a}function e(a){return g[a].split("_")}function f(a,b,f,g){var h=a+" ";return 1===a?h+c(a,b,f[0],g):b?h+(d(a)?e(f)[1]:e(f)[0]):g?h+e(f)[1]:h+(d(a)?e(f)[1]:e(f)[2])}var g={m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"},h=(b.defineLocale||b.lang).call(b,"lt",{months:{format:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis".split("_")},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:a,m:c,mm:f,h:c,hh:f,d:c,dd:f,M:c,MM:f,y:c,yy:f},ordinalParse:/\d{1,2}-oji/,ordinal:function(a){return a+"-oji"},week:{dow:1,doy:4}});return h}(),a.fullCalendar.datepickerLang("lt","lt",{closeText:"Uždaryti",prevText:"<Atgal",nextText:"Pirmyn>",currentText:"Šiandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","šeš"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Še"],weekHeader:"SAV",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),a.fullCalendar.lang("lt",{buttonText:{month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},allDayText:"Visą dieną",eventLimitText:"daugiau"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/lv.js b/assets/js/fullcalendar/lang/lv.js new file mode 100644 index 0000000..b27c6ff --- /dev/null +++ b/assets/js/fullcalendar/lang/lv.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a,b,c){return c?b%10===1&&11!==b?a[2]:a[3]:b%10===1&&11!==b?a[0]:a[1]}function c(b,c,d){return b+" "+a(f[d],b,c)}function d(b,c,d){return a(f[d],b,c)}function e(a,b){return b?"dažas sekundes":"dažām sekundēm"}var f={m:"minūtes_minūtēm_minūte_minūtes".split("_"),mm:"minūtes_minūtēm_minūte_minūtes".split("_"),h:"stundas_stundām_stunda_stundas".split("_"),hh:"stundas_stundām_stunda_stundas".split("_"),d:"dienas_dienām_diena_dienas".split("_"),dd:"dienas_dienām_diena_dienas".split("_"),M:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),MM:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")},g=(b.defineLocale||b.lang).call(b,"lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"pēc %s",past:"pirms %s",s:e,m:d,mm:c,h:d,hh:c,d:d,dd:c,M:d,MM:c,y:d,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return g}(),a.fullCalendar.datepickerLang("lv","lv",{closeText:"Aizvērt",prevText:"Iepr.",nextText:"Nāk.",currentText:"Šodien",monthNames:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],dayNames:["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Ned.",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("lv",{buttonText:{month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},allDayText:"Visu dienu",eventLimitText:function(a){return"+vēl "+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/nb.js b/assets/js/fullcalendar/lang/nb.js new file mode 100644 index 0000000..2996958 --- /dev/null +++ b/assets/js/fullcalendar/lang/nb.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("nb","nb",{closeText:"Lukk",prevText:"«Forrige",nextText:"Neste»",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("nb",{buttonText:{month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"til"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/nl.js b/assets/js/fullcalendar/lang/nl.js new file mode 100644 index 0000000..52a3549 --- /dev/null +++ b/assets/js/fullcalendar/lang/nl.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),c="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),d=(b.defineLocale||b.lang).call(b,"nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(b,d){return/-MMM-/.test(d)?c[b.month()]:a[b.month()]},monthsParseExact:!0,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}});return d}(),a.fullCalendar.datepickerLang("nl","nl",{closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("nl",{buttonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/pl.js b/assets/js/fullcalendar/lang/pl.js new file mode 100644 index 0000000..7fd6f98 --- /dev/null +++ b/assets/js/fullcalendar/lang/pl.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a){return 5>a%10&&a%10>1&&~~(a/10)%10!==1}function c(b,c,d){var e=b+" ";switch(d){case"m":return c?"minuta":"minutę";case"mm":return e+(a(b)?"minuty":"minut");case"h":return c?"godzina":"godzinę";case"hh":return e+(a(b)?"godziny":"godzin");case"MM":return e+(a(b)?"miesiące":"miesięcy");case"yy":return e+(a(b)?"lata":"lat")}}var d="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),e="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_"),f=(b.defineLocale||b.lang).call(b,"pl",{months:function(a,b){return""===b?"("+e[a.month()]+"|"+d[a.month()]+")":/D MMMM/.test(b)?e[a.month()]:d[a.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"nie_pon_wt_śr_czw_pt_sb".split("_"),weekdaysMin:"Nd_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:c,mm:c,h:c,hh:c,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:c,y:"rok",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return f}(),a.fullCalendar.datepickerLang("pl","pl",{closeText:"Zamknij",prevText:"<Poprzedni",nextText:"Następny>",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("pl",{buttonText:{month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},allDayText:"Cały dzień",eventLimitText:"więcej"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/pt-br.js b/assets/js/fullcalendar/lang/pt-br.js new file mode 100644 index 0000000..ad64773 --- /dev/null +++ b/assets/js/fullcalendar/lang/pt-br.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"pt-br",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"poucos segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"});return a}(),a.fullCalendar.datepickerLang("pt-br","pt-BR",{closeText:"Fechar",prevText:"<Anterior",nextText:"Próximo>",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("pt-br",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},allDayText:"dia inteiro",eventLimitText:function(a){return"mais +"+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/pt.js b/assets/js/fullcalendar/lang/pt.js new file mode 100644 index 0000000..652ffc5 --- /dev/null +++ b/assets/js/fullcalendar/lang/pt.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"pt",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("pt","pt",{closeText:"Fechar",prevText:"Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("pt",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},allDayText:"Todo o dia",eventLimitText:"mais"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/ro.js b/assets/js/fullcalendar/lang/ro.js new file mode 100644 index 0000000..69859ac --- /dev/null +++ b/assets/js/fullcalendar/lang/ro.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a,b,c){var d={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},e=" ";return(a%100>=20||a>=100&&a%100===0)&&(e=" de "),a+e+d[c]}var c=(b.defineLocale||b.lang).call(b,"ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:a,h:"o oră",hh:a,d:"o zi",dd:a,M:"o lună",MM:a,y:"un an",yy:a},week:{dow:1,doy:7}});return c}(),a.fullCalendar.datepickerLang("ro","ro",{closeText:"Închide",prevText:"« Luna precedentă",nextText:"Luna următoare »",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("ro",{buttonText:{prev:"precedentă",next:"următoare",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},allDayText:"Toată ziua",eventLimitText:function(a){return"+alte "+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/ru.js b/assets/js/fullcalendar/lang/ru.js new file mode 100644 index 0000000..0b6db7e --- /dev/null +++ b/assets/js/fullcalendar/lang/ru.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(b,c,d){var e={mm:c?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return"m"===d?c?"минута":"минуту":b+" "+a(e[d],+b)}var d=[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[йя]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i],e=(b.defineLocale||b.lang).call(b,"ru",{months:{format:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_"),standalone:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_")},monthsShort:{format:"янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.".split("_"),standalone:"янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.".split("_")},weekdays:{standalone:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),format:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_"),isFormat:/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/},weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:d,longMonthsParse:d,shortMonthsParse:d,monthsRegex:/^(сентябр[яь]|октябр[яь]|декабр[яь]|феврал[яь]|январ[яь]|апрел[яь]|августа?|ноябр[яь]|сент\.|февр\.|нояб\.|июнь|янв.|июль|дек.|авг.|апр.|марта|мар[.т]|окт.|июн[яь]|июл[яь]|ма[яй])/i,monthsShortRegex:/^(сентябр[яь]|октябр[яь]|декабр[яь]|феврал[яь]|январ[яь]|апрел[яь]|августа?|ноябр[яь]|сент\.|февр\.|нояб\.|июнь|янв.|июль|дек.|авг.|апр.|марта|мар[.т]|окт.|июн[яь]|июл[яь]|ма[яй])/i,monthsStrictRegex:/^(сентябр[яь]|октябр[яь]|декабр[яь]|феврал[яь]|январ[яь]|апрел[яь]|августа?|ноябр[яь]|марта?|июн[яь]|июл[яь]|ма[яй])/i,monthsShortStrictRegex:/^(нояб\.|февр\.|сент\.|июль|янв\.|июн[яь]|мар[.т]|авг\.|апр\.|окт\.|дек\.|ма[яй])/i,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Сегодня в] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT";switch(this.day()){case 0:return"[В следующее] dddd [в] LT";case 1:case 2:case 4:return"[В следующий] dddd [в] LT";case 3:case 5:case 6:return"[В следующую] dddd [в] LT"}},lastWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT";switch(this.day()){case 0:return"[В прошлое] dddd [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:c,mm:c,h:"час",hh:c,d:"день",dd:c,M:"месяц",MM:c,y:"год",yy:c},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(a){return/^(дня|вечера)$/.test(a)},meridiem:function(a,b,c){return 4>a?"ночи":12>a?"утра":17>a?"дня":"вечера"},ordinalParse:/\d{1,2}-(й|го|я)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":return a+"-й";case"D":return a+"-го";case"w":case"W":return a+"-я";default:return a}},week:{dow:1,doy:7}});return e}(),a.fullCalendar.datepickerLang("ru","ru",{closeText:"Закрыть",prevText:"<Пред",nextText:"След>",currentText:"Сегодня",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],dayNamesMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Нед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("ru",{buttonText:{month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},allDayText:"Весь день",eventLimitText:function(a){return"+ ещё "+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/sk.js b/assets/js/fullcalendar/lang/sk.js new file mode 100644 index 0000000..991ca49 --- /dev/null +++ b/assets/js/fullcalendar/lang/sk.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a){return a>1&&5>a}function c(b,c,d,e){var f=b+" ";switch(d){case"s":return c||e?"pár sekúnd":"pár sekundami";case"m":return c?"minúta":e?"minútu":"minútou";case"mm":return c||e?f+(a(b)?"minúty":"minút"):f+"minútami";case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(a(b)?"hodiny":"hodín"):f+"hodinami";case"d":return c||e?"deň":"dňom";case"dd":return c||e?f+(a(b)?"dni":"dní"):f+"dňami";case"M":return c||e?"mesiac":"mesiacom";case"MM":return c||e?f+(a(b)?"mesiace":"mesiacov"):f+"mesiacmi";case"y":return c||e?"rok":"rokom";case"yy":return c||e?f+(a(b)?"roky":"rokov"):f+"rokmi"}}var d="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),e="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_"),f=(b.defineLocale||b.lang).call(b,"sk",{months:d,monthsShort:e,weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return f}(),a.fullCalendar.datepickerLang("sk","sk",{closeText:"Zavrieť",prevText:"<Predchádzajúci",nextText:"Nasledujúci>",currentText:"Dnes",monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Št","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("sk",{buttonText:{month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},allDayText:"Celý deň",eventLimitText:function(a){return"+ďalšie: "+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/sl.js b/assets/js/fullcalendar/lang/sl.js new file mode 100644 index 0000000..619142c --- /dev/null +++ b/assets/js/fullcalendar/lang/sl.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a,b,c,d){var e=a+" ";switch(c){case"s":return b||d?"nekaj sekund":"nekaj sekundami";case"m":return b?"ena minuta":"eno minuto";case"mm":return e+=1===a?b?"minuta":"minuto":2===a?b||d?"minuti":"minutama":5>a?b||d?"minute":"minutami":b||d?"minut":"minutami";case"h":return b?"ena ura":"eno uro";case"hh":return e+=1===a?b?"ura":"uro":2===a?b||d?"uri":"urama":5>a?b||d?"ure":"urami":b||d?"ur":"urami";case"d":return b||d?"en dan":"enim dnem";case"dd":return e+=1===a?b||d?"dan":"dnem":2===a?b||d?"dni":"dnevoma":b||d?"dni":"dnevi";case"M":return b||d?"en mesec":"enim mesecem";case"MM":return e+=1===a?b||d?"mesec":"mesecem":2===a?b||d?"meseca":"mesecema":5>a?b||d?"mesece":"meseci":b||d?"mesecev":"meseci";case"y":return b||d?"eno leto":"enim letom";case"yy":return e+=1===a?b||d?"leto":"letom":2===a?b||d?"leti":"letoma":5>a?b||d?"leta":"leti":b||d?"let":"leti"}}var c=(b.defineLocale||b.lang).call(b,"sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prejšnjo] [nedeljo] [ob] LT";case 3:return"[prejšnjo] [sredo] [ob] LT";case 6:return"[prejšnjo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"pred %s",s:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return c}(),a.fullCalendar.datepickerLang("sl","sl",{closeText:"Zapri",prevText:"<Prejšnji",nextText:"Naslednji>",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","Če","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("sl",{buttonText:{month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},allDayText:"Ves dan",eventLimitText:"več"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/sr-cyrl.js b/assets/js/fullcalendar/lang/sr-cyrl.js new file mode 100644 index 0000000..08e8087 --- /dev/null +++ b/assets/js/fullcalendar/lang/sr-cyrl.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(b,c,d){var e=a.words[d];return 1===d.length?c?e[0]:e[1]:b+" "+a.correctGrammaticalCase(b,e)}},c=(b.defineLocale||b.lang).call(b,"sr-cyrl",{months:"јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар".split("_"),monthsShort:"јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.".split("_"),monthsParseExact:!0,weekdays:"недеља_понедељак_уторак_среда_четвртак_петак_субота".split("_"),weekdaysShort:"нед._пон._уто._сре._чет._пет._суб.".split("_"),weekdaysMin:"не_по_ут_ср_че_пе_су".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var a=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",m:a.translate,mm:a.translate,h:a.translate,hh:a.translate,d:"дан",dd:a.translate,M:"месец",MM:a.translate,y:"годину",yy:a.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return c}(),a.fullCalendar.datepickerLang("sr-cyrl","sr",{closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("sr-cyrl",{buttonText:{month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(a){return"+ још "+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/sr.js b/assets/js/fullcalendar/lang/sr.js new file mode 100644 index 0000000..3cc4a57 --- /dev/null +++ b/assets/js/fullcalendar/lang/sr.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(b,c,d){var e=a.words[d];return 1===d.length?c?e[0]:e[1]:b+" "+a.correctGrammaticalCase(b,e)}},c=(b.defineLocale||b.lang).call(b,"sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){var a=["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:a.translate,mm:a.translate,h:a.translate,hh:a.translate,d:"dan",dd:a.translate,M:"mesec",MM:a.translate,y:"godinu",yy:a.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return c}(),a.fullCalendar.datepickerLang("sr","sr",{closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("sr",{buttonText:{month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(a){return"+ још "+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/sv.js b/assets/js/fullcalendar/lang/sv.js new file mode 100644 index 0000000..95abfaf --- /dev/null +++ b/assets/js/fullcalendar/lang/sv.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"[På] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"e":1===b?"a":2===b?"a":"e";return a+c},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("sv","sv",{closeText:"Stäng",prevText:"«Förra",nextText:"Nästa»",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","Må","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("sv",{buttonText:{month:"Månad",week:"Vecka",day:"Dag",list:"Program"},allDayText:"Heldag",eventLimitText:"till"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/th.js b/assets/js/fullcalendar/lang/th.js new file mode 100644 index 0000000..bd37235 --- /dev/null +++ b/assets/js/fullcalendar/lang/th.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา".split("_"),monthsParseExact:!0,weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H นาฬิกา m นาที",LTS:"H นาฬิกา m นาที s วินาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H นาฬิกา m นาที",LLLL:"วันddddที่ D MMMM YYYY เวลา H นาฬิกา m นาที"},meridiemParse:/ก่อนเที่ยง|หลังเที่ยง/,isPM:function(a){return"หลังเที่ยง"===a},meridiem:function(a,b,c){return 12>a?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}});return a}(),a.fullCalendar.datepickerLang("th","th",{closeText:"ปิด",prevText:"« ย้อน",nextText:"ถัดไป »",currentText:"วันนี้",monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthNamesShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("th",{buttonText:{month:"เดือน",week:"สัปดาห์",day:"วัน",list:"แผนงาน"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/tr.js b/assets/js/fullcalendar/lang/tr.js new file mode 100644 index 0000000..413d5c5 --- /dev/null +++ b/assets/js/fullcalendar/lang/tr.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"},c=(b.defineLocale||b.lang).call(b,"tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(b){if(0===b)return b+"'ıncı";var c=b%10,d=b%100-c,e=b>=100?100:null;return b+(a[c]||a[d]||a[e])},week:{dow:1,doy:7}});return c}(),a.fullCalendar.datepickerLang("tr","tr",{closeText:"kapat",prevText:"<geri",nextText:"ileri>",currentText:"bugün",monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("tr",{buttonText:{next:"ileri",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},allDayText:"Tüm gün",eventLimitText:"daha fazla"})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/uk.js b/assets/js/fullcalendar/lang/uk.js new file mode 100644 index 0000000..ccb756a --- /dev/null +++ b/assets/js/fullcalendar/lang/uk.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";function a(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(b,c,d){var e={mm:c?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:c?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return"m"===d?c?"хвилина":"хвилину":"h"===d?c?"година":"годину":b+" "+a(e[d],+b)}function d(a,b){var c={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")},d=/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(b)?"genitive":"nominative";return c[d][a.day()]}function e(a){return function(){return a+"о"+(11===this.hours()?"б":"")+"] LT"}}var f=(b.defineLocale||b.lang).call(b,"uk",{months:{format:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_"),standalone:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_")},monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:d,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., HH:mm",LLLL:"dddd, D MMMM YYYY р., HH:mm"},calendar:{sameDay:e("[Сьогодні "),nextDay:e("[Завтра "),lastDay:e("[Вчора "),nextWeek:e("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return e("[Минулої] dddd [").call(this);case 1:case 2:case 4:return e("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",m:c,mm:c,h:"годину",hh:c,d:"день",dd:c,M:"місяць",MM:c,y:"рік",yy:c},meridiemParse:/ночі|ранку|дня|вечора/,isPM:function(a){return/^(дня|вечора)$/.test(a)},meridiem:function(a,b,c){return 4>a?"ночі":12>a?"ранку":17>a?"дня":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a+"-й";case"D":return a+"-го";default:return a}},week:{dow:1,doy:7}});return f}(),a.fullCalendar.datepickerLang("uk","uk",{closeText:"Закрити",prevText:"<",nextText:">",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],dayNames:["неділя","понеділок","вівторок","середа","четвер","п’ятниця","субота"],dayNamesShort:["нед","пнд","вів","срд","чтв","птн","сбт"],dayNamesMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("uk",{buttonText:{month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},allDayText:"Увесь день",eventLimitText:function(a){return"+ще "+a+"..."}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/vi.js b/assets/js/fullcalendar/lang/vi.js new file mode 100644 index 0000000..ec2369b --- /dev/null +++ b/assets/js/fullcalendar/lang/vi.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(a){return/^ch$/i.test(a)},meridiem:function(a,b,c){return 12>a?c?"sa":"SA":c?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}});return a}(),a.fullCalendar.datepickerLang("vi","vi",{closeText:"Đóng",prevText:"<Trước",nextText:"Tiếp>",currentText:"Hôm nay",monthNames:["Tháng Một","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.fullCalendar.lang("vi",{buttonText:{month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},allDayText:"Cả ngày",eventLimitText:function(a){return"+ thêm "+a}})}); \ No newline at end of file diff --git a/assets/js/fullcalendar/lang/zh-cn.js b/assets/js/fullcalendar/lang/zh-cn.js new file mode 100644 index 0000000..78096fd --- /dev/null +++ b/assets/js/fullcalendar/lang/zh-cn.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){!function(){"use strict";var a=(b.defineLocale||b.lang).call(b,"zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah点mm分",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日Ah点mm分",LLLL:"YYYY年MMMD日ddddAh点mm分",l:"YYYY-MM-DD",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日Ah点mm分",llll:"YYYY年MMMD日ddddAh点mm分"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上午"===b?a:"下午"===b||"晚上"===b?a+12:a>=11?a:a+12},meridiem:function(a,b,c){var d=100*a+b;return 600>d?"凌晨":900>d?"早上":1130>d?"上午":1230>d?"中午":1800>d?"下午":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var a,c;return a=b().startOf("week"),c=this.diff(a,"days")>=7?"[下]":"[本]",0===this.minutes()?c+"dddAh点整":c+"dddAh点mm"},lastWeek:function(){var a,c;return a=b().startOf("week"),c=this.unix()=11?a:a+12:"下午"===b||"晚上"===b?a+12:void 0},meridiem:function(a,b,c){var d=100*a+b;return 900>d?"早上":1130>d?"上午":1230>d?"中午":1800>d?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(日|月|週)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"日";case"M":return a+"月";case"w":case"W":return a+"週";default:return a}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",m:"1分鐘",mm:"%d分鐘",h:"1小時",hh:"%d小時",d:"1天",dd:"%d天",M:"1個月",MM:"%d個月",y:"1年",yy:"%d年"}});return a}(),a.fullCalendar.datepickerLang("zh-tw","zh-TW",{closeText:"關閉",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),a.fullCalendar.lang("zh-tw",{buttonText:{month:"月",week:"週",day:"天",list:"待辦事項"},allDayText:"全天",eventLimitText:"更多"})}); \ No newline at end of file diff --git a/assets/js/home.js b/assets/js/home.js new file mode 100644 index 0000000..296df0f --- /dev/null +++ b/assets/js/home.js @@ -0,0 +1,91 @@ +const amount = 18; +let offset = 0; +let category = $('#social-post-container .sort-list-filter > li > a.active').attr('data-filter'); + +$(window).load(function () { + $portfolio_selectors = $('#social-post-container .sort-list-filter >li>a'); + if ($portfolio_selectors != 'undefined') { + $portfolio = $('.sort-list-items'); + $portfolio.isotope({ + itemSelector: 'li', + layoutMode: 'masonry' + }); + $portfolio_selectors.on('click', function () { + $portfolio_selectors.removeClass('active'); + $(this).addClass('active'); + const selector = $(this).attr('data-filter'); + // if(selector === '*') { + offset = 0; + $('#load-more-button').fadeOut(); + $portfolio.isotope('remove', $('#social-posts > li')); + category = selector; + loadPosts(true); + // autoHeight(); + // } else if(selector === 'twitter') { + // + // } + $portfolio.isotope({filter: selector}).isotope('layout'); + return false; + }); + } + loadPosts(true); +}); + +$(document).ready(function () { +}); + +function loadPosts(onLoad) { + // const category = $('#social-post-container .sort-list-filter > li > a.active').attr('data-filter'); + $.ajax({ + url: "http://192.168.178.39/main/getPosts", + data: { + amount: amount, + offset: offset, + category: category + }, + beforeSend: function () { + $('#load-more-button').html($('#load-more-button').attr('data-loading')); + }, + success: function (data) { + const $items = $(data); + console.log(data); + if(onLoad) { + // $('#social-posts').isotope('insert', $items); + $('#social-posts').append($items) + .isotope('appended', $items); + $('#load-more-button').fadeIn(); + } else { + $('#social-posts').append($items) + .isotope('appended', $items); + } + $('#load-more-button').html($('#load-more-button').attr('data-load')); + autoHeight(); + $('#social-posts').isotope({filter: '*'}).isotope('layout'); + // $('#social-posts-list .social-post-item').each(function () { + // $(this).css('height', $(this).outerHeight()); + // }); + offset += 1; + // data = ' '; + if(data === ' ') { + $('#load-more-button').fadeOut().delay(1000).remove(); + $('#social-post-container').parent().append('
                ' + $('#social-post-container').attr('data-error-msg') + '
                '); + } + } + }); +} + +function autoHeight() { + $('.sort-list-item').each(function () { + $(this).css('height', $('.item-inner', this).outerHeight() + 40); + }); +} + +$('#main-slider').on('swiperight', function () { + $('#main-slider').carousel('prev'); +}); + +$('#main-slider').on('swipeleft', function () { + $('#main-slider').carousel('next'); +}); + +addReadMoreBtns(); \ No newline at end of file diff --git a/assets/js/images/drop-horz.svg b/assets/js/images/drop-horz.svg new file mode 100644 index 0000000..ed091cb --- /dev/null +++ b/assets/js/images/drop-horz.svg @@ -0,0 +1,34 @@ + + + + + + + \ No newline at end of file diff --git a/assets/js/images/drop-vert-above.svg b/assets/js/images/drop-vert-above.svg new file mode 100644 index 0000000..69902fe --- /dev/null +++ b/assets/js/images/drop-vert-above.svg @@ -0,0 +1,34 @@ + + + + + + + \ No newline at end of file diff --git a/assets/js/images/drop-vert-below.svg b/assets/js/images/drop-vert-below.svg new file mode 100644 index 0000000..a2553fd --- /dev/null +++ b/assets/js/images/drop-vert-below.svg @@ -0,0 +1,34 @@ + + + + + + + \ No newline at end of file diff --git a/assets/js/images/icons.woff b/assets/js/images/icons.woff new file mode 100644 index 0000000..9dc5f33 Binary files /dev/null and b/assets/js/images/icons.woff differ diff --git a/assets/js/images/video.svg b/assets/js/images/video.svg new file mode 100644 index 0000000..403690b --- /dev/null +++ b/assets/js/images/video.svg @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/assets/js/lib/autolist.min.js b/assets/js/lib/autolist.min.js new file mode 100644 index 0000000..17686b7 --- /dev/null +++ b/assets/js/lib/autolist.min.js @@ -0,0 +1 @@ +!function(e,t){"use strict";"object"==typeof module?module.exports=t:"function"==typeof define&&define.amd?define(t):e.AutoList=t}(this,function(e){var t=e.Extension.extend({name:"autolist",init:function(){this.subscribe("editableInput",this.onInput.bind(this))},onInput:function(e){var t=this.base.getSelectedParentElement().textContent;/1\.\s/.test(t)&&this.base.getExtensionByName("orderedlist")?(this.base.execAction("delete"),this.base.execAction("delete"),this.base.execAction("delete"),this.base.execAction("insertorderedlist")):/\*\s/.test(t)&&this.base.getExtensionByName("unorderedlist")&&(this.base.execAction("delete"),this.base.execAction("delete"),this.base.execAction("insertunorderedlist"))}});return t}("function"==typeof require?require("medium-editor"):MediumEditor)); diff --git a/assets/js/lib/bootstrap-datetimepicker.min.js b/assets/js/lib/bootstrap-datetimepicker.min.js new file mode 100644 index 0000000..c204d7c --- /dev/null +++ b/assets/js/lib/bootstrap-datetimepicker.min.js @@ -0,0 +1,217 @@ +/*! version : 4.17.43 + ========================================================= + bootstrap-datetimejs + https://github.com/Eonasdan/bootstrap-datetimepicker + Copyright (c) 2015 Jonathan Peterson + ========================================================= + */ +/* + The MIT License (MIT) + + Copyright (c) 2015 Jonathan Peterson + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + */ +/*global define:false */ +/*global exports:false */ +/*global require:false */ +/*global jQuery:false */ +/*global moment:false */ +!function(a){"use strict";if("function"==typeof define&&define.amd) +// AMD is used - Register as an anonymous module. +define(["jquery.min","moment"],a);else if("object"==typeof exports)module.exports=a(require("jquery"),require("moment"));else{ +// Neither AMD nor CommonJS used. Use global variables. +if("undefined"==typeof jQuery)throw"bootstrap-datetimepicker requires jQuery to be loaded first";if("undefined"==typeof moment)throw"bootstrap-datetimepicker requires Moment.js to be loaded first";a(jQuery,moment)}}(function(a,b){"use strict";if(!b)throw new Error("bootstrap-datetimepicker requires Moment.js to be loaded first");var c=function(c,d){var e,f,g,h,i,j,k,l={},m=!0,n=!1,o=!1,p=0,q=[{clsName:"days",navFnc:"M",navStep:1},{clsName:"months",navFnc:"y",navStep:1},{clsName:"years",navFnc:"y",navStep:10},{clsName:"decades",navFnc:"y",navStep:100}],r=["days","months","years","decades"],s=["top","bottom","auto"],t=["left","right","auto"],u=["default","top","bottom"],v={up:38,38:"up",down:40,40:"down",left:37,37:"left",right:39,39:"right",tab:9,9:"tab",escape:27,27:"escape",enter:13,13:"enter",pageUp:33,33:"pageUp",pageDown:34,34:"pageDown",shift:16,16:"shift",control:17,17:"control",space:32,32:"space",t:84,84:"t",delete:46,46:"delete"},w={},/******************************************************************************** + * + * Private functions + * + ********************************************************************************/ +x=function(){return void 0!==b.tz&&void 0!==d.timeZone&&null!==d.timeZone&&""!==d.timeZone},y=function(a){var c;return c=void 0===a||null===a?b():x()?b.tz(a,j,d.useStrict,d.timeZone):b(a,j,d.useStrict),x()&&c.tz(d.timeZone),c},z=function(a){if("string"!=typeof a||a.length>1)throw new TypeError("isEnabled expects a single character string parameter");switch(a){case"y":return i.indexOf("Y")!==-1;case"M":return i.indexOf("M")!==-1;case"d":return i.toLowerCase().indexOf("d")!==-1;case"h":case"H":return i.toLowerCase().indexOf("h")!==-1;case"m":return i.indexOf("m")!==-1;case"s":return i.indexOf("s")!==-1;default:return!1}},A=function(){return z("h")||z("m")||z("s")},B=function(){return z("y")||z("M")||z("d")},C=function(){var b=a("").append(a("").append(a("").addClass("prev").attr("data-action","previous").append(a("").addClass(d.icons.previous))).append(a("").addClass("picker-switch").attr("data-action","pickerSwitch").attr("colspan",d.calendarWeeks?"6":"5")).append(a("").addClass("next").attr("data-action","next").append(a("").addClass(d.icons.next)))),c=a("").append(a("").append(a("").attr("colspan",d.calendarWeeks?"8":"7")));return[a("
                ").addClass("datepicker-days").append(a("").addClass("table-condensed").append(b).append(a(""))),a("
                ").addClass("datepicker-months").append(a("
                ").addClass("table-condensed").append(b.clone()).append(c.clone())),a("
                ").addClass("datepicker-years").append(a("
                ").addClass("table-condensed").append(b.clone()).append(c.clone())),a("
                ").addClass("datepicker-decades").append(a("
                ").addClass("table-condensed").append(b.clone()).append(c.clone()))]},D=function(){var b=a(""),c=a(""),e=a("");return z("h")&&(b.append(a(""}var d,e,f,g,h,k,l,m,n=this,o=n._id,p=0;for(m=n.settings.origin,d=c(m),d.push({text:tinymce.translate("No color"),color:"transparent"}),f='
                ").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementHour}).addClass("btn").attr("data-action","incrementHours").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-hour").attr({"data-time-component":"hours",title:d.tooltips.pickHour}).attr("data-action","showHours"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementHour}).addClass("btn").attr("data-action","decrementHours").append(a("").addClass(d.icons.down))))),z("m")&&(z("h")&&(b.append(a("").addClass("separator")),c.append(a("").addClass("separator").html(":")),e.append(a("").addClass("separator"))),b.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementMinute}).addClass("btn").attr("data-action","incrementMinutes").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-minute").attr({"data-time-component":"minutes",title:d.tooltips.pickMinute}).attr("data-action","showMinutes"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementMinute}).addClass("btn").attr("data-action","decrementMinutes").append(a("").addClass(d.icons.down))))),z("s")&&(z("m")&&(b.append(a("").addClass("separator")),c.append(a("").addClass("separator").html(":")),e.append(a("").addClass("separator"))),b.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementSecond}).addClass("btn").attr("data-action","incrementSeconds").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-second").attr({"data-time-component":"seconds",title:d.tooltips.pickSecond}).attr("data-action","showSeconds"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementSecond}).addClass("btn").attr("data-action","decrementSeconds").append(a("").addClass(d.icons.down))))),h||(b.append(a("").addClass("separator")),c.append(a("").append(a("").addClass("separator"))),a("
                ").addClass("timepicker-picker").append(a("").addClass("table-condensed").append([b,c,e]))},E=function(){var b=a("
                ").addClass("timepicker-hours").append(a("
                ").addClass("table-condensed")),c=a("
                ").addClass("timepicker-minutes").append(a("
                ").addClass("table-condensed")),d=a("
                ").addClass("timepicker-seconds").append(a("
                ").addClass("table-condensed")),e=[D()];return z("h")&&e.push(b),z("m")&&e.push(c),z("s")&&e.push(d),e},F=function(){var b=[];return d.showTodayButton&&b.push(a("\s*$/g,At={option:[1,""],legend:[1,"
                ","
                "],area:[1,"",""],param:[1,"",""],thead:[1,"
                ").append(a("").attr({"data-action":"today",title:d.tooltips.today}).append(a("").addClass(d.icons.today)))),!d.sideBySide&&B()&&A()&&b.push(a("").append(a("").attr({"data-action":"togglePicker",title:d.tooltips.selectTime}).append(a("").addClass(d.icons.time)))),d.showClear&&b.push(a("").append(a("").attr({"data-action":"clear",title:d.tooltips.clear}).append(a("").addClass(d.icons.clear)))),d.showClose&&b.push(a("").append(a("").attr({"data-action":"close",title:d.tooltips.close}).append(a("").addClass(d.icons.close)))),a("").addClass("table-condensed").append(a("").append(a("").append(b)))},G=function(){var b=a("
                ").addClass("bootstrap-datetimepicker-widget dropdown-menu"),c=a("
                ").addClass("datepicker").append(C()),e=a("
                ").addClass("timepicker").append(E()),f=a("
                  ").addClass("list-unstyled"),g=a("
                • ").addClass("picker-switch"+(d.collapse?" accordion-toggle":"")).append(F());return d.inline&&b.removeClass("dropdown-menu"),h&&b.addClass("usetwentyfour"),z("s")&&!h&&b.addClass("wider"),d.sideBySide&&B()&&A()?(b.addClass("timepicker-sbs"),"top"===d.toolbarPlacement&&b.append(g),b.append(a("
                  ").addClass("row").append(c.addClass("col-md-6")).append(e.addClass("col-md-6"))),"bottom"===d.toolbarPlacement&&b.append(g),b):("top"===d.toolbarPlacement&&f.append(g),B()&&f.append(a("
                • ").addClass(d.collapse&&A()?"collapse in":"").append(c)),"default"===d.toolbarPlacement&&f.append(g),A()&&f.append(a("
                • ").addClass(d.collapse&&B()?"collapse":"").append(e)),"bottom"===d.toolbarPlacement&&f.append(g),b.append(f))},H=function(){var b,e={};return b=c.is("input")||d.inline?c.data():c.find("input").data(),b.dateOptions&&b.dateOptions instanceof Object&&(e=a.extend(!0,e,b.dateOptions)),a.each(d,function(a){var c="date"+a.charAt(0).toUpperCase()+a.slice(1);void 0!==b[c]&&(e[a]=b[c])}),e},I=function(){var b,e=(n||c).position(),f=(n||c).offset(),g=d.widgetPositioning.vertical,h=d.widgetPositioning.horizontal;if(d.widgetParent)b=d.widgetParent.append(o);else if(c.is("input"))b=c.after(o).parent();else{if(d.inline)return void(b=c.append(o));b=c,c.children().first().after(o)}if( +// Top and bottom logic +"auto"===g&&(g=f.top+1.5*o.height()>=a(window).height()+a(window).scrollTop()&&o.height()+c.outerHeight()a(window).width()?"right":"left"),"top"===g?o.addClass("top").removeClass("bottom"):o.addClass("bottom").removeClass("top"),"right"===h?o.addClass("pull-right"):o.removeClass("pull-right"), +// find the first parent element that has a relative css positioning +"relative"!==b.css("position")&&(b=b.parents().filter(function(){return"relative"===a(this).css("position")}).first()),0===b.length)throw new Error("datetimepicker component should be placed within a relative positioned container");o.css({top:"top"===g?"auto":e.top+c.outerHeight(),bottom:"top"===g?b.outerHeight()-(b===c?0:e.top):"auto",left:"left"===h?b===c?0:e.left:"auto",right:"left"===h?"auto":b.outerWidth()-c.outerWidth()-(b===c?0:e.left)})},J=function(a){"dp.change"===a.type&&(a.date&&a.date.isSame(a.oldDate)||!a.date&&!a.oldDate)||c.trigger(a)},K=function(a){"y"===a&&(a="YYYY"),J({type:"dp.update",change:a,viewDate:f.clone()})},L=function(a){o&&(a&&(k=Math.max(p,Math.min(3,k+a))),o.find(".datepicker > div").hide().filter(".datepicker-"+q[k].clsName).show())},M=function(){var b=a("
                "),c=f.clone().startOf("w").startOf("d");for(d.calendarWeeks===!0&&b.append(a(""),d.calendarWeeks&&c.append('"),k.push(c)),g="",b.isBefore(f,"M")&&(g+=" old"),b.isAfter(f,"M")&&(g+=" new"),b.isSame(e,"d")&&!m&&(g+=" active"),R(b,"d")||(g+=" disabled"),b.isSame(y(),"d")&&(g+=" today"),0!==b.day()&&6!==b.day()||(g+=" weekend"),c.append('"),b.add(1,"d");i.find("tbody").empty().append(k),T(),U(),V()}},X=function(){var b=o.find(".timepicker-hours table"),c=f.clone().startOf("d"),d=[],e=a("");for(f.hour()>11&&!h&&c.hour(12);c.isSame(f,"d")&&(h||f.hour()<12&&c.hour()<12||f.hour()>11);)c.hour()%4===0&&(e=a(""),d.push(e)),e.append('"),c.add(1,"h");b.empty().append(d)},Y=function(){for(var b=o.find(".timepicker-minutes table"),c=f.clone().startOf("h"),e=[],g=a(""),h=1===d.stepping?5:d.stepping;f.isSame(c,"h");)c.minute()%(4*h)===0&&(g=a(""),e.push(g)),g.append('"),c.add(h,"m");b.empty().append(e)},Z=function(){for(var b=o.find(".timepicker-seconds table"),c=f.clone().startOf("m"),d=[],e=a("");f.isSame(c,"m");)c.second()%20===0&&(e=a(""),d.push(e)),e.append('"),c.add(5,"s");b.empty().append(d)},$=function(){var a,b,c=o.find(".timepicker span[data-time-component]");h||(a=o.find(".timepicker [data-action=togglePeriod]"),b=e.clone().add(e.hours()>=12?-12:12,"h"),a.text(e.format("A")),R(b,"h")?a.removeClass("disabled"):a.addClass("disabled")),c.filter("[data-time-component=hours]").text(e.format(h?"HH":"hh")),c.filter("[data-time-component=minutes]").text(e.format("mm")),c.filter("[data-time-component=seconds]").text(e.format("ss")),X(),Y(),Z()},_=function(){o&&(W(),$())},aa=function(a){var b=m?null:e; +// case of calling setValue(null or false) +// case of calling setValue(null or false) +//viewDate = date.clone(); // TODO this doesn't work right on first use +return a?(a=a.clone().locale(d.locale),x()&&a.tz(d.timeZone),1!==d.stepping&&a.minutes(Math.round(a.minutes()/d.stepping)*d.stepping).seconds(0),void(R(a)?(e=a,g.val(e.format(i)),c.data("date",e.format(i)),m=!1,_(),J({type:"dp.change",date:e.clone(),oldDate:b})):(d.keepInvalid?J({type:"dp.change",date:a,oldDate:b}):g.val(m?"":e.format(i)),J({type:"dp.error",date:a,oldDate:b})))):(m=!0,g.val(""),c.data("date",""),J({type:"dp.change",date:!1,oldDate:b}),void _())},/** + * Hides the widget. Possibly will emit dp.hide + */ +ba=function(){var b=!1; +// Ignore event if in the middle of a picker transition +return o?(o.find(".collapse").each(function(){var c=a(this).data("collapse");return!c||!c.transitioning||(b=!0,!1)}),b?l:(n&&n.hasClass("btn")&&n.toggleClass("active"),o.hide(),a(window).off("resize",I),o.off("click","[data-action]"),o.off("mousedown",!1),o.remove(),o=!1,J({type:"dp.hide",date:e.clone()}),g.blur(),k=0,f=e.clone(),l)):l},ca=function(){aa(null)},da=function(a){ +//inputDate.locale(options.locale); +return void 0===d.parseInputDate?b.isMoment(a)||(a=y(a)):a=d.parseInputDate(a),a},/******************************************************************************** + * + * Widget UI interaction functions + * + ********************************************************************************/ +ea={next:function(){var a=q[k].navFnc;f.add(q[k].navStep,a),W(),K(a)},previous:function(){var a=q[k].navFnc;f.subtract(q[k].navStep,a),W(),K(a)},pickerSwitch:function(){L(1)},selectMonth:function(b){var c=a(b.target).closest("tbody").find("span").index(a(b.target));f.month(c),k===p?(aa(e.clone().year(f.year()).month(f.month())),d.inline||ba()):(L(-1),W()),K("M")},selectYear:function(b){var c=parseInt(a(b.target).text(),10)||0;f.year(c),k===p?(aa(e.clone().year(f.year())),d.inline||ba()):(L(-1),W()),K("YYYY")},selectDecade:function(b){var c=parseInt(a(b.target).data("selection"),10)||0;f.year(c),k===p?(aa(e.clone().year(f.year())),d.inline||ba()):(L(-1),W()),K("YYYY")},selectDay:function(b){var c=f.clone();a(b.target).is(".old")&&c.subtract(1,"M"),a(b.target).is(".new")&&c.add(1,"M"),aa(c.date(parseInt(a(b.target).text(),10))),A()||d.keepOpen||d.inline||ba()},incrementHours:function(){var a=e.clone().add(1,"h");R(a,"h")&&aa(a)},incrementMinutes:function(){var a=e.clone().add(d.stepping,"m");R(a,"m")&&aa(a)},incrementSeconds:function(){var a=e.clone().add(1,"s");R(a,"s")&&aa(a)},decrementHours:function(){var a=e.clone().subtract(1,"h");R(a,"h")&&aa(a)},decrementMinutes:function(){var a=e.clone().subtract(d.stepping,"m");R(a,"m")&&aa(a)},decrementSeconds:function(){var a=e.clone().subtract(1,"s");R(a,"s")&&aa(a)},togglePeriod:function(){aa(e.clone().add(e.hours()>=12?-12:12,"h"))},togglePicker:function(b){var c,e=a(b.target),f=e.closest("ul"),g=f.find(".in"),h=f.find(".collapse:not(.in)");if(g&&g.length){if(c=g.data("collapse"),c&&c.transitioning)return;g.collapse?(// if collapse plugin is available through bootstrap.js then use it +g.collapse("hide"),h.collapse("show")):(// otherwise just toggle in class on the two views +g.removeClass("in"),h.addClass("in")),e.is("span")?e.toggleClass(d.icons.time+" "+d.icons.date):e.find("span").toggleClass(d.icons.time+" "+d.icons.date)}},showPicker:function(){o.find(".timepicker > div:not(.timepicker-picker)").hide(),o.find(".timepicker .timepicker-picker").show()},showHours:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-hours").show()},showMinutes:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-minutes").show()},showSeconds:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-seconds").show()},selectHour:function(b){var c=parseInt(a(b.target).text(),10);h||(e.hours()>=12?12!==c&&(c+=12):12===c&&(c=0)),aa(e.clone().hours(c)),ea.showPicker.call(l)},selectMinute:function(b){aa(e.clone().minutes(parseInt(a(b.target).text(),10))),ea.showPicker.call(l)},selectSecond:function(b){aa(e.clone().seconds(parseInt(a(b.target).text(),10))),ea.showPicker.call(l)},clear:ca,today:function(){var a=y();R(a,"d")&&aa(a)},close:ba},fa=function(b){return!a(b.currentTarget).is(".disabled")&&(ea[a(b.currentTarget).data("action")].apply(l,arguments),!1)},/** + * Shows the widget. Possibly will emit dp.show and dp.change + */ +ga=function(){var b,c={year:function(a){return a.month(0).date(1).hours(0).seconds(0).minutes(0)},month:function(a){return a.date(1).hours(0).seconds(0).minutes(0)},day:function(a){return a.hours(0).seconds(0).minutes(0)},hour:function(a){return a.seconds(0).minutes(0)},minute:function(a){return a.seconds(0)}};// this handles clicks on the widget +return g.prop("disabled")||!d.ignoreReadonly&&g.prop("readonly")||o?l:(void 0!==g.val()&&0!==g.val().trim().length?aa(da(g.val().trim())):m&&d.useCurrent&&(d.inline||g.is("input")&&0===g.val().trim().length)&&(b=y(),"string"==typeof d.useCurrent&&(b=c[d.useCurrent](b)),aa(b)),o=G(),M(),S(),o.find(".timepicker-hours").hide(),o.find(".timepicker-minutes").hide(),o.find(".timepicker-seconds").hide(),_(),L(),a(window).on("resize",I),o.on("click","[data-action]",fa),o.on("mousedown",!1),n&&n.hasClass("btn")&&n.toggleClass("active"),I(),o.show(),d.focusOnShow&&!g.is(":focus")&&g.focus(),J({type:"dp.show"}),l)},/** + * Shows or hides the widget + */ +ha=function(){return o?ba():ga()},ia=function(a){var b,c,e,f,g=null,h=[],i={},j=a.which,k="p";w[j]=k;for(b in w)w.hasOwnProperty(b)&&w[b]===k&&(h.push(b),parseInt(b,10)!==j&&(i[b]=!0));for(b in d.keyBinds)if(d.keyBinds.hasOwnProperty(b)&&"function"==typeof d.keyBinds[b]&&(e=b.split(" "),e.length===h.length&&v[j]===e[e.length-1])){for(f=!0,c=e.length-2;c>=0;c--)if(!(v[e[c]]in i)){f=!1;break}if(f){g=d.keyBinds[b];break}}g&&(g.call(l,o),a.stopPropagation(),a.preventDefault())},ja=function(a){w[a.which]="r",a.stopPropagation(),a.preventDefault()},ka=function(b){var c=a(b.target).val().trim(),d=c?da(c):null;return aa(d),b.stopImmediatePropagation(),!1},la=function(){g.on({change:ka,blur:d.debug?"":ba,keydown:ia,keyup:ja,focus:d.allowInputToggle?ga:""}),c.is("input")?g.on({focus:ga}):n&&(n.on("click",ha),n.on("mousedown",!1))},ma=function(){g.off({change:ka,blur:blur,keydown:ia,keyup:ja,focus:d.allowInputToggle?ba:""}),c.is("input")?g.off({focus:ga}):n&&(n.off("click",ha),n.off("mousedown",!1))},na=function(b){ +// Store given enabledDates and disabledDates as keys. +// This way we can check their existence in O(1) time instead of looping through whole array. +// (for example: options.enabledDates['2014-02-27'] === true) +var c={};return a.each(b,function(){var a=da(this);a.isValid()&&(c[a.format("YYYY-MM-DD")]=!0)}),!!Object.keys(c).length&&c},oa=function(b){ +// Store given enabledHours and disabledHours as keys. +// This way we can check their existence in O(1) time instead of looping through whole array. +// (for example: options.enabledHours['2014-02-27'] === true) +var c={};return a.each(b,function(){c[this]=!0}),!!Object.keys(c).length&&c},pa=function(){var a=d.format||"L LT";i=a.replace(/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,function(a){var b=e.localeData().longDateFormat(a)||a;return b.replace(/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,function(a){//temp fix for #740 +return e.localeData().longDateFormat(a)||a})}),j=d.extraFormats?d.extraFormats.slice():[],j.indexOf(a)<0&&j.indexOf(i)<0&&j.push(i),h=i.toLowerCase().indexOf("a")<1&&i.replace(/\[.*?\]/g,"").indexOf("h")<1,z("y")&&(p=2),z("M")&&(p=1),z("d")&&(p=0),k=Math.max(p,k),m||aa(e)}; +// initializing element and component attributes +if(/******************************************************************************** + * + * Public API functions + * ===================== + * + * Important: Do not expose direct references to private objects or the options + * object to the outer world. Always return a clone when returning values or make + * a clone when setting a private variable. + * + ********************************************************************************/ +l.destroy=function(){ +///Destroys the widget and removes all attached event listeners +ba(),ma(),c.removeData("DateTimePicker"),c.removeData("date")},l.toggle=ha,l.show=ga,l.hide=ba,l.disable=function(){ +///Disables the input element, the component is attached to, by adding a disabled="true" attribute to it. +///If the widget was visible before that call it is hidden. Possibly emits dp.hide +return ba(),n&&n.hasClass("btn")&&n.addClass("disabled"),g.prop("disabled",!0),l},l.enable=function(){ +///Enables the input element, the component is attached to, by removing disabled attribute from it. +return n&&n.hasClass("btn")&&n.removeClass("disabled"),g.prop("disabled",!1),l},l.ignoreReadonly=function(a){if(0===arguments.length)return d.ignoreReadonly;if("boolean"!=typeof a)throw new TypeError("ignoreReadonly () expects a boolean parameter");return d.ignoreReadonly=a,l},l.options=function(b){if(0===arguments.length)return a.extend(!0,{},d);if(!(b instanceof Object))throw new TypeError("options() options parameter should be an object");return a.extend(!0,d,b),a.each(d,function(a,b){if(void 0===l[a])throw new TypeError("option "+a+" is not recognized!");l[a](b)}),l},l.date=function(a){ +/// +///Returns the component's model current date, a moment object or null if not set. +///date.clone() +/// +/// +///Sets the components model current moment to it. Passing a null value unsets the components model current moment. Parsing of the newDate parameter is made using moment library with the options.format and options.useStrict components configuration. +///Takes string, Date, moment, null parameter. +/// +if(0===arguments.length)return m?null:e.clone();if(!(null===a||"string"==typeof a||b.isMoment(a)||a instanceof Date))throw new TypeError("date() parameter must be one of [null, string, moment or Date]");return aa(null===a?null:da(a)),l},l.format=function(a){ +///test su +///info about para +///returns foo +if(0===arguments.length)return d.format;if("string"!=typeof a&&("boolean"!=typeof a||a!==!1))throw new TypeError("format() expects a string or boolean:false parameter "+a);return d.format=a,i&&pa(),l},l.timeZone=function(a){if(0===arguments.length)return d.timeZone;if("string"!=typeof a)throw new TypeError("newZone() expects a string parameter");return d.timeZone=a,l},l.dayViewHeaderFormat=function(a){if(0===arguments.length)return d.dayViewHeaderFormat;if("string"!=typeof a)throw new TypeError("dayViewHeaderFormat() expects a string parameter");return d.dayViewHeaderFormat=a,l},l.extraFormats=function(a){if(0===arguments.length)return d.extraFormats;if(a!==!1&&!(a instanceof Array))throw new TypeError("extraFormats() expects an array or false parameter");return d.extraFormats=a,j&&pa(),l},l.disabledDates=function(b){ +/// +///Returns an array with the currently set disabled dates on the component. +///options.disabledDates +/// +/// +///Setting this takes precedence over options.minDate, options.maxDate configuration. Also calling this function removes the configuration of +///options.enabledDates if such exist. +///Takes an [ string or Date or moment ] of values and allows the user to select only from those days. +/// +if(0===arguments.length)return d.disabledDates?a.extend({},d.disabledDates):d.disabledDates;if(!b)return d.disabledDates=!1,_(),l;if(!(b instanceof Array))throw new TypeError("disabledDates() expects an array parameter");return d.disabledDates=na(b),d.enabledDates=!1,_(),l},l.enabledDates=function(b){ +/// +///Returns an array with the currently set enabled dates on the component. +///options.enabledDates +/// +/// +///Setting this takes precedence over options.minDate, options.maxDate configuration. Also calling this function removes the configuration of options.disabledDates if such exist. +///Takes an [ string or Date or moment ] of values and allows the user to select only from those days. +/// +if(0===arguments.length)return d.enabledDates?a.extend({},d.enabledDates):d.enabledDates;if(!b)return d.enabledDates=!1,_(),l;if(!(b instanceof Array))throw new TypeError("enabledDates() expects an array parameter");return d.enabledDates=na(b),d.disabledDates=!1,_(),l},l.daysOfWeekDisabled=function(a){if(0===arguments.length)return d.daysOfWeekDisabled.splice(0);if("boolean"==typeof a&&!a)return d.daysOfWeekDisabled=!1,_(),l;if(!(a instanceof Array))throw new TypeError("daysOfWeekDisabled() expects an array parameter");if(d.daysOfWeekDisabled=a.reduce(function(a,b){return b=parseInt(b,10),b>6||b<0||isNaN(b)?a:(a.indexOf(b)===-1&&a.push(b),a)},[]).sort(),d.useCurrent&&!d.keepInvalid){for(var b=0;!R(e,"d");){if(e.add(1,"d"),31===b)throw"Tried 31 times to find a valid date";b++}aa(e)}return _(),l},l.maxDate=function(a){if(0===arguments.length)return d.maxDate?d.maxDate.clone():d.maxDate;if("boolean"==typeof a&&a===!1)return d.maxDate=!1,_(),l;"string"==typeof a&&("now"!==a&&"moment"!==a||(a=y()));var b=da(a);if(!b.isValid())throw new TypeError("maxDate() Could not parse date parameter: "+a);if(d.minDate&&b.isBefore(d.minDate))throw new TypeError("maxDate() date parameter is before options.minDate: "+b.format(i));return d.maxDate=b,d.useCurrent&&!d.keepInvalid&&e.isAfter(a)&&aa(d.maxDate),f.isAfter(b)&&(f=b.clone().subtract(d.stepping,"m")),_(),l},l.minDate=function(a){if(0===arguments.length)return d.minDate?d.minDate.clone():d.minDate;if("boolean"==typeof a&&a===!1)return d.minDate=!1,_(),l;"string"==typeof a&&("now"!==a&&"moment"!==a||(a=y()));var b=da(a);if(!b.isValid())throw new TypeError("minDate() Could not parse date parameter: "+a);if(d.maxDate&&b.isAfter(d.maxDate))throw new TypeError("minDate() date parameter is after options.maxDate: "+b.format(i));return d.minDate=b,d.useCurrent&&!d.keepInvalid&&e.isBefore(a)&&aa(d.minDate),f.isBefore(b)&&(f=b.clone().add(d.stepping,"m")),_(),l},l.defaultDate=function(a){ +/// +///Returns a moment with the options.defaultDate option configuration or false if not set +///date.clone() +/// +/// +///Will set the picker's inital date. If a boolean:false value is passed the options.defaultDate parameter is cleared. +///Takes a string, Date, moment, boolean:false +/// +if(0===arguments.length)return d.defaultDate?d.defaultDate.clone():d.defaultDate;if(!a)return d.defaultDate=!1,l;"string"==typeof a&&(a="now"===a||"moment"===a?y():y(a));var b=da(a);if(!b.isValid())throw new TypeError("defaultDate() Could not parse date parameter: "+a);if(!R(b))throw new TypeError("defaultDate() date passed is invalid according to component setup validations");return d.defaultDate=b,(d.defaultDate&&d.inline||""===g.val().trim())&&aa(d.defaultDate),l},l.locale=function(a){if(0===arguments.length)return d.locale;if(!b.localeData(a))throw new TypeError("locale() locale "+a+" is not loaded from moment locales!");return d.locale=a,e.locale(d.locale),f.locale(d.locale),i&&pa(),o&&(ba(),ga()),l},l.stepping=function(a){return 0===arguments.length?d.stepping:(a=parseInt(a,10),(isNaN(a)||a<1)&&(a=1),d.stepping=a,l)},l.useCurrent=function(a){var b=["year","month","day","hour","minute"];if(0===arguments.length)return d.useCurrent;if("boolean"!=typeof a&&"string"!=typeof a)throw new TypeError("useCurrent() expects a boolean or string parameter");if("string"==typeof a&&b.indexOf(a.toLowerCase())===-1)throw new TypeError("useCurrent() expects a string parameter of "+b.join(", "));return d.useCurrent=a,l},l.collapse=function(a){if(0===arguments.length)return d.collapse;if("boolean"!=typeof a)throw new TypeError("collapse() expects a boolean parameter");return d.collapse===a?l:(d.collapse=a,o&&(ba(),ga()),l)},l.icons=function(b){if(0===arguments.length)return a.extend({},d.icons);if(!(b instanceof Object))throw new TypeError("icons() expects parameter to be an Object");return a.extend(d.icons,b),o&&(ba(),ga()),l},l.tooltips=function(b){if(0===arguments.length)return a.extend({},d.tooltips);if(!(b instanceof Object))throw new TypeError("tooltips() expects parameter to be an Object");return a.extend(d.tooltips,b),o&&(ba(),ga()),l},l.useStrict=function(a){if(0===arguments.length)return d.useStrict;if("boolean"!=typeof a)throw new TypeError("useStrict() expects a boolean parameter");return d.useStrict=a,l},l.sideBySide=function(a){if(0===arguments.length)return d.sideBySide;if("boolean"!=typeof a)throw new TypeError("sideBySide() expects a boolean parameter");return d.sideBySide=a,o&&(ba(),ga()),l},l.viewMode=function(a){if(0===arguments.length)return d.viewMode;if("string"!=typeof a)throw new TypeError("viewMode() expects a string parameter");if(r.indexOf(a)===-1)throw new TypeError("viewMode() parameter must be one of ("+r.join(", ")+") value");return d.viewMode=a,k=Math.max(r.indexOf(a),p),L(),l},l.toolbarPlacement=function(a){if(0===arguments.length)return d.toolbarPlacement;if("string"!=typeof a)throw new TypeError("toolbarPlacement() expects a string parameter");if(u.indexOf(a)===-1)throw new TypeError("toolbarPlacement() parameter must be one of ("+u.join(", ")+") value");return d.toolbarPlacement=a,o&&(ba(),ga()),l},l.widgetPositioning=function(b){if(0===arguments.length)return a.extend({},d.widgetPositioning);if("[object Object]"!=={}.toString.call(b))throw new TypeError("widgetPositioning() expects an object variable");if(b.horizontal){if("string"!=typeof b.horizontal)throw new TypeError("widgetPositioning() horizontal variable must be a string");if(b.horizontal=b.horizontal.toLowerCase(),t.indexOf(b.horizontal)===-1)throw new TypeError("widgetPositioning() expects horizontal parameter to be one of ("+t.join(", ")+")");d.widgetPositioning.horizontal=b.horizontal}if(b.vertical){if("string"!=typeof b.vertical)throw new TypeError("widgetPositioning() vertical variable must be a string");if(b.vertical=b.vertical.toLowerCase(),s.indexOf(b.vertical)===-1)throw new TypeError("widgetPositioning() expects vertical parameter to be one of ("+s.join(", ")+")");d.widgetPositioning.vertical=b.vertical}return _(),l},l.calendarWeeks=function(a){if(0===arguments.length)return d.calendarWeeks;if("boolean"!=typeof a)throw new TypeError("calendarWeeks() expects parameter to be a boolean value");return d.calendarWeeks=a,_(),l},l.showTodayButton=function(a){if(0===arguments.length)return d.showTodayButton;if("boolean"!=typeof a)throw new TypeError("showTodayButton() expects a boolean parameter");return d.showTodayButton=a,o&&(ba(),ga()),l},l.showClear=function(a){if(0===arguments.length)return d.showClear;if("boolean"!=typeof a)throw new TypeError("showClear() expects a boolean parameter");return d.showClear=a,o&&(ba(),ga()),l},l.widgetParent=function(b){if(0===arguments.length)return d.widgetParent;if("string"==typeof b&&(b=a(b)),null!==b&&"string"!=typeof b&&!(b instanceof a))throw new TypeError("widgetParent() expects a string or a jQuery object parameter");return d.widgetParent=b,o&&(ba(),ga()),l},l.keepOpen=function(a){if(0===arguments.length)return d.keepOpen;if("boolean"!=typeof a)throw new TypeError("keepOpen() expects a boolean parameter");return d.keepOpen=a,l},l.focusOnShow=function(a){if(0===arguments.length)return d.focusOnShow;if("boolean"!=typeof a)throw new TypeError("focusOnShow() expects a boolean parameter");return d.focusOnShow=a,l},l.inline=function(a){if(0===arguments.length)return d.inline;if("boolean"!=typeof a)throw new TypeError("inline() expects a boolean parameter");return d.inline=a,l},l.clear=function(){return ca(),l},l.keyBinds=function(a){return 0===arguments.length?d.keyBinds:(d.keyBinds=a,l)},l.getMoment=function(a){return y(a)},l.debug=function(a){if("boolean"!=typeof a)throw new TypeError("debug() expects a boolean parameter");return d.debug=a,l},l.allowInputToggle=function(a){if(0===arguments.length)return d.allowInputToggle;if("boolean"!=typeof a)throw new TypeError("allowInputToggle() expects a boolean parameter");return d.allowInputToggle=a,l},l.showClose=function(a){if(0===arguments.length)return d.showClose;if("boolean"!=typeof a)throw new TypeError("showClose() expects a boolean parameter");return d.showClose=a,l},l.keepInvalid=function(a){if(0===arguments.length)return d.keepInvalid;if("boolean"!=typeof a)throw new TypeError("keepInvalid() expects a boolean parameter");return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)return d.datepickerInput;if("string"!=typeof a)throw new TypeError("datepickerInput() expects a string parameter");return d.datepickerInput=a,l},l.parseInputDate=function(a){if(0===arguments.length)return d.parseInputDate;if("function"!=typeof a)throw new TypeError("parseInputDate() sholud be as function");return d.parseInputDate=a,l},l.disabledTimeIntervals=function(b){ +/// +///Returns an array with the currently set disabled dates on the component. +///options.disabledTimeIntervals +/// +/// +///Setting this takes precedence over options.minDate, options.maxDate configuration. Also calling this function removes the configuration of +///options.enabledDates if such exist. +///Takes an [ string or Date or moment ] of values and allows the user to select only from those days. +/// +if(0===arguments.length)return d.disabledTimeIntervals?a.extend({},d.disabledTimeIntervals):d.disabledTimeIntervals;if(!b)return d.disabledTimeIntervals=!1,_(),l;if(!(b instanceof Array))throw new TypeError("disabledTimeIntervals() expects an array parameter");return d.disabledTimeIntervals=b,_(),l},l.disabledHours=function(b){ +/// +///Returns an array with the currently set disabled hours on the component. +///options.disabledHours +/// +/// +///Setting this takes precedence over options.minDate, options.maxDate configuration. Also calling this function removes the configuration of +///options.enabledHours if such exist. +///Takes an [ int ] of values and disallows the user to select only from those hours. +/// +if(0===arguments.length)return d.disabledHours?a.extend({},d.disabledHours):d.disabledHours;if(!b)return d.disabledHours=!1,_(),l;if(!(b instanceof Array))throw new TypeError("disabledHours() expects an array parameter");if(d.disabledHours=oa(b),d.enabledHours=!1,d.useCurrent&&!d.keepInvalid){for(var c=0;!R(e,"h");){if(e.add(1,"h"),24===c)throw"Tried 24 times to find a valid date";c++}aa(e)}return _(),l},l.enabledHours=function(b){ +/// +///Returns an array with the currently set enabled hours on the component. +///options.enabledHours +/// +/// +///Setting this takes precedence over options.minDate, options.maxDate configuration. Also calling this function removes the configuration of options.disabledHours if such exist. +///Takes an [ int ] of values and allows the user to select only from those hours. +/// +if(0===arguments.length)return d.enabledHours?a.extend({},d.enabledHours):d.enabledHours;if(!b)return d.enabledHours=!1,_(),l;if(!(b instanceof Array))throw new TypeError("enabledHours() expects an array parameter");if(d.enabledHours=oa(b),d.disabledHours=!1,d.useCurrent&&!d.keepInvalid){for(var c=0;!R(e,"h");){if(e.add(1,"h"),24===c)throw"Tried 24 times to find a valid date";c++}aa(e)}return _(),l},/** + * Returns the component's model current viewDate, a moment object or null if not set. Passing a null value unsets the components model current moment. Parsing of the newDate parameter is made using moment library with the options.format and options.useStrict components configuration. + * @param {Takes string, viewDate, moment, null parameter.} newDate + * @returns {viewDate.clone()} + */ +l.viewDate=function(a){if(0===arguments.length)return f.clone();if(!a)return f=e.clone(),l;if(!("string"==typeof a||b.isMoment(a)||a instanceof Date))throw new TypeError("viewDate() parameter must be one of [string, moment or Date]");return f=da(a),K(),l},c.is("input"))g=c;else if(g=c.find(d.datepickerInput),0===g.length)g=c.find("input");else if(!g.is("input"))throw new Error('CSS class "'+d.datepickerInput+'" cannot be applied to non input element');if(c.hasClass("input-group")&&( +// in case there is more then one 'input-group-addon' Issue #48 +n=0===c.find(".datepickerbutton").length?c.find(".input-group-addon"):c.find(".datepickerbutton")),!d.inline&&!g.is("input"))throw new Error("Could not initialize DateTimePicker without an input element"); +// Set defaults for date here now instead of in var declaration +return e=y(),f=e.clone(),a.extend(!0,d,H()),l.options(d),pa(),la(),g.prop("disabled")&&l.disable(),g.is("input")&&0!==g.val().trim().length?aa(da(g.val().trim())):d.defaultDate&&void 0===g.attr("placeholder")&&aa(d.defaultDate),d.inline&&ga(),l};/******************************************************************************** + * + * jQuery plugin constructor and defaults object + * + ********************************************************************************/ +/** + * See (http://jquery.com/). + * @name jQuery + * @class + * See the jQuery Library (http://jquery.com/) for full details. This just + * documents the function and classes that are added to jQuery by this plug-in. + */ +/** + * See (http://jquery.com/) + * @name fn + * @class + * See the jQuery Library (http://jquery.com/) for full details. This just + * documents the function and classes that are added to jQuery by this plug-in. + * @memberOf jQuery + */ +/** + * Show comments + * @class datetimepicker + * @memberOf jQuery.fn + */ +a.fn.datetimepicker=function(b){b=b||{};var d,e=Array.prototype.slice.call(arguments,1),f=!0,g=["destroy","hide","show","toggle"];if("object"==typeof b)return this.each(function(){var d=a(this);d.data("DateTimePicker")||( +// create a private copy of the defaults object +b=a.extend(!0,{},a.fn.datetimepicker.defaults,b),d.data("DateTimePicker",c(d,b)))});if("string"==typeof b)return this.each(function(){var c=a(this),g=c.data("DateTimePicker");if(!g)throw new Error('bootstrap-datetimepicker("'+b+'") method was called on an element that is not using DateTimePicker');d=g[b].apply(g,e),f=d===g}),f||a.inArray(b,g)>-1?this:d;throw new TypeError("Invalid arguments for DateTimePicker: "+b)},a.fn.datetimepicker.defaults={timeZone:"",format:!1,dayViewHeaderFormat:"MMMM YYYY",extraFormats:!1,stepping:1,minDate:!1,maxDate:!1,useCurrent:!0,collapse:!0,locale:b.locale(),defaultDate:!1,disabledDates:!1,enabledDates:!1,icons:{time:"fa fa-clock-o",date:"fa fa-calendar",up:"fa fa-angle-up",down:"fa fa-angle-down",previous:"fa fa-angle-left",next:"fa fa-angle-right",today:"fa fa-crosshair",clear:"fa fa-trash",close:"fa fa-eraser"},tooltips:{today:"Go to today",clear:"Clear selection",close:"Close the picker",selectMonth:"Select Month",prevMonth:"Previous Month",nextMonth:"Next Month",selectYear:"Select Year",prevYear:"Previous Year",nextYear:"Next Year",selectDecade:"Select Decade",prevDecade:"Previous Decade",nextDecade:"Next Decade",prevCentury:"Previous Century",nextCentury:"Next Century",pickHour:"Pick Hour",incrementHour:"Increment Hour",decrementHour:"Decrement Hour",pickMinute:"Pick Minute",incrementMinute:"Increment Minute",decrementMinute:"Decrement Minute",pickSecond:"Pick Second",incrementSecond:"Increment Second",decrementSecond:"Decrement Second",togglePeriod:"Toggle Period",selectTime:"Select Time"},useStrict:!1,sideBySide:!1,daysOfWeekDisabled:!1,calendarWeeks:!1,viewMode:"days",toolbarPlacement:"default",showTodayButton:!1,showClear:!1,showClose:!1,widgetPositioning:{horizontal:"auto",vertical:"auto"},widgetParent:null,ignoreReadonly:!1,keepOpen:!1,focusOnShow:!0,inline:!1,keepInvalid:!1,datepickerInput:".datepickerinput",keyBinds:{up:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().subtract(7,"d")):this.date(b.clone().add(this.stepping(),"m"))}},down:function(a){if(!a)return void this.show();var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().add(7,"d")):this.date(b.clone().subtract(this.stepping(),"m"))},"control up":function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().subtract(1,"y")):this.date(b.clone().add(1,"h"))}},"control down":function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().add(1,"y")):this.date(b.clone().subtract(1,"h"))}},left:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().subtract(1,"d"))}},right:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().add(1,"d"))}},pageUp:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().subtract(1,"M"))}},pageDown:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().add(1,"M"))}},enter:function(){this.hide()},escape:function(){this.hide()}, +//tab: function (widget) { //this break the flow of the form. disabling for now +// var toggle = widget.find('.picker-switch a[data-action="togglePicker"]'); +// if(toggle.length > 0) toggle.click(); +//}, +"control space":function(a){a&&a.find(".timepicker").is(":visible")&&a.find('.btn[data-action="togglePeriod"]').click()},t:function(){this.date(this.getMoment())},delete:function(){this.clear()}},debug:!1,allowInputToggle:!1,disabledTimeIntervals:!1,disabledHours:!1,enabledHours:!1,viewDate:!1},"undefined"!=typeof module&&(module.exports=a.fn.datetimepicker)}); \ No newline at end of file diff --git a/assets/js/lib/bootstrap-strength-meter.js b/assets/js/lib/bootstrap-strength-meter.js new file mode 100644 index 0000000..8083dc4 --- /dev/null +++ b/assets/js/lib/bootstrap-strength-meter.js @@ -0,0 +1,278 @@ +/** + * bootstrap-strength-meter.js + * https://github.com/davidstutz/bootstrap-strength-meter + * + * Copyright 2013 David Stutz + */ +!function($) { + + "use strict";// jshint ;_; + + var StrengthMeter = { + + progressBar: function(input, options) { + + var defaults = { + container: input.parent(), + base: 80, + hierarchy: { + '0': 'progress-bar-danger', + '25': 'progress-bar-warning', + '50': 'progress-bar-success' + }, + passwordScore: { + options: [], + append: true + } + }; + + var settings = $.extend(true, {}, defaults, options); + + if (typeof options === 'object' && 'hierarchy' in options) { + settings.hierarchy = options.hierarchy; + } + + var template = '
                '; + var progress; + var progressBar; + var passcheckTimeout; + var core = { + + /** + * Initialize the plugin. + */ + init: function() { + progress = settings.container.append($(template)); + progressBar = $('.progress-bar', progress); + + progressBar.attr('aria-valuemin', 0) + .attr('aria-valuemay', 100); + + input.on('keyup', core.keyup) + .keyup(); + }, + queue: function(event){ + var password = $(event.target).val(); + var value = 0; + + if (password.length > 0) { + var score = new Score(password); + value = score.calculateEntropyScore(settings.passwordScore.options, settings.passwordScore.append); + } + + core.update(value); + }, + + /** + * Update progress bar. + * + * @param {string} value + */ + update: function(value) { + var width = Math.floor((value/settings.base)*100); + + if (width > 100) { + width = 100; + } + + progressBar + .attr('area-valuenow', width) + .css('width', width + '%'); + + for (var value in settings.hierarchy) { + if (width > value) { + progressBar + .removeClass() + .addClass('progress-bar') + .addClass(settings.hierarchy[value]); + } + } + }, + + /** + * Event binding on password input. + * + * @param {Object} event + */ + keyup: function(event) { + if(passcheckTimeout)clearTimeout(passcheckTimeout); + passcheckTimeout = setTimeout( function(){ + core.queue(event); + },500); + } + }; + + core.init(); + }, + text: function(input, options) { + + var defaults = { + container: input.parent(), + hierarchy: { + '0': ['text-danger', 'ridiculous'], + '10': ['text-danger', 'very weak'], + '20': ['text-warning', 'weak'], + '30': ['text-warning', 'good'], + '40': ['text-success', 'strong'], + '50': ['text-success', 'very strong'] + }, + passwordScore: { + options: [], + append: true + } + }; + + var settings = $.extend(true, {}, defaults, options); + + if (typeof options === 'object' && 'hierarchy' in options) { + settings.hierarchy = options.hierarchy; + } + + var core = { + + /** + * Initialize the plugin. + */ + init: function() { + input.on('keyup', core.keyup) + .keyup(); + }, + + /** + * Update text element. + * + * @param {string} value + */ + update: function(value) { + for (var border in settings.hierarchy) { + if (value >= border) { + var text = settings.hierarchy[border][1]; + var color = settings.hierarchy[border][0]; + + settings.container.text(text) + .removeClass() + .addClass(color); + } + } + }, + + /** + * Event binding on input element. + * + * @param {Object} event + */ + keyup: function(event) { + var password = $(event.target).val(); + var value = 0; + + if (password.length > 0) { + var score = new Score(password); + value = score.calculateEntropyScore(settings.passwordScore.options, settings.passwordScore.append); + } + + core.update(value); + } + }; + + core.init(); + }, + + tooltip: function(input, options) { + + var defaults = { + hierarchy: { + '0': 'ridiculous', + '10': 'very weak', + '20': 'weak', + '30': 'good', + '40': 'strong', + '50': 'very strong' + }, + tooltip: { + placement: 'right' + }, + passwordScore: { + options: [], + append: true + } + }; + + var settings = $.extend(true, {}, defaults, options); + + if (typeof options === 'object' && 'hierarchy' in options) { + settings.hierarchy = options.hierarchy; + } + + var core = { + + /** + * Initialize the plugin. + */ + init: function() { + input.tooltip(settings.tooltip); + + input.on('keyup', core.keyup) + .keyup(); + }, + + /** + * Update tooltip. + * + * @param {string} value + */ + update: function(value) { + for (var border in settings.hierarchy) { + if (value >= border) { + var text = settings.hierarchy[border]; + + input.attr('data-original-title', text) + .tooltip('show'); + } + } + }, + + /** + * Event binding on input element. + * + * @param {Object} event + */ + keyup: function(event) { + var password = $(event.target).val(); + var value = 0; + + if (password.length > 0) { + var score = new Score(password); + value = score.calculateEntropyScore(settings.passwordScore.options, settings.passwordScore.append); + } + + core.update(value); + } + }; + + core.init(); + } + }; + + $.fn.strengthMeter = function(type, options) { + type = (type === undefined) ? 'tooltip' : type; + + if (!type in StrengthMeter) { + return; + } + + var instance = this.data('strengthMeter'); + var elem = this; + + return elem.each(function() { + var strengthMeter; + + if (instance) { + return; + } + + strengthMeter = StrengthMeter[type](elem, options); + elem.data('strengthMeter', strengthMeter); + }); + }; + +}(window.jQuery); diff --git a/assets/js/lib/bootstrap-tagsinput-angular.js b/assets/js/lib/bootstrap-tagsinput-angular.js new file mode 100644 index 0000000..adcaccb --- /dev/null +++ b/assets/js/lib/bootstrap-tagsinput-angular.js @@ -0,0 +1,87 @@ +angular.module('bootstrap-tagsinput', []) +.directive('bootstrapTagsinput', [function() { + + function getItemProperty(scope, property) { + if (!property) + return undefined; + + if (angular.isFunction(scope.$parent[property])) + return scope.$parent[property]; + + return function(item) { + return item[property]; + }; + } + + return { + restrict: 'EA', + scope: { + model: '=ngModel' + }, + template: '', + replace: false, + link: function(scope, element, attrs) { + $(function() { + if (!angular.isArray(scope.model)) + scope.model = []; + + var select = $('select', element); + var typeaheadSourceArray = attrs.typeaheadSource ? attrs.typeaheadSource.split('.') : null; + var typeaheadSource = typeaheadSourceArray ? + (typeaheadSourceArray.length > 1 ? + scope.$parent[typeaheadSourceArray[0]][typeaheadSourceArray[1]] + : scope.$parent[typeaheadSourceArray[0]]) + : null; + + select.tagsinput(scope.$parent[attrs.options || ''] || { + typeahead : { + source : angular.isFunction(typeaheadSource) ? typeaheadSource : null + }, + itemValue: getItemProperty(scope, attrs.itemvalue), + itemText : getItemProperty(scope, attrs.itemtext), + confirmKeys : getItemProperty(scope, attrs.confirmkeys) ? JSON.parse(attrs.confirmkeys) : [13], + tagClass : angular.isFunction(scope.$parent[attrs.tagclass]) ? scope.$parent[attrs.tagclass] : function(item) { return attrs.tagclass; } + }); + + for (var i = 0; i < scope.model.length; i++) { + select.tagsinput('add', scope.model[i]); + } + + select.on('itemAdded', function(event) { + if (scope.model.indexOf(event.item) === -1) + scope.model.push(event.item); + }); + + select.on('itemRemoved', function(event) { + var idx = scope.model.indexOf(event.item); + if (idx !== -1) + scope.model.splice(idx, 1); + }); + + // create a shallow copy of model's current state, needed to determine + // diff when model changes + var prev = scope.model.slice(); + scope.$watch("model", function() { + var added = scope.model.filter(function(i) {return prev.indexOf(i) === -1;}), + removed = prev.filter(function(i) {return scope.model.indexOf(i) === -1;}), + i; + + prev = scope.model.slice(); + + // Remove tags no longer in binded model + for (i = 0; i < removed.length; i++) { + select.tagsinput('remove', removed[i]); + } + + // Refresh remaining tags + select.tagsinput('refresh'); + + // Add new items in model as tags + for (i = 0; i < added.length; i++) { + select.tagsinput('add', added[i]); + } + }, true); + }); + } + }; +}]); diff --git a/assets/js/lib/bootstrap-tagsinput.js b/assets/js/lib/bootstrap-tagsinput.js new file mode 100644 index 0000000..2b403f7 --- /dev/null +++ b/assets/js/lib/bootstrap-tagsinput.js @@ -0,0 +1,646 @@ +(function ($) { + "use strict"; + + var defaultOptions = { + tagClass: function(item) { + return 'label label-info'; + }, + itemValue: function(item) { + return item ? item.toString() : item; + }, + itemText: function(item) { + return this.itemValue(item); + }, + itemTitle: function(item) { + return null; + }, + freeInput: true, + addOnBlur: true, + maxTags: undefined, + maxChars: undefined, + confirmKeys: [13, 44], + delimiter: ',', + delimiterRegex: null, + cancelConfirmKeysOnEmpty: true, + onTagExists: function(item, $tag) { + $tag.hide().fadeIn(); + }, + trimValue: false, + allowDuplicates: false + }; + + /** + * Constructor function + */ + function TagsInput(element, options) { + this.itemsArray = []; + + this.$element = $(element); + this.$element.hide(); + + this.isSelect = (element.tagName === 'SELECT'); + this.multiple = (this.isSelect && element.hasAttribute('multiple')); + this.objectItems = options && options.itemValue; + this.placeholderText = element.hasAttribute('placeholder') ? this.$element.attr('placeholder') : ''; + this.inputSize = Math.max(1, this.placeholderText.length); + + this.$container = $('
                '); + this.$input = $('').appendTo(this.$container); + + this.$element.before(this.$container); + + this.build(options); + } + + TagsInput.prototype = { + constructor: TagsInput, + + /** + * Adds the given item as a new tag. Pass true to dontPushVal to prevent + * updating the elements val() + */ + add: function(item, dontPushVal, options) { + var self = this; + + if (self.options.maxTags && self.itemsArray.length >= self.options.maxTags) + return; + + // Ignore falsey values, except false + if (item !== false && !item) + return; + + // Trim value + if (typeof item === "string" && self.options.trimValue) { + item = $.trim(item); + } + + // Throw an error when trying to add an object while the itemValue option was not set + if (typeof item === "object" && !self.objectItems) + throw("Can't add objects when itemValue option is not set"); + + // Ignore strings only containg whitespace + if (item.toString().match(/^\s*$/)) + return; + + // If SELECT but not multiple, remove current tag + if (self.isSelect && !self.multiple && self.itemsArray.length > 0) + self.remove(self.itemsArray[0]); + + if (typeof item === "string" && this.$element[0].tagName === 'INPUT') { + var delimiter = (self.options.delimiterRegex) ? self.options.delimiterRegex : self.options.delimiter; + var items = item.split(delimiter); + if (items.length > 1) { + for (var i = 0; i < items.length; i++) { + this.add(items[i], true); + } + + if (!dontPushVal) + self.pushVal(); + return; + } + } + + var itemValue = self.options.itemValue(item), + itemText = self.options.itemText(item), + tagClass = self.options.tagClass(item), + itemTitle = self.options.itemTitle(item); + + // Ignore items allready added + var existing = $.grep(self.itemsArray, function(item) { return self.options.itemValue(item) === itemValue; } )[0]; + if (existing && !self.options.allowDuplicates) { + // Invoke onTagExists + if (self.options.onTagExists) { + var $existingTag = $(".tag", self.$container).filter(function() { return $(this).data("item") === existing; }); + self.options.onTagExists(item, $existingTag); + } + return; + } + + // if length greater than limit + if (self.items().toString().length + item.length + 1 > self.options.maxInputLength) + return; + + // raise beforeItemAdd arg + var beforeItemAddEvent = $.Event('beforeItemAdd', { item: item, cancel: false, options: options}); + self.$element.trigger(beforeItemAddEvent); + if (beforeItemAddEvent.cancel) + return; + + // register item in internal array and map + self.itemsArray.push(item); + + // add a tag element + + var $tag = $('' + htmlEncode(itemText) + ''); + $tag.data('item', item); + self.findInputWrapper().before($tag); + $tag.after(' '); + + // add ').appendTo($this); + } + oSettings.nTBody = tbody[0]; + + var tfoot = $this.children('tfoot'); + if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") ) { + // If we are a scrolling table, and no footer has been given, then we need to create + // a tfoot element for the caption element to be appended to + tfoot = $('').appendTo($this); + } + + if ( tfoot.length === 0 || tfoot.children().length === 0 ) { + $this.addClass( oClasses.sNoFooter ); + } + else if ( tfoot.length > 0 ) { + oSettings.nTFoot = tfoot[0]; + _fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot ); + } + + /* Check if there is data passing into the constructor */ + if ( oInit.aaData ) { + for ( i=0 ; i/g; + + // This is not strict ISO8601 - Date.parse() is quite lax, although + // implementations differ between browsers. + var _re_date = /^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/; + + // Escape regular expression special characters + var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ].join('|\\') + ')', 'g' ); + + // http://en.wikipedia.org/wiki/Foreign_exchange_market + // - \u20BD - Russian ruble. + // - \u20a9 - South Korean Won + // - \u20BA - Turkish Lira + // - \u20B9 - Indian Rupee + // - R - Brazil (R$) and South Africa + // - fr - Swiss Franc + // - kr - Swedish krona, Norwegian krone and Danish krone + // - \u2009 is thin space and \u202F is narrow no-break space, both used in many + // standards as thousands separators. + var _re_formatted_numeric = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi; + + + var _empty = function ( d ) { + return !d || d === true || d === '-' ? true : false; + }; + + + var _intVal = function ( s ) { + var integer = parseInt( s, 10 ); + return !isNaN(integer) && isFinite(s) ? integer : null; + }; + + // Convert from a formatted number with characters other than `.` as the + // decimal place, to a Javascript number + var _numToDecimal = function ( num, decimalPoint ) { + // Cache created regular expressions for speed as this function is called often + if ( ! _re_dic[ decimalPoint ] ) { + _re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' ); + } + return typeof num === 'string' && decimalPoint !== '.' ? + num.replace( /\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) : + num; + }; + + + var _isNumber = function ( d, decimalPoint, formatted ) { + var strType = typeof d === 'string'; + + // If empty return immediately so there must be a number if it is a + // formatted string (this stops the string "k", or "kr", etc being detected + // as a formatted number for currency + if ( _empty( d ) ) { + return true; + } + + if ( decimalPoint && strType ) { + d = _numToDecimal( d, decimalPoint ); + } + + if ( formatted && strType ) { + d = d.replace( _re_formatted_numeric, '' ); + } + + return !isNaN( parseFloat(d) ) && isFinite( d ); + }; + + + // A string without HTML in it can be considered to be HTML still + var _isHtml = function ( d ) { + return _empty( d ) || typeof d === 'string'; + }; + + + var _htmlNumeric = function ( d, decimalPoint, formatted ) { + if ( _empty( d ) ) { + return true; + } + + var html = _isHtml( d ); + return ! html ? + null : + _isNumber( _stripHtml( d ), decimalPoint, formatted ) ? + true : + null; + }; + + + var _pluck = function ( a, prop, prop2 ) { + var out = []; + var i=0, ien=a.length; + + // Could have the test in the loop for slightly smaller code, but speed + // is essential here + if ( prop2 !== undefined ) { + for ( ; i') + .css( { + position: 'fixed', + top: 0, + left: $(window).scrollLeft()*-1, // allow for scrolling + height: 1, + width: 1, + overflow: 'hidden' + } ) + .append( + $('
                ') + .css( { + position: 'absolute', + top: 1, + left: 1, + width: 100, + overflow: 'scroll' + } ) + .append( + $('
                ') + .css( { + width: '100%', + height: 10 + } ) + ) + ) + .appendTo( 'body' ); + + var outer = n.children(); + var inner = outer.children(); + + // Numbers below, in order, are: + // inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth + // + // IE6 XP: 100 100 100 83 + // IE7 Vista: 100 100 100 83 + // IE 8+ Windows: 83 83 100 83 + // Evergreen Windows: 83 83 100 83 + // Evergreen Mac with scrollbars: 85 85 100 85 + // Evergreen Mac without scrollbars: 100 100 100 100 + + // Get scrollbar width + browser.barWidth = outer[0].offsetWidth - outer[0].clientWidth; + + // IE6/7 will oversize a width 100% element inside a scrolling element, to + // include the width of the scrollbar, while other browsers ensure the inner + // element is contained without forcing scrolling + browser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100; + + // In rtl text layout, some browsers (most, but not all) will place the + // scrollbar on the left, rather than the right. + browser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1; + + // IE8- don't provide height and width for getBoundingClientRect + browser.bBounding = n[0].getBoundingClientRect().width ? true : false; + + n.remove(); + } + + $.extend( settings.oBrowser, DataTable.__browser ); + settings.oScroll.iBarWidth = DataTable.__browser.barWidth; + } + + + /** + * Array.prototype reduce[Right] method, used for browsers which don't support + * JS 1.6. Done this way to reduce code size, since we iterate either way + * @param {object} settings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnReduce ( that, fn, init, start, end, inc ) + { + var + i = start, + value, + isSet = false; + + if ( init !== undefined ) { + value = init; + isSet = true; + } + + while ( i !== end ) { + if ( ! that.hasOwnProperty(i) ) { + continue; + } + + value = isSet ? + fn( value, that[i], i, that ) : + that[i]; + + isSet = true; + i += inc; + } + + return value; + } + + /** + * Add a column to the list used for the table with default values + * @param {object} oSettings dataTables settings object + * @param {node} nTh The th element for this column + * @memberof DataTable#oApi + */ + function _fnAddColumn( oSettings, nTh ) + { + // Add column to aoColumns array + var oDefaults = DataTable.defaults.column; + var iCol = oSettings.aoColumns.length; + var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, { + "nTh": nTh ? nTh : document.createElement('th'), + "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '', + "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol], + "mData": oDefaults.mData ? oDefaults.mData : iCol, + idx: iCol + } ); + oSettings.aoColumns.push( oCol ); + + // Add search object for column specific search. Note that the `searchCols[ iCol ]` + // passed into extend can be undefined. This allows the user to give a default + // with only some of the parameters defined, and also not give a default + var searchCols = oSettings.aoPreSearchCols; + searchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] ); + + // Use the default column options function to initialise classes etc + _fnColumnOptions( oSettings, iCol, $(nTh).data() ); + } + + + /** + * Apply options for a column + * @param {object} oSettings dataTables settings object + * @param {int} iCol column index to consider + * @param {object} oOptions object with sType, bVisible and bSearchable etc + * @memberof DataTable#oApi + */ + function _fnColumnOptions( oSettings, iCol, oOptions ) + { + var oCol = oSettings.aoColumns[ iCol ]; + var oClasses = oSettings.oClasses; + var th = $(oCol.nTh); + + // Try to get width information from the DOM. We can't get it from CSS + // as we'd need to parse the CSS stylesheet. `width` option can override + if ( ! oCol.sWidthOrig ) { + // Width attribute + oCol.sWidthOrig = th.attr('width') || null; + + // Style attribute + var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/); + if ( t ) { + oCol.sWidthOrig = t[1]; + } + } + + /* User specified column options */ + if ( oOptions !== undefined && oOptions !== null ) + { + // Backwards compatibility + _fnCompatCols( oOptions ); + + // Map camel case parameters to their Hungarian counterparts + _fnCamelToHungarian( DataTable.defaults.column, oOptions ); + + /* Backwards compatibility for mDataProp */ + if ( oOptions.mDataProp !== undefined && !oOptions.mData ) + { + oOptions.mData = oOptions.mDataProp; + } + + if ( oOptions.sType ) + { + oCol._sManualType = oOptions.sType; + } + + // `class` is a reserved word in Javascript, so we need to provide + // the ability to use a valid name for the camel case input + if ( oOptions.className && ! oOptions.sClass ) + { + oOptions.sClass = oOptions.className; + } + if ( oOptions.sClass ) { + th.addClass( oOptions.sClass ); + } + + $.extend( oCol, oOptions ); + _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" ); + + /* iDataSort to be applied (backwards compatibility), but aDataSort will take + * priority if defined + */ + if ( oOptions.iDataSort !== undefined ) + { + oCol.aDataSort = [ oOptions.iDataSort ]; + } + _fnMap( oCol, oOptions, "aDataSort" ); + } + + /* Cache the data get and set functions for speed */ + var mDataSrc = oCol.mData; + var mData = _fnGetObjectDataFn( mDataSrc ); + var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null; + + var attrTest = function( src ) { + return typeof src === 'string' && src.indexOf('@') !== -1; + }; + oCol._bAttrSrc = $.isPlainObject( mDataSrc ) && ( + attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter) + ); + oCol._setter = null; + + oCol.fnGetData = function (rowData, type, meta) { + var innerData = mData( rowData, type, undefined, meta ); + + return mRender && type ? + mRender( innerData, type, rowData, meta ) : + innerData; + }; + oCol.fnSetData = function ( rowData, val, meta ) { + return _fnSetObjectDataFn( mDataSrc )( rowData, val, meta ); + }; + + // Indicate if DataTables should read DOM data as an object or array + // Used in _fnGetRowElements + if ( typeof mDataSrc !== 'number' ) { + oSettings._rowReadObject = true; + } + + /* Feature sorting overrides column specific when off */ + if ( !oSettings.oFeatures.bSort ) + { + oCol.bSortable = false; + th.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called + } + + /* Check that the class assignment is correct for sorting */ + var bAsc = $.inArray('asc', oCol.asSorting) !== -1; + var bDesc = $.inArray('desc', oCol.asSorting) !== -1; + if ( !oCol.bSortable || (!bAsc && !bDesc) ) + { + oCol.sSortingClass = oClasses.sSortableNone; + oCol.sSortingClassJUI = ""; + } + else if ( bAsc && !bDesc ) + { + oCol.sSortingClass = oClasses.sSortableAsc; + oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed; + } + else if ( !bAsc && bDesc ) + { + oCol.sSortingClass = oClasses.sSortableDesc; + oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed; + } + else + { + oCol.sSortingClass = oClasses.sSortable; + oCol.sSortingClassJUI = oClasses.sSortJUI; + } + } + + + /** + * Adjust the table column widths for new data. Note: you would probably want to + * do a redraw after calling this function! + * @param {object} settings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnAdjustColumnSizing ( settings ) + { + /* Not interested in doing column width calculation if auto-width is disabled */ + if ( settings.oFeatures.bAutoWidth !== false ) + { + var columns = settings.aoColumns; + + _fnCalculateColumnWidths( settings ); + for ( var i=0 , iLen=columns.length ; i
                ').addClass( k ); + $('td', created) + .addClass( k ) + .html( r ) + [0].colSpan = _fnVisbleColumns( ctx ); + + rows.push( created[0] ); + } + }; + + addRow( data, klass ); + + if ( row._details ) { + row._details.detach(); + } + + row._details = $(rows); + + // If the children were already shown, that state should be retained + if ( row._detailsShow ) { + row._details.insertAfter( row.nTr ); + } + }; + + + var __details_remove = function ( api, idx ) + { + var ctx = api.context; + + if ( ctx.length ) { + var row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ]; + + if ( row && row._details ) { + row._details.remove(); + + row._detailsShow = undefined; + row._details = undefined; + } + } + }; + + + var __details_display = function ( api, show ) { + var ctx = api.context; + + if ( ctx.length && api.length ) { + var row = ctx[0].aoData[ api[0] ]; + + if ( row._details ) { + row._detailsShow = show; + + if ( show ) { + row._details.insertAfter( row.nTr ); + } + else { + row._details.detach(); + } + + __details_events( ctx[0] ); + } + } + }; + + + var __details_events = function ( settings ) + { + var api = new _Api( settings ); + var namespace = '.dt.DT_details'; + var drawEvent = 'draw'+namespace; + var colvisEvent = 'column-visibility'+namespace; + var destroyEvent = 'destroy'+namespace; + var data = settings.aoData; + + api.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent ); + + if ( _pluck( data, '_details' ).length > 0 ) { + // On each draw, insert the required elements into the document + api.on( drawEvent, function ( e, ctx ) { + if ( settings !== ctx ) { + return; + } + + api.rows( {page:'current'} ).eq(0).each( function (idx) { + // Internal data grab + var row = data[ idx ]; + + if ( row._detailsShow ) { + row._details.insertAfter( row.nTr ); + } + } ); + } ); + + // Column visibility change - update the colspan + api.on( colvisEvent, function ( e, ctx, idx, vis ) { + if ( settings !== ctx ) { + return; + } + + // Update the colspan for the details rows (note, only if it already has + // a colspan) + var row, visible = _fnVisbleColumns( ctx ); + + for ( var i=0, ien=data.length ; i=0 count from left, <0 count from right) + * "{integer}:visIdx" - visible column index (i.e. translate to column index) (>=0 count from left, <0 count from right) + * "{integer}:visible" - alias for {integer}:visIdx (>=0 count from left, <0 count from right) + * "{string}:name" - column name + * "{string}" - jQuery selector on column header nodes + * + */ + + // can be an array of these items, comma separated list, or an array of comma + // separated lists + + var __re_column_selector = /^([^:]+):(name|visIdx|visible)$/; + + + // r1 and r2 are redundant - but it means that the parameters match for the + // iterator callback in columns().data() + var __columnData = function ( settings, column, r1, r2, rows ) { + var a = []; + for ( var row=0, ien=rows.length ; row= 0 ? + selInt : // Count from left + columns.length + selInt // Count from right (+ because its a negative value) + ]; + } + + // Selector = function + if ( typeof s === 'function' ) { + var rows = _selector_row_indexes( settings, opts ); + + return $.map( columns, function (col, idx) { + return s( + idx, + __columnData( settings, idx, 0, 0, rows ), + nodes[ idx ] + ) ? idx : null; + } ); + } + + // jQuery or string selector + var match = typeof s === 'string' ? + s.match( __re_column_selector ) : + ''; + + if ( match ) { + switch( match[2] ) { + case 'visIdx': + case 'visible': + var idx = parseInt( match[1], 10 ); + // Visible index given, convert to column index + if ( idx < 0 ) { + // Counting from the right + var visColumns = $.map( columns, function (col,i) { + return col.bVisible ? i : null; + } ); + return [ visColumns[ visColumns.length + idx ] ]; + } + // Counting from the left + return [ _fnVisibleToColumnIndex( settings, idx ) ]; + + case 'name': + // match by name. `names` is column index complete and in order + return $.map( names, function (name, i) { + return name === match[1] ? i : null; + } ); + + default: + return []; + } + } + + // Cell in the table body + if ( s.nodeName && s._DT_CellIndex ) { + return [ s._DT_CellIndex.column ]; + } + + // jQuery selector on the TH elements for the columns + var jqResult = $( nodes ) + .filter( s ) + .map( function () { + return $.inArray( this, nodes ); // `nodes` is column index complete and in order + } ) + .toArray(); + + if ( jqResult.length || ! s.nodeName ) { + return jqResult; + } + + // Otherwise a node which might have a `dt-column` data attribute, or be + // a child or such an element + var host = $(s).closest('*[data-dt-column]'); + return host.length ? + [ host.data('dt-column') ] : + []; + }; + + return _selector_run( 'column', selector, run, settings, opts ); + }; + + + var __setColumnVis = function ( settings, column, vis ) { + var + cols = settings.aoColumns, + col = cols[ column ], + data = settings.aoData, + row, cells, i, ien, tr; + + // Get + if ( vis === undefined ) { + return col.bVisible; + } + + // Set + // No change + if ( col.bVisible === vis ) { + return; + } + + if ( vis ) { + // Insert column + // Need to decide if we should use appendChild or insertBefore + var insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 ); + + for ( i=0, ien=data.length ; i iThat; + } + + return true; + }; + + + /** + * Check if a `
                ").addClass("cw").text("#"));c.isBefore(f.clone().endOf("w"));)b.append(a("").addClass("dow").text(c.format("dd"))),c.add(1,"d");o.find(".datepicker-days thead").append(b)},N=function(a){return d.disabledDates[a.format("YYYY-MM-DD")]===!0},O=function(a){return d.enabledDates[a.format("YYYY-MM-DD")]===!0},P=function(a){return d.disabledHours[a.format("H")]===!0},Q=function(a){return d.enabledHours[a.format("H")]===!0},R=function(b,c){if(!b.isValid())return!1;if(d.disabledDates&&"d"===c&&N(b))return!1;if(d.enabledDates&&"d"===c&&!O(b))return!1;if(d.minDate&&b.isBefore(d.minDate,c))return!1;if(d.maxDate&&b.isAfter(d.maxDate,c))return!1;if(d.daysOfWeekDisabled&&"d"===c&&d.daysOfWeekDisabled.indexOf(b.day())!==-1)return!1;if(d.disabledHours&&("h"===c||"m"===c||"s"===c)&&P(b))return!1;if(d.enabledHours&&("h"===c||"m"===c||"s"===c)&&!Q(b))return!1;if(d.disabledTimeIntervals&&("h"===c||"m"===c||"s"===c)){var e=!1;if(a.each(d.disabledTimeIntervals,function(){if(b.isBetween(this[0],this[1]))return e=!0,!1}),e)return!1}return!0},S=function(){for(var b=[],c=f.clone().startOf("y").startOf("d");c.isSame(f,"y");)b.push(a("").attr("data-action","selectMonth").addClass("month").text(c.format("MMM"))),c.add(1,"M");o.find(".datepicker-months td").empty().append(b)},T=function(){var b=o.find(".datepicker-months"),c=b.find("th"),g=b.find("tbody").find("span");c.eq(0).find("span").attr("title",d.tooltips.prevYear),c.eq(1).attr("title",d.tooltips.selectYear),c.eq(2).find("span").attr("title",d.tooltips.nextYear),b.find(".disabled").removeClass("disabled"),R(f.clone().subtract(1,"y"),"y")||c.eq(0).addClass("disabled"),c.eq(1).text(f.year()),R(f.clone().add(1,"y"),"y")||c.eq(2).addClass("disabled"),g.removeClass("active"),e.isSame(f,"y")&&!m&&g.eq(e.month()).addClass("active"),g.each(function(b){R(f.clone().month(b),"M")||a(this).addClass("disabled")})},U=function(){var a=o.find(".datepicker-years"),b=a.find("th"),c=f.clone().subtract(5,"y"),g=f.clone().add(6,"y"),h="";for(b.eq(0).find("span").attr("title",d.tooltips.prevDecade),b.eq(1).attr("title",d.tooltips.selectDecade),b.eq(2).find("span").attr("title",d.tooltips.nextDecade),a.find(".disabled").removeClass("disabled"),d.minDate&&d.minDate.isAfter(c,"y")&&b.eq(0).addClass("disabled"),b.eq(1).text(c.year()+"-"+g.year()),d.maxDate&&d.maxDate.isBefore(g,"y")&&b.eq(2).addClass("disabled");!c.isAfter(g,"y");)h+=''+c.year()+"",c.add(1,"y");a.find("td").html(h)},V=function(){var a,c=o.find(".datepicker-decades"),g=c.find("th"),h=b({y:f.year()-f.year()%100-1}),i=h.clone().add(100,"y"),j=h.clone(),k=!1,l=!1,m="";for(g.eq(0).find("span").attr("title",d.tooltips.prevCentury),g.eq(2).find("span").attr("title",d.tooltips.nextCentury),c.find(".disabled").removeClass("disabled"),(h.isSame(b({y:1900}))||d.minDate&&d.minDate.isAfter(h,"y"))&&g.eq(0).addClass("disabled"),g.eq(1).text(h.year()+"-"+i.year()),(h.isSame(b({y:2e3}))||d.maxDate&&d.maxDate.isBefore(i,"y"))&&g.eq(2).addClass("disabled");!h.isAfter(i,"y");)a=h.year()+12,k=d.minDate&&d.minDate.isAfter(h,"y")&&d.minDate.year()<=a,l=d.maxDate&&d.maxDate.isAfter(h,"y")&&d.maxDate.year()<=a,m+=''+(h.year()+1)+" - "+(h.year()+12)+"",h.add(12,"y");m+="",//push the dangling block over, at least this way it's even +c.find("td").html(m),g.eq(1).text(j.year()+1+"-"+h.year())},W=function(){var b,c,g,h,i=o.find(".datepicker-days"),j=i.find("th"),k=[];if(B()){for(j.eq(0).find("span").attr("title",d.tooltips.prevMonth),j.eq(1).attr("title",d.tooltips.selectMonth),j.eq(2).find("span").attr("title",d.tooltips.nextMonth),i.find(".disabled").removeClass("disabled"),j.eq(1).text(f.format(d.dayViewHeaderFormat)),R(f.clone().subtract(1,"M"),"M")||j.eq(0).addClass("disabled"),R(f.clone().add(1,"M"),"M")||j.eq(2).addClass("disabled"),b=f.clone().startOf("M").startOf("w").startOf("d"),h=0;h<42;h++)//always display 42 days (should show 6 weeks) +0===b.weekday()&&(c=a("
                '+b.week()+"'+b.date()+"
                '+c.format(h?"HH":"hh")+"
                '+c.format("mm")+"
                '+c.format("ss")+"
                ', { + 'valign': 'top', + 'colSpan': _fnVisbleColumns( oSettings ), + 'class': oSettings.oClasses.sRowEmpty + } ).html( sZero ) )[0]; + } + + /* Header and footer callbacks */ + _fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0], + _fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] ); + + _fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0], + _fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] ); + + var body = $(oSettings.nTBody); + + body.children().detach(); + body.append( $(anRows) ); + + /* Call all required callback functions for the end of a draw */ + _fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] ); + + /* Draw is complete, sorting and filtering must be as well */ + oSettings.bSorted = false; + oSettings.bFiltered = false; + oSettings.bDrawing = false; + } + + + /** + * Redraw the table - taking account of the various features which are enabled + * @param {object} oSettings dataTables settings object + * @param {boolean} [holdPosition] Keep the current paging position. By default + * the paging is reset to the first page + * @memberof DataTable#oApi + */ + function _fnReDraw( settings, holdPosition ) + { + var + features = settings.oFeatures, + sort = features.bSort, + filter = features.bFilter; + + if ( sort ) { + _fnSort( settings ); + } + + if ( filter ) { + _fnFilterComplete( settings, settings.oPreviousSearch ); + } + else { + // No filtering, so we want to just use the display master + settings.aiDisplay = settings.aiDisplayMaster.slice(); + } + + if ( holdPosition !== true ) { + settings._iDisplayStart = 0; + } + + // Let any modules know about the draw hold position state (used by + // scrolling internally) + settings._drawHold = holdPosition; + + _fnDraw( settings ); + + settings._drawHold = false; + } + + + /** + * Add the options to the page HTML for the table + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnAddOptionsHtml ( oSettings ) + { + var classes = oSettings.oClasses; + var table = $(oSettings.nTable); + var holding = $('
                ').insertBefore( table ); // Holding element for speed + var features = oSettings.oFeatures; + + // All DataTables are wrapped in a div + var insert = $('
                ', { + id: oSettings.sTableId+'_wrapper', + 'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter) + } ); + + oSettings.nHolding = holding[0]; + oSettings.nTableWrapper = insert[0]; + oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling; + + /* Loop over the user set positioning and place the elements as needed */ + var aDom = oSettings.sDom.split(''); + var featureNode, cOption, nNewNode, cNext, sAttr, j; + for ( var i=0 ; i')[0]; + + /* Check to see if we should append an id and/or a class name to the container */ + cNext = aDom[i+1]; + if ( cNext == "'" || cNext == '"' ) + { + sAttr = ""; + j = 2; + while ( aDom[i+j] != cNext ) + { + sAttr += aDom[i+j]; + j++; + } + + /* Replace jQuery UI constants @todo depreciated */ + if ( sAttr == "H" ) + { + sAttr = classes.sJUIHeader; + } + else if ( sAttr == "F" ) + { + sAttr = classes.sJUIFooter; + } + + /* The attribute can be in the format of "#id.class", "#id" or "class" This logic + * breaks the string into parts and applies them as needed + */ + if ( sAttr.indexOf('.') != -1 ) + { + var aSplit = sAttr.split('.'); + nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1); + nNewNode.className = aSplit[1]; + } + else if ( sAttr.charAt(0) == "#" ) + { + nNewNode.id = sAttr.substr(1, sAttr.length-1); + } + else + { + nNewNode.className = sAttr; + } + + i += j; /* Move along the position array */ + } + + insert.append( nNewNode ); + insert = $(nNewNode); + } + else if ( cOption == '>' ) + { + /* End container div */ + insert = insert.parent(); + } + // @todo Move options into their own plugins? + else if ( cOption == 'l' && features.bPaginate && features.bLengthChange ) + { + /* Length */ + featureNode = _fnFeatureHtmlLength( oSettings ); + } + else if ( cOption == 'f' && features.bFilter ) + { + /* Filter */ + featureNode = _fnFeatureHtmlFilter( oSettings ); + } + else if ( cOption == 'r' && features.bProcessing ) + { + /* pRocessing */ + featureNode = _fnFeatureHtmlProcessing( oSettings ); + } + else if ( cOption == 't' ) + { + /* Table */ + featureNode = _fnFeatureHtmlTable( oSettings ); + } + else if ( cOption == 'i' && features.bInfo ) + { + /* Info */ + featureNode = _fnFeatureHtmlInfo( oSettings ); + } + else if ( cOption == 'p' && features.bPaginate ) + { + /* Pagination */ + featureNode = _fnFeatureHtmlPaginate( oSettings ); + } + else if ( DataTable.ext.feature.length !== 0 ) + { + /* Plug-in features */ + var aoFeatures = DataTable.ext.feature; + for ( var k=0, kLen=aoFeatures.length ; k'; + + var str = language.sSearch; + str = str.match(/_INPUT_/) ? + str.replace('_INPUT_', input) : + str+input; + + var filter = $('
                ', { + 'id': ! features.f ? tableId+'_filter' : null, + 'class': classes.sFilter + } ) + .append( $('
                ').addClass( classes.sLength ); + if ( ! settings.aanFeatures.l ) { + div[0].id = tableId+'_length'; + } + + div.children().append( + settings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML ) + ); + + // Can't use `select` variable as user might provide their own and the + // reference is broken by the use of outerHTML + $('select', div) + .val( settings._iDisplayLength ) + .on( 'change.DT', function(e) { + _fnLengthChange( settings, $(this).val() ); + _fnDraw( settings ); + } ); + + // Update node value whenever anything changes the table's length + $(settings.nTable).on( 'length.dt.DT', function (e, s, len) { + if ( settings === s ) { + $('select', div).val( len ); + } + } ); + + return div[0]; + } + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Note that most of the paging logic is done in + * DataTable.ext.pager + */ + + /** + * Generate the node required for default pagination + * @param {object} oSettings dataTables settings object + * @returns {node} Pagination feature node + * @memberof DataTable#oApi + */ + function _fnFeatureHtmlPaginate ( settings ) + { + var + type = settings.sPaginationType, + plugin = DataTable.ext.pager[ type ], + modern = typeof plugin === 'function', + redraw = function( settings ) { + _fnDraw( settings ); + }, + node = $('
                ').addClass( settings.oClasses.sPaging + type )[0], + features = settings.aanFeatures; + + if ( ! modern ) { + plugin.fnInit( settings, node, redraw ); + } + + /* Add a draw callback for the pagination on first instance, to update the paging display */ + if ( ! features.p ) + { + node.id = settings.sTableId+'_paginate'; + + settings.aoDrawCallback.push( { + "fn": function( settings ) { + if ( modern ) { + var + start = settings._iDisplayStart, + len = settings._iDisplayLength, + visRecords = settings.fnRecordsDisplay(), + all = len === -1, + page = all ? 0 : Math.ceil( start / len ), + pages = all ? 1 : Math.ceil( visRecords / len ), + buttons = plugin(page, pages), + i, ien; + + for ( i=0, ien=features.p.length ; i records ) + { + start = 0; + } + } + else if ( action == "first" ) + { + start = 0; + } + else if ( action == "previous" ) + { + start = len >= 0 ? + start - len : + 0; + + if ( start < 0 ) + { + start = 0; + } + } + else if ( action == "next" ) + { + if ( start + len < records ) + { + start += len; + } + } + else if ( action == "last" ) + { + start = Math.floor( (records-1) / len) * len; + } + else + { + _fnLog( settings, 0, "Unknown paging action: "+action, 5 ); + } + + var changed = settings._iDisplayStart !== start; + settings._iDisplayStart = start; + + if ( changed ) { + _fnCallbackFire( settings, null, 'page', [settings] ); + + if ( redraw ) { + _fnDraw( settings ); + } + } + + return changed; + } + + + + /** + * Generate the node required for the processing node + * @param {object} settings dataTables settings object + * @returns {node} Processing element + * @memberof DataTable#oApi + */ + function _fnFeatureHtmlProcessing ( settings ) + { + return $('
                ', { + 'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null, + 'class': settings.oClasses.sProcessing + } ) + .html( settings.oLanguage.sProcessing ) + .insertBefore( settings.nTable )[0]; + } + + + /** + * Display or hide the processing indicator + * @param {object} settings dataTables settings object + * @param {bool} show Show the processing indicator (true) or not (false) + * @memberof DataTable#oApi + */ + function _fnProcessingDisplay ( settings, show ) + { + if ( settings.oFeatures.bProcessing ) { + $(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' ); + } + + _fnCallbackFire( settings, null, 'processing', [settings, show] ); + } + + /** + * Add any control elements for the table - specifically scrolling + * @param {object} settings dataTables settings object + * @returns {node} Node to add to the DOM + * @memberof DataTable#oApi + */ + function _fnFeatureHtmlTable ( settings ) + { + var table = $(settings.nTable); + + // Add the ARIA grid role to the table + table.attr( 'role', 'grid' ); + + // Scrolling from here on in + var scroll = settings.oScroll; + + if ( scroll.sX === '' && scroll.sY === '' ) { + return settings.nTable; + } + + var scrollX = scroll.sX; + var scrollY = scroll.sY; + var classes = settings.oClasses; + var caption = table.children('caption'); + var captionSide = caption.length ? caption[0]._captionSide : null; + var headerClone = $( table[0].cloneNode(false) ); + var footerClone = $( table[0].cloneNode(false) ); + var footer = table.children('tfoot'); + var _div = '
                '; + var size = function ( s ) { + return !s ? null : _fnStringToCss( s ); + }; + + if ( ! footer.length ) { + footer = null; + } + + /* + * The HTML structure that we want to generate in this function is: + * div - scroller + * div - scroll head + * div - scroll head inner + * table - scroll head table + * thead - thead + * div - scroll body + * table - table (master table) + * thead - thead clone for sizing + * tbody - tbody + * div - scroll foot + * div - scroll foot inner + * table - scroll foot table + * tfoot - tfoot + */ + var scroller = $( _div, { 'class': classes.sScrollWrapper } ) + .append( + $(_div, { 'class': classes.sScrollHead } ) + .css( { + overflow: 'hidden', + position: 'relative', + border: 0, + width: scrollX ? size(scrollX) : '100%' + } ) + .append( + $(_div, { 'class': classes.sScrollHeadInner } ) + .css( { + 'box-sizing': 'content-box', + width: scroll.sXInner || '100%' + } ) + .append( + headerClone + .removeAttr('id') + .css( 'margin-left', 0 ) + .append( captionSide === 'top' ? caption : null ) + .append( + table.children('thead') + ) + ) + ) + ) + .append( + $(_div, { 'class': classes.sScrollBody } ) + .css( { + position: 'relative', + overflow: 'auto', + width: size( scrollX ) + } ) + .append( table ) + ); + + if ( footer ) { + scroller.append( + $(_div, { 'class': classes.sScrollFoot } ) + .css( { + overflow: 'hidden', + border: 0, + width: scrollX ? size(scrollX) : '100%' + } ) + .append( + $(_div, { 'class': classes.sScrollFootInner } ) + .append( + footerClone + .removeAttr('id') + .css( 'margin-left', 0 ) + .append( captionSide === 'bottom' ? caption : null ) + .append( + table.children('tfoot') + ) + ) + ) + ); + } + + var children = scroller.children(); + var scrollHead = children[0]; + var scrollBody = children[1]; + var scrollFoot = footer ? children[2] : null; + + // When the body is scrolled, then we also want to scroll the headers + if ( scrollX ) { + $(scrollBody).on( 'scroll.DT', function (e) { + var scrollLeft = this.scrollLeft; + + scrollHead.scrollLeft = scrollLeft; + + if ( footer ) { + scrollFoot.scrollLeft = scrollLeft; + } + } ); + } + + $(scrollBody).css( + scrollY && scroll.bCollapse ? 'max-height' : 'height', + scrollY + ); + + settings.nScrollHead = scrollHead; + settings.nScrollBody = scrollBody; + settings.nScrollFoot = scrollFoot; + + // On redraw - align columns + settings.aoDrawCallback.push( { + "fn": _fnScrollDraw, + "sName": "scrolling" + } ); + + return scroller[0]; + } + + + + /** + * Update the header, footer and body tables for resizing - i.e. column + * alignment. + * + * Welcome to the most horrible function DataTables. The process that this + * function follows is basically: + * 1. Re-create the table inside the scrolling div + * 2. Take live measurements from the DOM + * 3. Apply the measurements to align the columns + * 4. Clean up + * + * @param {object} settings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnScrollDraw ( settings ) + { + // Given that this is such a monster function, a lot of variables are use + // to try and keep the minimised size as small as possible + var + scroll = settings.oScroll, + scrollX = scroll.sX, + scrollXInner = scroll.sXInner, + scrollY = scroll.sY, + barWidth = scroll.iBarWidth, + divHeader = $(settings.nScrollHead), + divHeaderStyle = divHeader[0].style, + divHeaderInner = divHeader.children('div'), + divHeaderInnerStyle = divHeaderInner[0].style, + divHeaderTable = divHeaderInner.children('table'), + divBodyEl = settings.nScrollBody, + divBody = $(divBodyEl), + divBodyStyle = divBodyEl.style, + divFooter = $(settings.nScrollFoot), + divFooterInner = divFooter.children('div'), + divFooterTable = divFooterInner.children('table'), + header = $(settings.nTHead), + table = $(settings.nTable), + tableEl = table[0], + tableStyle = tableEl.style, + footer = settings.nTFoot ? $(settings.nTFoot) : null, + browser = settings.oBrowser, + ie67 = browser.bScrollOversize, + dtHeaderCells = _pluck( settings.aoColumns, 'nTh' ), + headerTrgEls, footerTrgEls, + headerSrcEls, footerSrcEls, + headerCopy, footerCopy, + headerWidths=[], footerWidths=[], + headerContent=[], footerContent=[], + idx, correction, sanityWidth, + zeroOut = function(nSizer) { + var style = nSizer.style; + style.paddingTop = "0"; + style.paddingBottom = "0"; + style.borderTopWidth = "0"; + style.borderBottomWidth = "0"; + style.height = 0; + }; + + // If the scrollbar visibility has changed from the last draw, we need to + // adjust the column sizes as the table width will have changed to account + // for the scrollbar + var scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight; + + if ( settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined ) { + settings.scrollBarVis = scrollBarVis; + _fnAdjustColumnSizing( settings ); + return; // adjust column sizing will call this function again + } + else { + settings.scrollBarVis = scrollBarVis; + } + + /* + * 1. Re-create the table inside the scrolling div + */ + + // Remove the old minimised thead and tfoot elements in the inner table + table.children('thead, tfoot').remove(); + + if ( footer ) { + footerCopy = footer.clone().prependTo( table ); + footerTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized + footerSrcEls = footerCopy.find('tr'); + } + + // Clone the current header and footer elements and then place it into the inner table + headerCopy = header.clone().prependTo( table ); + headerTrgEls = header.find('tr'); // original header is in its own table + headerSrcEls = headerCopy.find('tr'); + headerCopy.find('th, td').removeAttr('tabindex'); + + + /* + * 2. Take live measurements from the DOM - do not alter the DOM itself! + */ + + // Remove old sizing and apply the calculated column widths + // Get the unique column headers in the newly created (cloned) header. We want to apply the + // calculated sizes to this header + if ( ! scrollX ) + { + divBodyStyle.width = '100%'; + divHeader[0].style.width = '100%'; + } + + $.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) { + idx = _fnVisibleToColumnIndex( settings, i ); + el.style.width = settings.aoColumns[idx].sWidth; + } ); + + if ( footer ) { + _fnApplyToChildren( function(n) { + n.style.width = ""; + }, footerSrcEls ); + } + + // Size the table as a whole + sanityWidth = table.outerWidth(); + if ( scrollX === "" ) { + // No x scrolling + tableStyle.width = "100%"; + + // IE7 will make the width of the table when 100% include the scrollbar + // - which is shouldn't. When there is a scrollbar we need to take this + // into account. + if ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight || + divBody.css('overflow-y') == "scroll") + ) { + tableStyle.width = _fnStringToCss( table.outerWidth() - barWidth); + } + + // Recalculate the sanity width + sanityWidth = table.outerWidth(); + } + else if ( scrollXInner !== "" ) { + // legacy x scroll inner has been given - use it + tableStyle.width = _fnStringToCss(scrollXInner); + + // Recalculate the sanity width + sanityWidth = table.outerWidth(); + } + + // Hidden header should have zero height, so remove padding and borders. Then + // set the width based on the real headers + + // Apply all styles in one pass + _fnApplyToChildren( zeroOut, headerSrcEls ); + + // Read all widths in next pass + _fnApplyToChildren( function(nSizer) { + headerContent.push( nSizer.innerHTML ); + headerWidths.push( _fnStringToCss( $(nSizer).css('width') ) ); + }, headerSrcEls ); + + // Apply all widths in final pass + _fnApplyToChildren( function(nToSize, i) { + // Only apply widths to the DataTables detected header cells - this + // prevents complex headers from having contradictory sizes applied + if ( $.inArray( nToSize, dtHeaderCells ) !== -1 ) { + nToSize.style.width = headerWidths[i]; + } + }, headerTrgEls ); + + $(headerSrcEls).height(0); + + /* Same again with the footer if we have one */ + if ( footer ) + { + _fnApplyToChildren( zeroOut, footerSrcEls ); + + _fnApplyToChildren( function(nSizer) { + footerContent.push( nSizer.innerHTML ); + footerWidths.push( _fnStringToCss( $(nSizer).css('width') ) ); + }, footerSrcEls ); + + _fnApplyToChildren( function(nToSize, i) { + nToSize.style.width = footerWidths[i]; + }, footerTrgEls ); + + $(footerSrcEls).height(0); + } + + + /* + * 3. Apply the measurements + */ + + // "Hide" the header and footer that we used for the sizing. We need to keep + // the content of the cell so that the width applied to the header and body + // both match, but we want to hide it completely. We want to also fix their + // width to what they currently are + _fnApplyToChildren( function(nSizer, i) { + nSizer.innerHTML = '
                '+headerContent[i]+'
                '; + nSizer.style.width = headerWidths[i]; + }, headerSrcEls ); + + if ( footer ) + { + _fnApplyToChildren( function(nSizer, i) { + nSizer.innerHTML = '
                '+footerContent[i]+'
                '; + nSizer.style.width = footerWidths[i]; + }, footerSrcEls ); + } + + // Sanity check that the table is of a sensible width. If not then we are going to get + // misalignment - try to prevent this by not allowing the table to shrink below its min width + if ( table.outerWidth() < sanityWidth ) + { + // The min width depends upon if we have a vertical scrollbar visible or not */ + correction = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight || + divBody.css('overflow-y') == "scroll")) ? + sanityWidth+barWidth : + sanityWidth; + + // IE6/7 are a law unto themselves... + if ( ie67 && (divBodyEl.scrollHeight > + divBodyEl.offsetHeight || divBody.css('overflow-y') == "scroll") + ) { + tableStyle.width = _fnStringToCss( correction-barWidth ); + } + + // And give the user a warning that we've stopped the table getting too small + if ( scrollX === "" || scrollXInner !== "" ) { + _fnLog( settings, 1, 'Possible column misalignment', 6 ); + } + } + else + { + correction = '100%'; + } + + // Apply to the container elements + divBodyStyle.width = _fnStringToCss( correction ); + divHeaderStyle.width = _fnStringToCss( correction ); + + if ( footer ) { + settings.nScrollFoot.style.width = _fnStringToCss( correction ); + } + + + /* + * 4. Clean up + */ + if ( ! scrollY ) { + /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting + * the scrollbar height from the visible display, rather than adding it on. We need to + * set the height in order to sort this. Don't want to do it in any other browsers. + */ + if ( ie67 ) { + divBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth ); + } + } + + /* Finally set the width's of the header and footer tables */ + var iOuterWidth = table.outerWidth(); + divHeaderTable[0].style.width = _fnStringToCss( iOuterWidth ); + divHeaderInnerStyle.width = _fnStringToCss( iOuterWidth ); + + // Figure out if there are scrollbar present - if so then we need a the header and footer to + // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar) + var bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == "scroll"; + var padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' ); + divHeaderInnerStyle[ padding ] = bScrolling ? barWidth+"px" : "0px"; + + if ( footer ) { + divFooterTable[0].style.width = _fnStringToCss( iOuterWidth ); + divFooterInner[0].style.width = _fnStringToCss( iOuterWidth ); + divFooterInner[0].style[padding] = bScrolling ? barWidth+"px" : "0px"; + } + + // Correct DOM ordering for colgroup - comes before the thead + table.children('colgroup').insertBefore( table.children('thead') ); + + /* Adjust the position of the header in case we loose the y-scrollbar */ + divBody.scroll(); + + // If sorting or filtering has occurred, jump the scrolling back to the top + // only if we aren't holding the position + if ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) { + divBodyEl.scrollTop = 0; + } + } + + + + /** + * Apply a given function to the display child nodes of an element array (typically + * TD children of TR rows + * @param {function} fn Method to apply to the objects + * @param array {nodes} an1 List of elements to look through for display children + * @param array {nodes} an2 Another list (identical structure to the first) - optional + * @memberof DataTable#oApi + */ + function _fnApplyToChildren( fn, an1, an2 ) + { + var index=0, i=0, iLen=an1.length; + var nNode1, nNode2; + + while ( i < iLen ) { + nNode1 = an1[i].firstChild; + nNode2 = an2 ? an2[i].firstChild : null; + + while ( nNode1 ) { + if ( nNode1.nodeType === 1 ) { + if ( an2 ) { + fn( nNode1, nNode2, index ); + } + else { + fn( nNode1, index ); + } + + index++; + } + + nNode1 = nNode1.nextSibling; + nNode2 = an2 ? nNode2.nextSibling : null; + } + + i++; + } + } + + + + var __re_html_remove = /<.*?>/g; + + + /** + * Calculate the width of columns for the table + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnCalculateColumnWidths ( oSettings ) + { + var + table = oSettings.nTable, + columns = oSettings.aoColumns, + scroll = oSettings.oScroll, + scrollY = scroll.sY, + scrollX = scroll.sX, + scrollXInner = scroll.sXInner, + columnCount = columns.length, + visibleColumns = _fnGetColumns( oSettings, 'bVisible' ), + headerCells = $('th', oSettings.nTHead), + tableWidthAttr = table.getAttribute('width'), // from DOM element + tableContainer = table.parentNode, + userInputs = false, + i, column, columnIdx, width, outerWidth, + browser = oSettings.oBrowser, + ie67 = browser.bScrollOversize; + + var styleWidth = table.style.width; + if ( styleWidth && styleWidth.indexOf('%') !== -1 ) { + tableWidthAttr = styleWidth; + } + + /* Convert any user input sizes into pixel sizes */ + for ( i=0 ; i').appendTo( tmpTable.find('tbody') ); + + // Clone the table header and footer - we can't use the header / footer + // from the cloned table, since if scrolling is active, the table's + // real header and footer are contained in different table tags + tmpTable.find('thead, tfoot').remove(); + tmpTable + .append( $(oSettings.nTHead).clone() ) + .append( $(oSettings.nTFoot).clone() ); + + // Remove any assigned widths from the footer (from scrolling) + tmpTable.find('tfoot th, tfoot td').css('width', ''); + + // Apply custom sizing to the cloned header + headerCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] ); + + for ( i=0 ; i').css( { + width: column.sWidthOrig, + margin: 0, + padding: 0, + border: 0, + height: 1 + } ) ); + } + } + + // Find the widest cell for each column and put it into the table + if ( oSettings.aoData.length ) { + for ( i=0 ; i').css( scrollX || scrollY ? + { + position: 'absolute', + top: 0, + left: 0, + height: 1, + right: 0, + overflow: 'hidden' + } : + {} + ) + .append( tmpTable ) + .appendTo( tableContainer ); + + // When scrolling (X or Y) we want to set the width of the table as + // appropriate. However, when not scrolling leave the table width as it + // is. This results in slightly different, but I think correct behaviour + if ( scrollX && scrollXInner ) { + tmpTable.width( scrollXInner ); + } + else if ( scrollX ) { + tmpTable.css( 'width', 'auto' ); + tmpTable.removeAttr('width'); + + // If there is no width attribute or style, then allow the table to + // collapse + if ( tmpTable.width() < tableContainer.clientWidth && tableWidthAttr ) { + tmpTable.width( tableContainer.clientWidth ); + } + } + else if ( scrollY ) { + tmpTable.width( tableContainer.clientWidth ); + } + else if ( tableWidthAttr ) { + tmpTable.width( tableWidthAttr ); + } + + // Get the width of each column in the constructed table - we need to + // know the inner width (so it can be assigned to the other table's + // cells) and the outer width so we can calculate the full width of the + // table. This is safe since DataTables requires a unique cell for each + // column, but if ever a header can span multiple columns, this will + // need to be modified. + var total = 0; + for ( i=0 ; i') + .css( 'width', _fnStringToCss( width ) ) + .appendTo( parent || document.body ); + + var val = n[0].offsetWidth; + n.remove(); + + return val; + } + + + /** + * Get the widest node + * @param {object} settings dataTables settings object + * @param {int} colIdx column of interest + * @returns {node} widest table node + * @memberof DataTable#oApi + */ + function _fnGetWidestNode( settings, colIdx ) + { + var idx = _fnGetMaxLenString( settings, colIdx ); + if ( idx < 0 ) { + return null; + } + + var data = settings.aoData[ idx ]; + return ! data.nTr ? // Might not have been created when deferred rendering + $('
                ').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] : + data.anCells[ colIdx ]; + } + + + /** + * Get the maximum strlen for each data column + * @param {object} settings dataTables settings object + * @param {int} colIdx column of interest + * @returns {string} max string length for each column + * @memberof DataTable#oApi + */ + function _fnGetMaxLenString( settings, colIdx ) + { + var s, max=-1, maxIdx = -1; + + for ( var i=0, ien=settings.aoData.length ; i max ) { + max = s.length; + maxIdx = i; + } + } + + return maxIdx; + } + + + /** + * Append a CSS unit (only if required) to a string + * @param {string} value to css-ify + * @returns {string} value with css unit + * @memberof DataTable#oApi + */ + function _fnStringToCss( s ) + { + if ( s === null ) { + return '0px'; + } + + if ( typeof s == 'number' ) { + return s < 0 ? + '0px' : + s+'px'; + } + + // Check it has a unit character already + return s.match(/\d$/) ? + s+'px' : + s; + } + + + + function _fnSortFlatten ( settings ) + { + var + i, iLen, k, kLen, + aSort = [], + aiOrig = [], + aoColumns = settings.aoColumns, + aDataSort, iCol, sType, srcCol, + fixed = settings.aaSortingFixed, + fixedObj = $.isPlainObject( fixed ), + nestedSort = [], + add = function ( a ) { + if ( a.length && ! $.isArray( a[0] ) ) { + // 1D array + nestedSort.push( a ); + } + else { + // 2D array + $.merge( nestedSort, a ); + } + }; + + // Build the sort array, with pre-fix and post-fix options if they have been + // specified + if ( $.isArray( fixed ) ) { + add( fixed ); + } + + if ( fixedObj && fixed.pre ) { + add( fixed.pre ); + } + + add( settings.aaSorting ); + + if (fixedObj && fixed.post ) { + add( fixed.post ); + } + + for ( i=0 ; iy ? 1 : 0; + if ( test !== 0 ) { + return sort.dir === 'asc' ? test : -test; + } + } + + x = aiOrig[a]; + y = aiOrig[b]; + return xy ? 1 : 0; + } ); + } + else { + // Depreciated - remove in 1.11 (providing a plug-in option) + // Not all sort types have formatting methods, so we have to call their sorting + // methods. + displayMaster.sort( function ( a, b ) { + var + x, y, k, l, test, sort, fn, + len=aSort.length, + dataA = aoData[a]._aSortData, + dataB = aoData[b]._aSortData; + + for ( k=0 ; ky ? 1 : 0; + } ); + } + } + + /* Tell the draw function that we have sorted the data */ + oSettings.bSorted = true; + } + + + function _fnSortAria ( settings ) + { + var label; + var nextSort; + var columns = settings.aoColumns; + var aSort = _fnSortFlatten( settings ); + var oAria = settings.oLanguage.oAria; + + // ARIA attributes - need to loop all columns, to update all (removing old + // attributes as needed) + for ( var i=0, iLen=columns.length ; i/g, "" ); + var th = col.nTh; + + // IE7 is throwing an error when setting these properties with jQuery's + // attr() and removeAttr() methods... + th.removeAttribute('aria-sort'); + + /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */ + if ( col.bSortable ) { + if ( aSort.length > 0 && aSort[0].col == i ) { + th.setAttribute('aria-sort', aSort[0].dir=="asc" ? "ascending" : "descending" ); + nextSort = asSorting[ aSort[0].index+1 ] || asSorting[0]; + } + else { + nextSort = asSorting[0]; + } + + label = sTitle + ( nextSort === "asc" ? + oAria.sSortAscending : + oAria.sSortDescending + ); + } + else { + label = sTitle; + } + + th.setAttribute('aria-label', label); + } + } + + + /** + * Function to run on user sort request + * @param {object} settings dataTables settings object + * @param {node} attachTo node to attach the handler to + * @param {int} colIdx column sorting index + * @param {boolean} [append=false] Append the requested sort to the existing + * sort if true (i.e. multi-column sort) + * @param {function} [callback] callback function + * @memberof DataTable#oApi + */ + function _fnSortListener ( settings, colIdx, append, callback ) + { + var col = settings.aoColumns[ colIdx ]; + var sorting = settings.aaSorting; + var asSorting = col.asSorting; + var nextSortIdx; + var next = function ( a, overflow ) { + var idx = a._idx; + if ( idx === undefined ) { + idx = $.inArray( a[1], asSorting ); + } + + return idx+1 < asSorting.length ? + idx+1 : + overflow ? + null : + 0; + }; + + // Convert to 2D array if needed + if ( typeof sorting[0] === 'number' ) { + sorting = settings.aaSorting = [ sorting ]; + } + + // If appending the sort then we are multi-column sorting + if ( append && settings.oFeatures.bSortMulti ) { + // Are we already doing some kind of sort on this column? + var sortIdx = $.inArray( colIdx, _pluck(sorting, '0') ); + + if ( sortIdx !== -1 ) { + // Yes, modify the sort + nextSortIdx = next( sorting[sortIdx], true ); + + if ( nextSortIdx === null && sorting.length === 1 ) { + nextSortIdx = 0; // can't remove sorting completely + } + + if ( nextSortIdx === null ) { + sorting.splice( sortIdx, 1 ); + } + else { + sorting[sortIdx][1] = asSorting[ nextSortIdx ]; + sorting[sortIdx]._idx = nextSortIdx; + } + } + else { + // No sort on this column yet + sorting.push( [ colIdx, asSorting[0], 0 ] ); + sorting[sorting.length-1]._idx = 0; + } + } + else if ( sorting.length && sorting[0][0] == colIdx ) { + // Single column - already sorting on this column, modify the sort + nextSortIdx = next( sorting[0] ); + + sorting.length = 1; + sorting[0][1] = asSorting[ nextSortIdx ]; + sorting[0]._idx = nextSortIdx; + } + else { + // Single column - sort only on this column + sorting.length = 0; + sorting.push( [ colIdx, asSorting[0] ] ); + sorting[0]._idx = 0; + } + + // Run the sort by calling a full redraw + _fnReDraw( settings ); + + // callback used for async user interaction + if ( typeof callback == 'function' ) { + callback( settings ); + } + } + + + /** + * Attach a sort handler (click) to a node + * @param {object} settings dataTables settings object + * @param {node} attachTo node to attach the handler to + * @param {int} colIdx column sorting index + * @param {function} [callback] callback function + * @memberof DataTable#oApi + */ + function _fnSortAttachListener ( settings, attachTo, colIdx, callback ) + { + var col = settings.aoColumns[ colIdx ]; + + _fnBindAction( attachTo, {}, function (e) { + /* If the column is not sortable - don't to anything */ + if ( col.bSortable === false ) { + return; + } + + // If processing is enabled use a timeout to allow the processing + // display to be shown - otherwise to it synchronously + if ( settings.oFeatures.bProcessing ) { + _fnProcessingDisplay( settings, true ); + + setTimeout( function() { + _fnSortListener( settings, colIdx, e.shiftKey, callback ); + + // In server-side processing, the draw callback will remove the + // processing display + if ( _fnDataSource( settings ) !== 'ssp' ) { + _fnProcessingDisplay( settings, false ); + } + }, 0 ); + } + else { + _fnSortListener( settings, colIdx, e.shiftKey, callback ); + } + } ); + } + + + /** + * Set the sorting classes on table's body, Note: it is safe to call this function + * when bSort and bSortClasses are false + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnSortingClasses( settings ) + { + var oldSort = settings.aLastSort; + var sortClass = settings.oClasses.sSortColumn; + var sort = _fnSortFlatten( settings ); + var features = settings.oFeatures; + var i, ien, colIdx; + + if ( features.bSort && features.bSortClasses ) { + // Remove old sorting classes + for ( i=0, ien=oldSort.length ; i 0 && s.time < +new Date() - (duration*1000) ) { + callback(); + return; + } + + // Number of columns have changed - all bets are off, no restore of settings + if ( s.columns && columns.length !== s.columns.length ) { + callback(); + return; + } + + // Store the saved state so it might be accessed at any time + settings.oLoadedState = $.extend( true, {}, s ); + + // Restore key features - todo - for 1.11 this needs to be done by + // subscribed events + if ( s.start !== undefined ) { + settings._iDisplayStart = s.start; + settings.iInitDisplayStart = s.start; + } + if ( s.length !== undefined ) { + settings._iDisplayLength = s.length; + } + + // Order + if ( s.order !== undefined ) { + settings.aaSorting = []; + $.each( s.order, function ( i, col ) { + settings.aaSorting.push( col[0] >= columns.length ? + [ 0, col[1] ] : + col + ); + } ); + } + + // Search + if ( s.search !== undefined ) { + $.extend( settings.oPreviousSearch, _fnSearchToHung( s.search ) ); + } + + // Columns + // + if ( s.columns ) { + for ( i=0, ien=s.columns.length ; i= end ) + { + start = end - len; + } + + // Keep the start record on the current page + start -= (start % len); + + if ( len === -1 || start < 0 ) + { + start = 0; + } + + settings._iDisplayStart = start; + } + + + function _fnRenderer( settings, type ) + { + var renderer = settings.renderer; + var host = DataTable.ext.renderer[type]; + + if ( $.isPlainObject( renderer ) && renderer[type] ) { + // Specific renderer for this type. If available use it, otherwise use + // the default. + return host[renderer[type]] || host._; + } + else if ( typeof renderer === 'string' ) { + // Common renderer - if there is one available for this type use it, + // otherwise use the default + return host[renderer] || host._; + } + + // Use the default + return host._; + } + + + /** + * Detect the data source being used for the table. Used to simplify the code + * a little (ajax) and to make it compress a little smaller. + * + * @param {object} settings dataTables settings object + * @returns {string} Data source + * @memberof DataTable#oApi + */ + function _fnDataSource ( settings ) + { + if ( settings.oFeatures.bServerSide ) { + return 'ssp'; + } + else if ( settings.ajax || settings.sAjaxSource ) { + return 'ajax'; + } + return 'dom'; + } + + + + + /** + * Computed structure of the DataTables API, defined by the options passed to + * `DataTable.Api.register()` when building the API. + * + * The structure is built in order to speed creation and extension of the Api + * objects since the extensions are effectively pre-parsed. + * + * The array is an array of objects with the following structure, where this + * base array represents the Api prototype base: + * + * [ + * { + * name: 'data' -- string - Property name + * val: function () {}, -- function - Api method (or undefined if just an object + * methodExt: [ ... ], -- array - Array of Api object definitions to extend the method result + * propExt: [ ... ] -- array - Array of Api object definitions to extend the property + * }, + * { + * name: 'row' + * val: {}, + * methodExt: [ ... ], + * propExt: [ + * { + * name: 'data' + * val: function () {}, + * methodExt: [ ... ], + * propExt: [ ... ] + * }, + * ... + * ] + * } + * ] + * + * @type {Array} + * @ignore + */ + var __apiStruct = []; + + + /** + * `Array.prototype` reference. + * + * @type object + * @ignore + */ + var __arrayProto = Array.prototype; + + + /** + * Abstraction for `context` parameter of the `Api` constructor to allow it to + * take several different forms for ease of use. + * + * Each of the input parameter types will be converted to a DataTables settings + * object where possible. + * + * @param {string|node|jQuery|object} mixed DataTable identifier. Can be one + * of: + * + * * `string` - jQuery selector. Any DataTables' matching the given selector + * with be found and used. + * * `node` - `TABLE` node which has already been formed into a DataTable. + * * `jQuery` - A jQuery object of `TABLE` nodes. + * * `object` - DataTables settings object + * * `DataTables.Api` - API instance + * @return {array|null} Matching DataTables settings objects. `null` or + * `undefined` is returned if no matching DataTable is found. + * @ignore + */ + var _toSettings = function ( mixed ) + { + var idx, jq; + var settings = DataTable.settings; + var tables = $.map( settings, function (el, i) { + return el.nTable; + } ); + + if ( ! mixed ) { + return []; + } + else if ( mixed.nTable && mixed.oApi ) { + // DataTables settings object + return [ mixed ]; + } + else if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) { + // Table node + idx = $.inArray( mixed, tables ); + return idx !== -1 ? [ settings[idx] ] : null; + } + else if ( mixed && typeof mixed.settings === 'function' ) { + return mixed.settings().toArray(); + } + else if ( typeof mixed === 'string' ) { + // jQuery selector + jq = $(mixed); + } + else if ( mixed instanceof $ ) { + // jQuery object (also DataTables instance) + jq = mixed; + } + + if ( jq ) { + return jq.map( function(i) { + idx = $.inArray( this, tables ); + return idx !== -1 ? settings[idx] : null; + } ).toArray(); + } + }; + + + /** + * DataTables API class - used to control and interface with one or more + * DataTables enhanced tables. + * + * The API class is heavily based on jQuery, presenting a chainable interface + * that you can use to interact with tables. Each instance of the API class has + * a "context" - i.e. the tables that it will operate on. This could be a single + * table, all tables on a page or a sub-set thereof. + * + * Additionally the API is designed to allow you to easily work with the data in + * the tables, retrieving and manipulating it as required. This is done by + * presenting the API class as an array like interface. The contents of the + * array depend upon the actions requested by each method (for example + * `rows().nodes()` will return an array of nodes, while `rows().data()` will + * return an array of objects or arrays depending upon your table's + * configuration). The API object has a number of array like methods (`push`, + * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`, + * `unique` etc) to assist your working with the data held in a table. + * + * Most methods (those which return an Api instance) are chainable, which means + * the return from a method call also has all of the methods available that the + * top level object had. For example, these two calls are equivalent: + * + * // Not chained + * api.row.add( {...} ); + * api.draw(); + * + * // Chained + * api.row.add( {...} ).draw(); + * + * @class DataTable.Api + * @param {array|object|string|jQuery} context DataTable identifier. This is + * used to define which DataTables enhanced tables this API will operate on. + * Can be one of: + * + * * `string` - jQuery selector. Any DataTables' matching the given selector + * with be found and used. + * * `node` - `TABLE` node which has already been formed into a DataTable. + * * `jQuery` - A jQuery object of `TABLE` nodes. + * * `object` - DataTables settings object + * @param {array} [data] Data to initialise the Api instance with. + * + * @example + * // Direct initialisation during DataTables construction + * var api = $('#example').DataTable(); + * + * @example + * // Initialisation using a DataTables jQuery object + * var api = $('#example').dataTable().api(); + * + * @example + * // Initialisation as a constructor + * var api = new $.fn.DataTable.Api( 'table.dataTable' ); + */ + _Api = function ( context, data ) + { + if ( ! (this instanceof _Api) ) { + return new _Api( context, data ); + } + + var settings = []; + var ctxSettings = function ( o ) { + var a = _toSettings( o ); + if ( a ) { + settings = settings.concat( a ); + } + }; + + if ( $.isArray( context ) ) { + for ( var i=0, ien=context.length ; i idx ? + new _Api( ctx[idx], this[idx] ) : + null; + }, + + + filter: function ( fn ) + { + var a = []; + + if ( __arrayProto.filter ) { + a = __arrayProto.filter.call( this, fn, this ); + } + else { + // Compatibility for browsers without EMCA-252-5 (JS 1.6) + for ( var i=0, ien=this.length ; i 0 ) { + return ctx[0].json; + } + + // else return undefined; + } ); + + + /** + * Get the data submitted in the last Ajax request + */ + _api_register( 'ajax.params()', function () { + var ctx = this.context; + + if ( ctx.length > 0 ) { + return ctx[0].oAjaxData; + } + + // else return undefined; + } ); + + + /** + * Reload tables from the Ajax data source. Note that this function will + * automatically re-draw the table when the remote data has been loaded. + * + * @param {boolean} [reset=true] Reset (default) or hold the current paging + * position. A full re-sort and re-filter is performed when this method is + * called, which is why the pagination reset is the default action. + * @returns {DataTables.Api} this + */ + _api_register( 'ajax.reload()', function ( callback, resetPaging ) { + return this.iterator( 'table', function (settings) { + __reload( settings, resetPaging===false, callback ); + } ); + } ); + + + /** + * Get the current Ajax URL. Note that this returns the URL from the first + * table in the current context. + * + * @return {string} Current Ajax source URL + *//** + * Set the Ajax URL. Note that this will set the URL for all tables in the + * current context. + * + * @param {string} url URL to set. + * @returns {DataTables.Api} this + */ + _api_register( 'ajax.url()', function ( url ) { + var ctx = this.context; + + if ( url === undefined ) { + // get + if ( ctx.length === 0 ) { + return undefined; + } + ctx = ctx[0]; + + return ctx.ajax ? + $.isPlainObject( ctx.ajax ) ? + ctx.ajax.url : + ctx.ajax : + ctx.sAjaxSource; + } + + // set + return this.iterator( 'table', function ( settings ) { + if ( $.isPlainObject( settings.ajax ) ) { + settings.ajax.url = url; + } + else { + settings.ajax = url; + } + // No need to consider sAjaxSource here since DataTables gives priority + // to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any + // value of `sAjaxSource` redundant. + } ); + } ); + + + /** + * Load data from the newly set Ajax URL. Note that this method is only + * available when `ajax.url()` is used to set a URL. Additionally, this method + * has the same effect as calling `ajax.reload()` but is provided for + * convenience when setting a new URL. Like `ajax.reload()` it will + * automatically redraw the table once the remote data has been loaded. + * + * @returns {DataTables.Api} this + */ + _api_register( 'ajax.url().load()', function ( callback, resetPaging ) { + // Same as a reload, but makes sense to present it for easy access after a + // url change + return this.iterator( 'table', function ( ctx ) { + __reload( ctx, resetPaging===false, callback ); + } ); + } ); + + + + + var _selector_run = function ( type, selector, selectFn, settings, opts ) + { + var + out = [], res, + a, i, ien, j, jen, + selectorType = typeof selector; + + // Can't just check for isArray here, as an API or jQuery instance might be + // given with their array like look + if ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) { + selector = [ selector ]; + } + + for ( i=0, ien=selector.length ; i 0 ) { + // Assign the first element to the first item in the instance + // and truncate the instance and context + inst[0] = inst[i]; + inst[0].length = 1; + inst.length = 1; + inst.context = [ inst.context[i] ]; + + return inst; + } + } + + // Not found - return an empty instance + inst.length = 0; + return inst; + }; + + + var _selector_row_indexes = function ( settings, opts ) + { + var + i, ien, tmp, a=[], + displayFiltered = settings.aiDisplay, + displayMaster = settings.aiDisplayMaster; + + var + search = opts.search, // none, applied, removed + order = opts.order, // applied, current, index (original - compatibility with 1.9) + page = opts.page; // all, current + + if ( _fnDataSource( settings ) == 'ssp' ) { + // In server-side processing mode, most options are irrelevant since + // rows not shown don't exist and the index order is the applied order + // Removed is a special case - for consistency just return an empty + // array + return search === 'removed' ? + [] : + _range( 0, displayMaster.length ); + } + else if ( page == 'current' ) { + // Current page implies that order=current and fitler=applied, since it is + // fairly senseless otherwise, regardless of what order and search actually + // are + for ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i= 0 && search == 'applied') ) + { + a.push( i ); + } + } + } + } + + return a; + }; + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Rows + * + * {} - no selector - use all available rows + * {integer} - row aoData index + * {node} - TR node + * {string} - jQuery selector to apply to the TR elements + * {array} - jQuery array of nodes, or simply an array of TR nodes + * + */ + + + var __row_selector = function ( settings, selector, opts ) + { + var rows; + var run = function ( sel ) { + var selInt = _intVal( sel ); + var i, ien; + + // Short cut - selector is a number and no options provided (default is + // all records, so no need to check if the index is in there, since it + // must be - dev error if the index doesn't exist). + if ( selInt !== null && ! opts ) { + return [ selInt ]; + } + + if ( ! rows ) { + rows = _selector_row_indexes( settings, opts ); + } + + if ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) { + // Selector - integer + return [ selInt ]; + } + else if ( sel === null || sel === undefined || sel === '' ) { + // Selector - none + return rows; + } + + // Selector - function + if ( typeof sel === 'function' ) { + return $.map( rows, function (idx) { + var row = settings.aoData[ idx ]; + return sel( idx, row._aData, row.nTr ) ? idx : null; + } ); + } + + // Get nodes in the order from the `rows` array with null values removed + var nodes = _removeEmpty( + _pluck_order( settings.aoData, rows, 'nTr' ) + ); + + // Selector - node + if ( sel.nodeName ) { + if ( sel._DT_RowIndex !== undefined ) { + return [ sel._DT_RowIndex ]; // Property added by DT for fast lookup + } + else if ( sel._DT_CellIndex ) { + return [ sel._DT_CellIndex.row ]; + } + else { + var host = $(sel).closest('*[data-dt-row]'); + return host.length ? + [ host.data('dt-row') ] : + []; + } + } + + // ID selector. Want to always be able to select rows by id, regardless + // of if the tr element has been created or not, so can't rely upon + // jQuery here - hence a custom implementation. This does not match + // Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything, + // but to select it using a CSS selector engine (like Sizzle or + // querySelect) it would need to need to be escaped for some characters. + // DataTables simplifies this for row selectors since you can select + // only a row. A # indicates an id any anything that follows is the id - + // unescaped. + if ( typeof sel === 'string' && sel.charAt(0) === '#' ) { + // get row index from id + var rowObj = settings.aIds[ sel.replace( /^#/, '' ) ]; + if ( rowObj !== undefined ) { + return [ rowObj.idx ]; + } + + // need to fall through to jQuery in case there is DOM id that + // matches + } + + // Selector - jQuery selector string, array of nodes or jQuery object/ + // As jQuery's .filter() allows jQuery objects to be passed in filter, + // it also allows arrays, so this will cope with all three options + return $(nodes) + .filter( sel ) + .map( function () { + return this._DT_RowIndex; + } ) + .toArray(); + }; + + return _selector_run( 'row', selector, run, settings, opts ); + }; + + + _api_register( 'rows()', function ( selector, opts ) { + // argument shifting + if ( selector === undefined ) { + selector = ''; + } + else if ( $.isPlainObject( selector ) ) { + opts = selector; + selector = ''; + } + + opts = _selector_opts( opts ); + + var inst = this.iterator( 'table', function ( settings ) { + return __row_selector( settings, selector, opts ); + }, 1 ); + + // Want argument shifting here and in __row_selector? + inst.selector.rows = selector; + inst.selector.opts = opts; + + return inst; + } ); + + _api_register( 'rows().nodes()', function () { + return this.iterator( 'row', function ( settings, row ) { + return settings.aoData[ row ].nTr || undefined; + }, 1 ); + } ); + + _api_register( 'rows().data()', function () { + return this.iterator( true, 'rows', function ( settings, rows ) { + return _pluck_order( settings.aoData, rows, '_aData' ); + }, 1 ); + } ); + + _api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) { + return this.iterator( 'row', function ( settings, row ) { + var r = settings.aoData[ row ]; + return type === 'search' ? r._aFilterData : r._aSortData; + }, 1 ); + } ); + + _api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) { + return this.iterator( 'row', function ( settings, row ) { + _fnInvalidate( settings, row, src ); + } ); + } ); + + _api_registerPlural( 'rows().indexes()', 'row().index()', function () { + return this.iterator( 'row', function ( settings, row ) { + return row; + }, 1 ); + } ); + + _api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) { + var a = []; + var context = this.context; + + // `iterator` will drop undefined values, but in this case we want them + for ( var i=0, ien=context.length ; i 0 ) { + settings._iRecordsDisplay--; + } + + // Check for an 'overflow' they case for displaying the table + _fnLengthOverflow( settings ); + + // Remove the row's ID reference if there is one + var id = settings.rowIdFn( rowData._aData ); + if ( id !== undefined ) { + delete settings.aIds[ id ]; + } + } ); + + this.iterator( 'table', function ( settings ) { + for ( var i=0, ien=settings.aoData.length ; i
                ` node is a DataTable table already or not. + * + * @param {node|jquery|string} table Table node, jQuery object or jQuery + * selector for the table to test. Note that if more than more than one + * table is passed on, only the first will be checked + * @returns {boolean} true the table given is a DataTable, or false otherwise + * @static + * @dtopt API-Static + * + * @example + * if ( ! $.fn.DataTable.isDataTable( '#example' ) ) { + * $('#example').dataTable(); + * } + */ + DataTable.isDataTable = DataTable.fnIsDataTable = function ( table ) + { + var t = $(table).get(0); + var is = false; + + if ( table instanceof DataTable.Api ) { + return true; + } + + $.each( DataTable.settings, function (i, o) { + var head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null; + var foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null; + + if ( o.nTable === t || head === t || foot === t ) { + is = true; + } + } ); + + return is; + }; + + + /** + * Get all DataTable tables that have been initialised - optionally you can + * select to get only currently visible tables. + * + * @param {boolean} [visible=false] Flag to indicate if you want all (default) + * or visible tables only. + * @returns {array} Array of `table` nodes (not DataTable instances) which are + * DataTables + * @static + * @dtopt API-Static + * + * @example + * $.each( $.fn.dataTable.tables(true), function () { + * $(table).DataTable().columns.adjust(); + * } ); + */ + DataTable.tables = DataTable.fnTables = function ( visible ) + { + var api = false; + + if ( $.isPlainObject( visible ) ) { + api = visible.api; + visible = visible.visible; + } + + var a = $.map( DataTable.settings, function (o) { + if ( !visible || (visible && $(o.nTable).is(':visible')) ) { + return o.nTable; + } + } ); + + return api ? + new _Api( a ) : + a; + }; + + + /** + * Convert from camel case parameters to Hungarian notation. This is made public + * for the extensions to provide the same ability as DataTables core to accept + * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase + * parameters. + * + * @param {object} src The model object which holds all parameters that can be + * mapped. + * @param {object} user The object to convert from camel case to Hungarian. + * @param {boolean} force When set to `true`, properties which already have a + * Hungarian value in the `user` object will be overwritten. Otherwise they + * won't be. + */ + DataTable.camelToHungarian = _fnCamelToHungarian; + + + + /** + * + */ + _api_register( '$()', function ( selector, opts ) { + var + rows = this.rows( opts ).nodes(), // Get all rows + jqRows = $(rows); + + return $( [].concat( + jqRows.filter( selector ).toArray(), + jqRows.find( selector ).toArray() + ) ); + } ); + + + // jQuery functions to operate on the tables + $.each( [ 'on', 'one', 'off' ], function (i, key) { + _api_register( key+'()', function ( /* event, handler */ ) { + var args = Array.prototype.slice.call(arguments); + + // Add the `dt` namespace automatically if it isn't already present + args[0] = $.map( args[0].split( /\s/ ), function ( e ) { + return ! e.match(/\.dt\b/) ? + e+'.dt' : + e; + } ).join( ' ' ); + + var inst = $( this.tables().nodes() ); + inst[key].apply( inst, args ); + return this; + } ); + } ); + + + _api_register( 'clear()', function () { + return this.iterator( 'table', function ( settings ) { + _fnClearTable( settings ); + } ); + } ); + + + _api_register( 'settings()', function () { + return new _Api( this.context, this.context ); + } ); + + + _api_register( 'init()', function () { + var ctx = this.context; + return ctx.length ? ctx[0].oInit : null; + } ); + + + _api_register( 'data()', function () { + return this.iterator( 'table', function ( settings ) { + return _pluck( settings.aoData, '_aData' ); + } ).flatten(); + } ); + + + _api_register( 'destroy()', function ( remove ) { + remove = remove || false; + + return this.iterator( 'table', function ( settings ) { + var orig = settings.nTableWrapper.parentNode; + var classes = settings.oClasses; + var table = settings.nTable; + var tbody = settings.nTBody; + var thead = settings.nTHead; + var tfoot = settings.nTFoot; + var jqTable = $(table); + var jqTbody = $(tbody); + var jqWrapper = $(settings.nTableWrapper); + var rows = $.map( settings.aoData, function (r) { return r.nTr; } ); + var i, ien; + + // Flag to note that the table is currently being destroyed - no action + // should be taken + settings.bDestroying = true; + + // Fire off the destroy callbacks for plug-ins etc + _fnCallbackFire( settings, "aoDestroyCallback", "destroy", [settings] ); + + // If not being removed from the document, make all columns visible + if ( ! remove ) { + new _Api( settings ).columns().visible( true ); + } + + // Blitz all `DT` namespaced events (these are internal events, the + // lowercase, `dt` events are user subscribed and they are responsible + // for removing them + jqWrapper.off('.DT').find(':not(tbody *)').off('.DT'); + $(window).off('.DT-'+settings.sInstance); + + // When scrolling we had to break the table up - restore it + if ( table != thead.parentNode ) { + jqTable.children('thead').detach(); + jqTable.append( thead ); + } + + if ( tfoot && table != tfoot.parentNode ) { + jqTable.children('tfoot').detach(); + jqTable.append( tfoot ); + } + + settings.aaSorting = []; + settings.aaSortingFixed = []; + _fnSortingClasses( settings ); + + $( rows ).removeClass( settings.asStripeClasses.join(' ') ); + + $('th, td', thead).removeClass( classes.sSortable+' '+ + classes.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone + ); + + // Add the TR elements back into the table in their original order + jqTbody.children().detach(); + jqTbody.append( rows ); + + // Remove the DataTables generated nodes, events and classes + var removedMethod = remove ? 'remove' : 'detach'; + jqTable[ removedMethod ](); + jqWrapper[ removedMethod ](); + + // If we need to reattach the table to the document + if ( ! remove && orig ) { + // insertBefore acts like appendChild if !arg[1] + orig.insertBefore( table, settings.nTableReinsertBefore ); + + // Restore the width of the original table - was read from the style property, + // so we can restore directly to that + jqTable + .css( 'width', settings.sDestroyWidth ) + .removeClass( classes.sTable ); + + // If the were originally stripe classes - then we add them back here. + // Note this is not fool proof (for example if not all rows had stripe + // classes - but it's a good effort without getting carried away + ien = settings.asDestroyStripes.length; + + if ( ien ) { + jqTbody.children().each( function (i) { + $(this).addClass( settings.asDestroyStripes[i % ien] ); + } ); + } + } + + /* Remove the settings object from the settings array */ + var idx = $.inArray( settings, DataTable.settings ); + if ( idx !== -1 ) { + DataTable.settings.splice( idx, 1 ); + } + } ); + } ); + + + // Add the `every()` method for rows, columns and cells in a compact form + $.each( [ 'column', 'row', 'cell' ], function ( i, type ) { + _api_register( type+'s().every()', function ( fn ) { + var opts = this.selector.opts; + var api = this; + + return this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) { + // Rows and columns: + // arg1 - index + // arg2 - table counter + // arg3 - loop counter + // arg4 - undefined + // Cells: + // arg1 - row index + // arg2 - column index + // arg3 - table counter + // arg4 - loop counter + fn.call( + api[ type ]( + arg1, + type==='cell' ? arg2 : opts, + type==='cell' ? opts : undefined + ), + arg1, arg2, arg3, arg4 + ); + } ); + } ); + } ); + + + // i18n method for extensions to be able to use the language object from the + // DataTable + _api_register( 'i18n()', function ( token, def, plural ) { + var ctx = this.context[0]; + var resolved = _fnGetObjectDataFn( token )( ctx.oLanguage ); + + if ( resolved === undefined ) { + resolved = def; + } + + if ( plural !== undefined && $.isPlainObject( resolved ) ) { + resolved = resolved[ plural ] !== undefined ? + resolved[ plural ] : + resolved._; + } + + return resolved.replace( '%d', plural ); // nb: plural might be undefined, + } ); + + /** + * Version string for plug-ins to check compatibility. Allowed format is + * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used + * only for non-release builds. See http://semver.org/ for more information. + * @member + * @type string + * @default Version number + */ + DataTable.version = "1.10.16"; + + /** + * Private data store, containing all of the settings objects that are + * created for the tables on a given page. + * + * Note that the `DataTable.settings` object is aliased to + * `jQuery.fn.dataTableExt` through which it may be accessed and + * manipulated, or `jQuery.fn.dataTable.settings`. + * @member + * @type array + * @default [] + * @private + */ + DataTable.settings = []; + + /** + * Object models container, for the various models that DataTables has + * available to it. These models define the objects that are used to hold + * the active state and configuration of the table. + * @namespace + */ + DataTable.models = {}; + + + + /** + * Template object for the way in which DataTables holds information about + * search information for the global filter and individual column filters. + * @namespace + */ + DataTable.models.oSearch = { + /** + * Flag to indicate if the filtering should be case insensitive or not + * @type boolean + * @default true + */ + "bCaseInsensitive": true, + + /** + * Applied search term + * @type string + * @default Empty string + */ + "sSearch": "", + + /** + * Flag to indicate if the search term should be interpreted as a + * regular expression (true) or not (false) and therefore and special + * regex characters escaped. + * @type boolean + * @default false + */ + "bRegex": false, + + /** + * Flag to indicate if DataTables is to use its smart filtering or not. + * @type boolean + * @default true + */ + "bSmart": true + }; + + + + + /** + * Template object for the way in which DataTables holds information about + * each individual row. This is the object format used for the settings + * aoData array. + * @namespace + */ + DataTable.models.oRow = { + /** + * TR element for the row + * @type node + * @default null + */ + "nTr": null, + + /** + * Array of TD elements for each row. This is null until the row has been + * created. + * @type array nodes + * @default [] + */ + "anCells": null, + + /** + * Data object from the original data source for the row. This is either + * an array if using the traditional form of DataTables, or an object if + * using mData options. The exact type will depend on the passed in + * data from the data source, or will be an array if using DOM a data + * source. + * @type array|object + * @default [] + */ + "_aData": [], + + /** + * Sorting data cache - this array is ostensibly the same length as the + * number of columns (although each index is generated only as it is + * needed), and holds the data that is used for sorting each column in the + * row. We do this cache generation at the start of the sort in order that + * the formatting of the sort data need be done only once for each cell + * per sort. This array should not be read from or written to by anything + * other than the master sorting methods. + * @type array + * @default null + * @private + */ + "_aSortData": null, + + /** + * Per cell filtering data cache. As per the sort data cache, used to + * increase the performance of the filtering in DataTables + * @type array + * @default null + * @private + */ + "_aFilterData": null, + + /** + * Filtering data cache. This is the same as the cell filtering cache, but + * in this case a string rather than an array. This is easily computed with + * a join on `_aFilterData`, but is provided as a cache so the join isn't + * needed on every search (memory traded for performance) + * @type array + * @default null + * @private + */ + "_sFilterRow": null, + + /** + * Cache of the class name that DataTables has applied to the row, so we + * can quickly look at this variable rather than needing to do a DOM check + * on className for the nTr property. + * @type string + * @default Empty string + * @private + */ + "_sRowStripe": "", + + /** + * Denote if the original data source was from the DOM, or the data source + * object. This is used for invalidating data, so DataTables can + * automatically read data from the original source, unless uninstructed + * otherwise. + * @type string + * @default null + * @private + */ + "src": null, + + /** + * Index in the aoData array. This saves an indexOf lookup when we have the + * object, but want to know the index + * @type integer + * @default -1 + * @private + */ + "idx": -1 + }; + + + /** + * Template object for the column information object in DataTables. This object + * is held in the settings aoColumns array and contains all the information that + * DataTables needs about each individual column. + * + * Note that this object is related to {@link DataTable.defaults.column} + * but this one is the internal data store for DataTables's cache of columns. + * It should NOT be manipulated outside of DataTables. Any configuration should + * be done through the initialisation options. + * @namespace + */ + DataTable.models.oColumn = { + /** + * Column index. This could be worked out on-the-fly with $.inArray, but it + * is faster to just hold it as a variable + * @type integer + * @default null + */ + "idx": null, + + /** + * A list of the columns that sorting should occur on when this column + * is sorted. That this property is an array allows multi-column sorting + * to be defined for a column (for example first name / last name columns + * would benefit from this). The values are integers pointing to the + * columns to be sorted on (typically it will be a single integer pointing + * at itself, but that doesn't need to be the case). + * @type array + */ + "aDataSort": null, + + /** + * Define the sorting directions that are applied to the column, in sequence + * as the column is repeatedly sorted upon - i.e. the first value is used + * as the sorting direction when the column if first sorted (clicked on). + * Sort it again (click again) and it will move on to the next index. + * Repeat until loop. + * @type array + */ + "asSorting": null, + + /** + * Flag to indicate if the column is searchable, and thus should be included + * in the filtering or not. + * @type boolean + */ + "bSearchable": null, + + /** + * Flag to indicate if the column is sortable or not. + * @type boolean + */ + "bSortable": null, + + /** + * Flag to indicate if the column is currently visible in the table or not + * @type boolean + */ + "bVisible": null, + + /** + * Store for manual type assignment using the `column.type` option. This + * is held in store so we can manipulate the column's `sType` property. + * @type string + * @default null + * @private + */ + "_sManualType": null, + + /** + * Flag to indicate if HTML5 data attributes should be used as the data + * source for filtering or sorting. True is either are. + * @type boolean + * @default false + * @private + */ + "_bAttrSrc": false, + + /** + * Developer definable function that is called whenever a cell is created (Ajax source, + * etc) or processed for input (DOM source). This can be used as a compliment to mRender + * allowing you to modify the DOM element (add background colour for example) when the + * element is available. + * @type function + * @param {element} nTd The TD node that has been created + * @param {*} sData The Data for the cell + * @param {array|object} oData The data for the whole row + * @param {int} iRow The row index for the aoData data store + * @default null + */ + "fnCreatedCell": null, + + /** + * Function to get data from a cell in a column. You should never + * access data directly through _aData internally in DataTables - always use + * the method attached to this property. It allows mData to function as + * required. This function is automatically assigned by the column + * initialisation method + * @type function + * @param {array|object} oData The data array/object for the array + * (i.e. aoData[]._aData) + * @param {string} sSpecific The specific data type you want to get - + * 'display', 'type' 'filter' 'sort' + * @returns {*} The data for the cell from the given row's data + * @default null + */ + "fnGetData": null, + + /** + * Function to set data for a cell in the column. You should never + * set the data directly to _aData internally in DataTables - always use + * this method. It allows mData to function as required. This function + * is automatically assigned by the column initialisation method + * @type function + * @param {array|object} oData The data array/object for the array + * (i.e. aoData[]._aData) + * @param {*} sValue Value to set + * @default null + */ + "fnSetData": null, + + /** + * Property to read the value for the cells in the column from the data + * source array / object. If null, then the default content is used, if a + * function is given then the return from the function is used. + * @type function|int|string|null + * @default null + */ + "mData": null, + + /** + * Partner property to mData which is used (only when defined) to get + * the data - i.e. it is basically the same as mData, but without the + * 'set' option, and also the data fed to it is the result from mData. + * This is the rendering method to match the data method of mData. + * @type function|int|string|null + * @default null + */ + "mRender": null, + + /** + * Unique header TH/TD element for this column - this is what the sorting + * listener is attached to (if sorting is enabled.) + * @type node + * @default null + */ + "nTh": null, + + /** + * Unique footer TH/TD element for this column (if there is one). Not used + * in DataTables as such, but can be used for plug-ins to reference the + * footer for each column. + * @type node + * @default null + */ + "nTf": null, + + /** + * The class to apply to all TD elements in the table's TBODY for the column + * @type string + * @default null + */ + "sClass": null, + + /** + * When DataTables calculates the column widths to assign to each column, + * it finds the longest string in each column and then constructs a + * temporary table and reads the widths from that. The problem with this + * is that "mmm" is much wider then "iiii", but the latter is a longer + * string - thus the calculation can go wrong (doing it properly and putting + * it into an DOM object and measuring that is horribly(!) slow). Thus as + * a "work around" we provide this option. It will append its value to the + * text that is found to be the longest string for the column - i.e. padding. + * @type string + */ + "sContentPadding": null, + + /** + * Allows a default value to be given for a column's data, and will be used + * whenever a null data source is encountered (this can be because mData + * is set to null, or because the data source itself is null). + * @type string + * @default null + */ + "sDefaultContent": null, + + /** + * Name for the column, allowing reference to the column by name as well as + * by index (needs a lookup to work by name). + * @type string + */ + "sName": null, + + /** + * Custom sorting data type - defines which of the available plug-ins in + * afnSortData the custom sorting will use - if any is defined. + * @type string + * @default std + */ + "sSortDataType": 'std', + + /** + * Class to be applied to the header element when sorting on this column + * @type string + * @default null + */ + "sSortingClass": null, + + /** + * Class to be applied to the header element when sorting on this column - + * when jQuery UI theming is used. + * @type string + * @default null + */ + "sSortingClassJUI": null, + + /** + * Title of the column - what is seen in the TH element (nTh). + * @type string + */ + "sTitle": null, + + /** + * Column sorting and filtering type + * @type string + * @default null + */ + "sType": null, + + /** + * Width of the column + * @type string + * @default null + */ + "sWidth": null, + + /** + * Width of the column when it was first "encountered" + * @type string + * @default null + */ + "sWidthOrig": null + }; + + + /* + * Developer note: The properties of the object below are given in Hungarian + * notation, that was used as the interface for DataTables prior to v1.10, however + * from v1.10 onwards the primary interface is camel case. In order to avoid + * breaking backwards compatibility utterly with this change, the Hungarian + * version is still, internally the primary interface, but is is not documented + * - hence the @name tags in each doc comment. This allows a Javascript function + * to create a map from Hungarian notation to camel case (going the other direction + * would require each property to be listed, which would at around 3K to the size + * of DataTables, while this method is about a 0.5K hit. + * + * Ultimately this does pave the way for Hungarian notation to be dropped + * completely, but that is a massive amount of work and will break current + * installs (therefore is on-hold until v2). + */ + + /** + * Initialisation options that can be given to DataTables at initialisation + * time. + * @namespace + */ + DataTable.defaults = { + /** + * An array of data to use for the table, passed in at initialisation which + * will be used in preference to any data which is already in the DOM. This is + * particularly useful for constructing tables purely in Javascript, for + * example with a custom Ajax call. + * @type array + * @default null + * + * @dtopt Option + * @name DataTable.defaults.data + * + * @example + * // Using a 2D array data source + * $(document).ready( function () { + * $('#example').dataTable( { + * "data": [ + * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'], + * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'], + * ], + * "columns": [ + * { "title": "Engine" }, + * { "title": "Browser" }, + * { "title": "Platform" }, + * { "title": "Version" }, + * { "title": "Grade" } + * ] + * } ); + * } ); + * + * @example + * // Using an array of objects as a data source (`data`) + * $(document).ready( function () { + * $('#example').dataTable( { + * "data": [ + * { + * "engine": "Trident", + * "browser": "Internet Explorer 4.0", + * "platform": "Win 95+", + * "version": 4, + * "grade": "X" + * }, + * { + * "engine": "Trident", + * "browser": "Internet Explorer 5.0", + * "platform": "Win 95+", + * "version": 5, + * "grade": "C" + * } + * ], + * "columns": [ + * { "title": "Engine", "data": "engine" }, + * { "title": "Browser", "data": "browser" }, + * { "title": "Platform", "data": "platform" }, + * { "title": "Version", "data": "version" }, + * { "title": "Grade", "data": "grade" } + * ] + * } ); + * } ); + */ + "aaData": null, + + + /** + * If ordering is enabled, then DataTables will perform a first pass sort on + * initialisation. You can define which column(s) the sort is performed + * upon, and the sorting direction, with this variable. The `sorting` array + * should contain an array for each column to be sorted initially containing + * the column's index and a direction string ('asc' or 'desc'). + * @type array + * @default [[0,'asc']] + * + * @dtopt Option + * @name DataTable.defaults.order + * + * @example + * // Sort by 3rd column first, and then 4th column + * $(document).ready( function() { + * $('#example').dataTable( { + * "order": [[2,'asc'], [3,'desc']] + * } ); + * } ); + * + * // No initial sorting + * $(document).ready( function() { + * $('#example').dataTable( { + * "order": [] + * } ); + * } ); + */ + "aaSorting": [[0,'asc']], + + + /** + * This parameter is basically identical to the `sorting` parameter, but + * cannot be overridden by user interaction with the table. What this means + * is that you could have a column (visible or hidden) which the sorting + * will always be forced on first - any sorting after that (from the user) + * will then be performed as required. This can be useful for grouping rows + * together. + * @type array + * @default null + * + * @dtopt Option + * @name DataTable.defaults.orderFixed + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "orderFixed": [[0,'asc']] + * } ); + * } ) + */ + "aaSortingFixed": [], + + + /** + * DataTables can be instructed to load data to display in the table from a + * Ajax source. This option defines how that Ajax call is made and where to. + * + * The `ajax` property has three different modes of operation, depending on + * how it is defined. These are: + * + * * `string` - Set the URL from where the data should be loaded from. + * * `object` - Define properties for `jQuery.ajax`. + * * `function` - Custom data get function + * + * `string` + * -------- + * + * As a string, the `ajax` property simply defines the URL from which + * DataTables will load data. + * + * `object` + * -------- + * + * As an object, the parameters in the object are passed to + * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control + * of the Ajax request. DataTables has a number of default parameters which + * you can override using this option. Please refer to the jQuery + * documentation for a full description of the options available, although + * the following parameters provide additional options in DataTables or + * require special consideration: + * + * * `data` - As with jQuery, `data` can be provided as an object, but it + * can also be used as a function to manipulate the data DataTables sends + * to the server. The function takes a single parameter, an object of + * parameters with the values that DataTables has readied for sending. An + * object may be returned which will be merged into the DataTables + * defaults, or you can add the items to the object that was passed in and + * not return anything from the function. This supersedes `fnServerParams` + * from DataTables 1.9-. + * + * * `dataSrc` - By default DataTables will look for the property `data` (or + * `aaData` for compatibility with DataTables 1.9-) when obtaining data + * from an Ajax source or for server-side processing - this parameter + * allows that property to be changed. You can use Javascript dotted + * object notation to get a data source for multiple levels of nesting, or + * it my be used as a function. As a function it takes a single parameter, + * the JSON returned from the server, which can be manipulated as + * required, with the returned value being that used by DataTables as the + * data source for the table. This supersedes `sAjaxDataProp` from + * DataTables 1.9-. + * + * * `success` - Should not be overridden it is used internally in + * DataTables. To manipulate / transform the data returned by the server + * use `ajax.dataSrc`, or use `ajax` as a function (see below). + * + * `function` + * ---------- + * + * As a function, making the Ajax call is left up to yourself allowing + * complete control of the Ajax request. Indeed, if desired, a method other + * than Ajax could be used to obtain the required data, such as Web storage + * or an AIR database. + * + * The function is given four parameters and no return is required. The + * parameters are: + * + * 1. _object_ - Data to send to the server + * 2. _function_ - Callback function that must be executed when the required + * data has been obtained. That data should be passed into the callback + * as the only parameter + * 3. _object_ - DataTables settings object for the table + * + * Note that this supersedes `fnServerData` from DataTables 1.9-. + * + * @type string|object|function + * @default null + * + * @dtopt Option + * @name DataTable.defaults.ajax + * @since 1.10.0 + * + * @example + * // Get JSON data from a file via Ajax. + * // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default). + * $('#example').dataTable( { + * "ajax": "data.json" + * } ); + * + * @example + * // Get JSON data from a file via Ajax, using `dataSrc` to change + * // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`) + * $('#example').dataTable( { + * "ajax": { + * "url": "data.json", + * "dataSrc": "tableData" + * } + * } ); + * + * @example + * // Get JSON data from a file via Ajax, using `dataSrc` to read data + * // from a plain array rather than an array in an object + * $('#example').dataTable( { + * "ajax": { + * "url": "data.json", + * "dataSrc": "" + * } + * } ); + * + * @example + * // Manipulate the data returned from the server - add a link to data + * // (note this can, should, be done using `render` for the column - this + * // is just a simple example of how the data can be manipulated). + * $('#example').dataTable( { + * "ajax": { + * "url": "data.json", + * "dataSrc": function ( json ) { + * for ( var i=0, ien=json.length ; iView message'; + * } + * return json; + * } + * } + * } ); + * + * @example + * // Add data to the request + * $('#example').dataTable( { + * "ajax": { + * "url": "data.json", + * "data": function ( d ) { + * return { + * "extra_search": $('#extra').val() + * }; + * } + * } + * } ); + * + * @example + * // Send request as POST + * $('#example').dataTable( { + * "ajax": { + * "url": "data.json", + * "type": "POST" + * } + * } ); + * + * @example + * // Get the data from localStorage (could interface with a form for + * // adding, editing and removing rows). + * $('#example').dataTable( { + * "ajax": function (data, callback, settings) { + * callback( + * JSON.parse( localStorage.getItem('dataTablesData') ) + * ); + * } + * } ); + */ + "ajax": null, + + + /** + * This parameter allows you to readily specify the entries in the length drop + * down menu that DataTables shows when pagination is enabled. It can be + * either a 1D array of options which will be used for both the displayed + * option and the value, or a 2D array which will use the array in the first + * position as the value, and the array in the second position as the + * displayed options (useful for language strings such as 'All'). + * + * Note that the `pageLength` property will be automatically set to the + * first value given in this array, unless `pageLength` is also provided. + * @type array + * @default [ 10, 25, 50, 100 ] + * + * @dtopt Option + * @name DataTable.defaults.lengthMenu + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]] + * } ); + * } ); + */ + "aLengthMenu": [ 10, 25, 50, 100 ], + + + /** + * The `columns` option in the initialisation parameter allows you to define + * details about the way individual columns behave. For a full list of + * column options that can be set, please see + * {@link DataTable.defaults.column}. Note that if you use `columns` to + * define your columns, you must have an entry in the array for every single + * column that you have in your table (these can be null if you don't which + * to specify any options). + * @member + * + * @name DataTable.defaults.column + */ + "aoColumns": null, + + /** + * Very similar to `columns`, `columnDefs` allows you to target a specific + * column, multiple columns, or all columns, using the `targets` property of + * each object in the array. This allows great flexibility when creating + * tables, as the `columnDefs` arrays can be of any length, targeting the + * columns you specifically want. `columnDefs` may use any of the column + * options available: {@link DataTable.defaults.column}, but it _must_ + * have `targets` defined in each object in the array. Values in the `targets` + * array may be: + *
                  + *
                • a string - class name will be matched on the TH for the column
                • + *
                • 0 or a positive integer - column index counting from the left
                • + *
                • a negative integer - column index counting from the right
                • + *
                • the string "_all" - all columns (i.e. assign a default)
                • + *
                + * @member + * + * @name DataTable.defaults.columnDefs + */ + "aoColumnDefs": null, + + + /** + * Basically the same as `search`, this parameter defines the individual column + * filtering state at initialisation time. The array must be of the same size + * as the number of columns, and each element be an object with the parameters + * `search` and `escapeRegex` (the latter is optional). 'null' is also + * accepted and the default will be used. + * @type array + * @default [] + * + * @dtopt Option + * @name DataTable.defaults.searchCols + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "searchCols": [ + * null, + * { "search": "My filter" }, + * null, + * { "search": "^[0-9]", "escapeRegex": false } + * ] + * } ); + * } ) + */ + "aoSearchCols": [], + + + /** + * An array of CSS classes that should be applied to displayed rows. This + * array may be of any length, and DataTables will apply each class + * sequentially, looping when required. + * @type array + * @default null Will take the values determined by the `oClasses.stripe*` + * options + * + * @dtopt Option + * @name DataTable.defaults.stripeClasses + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "stripeClasses": [ 'strip1', 'strip2', 'strip3' ] + * } ); + * } ) + */ + "asStripeClasses": null, + + + /** + * Enable or disable automatic column width calculation. This can be disabled + * as an optimisation (it takes some time to calculate the widths) if the + * tables widths are passed in using `columns`. + * @type boolean + * @default true + * + * @dtopt Features + * @name DataTable.defaults.autoWidth + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "autoWidth": false + * } ); + * } ); + */ + "bAutoWidth": true, + + + /** + * Deferred rendering can provide DataTables with a huge speed boost when you + * are using an Ajax or JS data source for the table. This option, when set to + * true, will cause DataTables to defer the creation of the table elements for + * each row until they are needed for a draw - saving a significant amount of + * time. + * @type boolean + * @default false + * + * @dtopt Features + * @name DataTable.defaults.deferRender + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "ajax": "sources/arrays.txt", + * "deferRender": true + * } ); + * } ); + */ + "bDeferRender": false, + + + /** + * Replace a DataTable which matches the given selector and replace it with + * one which has the properties of the new initialisation object passed. If no + * table matches the selector, then the new DataTable will be constructed as + * per normal. + * @type boolean + * @default false + * + * @dtopt Options + * @name DataTable.defaults.destroy + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "srollY": "200px", + * "paginate": false + * } ); + * + * // Some time later.... + * $('#example').dataTable( { + * "filter": false, + * "destroy": true + * } ); + * } ); + */ + "bDestroy": false, + + + /** + * Enable or disable filtering of data. Filtering in DataTables is "smart" in + * that it allows the end user to input multiple words (space separated) and + * will match a row containing those words, even if not in the order that was + * specified (this allow matching across multiple columns). Note that if you + * wish to use filtering in DataTables this must remain 'true' - to remove the + * default filtering input box and retain filtering abilities, please use + * {@link DataTable.defaults.dom}. + * @type boolean + * @default true + * + * @dtopt Features + * @name DataTable.defaults.searching + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "searching": false + * } ); + * } ); + */ + "bFilter": true, + + + /** + * Enable or disable the table information display. This shows information + * about the data that is currently visible on the page, including information + * about filtered data if that action is being performed. + * @type boolean + * @default true + * + * @dtopt Features + * @name DataTable.defaults.info + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "info": false + * } ); + * } ); + */ + "bInfo": true, + + + /** + * Allows the end user to select the size of a formatted page from a select + * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`). + * @type boolean + * @default true + * + * @dtopt Features + * @name DataTable.defaults.lengthChange + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "lengthChange": false + * } ); + * } ); + */ + "bLengthChange": true, + + + /** + * Enable or disable pagination. + * @type boolean + * @default true + * + * @dtopt Features + * @name DataTable.defaults.paging + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "paging": false + * } ); + * } ); + */ + "bPaginate": true, + + + /** + * Enable or disable the display of a 'processing' indicator when the table is + * being processed (e.g. a sort). This is particularly useful for tables with + * large amounts of data where it can take a noticeable amount of time to sort + * the entries. + * @type boolean + * @default false + * + * @dtopt Features + * @name DataTable.defaults.processing + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "processing": true + * } ); + * } ); + */ + "bProcessing": false, + + + /** + * Retrieve the DataTables object for the given selector. Note that if the + * table has already been initialised, this parameter will cause DataTables + * to simply return the object that has already been set up - it will not take + * account of any changes you might have made to the initialisation object + * passed to DataTables (setting this parameter to true is an acknowledgement + * that you understand this). `destroy` can be used to reinitialise a table if + * you need. + * @type boolean + * @default false + * + * @dtopt Options + * @name DataTable.defaults.retrieve + * + * @example + * $(document).ready( function() { + * initTable(); + * tableActions(); + * } ); + * + * function initTable () + * { + * return $('#example').dataTable( { + * "scrollY": "200px", + * "paginate": false, + * "retrieve": true + * } ); + * } + * + * function tableActions () + * { + * var table = initTable(); + * // perform API operations with oTable + * } + */ + "bRetrieve": false, + + + /** + * When vertical (y) scrolling is enabled, DataTables will force the height of + * the table's viewport to the given height at all times (useful for layout). + * However, this can look odd when filtering data down to a small data set, + * and the footer is left "floating" further down. This parameter (when + * enabled) will cause DataTables to collapse the table's viewport down when + * the result set will fit within the given Y height. + * @type boolean + * @default false + * + * @dtopt Options + * @name DataTable.defaults.scrollCollapse + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "scrollY": "200", + * "scrollCollapse": true + * } ); + * } ); + */ + "bScrollCollapse": false, + + + /** + * Configure DataTables to use server-side processing. Note that the + * `ajax` parameter must also be given in order to give DataTables a + * source to obtain the required data for each draw. + * @type boolean + * @default false + * + * @dtopt Features + * @dtopt Server-side + * @name DataTable.defaults.serverSide + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "serverSide": true, + * "ajax": "xhr.php" + * } ); + * } ); + */ + "bServerSide": false, + + + /** + * Enable or disable sorting of columns. Sorting of individual columns can be + * disabled by the `sortable` option for each column. + * @type boolean + * @default true + * + * @dtopt Features + * @name DataTable.defaults.ordering + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "ordering": false + * } ); + * } ); + */ + "bSort": true, + + + /** + * Enable or display DataTables' ability to sort multiple columns at the + * same time (activated by shift-click by the user). + * @type boolean + * @default true + * + * @dtopt Options + * @name DataTable.defaults.orderMulti + * + * @example + * // Disable multiple column sorting ability + * $(document).ready( function () { + * $('#example').dataTable( { + * "orderMulti": false + * } ); + * } ); + */ + "bSortMulti": true, + + + /** + * Allows control over whether DataTables should use the top (true) unique + * cell that is found for a single column, or the bottom (false - default). + * This is useful when using complex headers. + * @type boolean + * @default false + * + * @dtopt Options + * @name DataTable.defaults.orderCellsTop + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "orderCellsTop": true + * } ); + * } ); + */ + "bSortCellsTop": false, + + + /** + * Enable or disable the addition of the classes `sorting\_1`, `sorting\_2` and + * `sorting\_3` to the columns which are currently being sorted on. This is + * presented as a feature switch as it can increase processing time (while + * classes are removed and added) so for large data sets you might want to + * turn this off. + * @type boolean + * @default true + * + * @dtopt Features + * @name DataTable.defaults.orderClasses + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "orderClasses": false + * } ); + * } ); + */ + "bSortClasses": true, + + + /** + * Enable or disable state saving. When enabled HTML5 `localStorage` will be + * used to save table display information such as pagination information, + * display length, filtering and sorting. As such when the end user reloads + * the page the display display will match what thy had previously set up. + * + * Due to the use of `localStorage` the default state saving is not supported + * in IE6 or 7. If state saving is required in those browsers, use + * `stateSaveCallback` to provide a storage solution such as cookies. + * @type boolean + * @default false + * + * @dtopt Features + * @name DataTable.defaults.stateSave + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "stateSave": true + * } ); + * } ); + */ + "bStateSave": false, + + + /** + * This function is called when a TR element is created (and all TD child + * elements have been inserted), or registered if using a DOM source, allowing + * manipulation of the TR element (adding classes etc). + * @type function + * @param {node} row "TR" element for the current row + * @param {array} data Raw data array for this row + * @param {int} dataIndex The index of this row in the internal aoData array + * + * @dtopt Callbacks + * @name DataTable.defaults.createdRow + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "createdRow": function( row, data, dataIndex ) { + * // Bold the grade for all 'A' grade browsers + * if ( data[4] == "A" ) + * { + * $('td:eq(4)', row).html( 'A' ); + * } + * } + * } ); + * } ); + */ + "fnCreatedRow": null, + + + /** + * This function is called on every 'draw' event, and allows you to + * dynamically modify any aspect you want about the created DOM. + * @type function + * @param {object} settings DataTables settings object + * + * @dtopt Callbacks + * @name DataTable.defaults.drawCallback + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "drawCallback": function( settings ) { + * alert( 'DataTables has redrawn the table' ); + * } + * } ); + * } ); + */ + "fnDrawCallback": null, + + + /** + * Identical to fnHeaderCallback() but for the table footer this function + * allows you to modify the table footer on every 'draw' event. + * @type function + * @param {node} foot "TR" element for the footer + * @param {array} data Full table data (as derived from the original HTML) + * @param {int} start Index for the current display starting point in the + * display array + * @param {int} end Index for the current display ending point in the + * display array + * @param {array int} display Index array to translate the visual position + * to the full data array + * + * @dtopt Callbacks + * @name DataTable.defaults.footerCallback + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "footerCallback": function( tfoot, data, start, end, display ) { + * tfoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+start; + * } + * } ); + * } ) + */ + "fnFooterCallback": null, + + + /** + * When rendering large numbers in the information element for the table + * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers + * to have a comma separator for the 'thousands' units (e.g. 1 million is + * rendered as "1,000,000") to help readability for the end user. This + * function will override the default method DataTables uses. + * @type function + * @member + * @param {int} toFormat number to be formatted + * @returns {string} formatted string for DataTables to show the number + * + * @dtopt Callbacks + * @name DataTable.defaults.formatNumber + * + * @example + * // Format a number using a single quote for the separator (note that + * // this can also be done with the language.thousands option) + * $(document).ready( function() { + * $('#example').dataTable( { + * "formatNumber": function ( toFormat ) { + * return toFormat.toString().replace( + * /\B(?=(\d{3})+(?!\d))/g, "'" + * ); + * }; + * } ); + * } ); + */ + "fnFormatNumber": function ( toFormat ) { + return toFormat.toString().replace( + /\B(?=(\d{3})+(?!\d))/g, + this.oLanguage.sThousands + ); + }, + + + /** + * This function is called on every 'draw' event, and allows you to + * dynamically modify the header row. This can be used to calculate and + * display useful information about the table. + * @type function + * @param {node} head "TR" element for the header + * @param {array} data Full table data (as derived from the original HTML) + * @param {int} start Index for the current display starting point in the + * display array + * @param {int} end Index for the current display ending point in the + * display array + * @param {array int} display Index array to translate the visual position + * to the full data array + * + * @dtopt Callbacks + * @name DataTable.defaults.headerCallback + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "fheaderCallback": function( head, data, start, end, display ) { + * head.getElementsByTagName('th')[0].innerHTML = "Displaying "+(end-start)+" records"; + * } + * } ); + * } ) + */ + "fnHeaderCallback": null, + + + /** + * The information element can be used to convey information about the current + * state of the table. Although the internationalisation options presented by + * DataTables are quite capable of dealing with most customisations, there may + * be times where you wish to customise the string further. This callback + * allows you to do exactly that. + * @type function + * @param {object} oSettings DataTables settings object + * @param {int} start Starting position in data for the draw + * @param {int} end End position in data for the draw + * @param {int} max Total number of rows in the table (regardless of + * filtering) + * @param {int} total Total number of rows in the data set, after filtering + * @param {string} pre The string that DataTables has formatted using it's + * own rules + * @returns {string} The string to be displayed in the information element. + * + * @dtopt Callbacks + * @name DataTable.defaults.infoCallback + * + * @example + * $('#example').dataTable( { + * "infoCallback": function( settings, start, end, max, total, pre ) { + * return start +" to "+ end; + * } + * } ); + */ + "fnInfoCallback": null, + + + /** + * Called when the table has been initialised. Normally DataTables will + * initialise sequentially and there will be no need for this function, + * however, this does not hold true when using external language information + * since that is obtained using an async XHR call. + * @type function + * @param {object} settings DataTables settings object + * @param {object} json The JSON object request from the server - only + * present if client-side Ajax sourced data is used + * + * @dtopt Callbacks + * @name DataTable.defaults.initComplete + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "initComplete": function(settings, json) { + * alert( 'DataTables has finished its initialisation.' ); + * } + * } ); + * } ) + */ + "fnInitComplete": null, + + + /** + * Called at the very start of each table draw and can be used to cancel the + * draw by returning false, any other return (including undefined) results in + * the full draw occurring). + * @type function + * @param {object} settings DataTables settings object + * @returns {boolean} False will cancel the draw, anything else (including no + * return) will allow it to complete. + * + * @dtopt Callbacks + * @name DataTable.defaults.preDrawCallback + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "preDrawCallback": function( settings ) { + * if ( $('#test').val() == 1 ) { + * return false; + * } + * } + * } ); + * } ); + */ + "fnPreDrawCallback": null, + + + /** + * This function allows you to 'post process' each row after it have been + * generated for each table draw, but before it is rendered on screen. This + * function might be used for setting the row class name etc. + * @type function + * @param {node} row "TR" element for the current row + * @param {array} data Raw data array for this row + * @param {int} displayIndex The display index for the current table draw + * @param {int} displayIndexFull The index of the data in the full list of + * rows (after filtering) + * + * @dtopt Callbacks + * @name DataTable.defaults.rowCallback + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "rowCallback": function( row, data, displayIndex, displayIndexFull ) { + * // Bold the grade for all 'A' grade browsers + * if ( data[4] == "A" ) { + * $('td:eq(4)', row).html( 'A' ); + * } + * } + * } ); + * } ); + */ + "fnRowCallback": null, + + + /** + * __Deprecated__ The functionality provided by this parameter has now been + * superseded by that provided through `ajax`, which should be used instead. + * + * This parameter allows you to override the default function which obtains + * the data from the server so something more suitable for your application. + * For example you could use POST data, or pull information from a Gears or + * AIR database. + * @type function + * @member + * @param {string} source HTTP source to obtain the data from (`ajax`) + * @param {array} data A key/value pair object containing the data to send + * to the server + * @param {function} callback to be called on completion of the data get + * process that will draw the data on the page. + * @param {object} settings DataTables settings object + * + * @dtopt Callbacks + * @dtopt Server-side + * @name DataTable.defaults.serverData + * + * @deprecated 1.10. Please use `ajax` for this functionality now. + */ + "fnServerData": null, + + + /** + * __Deprecated__ The functionality provided by this parameter has now been + * superseded by that provided through `ajax`, which should be used instead. + * + * It is often useful to send extra data to the server when making an Ajax + * request - for example custom filtering information, and this callback + * function makes it trivial to send extra information to the server. The + * passed in parameter is the data set that has been constructed by + * DataTables, and you can add to this or modify it as you require. + * @type function + * @param {array} data Data array (array of objects which are name/value + * pairs) that has been constructed by DataTables and will be sent to the + * server. In the case of Ajax sourced data with server-side processing + * this will be an empty array, for server-side processing there will be a + * significant number of parameters! + * @returns {undefined} Ensure that you modify the data array passed in, + * as this is passed by reference. + * + * @dtopt Callbacks + * @dtopt Server-side + * @name DataTable.defaults.serverParams + * + * @deprecated 1.10. Please use `ajax` for this functionality now. + */ + "fnServerParams": null, + + + /** + * Load the table state. With this function you can define from where, and how, the + * state of a table is loaded. By default DataTables will load from `localStorage` + * but you might wish to use a server-side database or cookies. + * @type function + * @member + * @param {object} settings DataTables settings object + * @param {object} callback Callback that can be executed when done. It + * should be passed the loaded state object. + * @return {object} The DataTables state object to be loaded + * + * @dtopt Callbacks + * @name DataTable.defaults.stateLoadCallback + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "stateSave": true, + * "stateLoadCallback": function (settings, callback) { + * $.ajax( { + * "url": "/state_load", + * "dataType": "json", + * "success": function (json) { + * callback( json ); + * } + * } ); + * } + * } ); + * } ); + */ + "fnStateLoadCallback": function ( settings ) { + try { + return JSON.parse( + (settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem( + 'DataTables_'+settings.sInstance+'_'+location.pathname + ) + ); + } catch (e) {} + }, + + + /** + * Callback which allows modification of the saved state prior to loading that state. + * This callback is called when the table is loading state from the stored data, but + * prior to the settings object being modified by the saved state. Note that for + * plug-in authors, you should use the `stateLoadParams` event to load parameters for + * a plug-in. + * @type function + * @param {object} settings DataTables settings object + * @param {object} data The state object that is to be loaded + * + * @dtopt Callbacks + * @name DataTable.defaults.stateLoadParams + * + * @example + * // Remove a saved filter, so filtering is never loaded + * $(document).ready( function() { + * $('#example').dataTable( { + * "stateSave": true, + * "stateLoadParams": function (settings, data) { + * data.oSearch.sSearch = ""; + * } + * } ); + * } ); + * + * @example + * // Disallow state loading by returning false + * $(document).ready( function() { + * $('#example').dataTable( { + * "stateSave": true, + * "stateLoadParams": function (settings, data) { + * return false; + * } + * } ); + * } ); + */ + "fnStateLoadParams": null, + + + /** + * Callback that is called when the state has been loaded from the state saving method + * and the DataTables settings object has been modified as a result of the loaded state. + * @type function + * @param {object} settings DataTables settings object + * @param {object} data The state object that was loaded + * + * @dtopt Callbacks + * @name DataTable.defaults.stateLoaded + * + * @example + * // Show an alert with the filtering value that was saved + * $(document).ready( function() { + * $('#example').dataTable( { + * "stateSave": true, + * "stateLoaded": function (settings, data) { + * alert( 'Saved filter was: '+data.oSearch.sSearch ); + * } + * } ); + * } ); + */ + "fnStateLoaded": null, + + + /** + * Save the table state. This function allows you to define where and how the state + * information for the table is stored By default DataTables will use `localStorage` + * but you might wish to use a server-side database or cookies. + * @type function + * @member + * @param {object} settings DataTables settings object + * @param {object} data The state object to be saved + * + * @dtopt Callbacks + * @name DataTable.defaults.stateSaveCallback + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "stateSave": true, + * "stateSaveCallback": function (settings, data) { + * // Send an Ajax request to the server with the state object + * $.ajax( { + * "url": "/state_save", + * "data": data, + * "dataType": "json", + * "method": "POST" + * "success": function () {} + * } ); + * } + * } ); + * } ); + */ + "fnStateSaveCallback": function ( settings, data ) { + try { + (settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem( + 'DataTables_'+settings.sInstance+'_'+location.pathname, + JSON.stringify( data ) + ); + } catch (e) {} + }, + + + /** + * Callback which allows modification of the state to be saved. Called when the table + * has changed state a new state save is required. This method allows modification of + * the state saving object prior to actually doing the save, including addition or + * other state properties or modification. Note that for plug-in authors, you should + * use the `stateSaveParams` event to save parameters for a plug-in. + * @type function + * @param {object} settings DataTables settings object + * @param {object} data The state object to be saved + * + * @dtopt Callbacks + * @name DataTable.defaults.stateSaveParams + * + * @example + * // Remove a saved filter, so filtering is never saved + * $(document).ready( function() { + * $('#example').dataTable( { + * "stateSave": true, + * "stateSaveParams": function (settings, data) { + * data.oSearch.sSearch = ""; + * } + * } ); + * } ); + */ + "fnStateSaveParams": null, + + + /** + * Duration for which the saved state information is considered valid. After this period + * has elapsed the state will be returned to the default. + * Value is given in seconds. + * @type int + * @default 7200 (2 hours) + * + * @dtopt Options + * @name DataTable.defaults.stateDuration + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "stateDuration": 60*60*24; // 1 day + * } ); + * } ) + */ + "iStateDuration": 7200, + + + /** + * When enabled DataTables will not make a request to the server for the first + * page draw - rather it will use the data already on the page (no sorting etc + * will be applied to it), thus saving on an XHR at load time. `deferLoading` + * is used to indicate that deferred loading is required, but it is also used + * to tell DataTables how many records there are in the full table (allowing + * the information element and pagination to be displayed correctly). In the case + * where a filtering is applied to the table on initial load, this can be + * indicated by giving the parameter as an array, where the first element is + * the number of records available after filtering and the second element is the + * number of records without filtering (allowing the table information element + * to be shown correctly). + * @type int | array + * @default null + * + * @dtopt Options + * @name DataTable.defaults.deferLoading + * + * @example + * // 57 records available in the table, no filtering applied + * $(document).ready( function() { + * $('#example').dataTable( { + * "serverSide": true, + * "ajax": "scripts/server_processing.php", + * "deferLoading": 57 + * } ); + * } ); + * + * @example + * // 57 records after filtering, 100 without filtering (an initial filter applied) + * $(document).ready( function() { + * $('#example').dataTable( { + * "serverSide": true, + * "ajax": "scripts/server_processing.php", + * "deferLoading": [ 57, 100 ], + * "search": { + * "search": "my_filter" + * } + * } ); + * } ); + */ + "iDeferLoading": null, + + + /** + * Number of rows to display on a single page when using pagination. If + * feature enabled (`lengthChange`) then the end user will be able to override + * this to a custom setting using a pop-up menu. + * @type int + * @default 10 + * + * @dtopt Options + * @name DataTable.defaults.pageLength + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "pageLength": 50 + * } ); + * } ) + */ + "iDisplayLength": 10, + + + /** + * Define the starting point for data display when using DataTables with + * pagination. Note that this parameter is the number of records, rather than + * the page number, so if you have 10 records per page and want to start on + * the third page, it should be "20". + * @type int + * @default 0 + * + * @dtopt Options + * @name DataTable.defaults.displayStart + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "displayStart": 20 + * } ); + * } ) + */ + "iDisplayStart": 0, + + + /** + * By default DataTables allows keyboard navigation of the table (sorting, paging, + * and filtering) by adding a `tabindex` attribute to the required elements. This + * allows you to tab through the controls and press the enter key to activate them. + * The tabindex is default 0, meaning that the tab follows the flow of the document. + * You can overrule this using this parameter if you wish. Use a value of -1 to + * disable built-in keyboard navigation. + * @type int + * @default 0 + * + * @dtopt Options + * @name DataTable.defaults.tabIndex + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "tabIndex": 1 + * } ); + * } ); + */ + "iTabIndex": 0, + + + /** + * Classes that DataTables assigns to the various components and features + * that it adds to the HTML table. This allows classes to be configured + * during initialisation in addition to through the static + * {@link DataTable.ext.oStdClasses} object). + * @namespace + * @name DataTable.defaults.classes + */ + "oClasses": {}, + + + /** + * All strings that DataTables uses in the user interface that it creates + * are defined in this object, allowing you to modified them individually or + * completely replace them all as required. + * @namespace + * @name DataTable.defaults.language + */ + "oLanguage": { + /** + * Strings that are used for WAI-ARIA labels and controls only (these are not + * actually visible on the page, but will be read by screenreaders, and thus + * must be internationalised as well). + * @namespace + * @name DataTable.defaults.language.aria + */ + "oAria": { + /** + * ARIA label that is added to the table headers when the column may be + * sorted ascending by activing the column (click or return when focused). + * Note that the column header is prefixed to this string. + * @type string + * @default : activate to sort column ascending + * + * @dtopt Language + * @name DataTable.defaults.language.aria.sortAscending + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "aria": { + * "sortAscending": " - click/return to sort ascending" + * } + * } + * } ); + * } ); + */ + "sSortAscending": ": activate to sort column ascending", + + /** + * ARIA label that is added to the table headers when the column may be + * sorted descending by activing the column (click or return when focused). + * Note that the column header is prefixed to this string. + * @type string + * @default : activate to sort column ascending + * + * @dtopt Language + * @name DataTable.defaults.language.aria.sortDescending + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "aria": { + * "sortDescending": " - click/return to sort descending" + * } + * } + * } ); + * } ); + */ + "sSortDescending": ": activate to sort column descending" + }, + + /** + * Pagination string used by DataTables for the built-in pagination + * control types. + * @namespace + * @name DataTable.defaults.language.paginate + */ + "oPaginate": { + /** + * Text to use when using the 'full_numbers' type of pagination for the + * button to take the user to the first page. + * @type string + * @default First + * + * @dtopt Language + * @name DataTable.defaults.language.paginate.first + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "paginate": { + * "first": "First page" + * } + * } + * } ); + * } ); + */ + "sFirst": "First", + + + /** + * Text to use when using the 'full_numbers' type of pagination for the + * button to take the user to the last page. + * @type string + * @default Last + * + * @dtopt Language + * @name DataTable.defaults.language.paginate.last + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "paginate": { + * "last": "Last page" + * } + * } + * } ); + * } ); + */ + "sLast": "Last", + + + /** + * Text to use for the 'next' pagination button (to take the user to the + * next page). + * @type string + * @default Next + * + * @dtopt Language + * @name DataTable.defaults.language.paginate.next + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "paginate": { + * "next": "Next page" + * } + * } + * } ); + * } ); + */ + "sNext": "Next", + + + /** + * Text to use for the 'previous' pagination button (to take the user to + * the previous page). + * @type string + * @default Previous + * + * @dtopt Language + * @name DataTable.defaults.language.paginate.previous + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "paginate": { + * "previous": "Previous page" + * } + * } + * } ); + * } ); + */ + "sPrevious": "Previous" + }, + + /** + * This string is shown in preference to `zeroRecords` when the table is + * empty of data (regardless of filtering). Note that this is an optional + * parameter - if it is not given, the value of `zeroRecords` will be used + * instead (either the default or given value). + * @type string + * @default No data available in table + * + * @dtopt Language + * @name DataTable.defaults.language.emptyTable + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "emptyTable": "No data available in table" + * } + * } ); + * } ); + */ + "sEmptyTable": "No data available in table", + + + /** + * This string gives information to the end user about the information + * that is current on display on the page. The following tokens can be + * used in the string and will be dynamically replaced as the table + * display updates. This tokens can be placed anywhere in the string, or + * removed as needed by the language requires: + * + * * `\_START\_` - Display index of the first record on the current page + * * `\_END\_` - Display index of the last record on the current page + * * `\_TOTAL\_` - Number of records in the table after filtering + * * `\_MAX\_` - Number of records in the table without filtering + * * `\_PAGE\_` - Current page number + * * `\_PAGES\_` - Total number of pages of data in the table + * + * @type string + * @default Showing _START_ to _END_ of _TOTAL_ entries + * + * @dtopt Language + * @name DataTable.defaults.language.info + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "info": "Showing page _PAGE_ of _PAGES_" + * } + * } ); + * } ); + */ + "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries", + + + /** + * Display information string for when the table is empty. Typically the + * format of this string should match `info`. + * @type string + * @default Showing 0 to 0 of 0 entries + * + * @dtopt Language + * @name DataTable.defaults.language.infoEmpty + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "infoEmpty": "No entries to show" + * } + * } ); + * } ); + */ + "sInfoEmpty": "Showing 0 to 0 of 0 entries", + + + /** + * When a user filters the information in a table, this string is appended + * to the information (`info`) to give an idea of how strong the filtering + * is. The variable _MAX_ is dynamically updated. + * @type string + * @default (filtered from _MAX_ total entries) + * + * @dtopt Language + * @name DataTable.defaults.language.infoFiltered + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "infoFiltered": " - filtering from _MAX_ records" + * } + * } ); + * } ); + */ + "sInfoFiltered": "(filtered from _MAX_ total entries)", + + + /** + * If can be useful to append extra information to the info string at times, + * and this variable does exactly that. This information will be appended to + * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are + * being used) at all times. + * @type string + * @default Empty string + * + * @dtopt Language + * @name DataTable.defaults.language.infoPostFix + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "infoPostFix": "All records shown are derived from real information." + * } + * } ); + * } ); + */ + "sInfoPostFix": "", + + + /** + * This decimal place operator is a little different from the other + * language options since DataTables doesn't output floating point + * numbers, so it won't ever use this for display of a number. Rather, + * what this parameter does is modify the sort methods of the table so + * that numbers which are in a format which has a character other than + * a period (`.`) as a decimal place will be sorted numerically. + * + * Note that numbers with different decimal places cannot be shown in + * the same table and still be sortable, the table must be consistent. + * However, multiple different tables on the page can use different + * decimal place characters. + * @type string + * @default + * + * @dtopt Language + * @name DataTable.defaults.language.decimal + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "decimal": "," + * "thousands": "." + * } + * } ); + * } ); + */ + "sDecimal": "", + + + /** + * DataTables has a build in number formatter (`formatNumber`) which is + * used to format large numbers that are used in the table information. + * By default a comma is used, but this can be trivially changed to any + * character you wish with this parameter. + * @type string + * @default , + * + * @dtopt Language + * @name DataTable.defaults.language.thousands + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "thousands": "'" + * } + * } ); + * } ); + */ + "sThousands": ",", + + + /** + * Detail the action that will be taken when the drop down menu for the + * pagination length option is changed. The '_MENU_' variable is replaced + * with a default select list of 10, 25, 50 and 100, and can be replaced + * with a custom select box if required. + * @type string + * @default Show _MENU_ entries + * + * @dtopt Language + * @name DataTable.defaults.language.lengthMenu + * + * @example + * // Language change only + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "lengthMenu": "Display _MENU_ records" + * } + * } ); + * } ); + * + * @example + * // Language and options change + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "lengthMenu": 'Display records' + * } + * } ); + * } ); + */ + "sLengthMenu": "Show _MENU_ entries", + + + /** + * When using Ajax sourced data and during the first draw when DataTables is + * gathering the data, this message is shown in an empty row in the table to + * indicate to the end user the the data is being loaded. Note that this + * parameter is not used when loading data by server-side processing, just + * Ajax sourced data with client-side processing. + * @type string + * @default Loading... + * + * @dtopt Language + * @name DataTable.defaults.language.loadingRecords + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "loadingRecords": "Please wait - loading..." + * } + * } ); + * } ); + */ + "sLoadingRecords": "Loading...", + + + /** + * Text which is displayed when the table is processing a user action + * (usually a sort command or similar). + * @type string + * @default Processing... + * + * @dtopt Language + * @name DataTable.defaults.language.processing + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "processing": "DataTables is currently busy" + * } + * } ); + * } ); + */ + "sProcessing": "Processing...", + + + /** + * Details the actions that will be taken when the user types into the + * filtering input text box. The variable "_INPUT_", if used in the string, + * is replaced with the HTML text box for the filtering input allowing + * control over where it appears in the string. If "_INPUT_" is not given + * then the input box is appended to the string automatically. + * @type string + * @default Search: + * + * @dtopt Language + * @name DataTable.defaults.language.search + * + * @example + * // Input text box will be appended at the end automatically + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "search": "Filter records:" + * } + * } ); + * } ); + * + * @example + * // Specify where the filter should appear + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "search": "Apply filter _INPUT_ to table" + * } + * } ); + * } ); + */ + "sSearch": "Search:", + + + /** + * Assign a `placeholder` attribute to the search `input` element + * @type string + * @default + * + * @dtopt Language + * @name DataTable.defaults.language.searchPlaceholder + */ + "sSearchPlaceholder": "", + + + /** + * All of the language information can be stored in a file on the + * server-side, which DataTables will look up if this parameter is passed. + * It must store the URL of the language file, which is in a JSON format, + * and the object has the same properties as the oLanguage object in the + * initialiser object (i.e. the above parameters). Please refer to one of + * the example language files to see how this works in action. + * @type string + * @default Empty string - i.e. disabled + * + * @dtopt Language + * @name DataTable.defaults.language.url + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "url": "http://www.sprymedia.co.uk/dataTables/lang.txt" + * } + * } ); + * } ); + */ + "sUrl": "", + + + /** + * Text shown inside the table records when the is no information to be + * displayed after filtering. `emptyTable` is shown when there is simply no + * information in the table at all (regardless of filtering). + * @type string + * @default No matching records found + * + * @dtopt Language + * @name DataTable.defaults.language.zeroRecords + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "zeroRecords": "No records to display" + * } + * } ); + * } ); + */ + "sZeroRecords": "No matching records found" + }, + + + /** + * This parameter allows you to have define the global filtering state at + * initialisation time. As an object the `search` parameter must be + * defined, but all other parameters are optional. When `regex` is true, + * the search string will be treated as a regular expression, when false + * (default) it will be treated as a straight string. When `smart` + * DataTables will use it's smart filtering methods (to word match at + * any point in the data), when false this will not be done. + * @namespace + * @extends DataTable.models.oSearch + * + * @dtopt Options + * @name DataTable.defaults.search + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "search": {"search": "Initial search"} + * } ); + * } ) + */ + "oSearch": $.extend( {}, DataTable.models.oSearch ), + + + /** + * __Deprecated__ The functionality provided by this parameter has now been + * superseded by that provided through `ajax`, which should be used instead. + * + * By default DataTables will look for the property `data` (or `aaData` for + * compatibility with DataTables 1.9-) when obtaining data from an Ajax + * source or for server-side processing - this parameter allows that + * property to be changed. You can use Javascript dotted object notation to + * get a data source for multiple levels of nesting. + * @type string + * @default data + * + * @dtopt Options + * @dtopt Server-side + * @name DataTable.defaults.ajaxDataProp + * + * @deprecated 1.10. Please use `ajax` for this functionality now. + */ + "sAjaxDataProp": "data", + + + /** + * __Deprecated__ The functionality provided by this parameter has now been + * superseded by that provided through `ajax`, which should be used instead. + * + * You can instruct DataTables to load data from an external + * source using this parameter (use aData if you want to pass data in you + * already have). Simply provide a url a JSON object can be obtained from. + * @type string + * @default null + * + * @dtopt Options + * @dtopt Server-side + * @name DataTable.defaults.ajaxSource + * + * @deprecated 1.10. Please use `ajax` for this functionality now. + */ + "sAjaxSource": null, + + + /** + * This initialisation variable allows you to specify exactly where in the + * DOM you want DataTables to inject the various controls it adds to the page + * (for example you might want the pagination controls at the top of the + * table). DIV elements (with or without a custom class) can also be added to + * aid styling. The follow syntax is used: + *
                  + *
                • The following options are allowed: + *
                    + *
                  • 'l' - Length changing
                  • + *
                  • 'f' - Filtering input
                  • + *
                  • 't' - The table!
                  • + *
                  • 'i' - Information
                  • + *
                  • 'p' - Pagination
                  • + *
                  • 'r' - pRocessing
                  • + *
                  + *
                • + *
                • The following constants are allowed: + *
                    + *
                  • 'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')
                  • + *
                  • 'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')
                  • + *
                  + *
                • + *
                • The following syntax is expected: + *
                    + *
                  • '<' and '>' - div elements
                  • + *
                  • '<"class" and '>' - div with a class
                  • + *
                  • '<"#id" and '>' - div with an ID
                  • + *
                  + *
                • + *
                • Examples: + *
                    + *
                  • '<"wrapper"flipt>'
                  • + *
                  • '<lf<t>ip>'
                  • + *
                  + *
                • + *
                + * @type string + * @default lfrtip (when `jQueryUI` is false)or + * <"H"lfr>t<"F"ip> (when `jQueryUI` is true) + * + * @dtopt Options + * @name DataTable.defaults.dom + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "dom": '<"top"i>rt<"bottom"flp><"clear">' + * } ); + * } ); + */ + "sDom": "lfrtip", + + + /** + * Search delay option. This will throttle full table searches that use the + * DataTables provided search input element (it does not effect calls to + * `dt-api search()`, providing a delay before the search is made. + * @type integer + * @default 0 + * + * @dtopt Options + * @name DataTable.defaults.searchDelay + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "searchDelay": 200 + * } ); + * } ) + */ + "searchDelay": null, + + + /** + * DataTables features six different built-in options for the buttons to + * display for pagination control: + * + * * `numbers` - Page number buttons only + * * `simple` - 'Previous' and 'Next' buttons only + * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers + * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons + * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers + * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers + * + * Further methods can be added using {@link DataTable.ext.oPagination}. + * @type string + * @default simple_numbers + * + * @dtopt Options + * @name DataTable.defaults.pagingType + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "pagingType": "full_numbers" + * } ); + * } ) + */ + "sPaginationType": "simple_numbers", + + + /** + * Enable horizontal scrolling. When a table is too wide to fit into a + * certain layout, or you have a large number of columns in the table, you + * can enable x-scrolling to show the table in a viewport, which can be + * scrolled. This property can be `true` which will allow the table to + * scroll horizontally when needed, or any CSS unit, or a number (in which + * case it will be treated as a pixel measurement). Setting as simply `true` + * is recommended. + * @type boolean|string + * @default blank string - i.e. disabled + * + * @dtopt Features + * @name DataTable.defaults.scrollX + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "scrollX": true, + * "scrollCollapse": true + * } ); + * } ); + */ + "sScrollX": "", + + + /** + * This property can be used to force a DataTable to use more width than it + * might otherwise do when x-scrolling is enabled. For example if you have a + * table which requires to be well spaced, this parameter is useful for + * "over-sizing" the table, and thus forcing scrolling. This property can by + * any CSS unit, or a number (in which case it will be treated as a pixel + * measurement). + * @type string + * @default blank string - i.e. disabled + * + * @dtopt Options + * @name DataTable.defaults.scrollXInner + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "scrollX": "100%", + * "scrollXInner": "110%" + * } ); + * } ); + */ + "sScrollXInner": "", + + + /** + * Enable vertical scrolling. Vertical scrolling will constrain the DataTable + * to the given height, and enable scrolling for any data which overflows the + * current viewport. This can be used as an alternative to paging to display + * a lot of data in a small area (although paging and scrolling can both be + * enabled at the same time). This property can be any CSS unit, or a number + * (in which case it will be treated as a pixel measurement). + * @type string + * @default blank string - i.e. disabled + * + * @dtopt Features + * @name DataTable.defaults.scrollY + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "scrollY": "200px", + * "paginate": false + * } ); + * } ); + */ + "sScrollY": "", + + + /** + * __Deprecated__ The functionality provided by this parameter has now been + * superseded by that provided through `ajax`, which should be used instead. + * + * Set the HTTP method that is used to make the Ajax call for server-side + * processing or Ajax sourced data. + * @type string + * @default GET + * + * @dtopt Options + * @dtopt Server-side + * @name DataTable.defaults.serverMethod + * + * @deprecated 1.10. Please use `ajax` for this functionality now. + */ + "sServerMethod": "GET", + + + /** + * DataTables makes use of renderers when displaying HTML elements for + * a table. These renderers can be added or modified by plug-ins to + * generate suitable mark-up for a site. For example the Bootstrap + * integration plug-in for DataTables uses a paging button renderer to + * display pagination buttons in the mark-up required by Bootstrap. + * + * For further information about the renderers available see + * DataTable.ext.renderer + * @type string|object + * @default null + * + * @name DataTable.defaults.renderer + * + */ + "renderer": null, + + + /** + * Set the data property name that DataTables should use to get a row's id + * to set as the `id` property in the node. + * @type string + * @default DT_RowId + * + * @name DataTable.defaults.rowId + */ + "rowId": "DT_RowId" + }; + + _fnHungarianMap( DataTable.defaults ); + + + + /* + * Developer note - See note in model.defaults.js about the use of Hungarian + * notation and camel case. + */ + + /** + * Column options that can be given to DataTables at initialisation time. + * @namespace + */ + DataTable.defaults.column = { + /** + * Define which column(s) an order will occur on for this column. This + * allows a column's ordering to take multiple columns into account when + * doing a sort or use the data from a different column. For example first + * name / last name columns make sense to do a multi-column sort over the + * two columns. + * @type array|int + * @default null Takes the value of the column index automatically + * + * @name DataTable.defaults.column.orderData + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "orderData": [ 0, 1 ], "targets": [ 0 ] }, + * { "orderData": [ 1, 0 ], "targets": [ 1 ] }, + * { "orderData": 2, "targets": [ 2 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "orderData": [ 0, 1 ] }, + * { "orderData": [ 1, 0 ] }, + * { "orderData": 2 }, + * null, + * null + * ] + * } ); + * } ); + */ + "aDataSort": null, + "iDataSort": -1, + + + /** + * You can control the default ordering direction, and even alter the + * behaviour of the sort handler (i.e. only allow ascending ordering etc) + * using this parameter. + * @type array + * @default [ 'asc', 'desc' ] + * + * @name DataTable.defaults.column.orderSequence + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "orderSequence": [ "asc" ], "targets": [ 1 ] }, + * { "orderSequence": [ "desc", "asc", "asc" ], "targets": [ 2 ] }, + * { "orderSequence": [ "desc" ], "targets": [ 3 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * null, + * { "orderSequence": [ "asc" ] }, + * { "orderSequence": [ "desc", "asc", "asc" ] }, + * { "orderSequence": [ "desc" ] }, + * null + * ] + * } ); + * } ); + */ + "asSorting": [ 'asc', 'desc' ], + + + /** + * Enable or disable filtering on the data in this column. + * @type boolean + * @default true + * + * @name DataTable.defaults.column.searchable + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "searchable": false, "targets": [ 0 ] } + * ] } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "searchable": false }, + * null, + * null, + * null, + * null + * ] } ); + * } ); + */ + "bSearchable": true, + + + /** + * Enable or disable ordering on this column. + * @type boolean + * @default true + * + * @name DataTable.defaults.column.orderable + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "orderable": false, "targets": [ 0 ] } + * ] } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "orderable": false }, + * null, + * null, + * null, + * null + * ] } ); + * } ); + */ + "bSortable": true, + + + /** + * Enable or disable the display of this column. + * @type boolean + * @default true + * + * @name DataTable.defaults.column.visible + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "visible": false, "targets": [ 0 ] } + * ] } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "visible": false }, + * null, + * null, + * null, + * null + * ] } ); + * } ); + */ + "bVisible": true, + + + /** + * Developer definable function that is called whenever a cell is created (Ajax source, + * etc) or processed for input (DOM source). This can be used as a compliment to mRender + * allowing you to modify the DOM element (add background colour for example) when the + * element is available. + * @type function + * @param {element} td The TD node that has been created + * @param {*} cellData The Data for the cell + * @param {array|object} rowData The data for the whole row + * @param {int} row The row index for the aoData data store + * @param {int} col The column index for aoColumns + * + * @name DataTable.defaults.column.createdCell + * @dtopt Columns + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [3], + * "createdCell": function (td, cellData, rowData, row, col) { + * if ( cellData == "1.7" ) { + * $(td).css('color', 'blue') + * } + * } + * } ] + * }); + * } ); + */ + "fnCreatedCell": null, + + + /** + * This parameter has been replaced by `data` in DataTables to ensure naming + * consistency. `dataProp` can still be used, as there is backwards + * compatibility in DataTables for this option, but it is strongly + * recommended that you use `data` in preference to `dataProp`. + * @name DataTable.defaults.column.dataProp + */ + + + /** + * This property can be used to read data from any data source property, + * including deeply nested objects / properties. `data` can be given in a + * number of different ways which effect its behaviour: + * + * * `integer` - treated as an array index for the data source. This is the + * default that DataTables uses (incrementally increased for each column). + * * `string` - read an object property from the data source. There are + * three 'special' options that can be used in the string to alter how + * DataTables reads the data from the source object: + * * `.` - Dotted Javascript notation. Just as you use a `.` in + * Javascript to read from nested objects, so to can the options + * specified in `data`. For example: `browser.version` or + * `browser.name`. If your object parameter name contains a period, use + * `\\` to escape it - i.e. `first\\.name`. + * * `[]` - Array notation. DataTables can automatically combine data + * from and array source, joining the data with the characters provided + * between the two brackets. For example: `name[, ]` would provide a + * comma-space separated list from the source array. If no characters + * are provided between the brackets, the original array source is + * returned. + * * `()` - Function notation. Adding `()` to the end of a parameter will + * execute a function of the name given. For example: `browser()` for a + * simple function on the data source, `browser.version()` for a + * function in a nested property or even `browser().version` to get an + * object property if the function called returns an object. Note that + * function notation is recommended for use in `render` rather than + * `data` as it is much simpler to use as a renderer. + * * `null` - use the original data source for the row rather than plucking + * data directly from it. This action has effects on two other + * initialisation options: + * * `defaultContent` - When null is given as the `data` option and + * `defaultContent` is specified for the column, the value defined by + * `defaultContent` will be used for the cell. + * * `render` - When null is used for the `data` option and the `render` + * option is specified for the column, the whole data source for the + * row is used for the renderer. + * * `function` - the function given will be executed whenever DataTables + * needs to set or get the data for a cell in the column. The function + * takes three parameters: + * * Parameters: + * * `{array|object}` The data source for the row + * * `{string}` The type call data requested - this will be 'set' when + * setting data or 'filter', 'display', 'type', 'sort' or undefined + * when gathering data. Note that when `undefined` is given for the + * type DataTables expects to get the raw data for the object back< + * * `{*}` Data to set when the second parameter is 'set'. + * * Return: + * * The return value from the function is not required when 'set' is + * the type of call, but otherwise the return is what will be used + * for the data requested. + * + * Note that `data` is a getter and setter option. If you just require + * formatting of data for output, you will likely want to use `render` which + * is simply a getter and thus simpler to use. + * + * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The + * name change reflects the flexibility of this property and is consistent + * with the naming of mRender. If 'mDataProp' is given, then it will still + * be used by DataTables, as it automatically maps the old name to the new + * if required. + * + * @type string|int|function|null + * @default null Use automatically calculated column index + * + * @name DataTable.defaults.column.data + * @dtopt Columns + * + * @example + * // Read table data from objects + * // JSON structure for each row: + * // { + * // "engine": {value}, + * // "browser": {value}, + * // "platform": {value}, + * // "version": {value}, + * // "grade": {value} + * // } + * $(document).ready( function() { + * $('#example').dataTable( { + * "ajaxSource": "sources/objects.txt", + * "columns": [ + * { "data": "engine" }, + * { "data": "browser" }, + * { "data": "platform" }, + * { "data": "version" }, + * { "data": "grade" } + * ] + * } ); + * } ); + * + * @example + * // Read information from deeply nested objects + * // JSON structure for each row: + * // { + * // "engine": {value}, + * // "browser": {value}, + * // "platform": { + * // "inner": {value} + * // }, + * // "details": [ + * // {value}, {value} + * // ] + * // } + * $(document).ready( function() { + * $('#example').dataTable( { + * "ajaxSource": "sources/deep.txt", + * "columns": [ + * { "data": "engine" }, + * { "data": "browser" }, + * { "data": "platform.inner" }, + * { "data": "platform.details.0" }, + * { "data": "platform.details.1" } + * ] + * } ); + * } ); + * + * @example + * // Using `data` as a function to provide different information for + * // sorting, filtering and display. In this case, currency (price) + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [ 0 ], + * "data": function ( source, type, val ) { + * if (type === 'set') { + * source.price = val; + * // Store the computed dislay and filter values for efficiency + * source.price_display = val=="" ? "" : "$"+numberFormat(val); + * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val; + * return; + * } + * else if (type === 'display') { + * return source.price_display; + * } + * else if (type === 'filter') { + * return source.price_filter; + * } + * // 'sort', 'type' and undefined all just use the integer + * return source.price; + * } + * } ] + * } ); + * } ); + * + * @example + * // Using default content + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [ 0 ], + * "data": null, + * "defaultContent": "Click to edit" + * } ] + * } ); + * } ); + * + * @example + * // Using array notation - outputting a list from an array + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [ 0 ], + * "data": "name[, ]" + * } ] + * } ); + * } ); + * + */ + "mData": null, + + + /** + * This property is the rendering partner to `data` and it is suggested that + * when you want to manipulate data for display (including filtering, + * sorting etc) without altering the underlying data for the table, use this + * property. `render` can be considered to be the the read only companion to + * `data` which is read / write (then as such more complex). Like `data` + * this option can be given in a number of different ways to effect its + * behaviour: + * + * * `integer` - treated as an array index for the data source. This is the + * default that DataTables uses (incrementally increased for each column). + * * `string` - read an object property from the data source. There are + * three 'special' options that can be used in the string to alter how + * DataTables reads the data from the source object: + * * `.` - Dotted Javascript notation. Just as you use a `.` in + * Javascript to read from nested objects, so to can the options + * specified in `data`. For example: `browser.version` or + * `browser.name`. If your object parameter name contains a period, use + * `\\` to escape it - i.e. `first\\.name`. + * * `[]` - Array notation. DataTables can automatically combine data + * from and array source, joining the data with the characters provided + * between the two brackets. For example: `name[, ]` would provide a + * comma-space separated list from the source array. If no characters + * are provided between the brackets, the original array source is + * returned. + * * `()` - Function notation. Adding `()` to the end of a parameter will + * execute a function of the name given. For example: `browser()` for a + * simple function on the data source, `browser.version()` for a + * function in a nested property or even `browser().version` to get an + * object property if the function called returns an object. + * * `object` - use different data for the different data types requested by + * DataTables ('filter', 'display', 'type' or 'sort'). The property names + * of the object is the data type the property refers to and the value can + * defined using an integer, string or function using the same rules as + * `render` normally does. Note that an `_` option _must_ be specified. + * This is the default value to use if you haven't specified a value for + * the data type requested by DataTables. + * * `function` - the function given will be executed whenever DataTables + * needs to set or get the data for a cell in the column. The function + * takes three parameters: + * * Parameters: + * * {array|object} The data source for the row (based on `data`) + * * {string} The type call data requested - this will be 'filter', + * 'display', 'type' or 'sort'. + * * {array|object} The full data source for the row (not based on + * `data`) + * * Return: + * * The return value from the function is what will be used for the + * data requested. + * + * @type string|int|function|object|null + * @default null Use the data source value. + * + * @name DataTable.defaults.column.render + * @dtopt Columns + * + * @example + * // Create a comma separated list from an array of objects + * $(document).ready( function() { + * $('#example').dataTable( { + * "ajaxSource": "sources/deep.txt", + * "columns": [ + * { "data": "engine" }, + * { "data": "browser" }, + * { + * "data": "platform", + * "render": "[, ].name" + * } + * ] + * } ); + * } ); + * + * @example + * // Execute a function to obtain data + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [ 0 ], + * "data": null, // Use the full data source object for the renderer's source + * "render": "browserName()" + * } ] + * } ); + * } ); + * + * @example + * // As an object, extracting different data for the different types + * // This would be used with a data source such as: + * // { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368" } + * // Here the `phone` integer is used for sorting and type detection, while `phone_filter` + * // (which has both forms) is used for filtering for if a user inputs either format, while + * // the formatted phone number is the one that is shown in the table. + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [ 0 ], + * "data": null, // Use the full data source object for the renderer's source + * "render": { + * "_": "phone", + * "filter": "phone_filter", + * "display": "phone_display" + * } + * } ] + * } ); + * } ); + * + * @example + * // Use as a function to create a link from the data source + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [ 0 ], + * "data": "download_link", + * "render": function ( data, type, full ) { + * return 'Download'; + * } + * } ] + * } ); + * } ); + */ + "mRender": null, + + + /** + * Change the cell type created for the column - either TD cells or TH cells. This + * can be useful as TH cells have semantic meaning in the table body, allowing them + * to act as a header for a row (you may wish to add scope='row' to the TH elements). + * @type string + * @default td + * + * @name DataTable.defaults.column.cellType + * @dtopt Columns + * + * @example + * // Make the first column use TH cells + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [ 0 ], + * "cellType": "th" + * } ] + * } ); + * } ); + */ + "sCellType": "td", + + + /** + * Class to give to each cell in this column. + * @type string + * @default Empty string + * + * @name DataTable.defaults.column.class + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "class": "my_class", "targets": [ 0 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "class": "my_class" }, + * null, + * null, + * null, + * null + * ] + * } ); + * } ); + */ + "sClass": "", + + /** + * When DataTables calculates the column widths to assign to each column, + * it finds the longest string in each column and then constructs a + * temporary table and reads the widths from that. The problem with this + * is that "mmm" is much wider then "iiii", but the latter is a longer + * string - thus the calculation can go wrong (doing it properly and putting + * it into an DOM object and measuring that is horribly(!) slow). Thus as + * a "work around" we provide this option. It will append its value to the + * text that is found to be the longest string for the column - i.e. padding. + * Generally you shouldn't need this! + * @type string + * @default Empty string + * + * @name DataTable.defaults.column.contentPadding + * @dtopt Columns + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * null, + * null, + * null, + * { + * "contentPadding": "mmm" + * } + * ] + * } ); + * } ); + */ + "sContentPadding": "", + + + /** + * Allows a default value to be given for a column's data, and will be used + * whenever a null data source is encountered (this can be because `data` + * is set to null, or because the data source itself is null). + * @type string + * @default null + * + * @name DataTable.defaults.column.defaultContent + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { + * "data": null, + * "defaultContent": "Edit", + * "targets": [ -1 ] + * } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * null, + * null, + * null, + * { + * "data": null, + * "defaultContent": "Edit" + * } + * ] + * } ); + * } ); + */ + "sDefaultContent": null, + + + /** + * This parameter is only used in DataTables' server-side processing. It can + * be exceptionally useful to know what columns are being displayed on the + * client side, and to map these to database fields. When defined, the names + * also allow DataTables to reorder information from the server if it comes + * back in an unexpected order (i.e. if you switch your columns around on the + * client-side, your server-side code does not also need updating). + * @type string + * @default Empty string + * + * @name DataTable.defaults.column.name + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "name": "engine", "targets": [ 0 ] }, + * { "name": "browser", "targets": [ 1 ] }, + * { "name": "platform", "targets": [ 2 ] }, + * { "name": "version", "targets": [ 3 ] }, + * { "name": "grade", "targets": [ 4 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "name": "engine" }, + * { "name": "browser" }, + * { "name": "platform" }, + * { "name": "version" }, + * { "name": "grade" } + * ] + * } ); + * } ); + */ + "sName": "", + + + /** + * Defines a data source type for the ordering which can be used to read + * real-time information from the table (updating the internally cached + * version) prior to ordering. This allows ordering to occur on user + * editable elements such as form inputs. + * @type string + * @default std + * + * @name DataTable.defaults.column.orderDataType + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "orderDataType": "dom-text", "targets": [ 2, 3 ] }, + * { "type": "numeric", "targets": [ 3 ] }, + * { "orderDataType": "dom-select", "targets": [ 4 ] }, + * { "orderDataType": "dom-checkbox", "targets": [ 5 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * null, + * null, + * { "orderDataType": "dom-text" }, + * { "orderDataType": "dom-text", "type": "numeric" }, + * { "orderDataType": "dom-select" }, + * { "orderDataType": "dom-checkbox" } + * ] + * } ); + * } ); + */ + "sSortDataType": "std", + + + /** + * The title of this column. + * @type string + * @default null Derived from the 'TH' value for this column in the + * original HTML table. + * + * @name DataTable.defaults.column.title + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "title": "My column title", "targets": [ 0 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "title": "My column title" }, + * null, + * null, + * null, + * null + * ] + * } ); + * } ); + */ + "sTitle": null, + + + /** + * The type allows you to specify how the data for this column will be + * ordered. Four types (string, numeric, date and html (which will strip + * HTML tags before ordering)) are currently available. Note that only date + * formats understood by Javascript's Date() object will be accepted as type + * date. For example: "Mar 26, 2008 5:03 PM". May take the values: 'string', + * 'numeric', 'date' or 'html' (by default). Further types can be adding + * through plug-ins. + * @type string + * @default null Auto-detected from raw data + * + * @name DataTable.defaults.column.type + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "type": "html", "targets": [ 0 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "type": "html" }, + * null, + * null, + * null, + * null + * ] + * } ); + * } ); + */ + "sType": null, + + + /** + * Defining the width of the column, this parameter may take any CSS value + * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not + * been given a specific width through this interface ensuring that the table + * remains readable. + * @type string + * @default null Automatic + * + * @name DataTable.defaults.column.width + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "width": "20%", "targets": [ 0 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "width": "20%" }, + * null, + * null, + * null, + * null + * ] + * } ); + * } ); + */ + "sWidth": null + }; + + _fnHungarianMap( DataTable.defaults.column ); + + + + /** + * DataTables settings object - this holds all the information needed for a + * given table, including configuration, data and current application of the + * table options. DataTables does not have a single instance for each DataTable + * with the settings attached to that instance, but rather instances of the + * DataTable "class" are created on-the-fly as needed (typically by a + * $().dataTable() call) and the settings object is then applied to that + * instance. + * + * Note that this object is related to {@link DataTable.defaults} but this + * one is the internal data store for DataTables's cache of columns. It should + * NOT be manipulated outside of DataTables. Any configuration should be done + * through the initialisation options. + * @namespace + * @todo Really should attach the settings object to individual instances so we + * don't need to create new instances on each $().dataTable() call (if the + * table already exists). It would also save passing oSettings around and + * into every single function. However, this is a very significant + * architecture change for DataTables and will almost certainly break + * backwards compatibility with older installations. This is something that + * will be done in 2.0. + */ + DataTable.models.oSettings = { + /** + * Primary features of DataTables and their enablement state. + * @namespace + */ + "oFeatures": { + + /** + * Flag to say if DataTables should automatically try to calculate the + * optimum table and columns widths (true) or not (false). + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bAutoWidth": null, + + /** + * Delay the creation of TR and TD elements until they are actually + * needed by a driven page draw. This can give a significant speed + * increase for Ajax source and Javascript source data, but makes no + * difference at all fro DOM and server-side processing tables. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bDeferRender": null, + + /** + * Enable filtering on the table or not. Note that if this is disabled + * then there is no filtering at all on the table, including fnFilter. + * To just remove the filtering input use sDom and remove the 'f' option. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bFilter": null, + + /** + * Table information element (the 'Showing x of y records' div) enable + * flag. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bInfo": null, + + /** + * Present a user control allowing the end user to change the page size + * when pagination is enabled. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bLengthChange": null, + + /** + * Pagination enabled or not. Note that if this is disabled then length + * changing must also be disabled. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bPaginate": null, + + /** + * Processing indicator enable flag whenever DataTables is enacting a + * user request - typically an Ajax request for server-side processing. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bProcessing": null, + + /** + * Server-side processing enabled flag - when enabled DataTables will + * get all data from the server for every draw - there is no filtering, + * sorting or paging done on the client-side. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bServerSide": null, + + /** + * Sorting enablement flag. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bSort": null, + + /** + * Multi-column sorting + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bSortMulti": null, + + /** + * Apply a class to the columns which are being sorted to provide a + * visual highlight or not. This can slow things down when enabled since + * there is a lot of DOM interaction. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bSortClasses": null, + + /** + * State saving enablement flag. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bStateSave": null + }, + + + /** + * Scrolling settings for a table. + * @namespace + */ + "oScroll": { + /** + * When the table is shorter in height than sScrollY, collapse the + * table container down to the height of the table (when true). + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bCollapse": null, + + /** + * Width of the scrollbar for the web-browser's platform. Calculated + * during table initialisation. + * @type int + * @default 0 + */ + "iBarWidth": 0, + + /** + * Viewport width for horizontal scrolling. Horizontal scrolling is + * disabled if an empty string. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + */ + "sX": null, + + /** + * Width to expand the table to when using x-scrolling. Typically you + * should not need to use this. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + * @deprecated + */ + "sXInner": null, + + /** + * Viewport height for vertical scrolling. Vertical scrolling is disabled + * if an empty string. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + */ + "sY": null + }, + + /** + * Language information for the table. + * @namespace + * @extends DataTable.defaults.oLanguage + */ + "oLanguage": { + /** + * Information callback function. See + * {@link DataTable.defaults.fnInfoCallback} + * @type function + * @default null + */ + "fnInfoCallback": null + }, + + /** + * Browser support parameters + * @namespace + */ + "oBrowser": { + /** + * Indicate if the browser incorrectly calculates width:100% inside a + * scrolling element (IE6/7) + * @type boolean + * @default false + */ + "bScrollOversize": false, + + /** + * Determine if the vertical scrollbar is on the right or left of the + * scrolling container - needed for rtl language layout, although not + * all browsers move the scrollbar (Safari). + * @type boolean + * @default false + */ + "bScrollbarLeft": false, + + /** + * Flag for if `getBoundingClientRect` is fully supported or not + * @type boolean + * @default false + */ + "bBounding": false, + + /** + * Browser scrollbar width + * @type integer + * @default 0 + */ + "barWidth": 0 + }, + + + "ajax": null, + + + /** + * Array referencing the nodes which are used for the features. The + * parameters of this object match what is allowed by sDom - i.e. + *
                  + *
                • 'l' - Length changing
                • + *
                • 'f' - Filtering input
                • + *
                • 't' - The table!
                • + *
                • 'i' - Information
                • + *
                • 'p' - Pagination
                • + *
                • 'r' - pRocessing
                • + *
                + * @type array + * @default [] + */ + "aanFeatures": [], + + /** + * Store data information - see {@link DataTable.models.oRow} for detailed + * information. + * @type array + * @default [] + */ + "aoData": [], + + /** + * Array of indexes which are in the current display (after filtering etc) + * @type array + * @default [] + */ + "aiDisplay": [], + + /** + * Array of indexes for display - no filtering + * @type array + * @default [] + */ + "aiDisplayMaster": [], + + /** + * Map of row ids to data indexes + * @type object + * @default {} + */ + "aIds": {}, + + /** + * Store information about each column that is in use + * @type array + * @default [] + */ + "aoColumns": [], + + /** + * Store information about the table's header + * @type array + * @default [] + */ + "aoHeader": [], + + /** + * Store information about the table's footer + * @type array + * @default [] + */ + "aoFooter": [], + + /** + * Store the applied global search information in case we want to force a + * research or compare the old search to a new one. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @namespace + * @extends DataTable.models.oSearch + */ + "oPreviousSearch": {}, + + /** + * Store the applied search for each column - see + * {@link DataTable.models.oSearch} for the format that is used for the + * filtering information for each column. + * @type array + * @default [] + */ + "aoPreSearchCols": [], + + /** + * Sorting that is applied to the table. Note that the inner arrays are + * used in the following manner: + *
                  + *
                • Index 0 - column number
                • + *
                • Index 1 - current sorting direction
                • + *
                + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type array + * @todo These inner arrays should really be objects + */ + "aaSorting": null, + + /** + * Sorting that is always applied to the table (i.e. prefixed in front of + * aaSorting). + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type array + * @default [] + */ + "aaSortingFixed": [], + + /** + * Classes to use for the striping of a table. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type array + * @default [] + */ + "asStripeClasses": null, + + /** + * If restoring a table - we should restore its striping classes as well + * @type array + * @default [] + */ + "asDestroyStripes": [], + + /** + * If restoring a table - we should restore its width + * @type int + * @default 0 + */ + "sDestroyWidth": 0, + + /** + * Callback functions array for every time a row is inserted (i.e. on a draw). + * @type array + * @default [] + */ + "aoRowCallback": [], + + /** + * Callback functions for the header on each draw. + * @type array + * @default [] + */ + "aoHeaderCallback": [], + + /** + * Callback function for the footer on each draw. + * @type array + * @default [] + */ + "aoFooterCallback": [], + + /** + * Array of callback functions for draw callback functions + * @type array + * @default [] + */ + "aoDrawCallback": [], + + /** + * Array of callback functions for row created function + * @type array + * @default [] + */ + "aoRowCreatedCallback": [], + + /** + * Callback functions for just before the table is redrawn. A return of + * false will be used to cancel the draw. + * @type array + * @default [] + */ + "aoPreDrawCallback": [], + + /** + * Callback functions for when the table has been initialised. + * @type array + * @default [] + */ + "aoInitComplete": [], + + + /** + * Callbacks for modifying the settings to be stored for state saving, prior to + * saving state. + * @type array + * @default [] + */ + "aoStateSaveParams": [], + + /** + * Callbacks for modifying the settings that have been stored for state saving + * prior to using the stored values to restore the state. + * @type array + * @default [] + */ + "aoStateLoadParams": [], + + /** + * Callbacks for operating on the settings object once the saved state has been + * loaded + * @type array + * @default [] + */ + "aoStateLoaded": [], + + /** + * Cache the table ID for quick access + * @type string + * @default Empty string + */ + "sTableId": "", + + /** + * The TABLE node for the main table + * @type node + * @default null + */ + "nTable": null, + + /** + * Permanent ref to the thead element + * @type node + * @default null + */ + "nTHead": null, + + /** + * Permanent ref to the tfoot element - if it exists + * @type node + * @default null + */ + "nTFoot": null, + + /** + * Permanent ref to the tbody element + * @type node + * @default null + */ + "nTBody": null, + + /** + * Cache the wrapper node (contains all DataTables controlled elements) + * @type node + * @default null + */ + "nTableWrapper": null, + + /** + * Indicate if when using server-side processing the loading of data + * should be deferred until the second draw. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + * @default false + */ + "bDeferLoading": false, + + /** + * Indicate if all required information has been read in + * @type boolean + * @default false + */ + "bInitialised": false, + + /** + * Information about open rows. Each object in the array has the parameters + * 'nTr' and 'nParent' + * @type array + * @default [] + */ + "aoOpenRows": [], + + /** + * Dictate the positioning of DataTables' control elements - see + * {@link DataTable.model.oInit.sDom}. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + * @default null + */ + "sDom": null, + + /** + * Search delay (in mS) + * @type integer + * @default null + */ + "searchDelay": null, + + /** + * Which type of pagination should be used. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + * @default two_button + */ + "sPaginationType": "two_button", + + /** + * The state duration (for `stateSave`) in seconds. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type int + * @default 0 + */ + "iStateDuration": 0, + + /** + * Array of callback functions for state saving. Each array element is an + * object with the following parameters: + *
                  + *
                • function:fn - function to call. Takes two parameters, oSettings + * and the JSON string to save that has been thus far created. Returns + * a JSON string to be inserted into a json object + * (i.e. '"param": [ 0, 1, 2]')
                • + *
                • string:sName - name of callback
                • + *
                + * @type array + * @default [] + */ + "aoStateSave": [], + + /** + * Array of callback functions for state loading. Each array element is an + * object with the following parameters: + *
                  + *
                • function:fn - function to call. Takes two parameters, oSettings + * and the object stored. May return false to cancel state loading
                • + *
                • string:sName - name of callback
                • + *
                + * @type array + * @default [] + */ + "aoStateLoad": [], + + /** + * State that was saved. Useful for back reference + * @type object + * @default null + */ + "oSavedState": null, + + /** + * State that was loaded. Useful for back reference + * @type object + * @default null + */ + "oLoadedState": null, + + /** + * Source url for AJAX data for the table. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + * @default null + */ + "sAjaxSource": null, + + /** + * Property from a given object from which to read the table data from. This + * can be an empty string (when not server-side processing), in which case + * it is assumed an an array is given directly. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + */ + "sAjaxDataProp": null, + + /** + * Note if draw should be blocked while getting data + * @type boolean + * @default true + */ + "bAjaxDataGet": true, + + /** + * The last jQuery XHR object that was used for server-side data gathering. + * This can be used for working with the XHR information in one of the + * callbacks + * @type object + * @default null + */ + "jqXHR": null, + + /** + * JSON returned from the server in the last Ajax request + * @type object + * @default undefined + */ + "json": undefined, + + /** + * Data submitted as part of the last Ajax request + * @type object + * @default undefined + */ + "oAjaxData": undefined, + + /** + * Function to get the server-side data. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type function + */ + "fnServerData": null, + + /** + * Functions which are called prior to sending an Ajax request so extra + * parameters can easily be sent to the server + * @type array + * @default [] + */ + "aoServerParams": [], + + /** + * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if + * required). + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + */ + "sServerMethod": null, + + /** + * Format numbers for display. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type function + */ + "fnFormatNumber": null, + + /** + * List of options that can be used for the user selectable length menu. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type array + * @default [] + */ + "aLengthMenu": null, + + /** + * Counter for the draws that the table does. Also used as a tracker for + * server-side processing + * @type int + * @default 0 + */ + "iDraw": 0, + + /** + * Indicate if a redraw is being done - useful for Ajax + * @type boolean + * @default false + */ + "bDrawing": false, + + /** + * Draw index (iDraw) of the last error when parsing the returned data + * @type int + * @default -1 + */ + "iDrawError": -1, + + /** + * Paging display length + * @type int + * @default 10 + */ + "_iDisplayLength": 10, + + /** + * Paging start point - aiDisplay index + * @type int + * @default 0 + */ + "_iDisplayStart": 0, + + /** + * Server-side processing - number of records in the result set + * (i.e. before filtering), Use fnRecordsTotal rather than + * this property to get the value of the number of records, regardless of + * the server-side processing setting. + * @type int + * @default 0 + * @private + */ + "_iRecordsTotal": 0, + + /** + * Server-side processing - number of records in the current display set + * (i.e. after filtering). Use fnRecordsDisplay rather than + * this property to get the value of the number of records, regardless of + * the server-side processing setting. + * @type boolean + * @default 0 + * @private + */ + "_iRecordsDisplay": 0, + + /** + * The classes to use for the table + * @type object + * @default {} + */ + "oClasses": {}, + + /** + * Flag attached to the settings object so you can check in the draw + * callback if filtering has been done in the draw. Deprecated in favour of + * events. + * @type boolean + * @default false + * @deprecated + */ + "bFiltered": false, + + /** + * Flag attached to the settings object so you can check in the draw + * callback if sorting has been done in the draw. Deprecated in favour of + * events. + * @type boolean + * @default false + * @deprecated + */ + "bSorted": false, + + /** + * Indicate that if multiple rows are in the header and there is more than + * one unique cell per column, if the top one (true) or bottom one (false) + * should be used for sorting / title by DataTables. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bSortCellsTop": null, + + /** + * Initialisation object that is used for the table + * @type object + * @default null + */ + "oInit": null, + + /** + * Destroy callback functions - for plug-ins to attach themselves to the + * destroy so they can clean up markup and events. + * @type array + * @default [] + */ + "aoDestroyCallback": [], + + + /** + * Get the number of records in the current record set, before filtering + * @type function + */ + "fnRecordsTotal": function () + { + return _fnDataSource( this ) == 'ssp' ? + this._iRecordsTotal * 1 : + this.aiDisplayMaster.length; + }, + + /** + * Get the number of records in the current record set, after filtering + * @type function + */ + "fnRecordsDisplay": function () + { + return _fnDataSource( this ) == 'ssp' ? + this._iRecordsDisplay * 1 : + this.aiDisplay.length; + }, + + /** + * Get the display end point - aiDisplay index + * @type function + */ + "fnDisplayEnd": function () + { + var + len = this._iDisplayLength, + start = this._iDisplayStart, + calc = start + len, + records = this.aiDisplay.length, + features = this.oFeatures, + paginate = features.bPaginate; + + if ( features.bServerSide ) { + return paginate === false || len === -1 ? + start + records : + Math.min( start+len, this._iRecordsDisplay ); + } + else { + return ! paginate || calc>records || len===-1 ? + records : + calc; + } + }, + + /** + * The DataTables object for this table + * @type object + * @default null + */ + "oInstance": null, + + /** + * Unique identifier for each instance of the DataTables object. If there + * is an ID on the table node, then it takes that value, otherwise an + * incrementing internal counter is used. + * @type string + * @default null + */ + "sInstance": null, + + /** + * tabindex attribute value that is added to DataTables control elements, allowing + * keyboard navigation of the table and its controls. + */ + "iTabIndex": 0, + + /** + * DIV container for the footer scrolling table if scrolling + */ + "nScrollHead": null, + + /** + * DIV container for the footer scrolling table if scrolling + */ + "nScrollFoot": null, + + /** + * Last applied sort + * @type array + * @default [] + */ + "aLastSort": [], + + /** + * Stored plug-in instances + * @type object + * @default {} + */ + "oPlugins": {}, + + /** + * Function used to get a row's id from the row's data + * @type function + * @default null + */ + "rowIdFn": null, + + /** + * Data location where to store a row's id + * @type string + * @default null + */ + "rowId": null + }; + + /** + * Extension object for DataTables that is used to provide all extension + * options. + * + * Note that the `DataTable.ext` object is available through + * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is + * also aliased to `jQuery.fn.dataTableExt` for historic reasons. + * @namespace + * @extends DataTable.models.ext + */ + + + /** + * DataTables extensions + * + * This namespace acts as a collection area for plug-ins that can be used to + * extend DataTables capabilities. Indeed many of the build in methods + * use this method to provide their own capabilities (sorting methods for + * example). + * + * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy + * reasons + * + * @namespace + */ + DataTable.ext = _ext = { + /** + * Buttons. For use with the Buttons extension for DataTables. This is + * defined here so other extensions can define buttons regardless of load + * order. It is _not_ used by DataTables core. + * + * @type object + * @default {} + */ + buttons: {}, + + + /** + * Element class names + * + * @type object + * @default {} + */ + classes: {}, + + + /** + * DataTables build type (expanded by the download builder) + * + * @type string + */ + build:"bs/dt-1.10.16/fh-3.1.3/r-2.2.1", + + + /** + * Error reporting. + * + * How should DataTables report an error. Can take the value 'alert', + * 'throw', 'none' or a function. + * + * @type string|function + * @default alert + */ + errMode: "alert", + + + /** + * Feature plug-ins. + * + * This is an array of objects which describe the feature plug-ins that are + * available to DataTables. These feature plug-ins are then available for + * use through the `dom` initialisation option. + * + * Each feature plug-in is described by an object which must have the + * following properties: + * + * * `fnInit` - function that is used to initialise the plug-in, + * * `cFeature` - a character so the feature can be enabled by the `dom` + * instillation option. This is case sensitive. + * + * The `fnInit` function has the following input parameters: + * + * 1. `{object}` DataTables settings object: see + * {@link DataTable.models.oSettings} + * + * And the following return is expected: + * + * * {node|null} The element which contains your feature. Note that the + * return may also be void if your plug-in does not require to inject any + * DOM elements into DataTables control (`dom`) - for example this might + * be useful when developing a plug-in which allows table control via + * keyboard entry + * + * @type array + * + * @example + * $.fn.dataTable.ext.features.push( { + * "fnInit": function( oSettings ) { + * return new TableTools( { "oDTSettings": oSettings } ); + * }, + * "cFeature": "T" + * } ); + */ + feature: [], + + + /** + * Row searching. + * + * This method of searching is complimentary to the default type based + * searching, and a lot more comprehensive as it allows you complete control + * over the searching logic. Each element in this array is a function + * (parameters described below) that is called for every row in the table, + * and your logic decides if it should be included in the searching data set + * or not. + * + * Searching functions have the following input parameters: + * + * 1. `{object}` DataTables settings object: see + * {@link DataTable.models.oSettings} + * 2. `{array|object}` Data for the row to be processed (same as the + * original format that was passed in as the data source, or an array + * from a DOM data source + * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which + * can be useful to retrieve the `TR` element if you need DOM interaction. + * + * And the following return is expected: + * + * * {boolean} Include the row in the searched result set (true) or not + * (false) + * + * Note that as with the main search ability in DataTables, technically this + * is "filtering", since it is subtractive. However, for consistency in + * naming we call it searching here. + * + * @type array + * @default [] + * + * @example + * // The following example shows custom search being applied to the + * // fourth column (i.e. the data[3] index) based on two input values + * // from the end-user, matching the data in a certain range. + * $.fn.dataTable.ext.search.push( + * function( settings, data, dataIndex ) { + * var min = document.getElementById('min').value * 1; + * var max = document.getElementById('max').value * 1; + * var version = data[3] == "-" ? 0 : data[3]*1; + * + * if ( min == "" && max == "" ) { + * return true; + * } + * else if ( min == "" && version < max ) { + * return true; + * } + * else if ( min < version && "" == max ) { + * return true; + * } + * else if ( min < version && version < max ) { + * return true; + * } + * return false; + * } + * ); + */ + search: [], + + + /** + * Selector extensions + * + * The `selector` option can be used to extend the options available for the + * selector modifier options (`selector-modifier` object data type) that + * each of the three built in selector types offer (row, column and cell + + * their plural counterparts). For example the Select extension uses this + * mechanism to provide an option to select only rows, columns and cells + * that have been marked as selected by the end user (`{selected: true}`), + * which can be used in conjunction with the existing built in selector + * options. + * + * Each property is an array to which functions can be pushed. The functions + * take three attributes: + * + * * Settings object for the host table + * * Options object (`selector-modifier` object type) + * * Array of selected item indexes + * + * The return is an array of the resulting item indexes after the custom + * selector has been applied. + * + * @type object + */ + selector: { + cell: [], + column: [], + row: [] + }, + + + /** + * Internal functions, exposed for used in plug-ins. + * + * Please note that you should not need to use the internal methods for + * anything other than a plug-in (and even then, try to avoid if possible). + * The internal function may change between releases. + * + * @type object + * @default {} + */ + internal: {}, + + + /** + * Legacy configuration options. Enable and disable legacy options that + * are available in DataTables. + * + * @type object + */ + legacy: { + /** + * Enable / disable DataTables 1.9 compatible server-side processing + * requests + * + * @type boolean + * @default null + */ + ajax: null + }, + + + /** + * Pagination plug-in methods. + * + * Each entry in this object is a function and defines which buttons should + * be shown by the pagination rendering method that is used for the table: + * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the + * buttons are displayed in the document, while the functions here tell it + * what buttons to display. This is done by returning an array of button + * descriptions (what each button will do). + * + * Pagination types (the four built in options and any additional plug-in + * options defined here) can be used through the `paginationType` + * initialisation parameter. + * + * The functions defined take two parameters: + * + * 1. `{int} page` The current page index + * 2. `{int} pages` The number of pages in the table + * + * Each function is expected to return an array where each element of the + * array can be one of: + * + * * `first` - Jump to first page when activated + * * `last` - Jump to last page when activated + * * `previous` - Show previous page when activated + * * `next` - Show next page when activated + * * `{int}` - Show page of the index given + * * `{array}` - A nested array containing the above elements to add a + * containing 'DIV' element (might be useful for styling). + * + * Note that DataTables v1.9- used this object slightly differently whereby + * an object with two functions would be defined for each plug-in. That + * ability is still supported by DataTables 1.10+ to provide backwards + * compatibility, but this option of use is now decremented and no longer + * documented in DataTables 1.10+. + * + * @type object + * @default {} + * + * @example + * // Show previous, next and current page buttons only + * $.fn.dataTableExt.oPagination.current = function ( page, pages ) { + * return [ 'previous', page, 'next' ]; + * }; + */ + pager: {}, + + + renderer: { + pageButton: {}, + header: {} + }, + + + /** + * Ordering plug-ins - custom data source + * + * The extension options for ordering of data available here is complimentary + * to the default type based ordering that DataTables typically uses. It + * allows much greater control over the the data that is being used to + * order a column, but is necessarily therefore more complex. + * + * This type of ordering is useful if you want to do ordering based on data + * live from the DOM (for example the contents of an 'input' element) rather + * than just the static string that DataTables knows of. + * + * The way these plug-ins work is that you create an array of the values you + * wish to be ordering for the column in question and then return that + * array. The data in the array much be in the index order of the rows in + * the table (not the currently ordering order!). Which order data gathering + * function is run here depends on the `dt-init columns.orderDataType` + * parameter that is used for the column (if any). + * + * The functions defined take two parameters: + * + * 1. `{object}` DataTables settings object: see + * {@link DataTable.models.oSettings} + * 2. `{int}` Target column index + * + * Each function is expected to return an array: + * + * * `{array}` Data for the column to be ordering upon + * + * @type array + * + * @example + * // Ordering using `input` node values + * $.fn.dataTable.ext.order['dom-text'] = function ( settings, col ) + * { + * return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) { + * return $('input', td).val(); + * } ); + * } + */ + order: {}, + + + /** + * Type based plug-ins. + * + * Each column in DataTables has a type assigned to it, either by automatic + * detection or by direct assignment using the `type` option for the column. + * The type of a column will effect how it is ordering and search (plug-ins + * can also make use of the column type if required). + * + * @namespace + */ + type: { + /** + * Type detection functions. + * + * The functions defined in this object are used to automatically detect + * a column's type, making initialisation of DataTables super easy, even + * when complex data is in the table. + * + * The functions defined take two parameters: + * + * 1. `{*}` Data from the column cell to be analysed + * 2. `{settings}` DataTables settings object. This can be used to + * perform context specific type detection - for example detection + * based on language settings such as using a comma for a decimal + * place. Generally speaking the options from the settings will not + * be required + * + * Each function is expected to return: + * + * * `{string|null}` Data type detected, or null if unknown (and thus + * pass it on to the other type detection functions. + * + * @type array + * + * @example + * // Currency type detection plug-in: + * $.fn.dataTable.ext.type.detect.push( + * function ( data, settings ) { + * // Check the numeric part + * if ( ! $.isNumeric( data.substring(1) ) ) { + * return null; + * } + * + * // Check prefixed by currency + * if ( data.charAt(0) == '$' || data.charAt(0) == '£' ) { + * return 'currency'; + * } + * return null; + * } + * ); + */ + detect: [], + + + /** + * Type based search formatting. + * + * The type based searching functions can be used to pre-format the + * data to be search on. For example, it can be used to strip HTML + * tags or to de-format telephone numbers for numeric only searching. + * + * Note that is a search is not defined for a column of a given type, + * no search formatting will be performed. + * + * Pre-processing of searching data plug-ins - When you assign the sType + * for a column (or have it automatically detected for you by DataTables + * or a type detection plug-in), you will typically be using this for + * custom sorting, but it can also be used to provide custom searching + * by allowing you to pre-processing the data and returning the data in + * the format that should be searched upon. This is done by adding + * functions this object with a parameter name which matches the sType + * for that target column. This is the corollary of afnSortData + * for searching data. + * + * The functions defined take a single parameter: + * + * 1. `{*}` Data from the column cell to be prepared for searching + * + * Each function is expected to return: + * + * * `{string|null}` Formatted string that will be used for the searching. + * + * @type object + * @default {} + * + * @example + * $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) { + * return d.replace(/\n/g," ").replace( /<.*?>/g, "" ); + * } + */ + search: {}, + + + /** + * Type based ordering. + * + * The column type tells DataTables what ordering to apply to the table + * when a column is sorted upon. The order for each type that is defined, + * is defined by the functions available in this object. + * + * Each ordering option can be described by three properties added to + * this object: + * + * * `{type}-pre` - Pre-formatting function + * * `{type}-asc` - Ascending order function + * * `{type}-desc` - Descending order function + * + * All three can be used together, only `{type}-pre` or only + * `{type}-asc` and `{type}-desc` together. It is generally recommended + * that only `{type}-pre` is used, as this provides the optimal + * implementation in terms of speed, although the others are provided + * for compatibility with existing Javascript sort functions. + * + * `{type}-pre`: Functions defined take a single parameter: + * + * 1. `{*}` Data from the column cell to be prepared for ordering + * + * And return: + * + * * `{*}` Data to be sorted upon + * + * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort + * functions, taking two parameters: + * + * 1. `{*}` Data to compare to the second parameter + * 2. `{*}` Data to compare to the first parameter + * + * And returning: + * + * * `{*}` Ordering match: <0 if first parameter should be sorted lower + * than the second parameter, ===0 if the two parameters are equal and + * >0 if the first parameter should be sorted height than the second + * parameter. + * + * @type object + * @default {} + * + * @example + * // Numeric ordering of formatted numbers with a pre-formatter + * $.extend( $.fn.dataTable.ext.type.order, { + * "string-pre": function(x) { + * a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" ); + * return parseFloat( a ); + * } + * } ); + * + * @example + * // Case-sensitive string ordering, with no pre-formatting method + * $.extend( $.fn.dataTable.ext.order, { + * "string-case-asc": function(x,y) { + * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); + * }, + * "string-case-desc": function(x,y) { + * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); + * } + * } ); + */ + order: {} + }, + + /** + * Unique DataTables instance counter + * + * @type int + * @private + */ + _unique: 0, + + + // + // Depreciated + // The following properties are retained for backwards compatiblity only. + // The should not be used in new projects and will be removed in a future + // version + // + + /** + * Version check function. + * @type function + * @depreciated Since 1.10 + */ + fnVersionCheck: DataTable.fnVersionCheck, + + + /** + * Index for what 'this' index API functions should use + * @type int + * @deprecated Since v1.10 + */ + iApiIndex: 0, + + + /** + * jQuery UI class container + * @type object + * @deprecated Since v1.10 + */ + oJUIClasses: {}, + + + /** + * Software version + * @type string + * @deprecated Since v1.10 + */ + sVersion: DataTable.version + }; + + + // + // Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts + // + $.extend( _ext, { + afnFiltering: _ext.search, + aTypes: _ext.type.detect, + ofnSearch: _ext.type.search, + oSort: _ext.type.order, + afnSortData: _ext.order, + aoFeatures: _ext.feature, + oApi: _ext.internal, + oStdClasses: _ext.classes, + oPagination: _ext.pager + } ); + + + $.extend( DataTable.ext.classes, { + "sTable": "dataTable", + "sNoFooter": "no-footer", + + /* Paging buttons */ + "sPageButton": "paginate_button", + "sPageButtonActive": "current", + "sPageButtonDisabled": "disabled", + + /* Striping classes */ + "sStripeOdd": "odd", + "sStripeEven": "even", + + /* Empty row */ + "sRowEmpty": "dataTables_empty", + + /* Features */ + "sWrapper": "dataTables_wrapper", + "sFilter": "dataTables_filter", + "sInfo": "dataTables_info", + "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */ + "sLength": "dataTables_length", + "sProcessing": "dataTables_processing", + + /* Sorting */ + "sSortAsc": "sorting_asc", + "sSortDesc": "sorting_desc", + "sSortable": "sorting", /* Sortable in both directions */ + "sSortableAsc": "sorting_asc_disabled", + "sSortableDesc": "sorting_desc_disabled", + "sSortableNone": "sorting_disabled", + "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */ + + /* Filtering */ + "sFilterInput": "", + + /* Page length */ + "sLengthSelect": "", + + /* Scrolling */ + "sScrollWrapper": "dataTables_scroll", + "sScrollHead": "dataTables_scrollHead", + "sScrollHeadInner": "dataTables_scrollHeadInner", + "sScrollBody": "dataTables_scrollBody", + "sScrollFoot": "dataTables_scrollFoot", + "sScrollFootInner": "dataTables_scrollFootInner", + + /* Misc */ + "sHeaderTH": "", + "sFooterTH": "", + + // Deprecated + "sSortJUIAsc": "", + "sSortJUIDesc": "", + "sSortJUI": "", + "sSortJUIAscAllowed": "", + "sSortJUIDescAllowed": "", + "sSortJUIWrapper": "", + "sSortIcon": "", + "sJUIHeader": "", + "sJUIFooter": "" + } ); + + + var extPagination = DataTable.ext.pager; + + function _numbers ( page, pages ) { + var + numbers = [], + buttons = extPagination.numbers_length, + half = Math.floor( buttons / 2 ), + i = 1; + + if ( pages <= buttons ) { + numbers = _range( 0, pages ); + } + else if ( page <= half ) { + numbers = _range( 0, buttons-2 ); + numbers.push( 'ellipsis' ); + numbers.push( pages-1 ); + } + else if ( page >= pages - 1 - half ) { + numbers = _range( pages-(buttons-2), pages ); + numbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6 + numbers.splice( 0, 0, 0 ); + } + else { + numbers = _range( page-half+2, page+half-1 ); + numbers.push( 'ellipsis' ); + numbers.push( pages-1 ); + numbers.splice( 0, 0, 'ellipsis' ); + numbers.splice( 0, 0, 0 ); + } + + numbers.DT_el = 'span'; + return numbers; + } + + + $.extend( extPagination, { + simple: function ( page, pages ) { + return [ 'previous', 'next' ]; + }, + + full: function ( page, pages ) { + return [ 'first', 'previous', 'next', 'last' ]; + }, + + numbers: function ( page, pages ) { + return [ _numbers(page, pages) ]; + }, + + simple_numbers: function ( page, pages ) { + return [ 'previous', _numbers(page, pages), 'next' ]; + }, + + full_numbers: function ( page, pages ) { + return [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ]; + }, + + first_last_numbers: function (page, pages) { + return ['first', _numbers(page, pages), 'last']; + }, + + // For testing and plug-ins to use + _numbers: _numbers, + + // Number of number buttons (including ellipsis) to show. _Must be odd!_ + numbers_length: 7 + } ); + + + $.extend( true, DataTable.ext.renderer, { + pageButton: { + _: function ( settings, host, idx, buttons, page, pages ) { + var classes = settings.oClasses; + var lang = settings.oLanguage.oPaginate; + var aria = settings.oLanguage.oAria.paginate || {}; + var btnDisplay, btnClass, counter=0; + + var attach = function( container, buttons ) { + var i, ien, node, button; + var clickHandler = function ( e ) { + _fnPageChange( settings, e.data.action, true ); + }; + + for ( i=0, ien=buttons.length ; i' ) + .appendTo( container ); + attach( inner, button ); + } + else { + btnDisplay = null; + btnClass = ''; + + switch ( button ) { + case 'ellipsis': + container.append(''); + break; + + case 'first': + btnDisplay = lang.sFirst; + btnClass = button + (page > 0 ? + '' : ' '+classes.sPageButtonDisabled); + break; + + case 'previous': + btnDisplay = lang.sPrevious; + btnClass = button + (page > 0 ? + '' : ' '+classes.sPageButtonDisabled); + break; + + case 'next': + btnDisplay = lang.sNext; + btnClass = button + (page < pages-1 ? + '' : ' '+classes.sPageButtonDisabled); + break; + + case 'last': + btnDisplay = lang.sLast; + btnClass = button + (page < pages-1 ? + '' : ' '+classes.sPageButtonDisabled); + break; + + default: + btnDisplay = button + 1; + btnClass = page === button ? + classes.sPageButtonActive : ''; + break; + } + + if ( btnDisplay !== null ) { + node = $('', { + 'class': classes.sPageButton+' '+btnClass, + 'aria-controls': settings.sTableId, + 'aria-label': aria[ button ], + 'data-dt-idx': counter, + 'tabindex': settings.iTabIndex, + 'id': idx === 0 && typeof button === 'string' ? + settings.sTableId +'_'+ button : + null + } ) + .html( btnDisplay ) + .appendTo( container ); + + _fnBindAction( + node, {action: button}, clickHandler + ); + + counter++; + } + } + } + }; + + // IE9 throws an 'unknown error' if document.activeElement is used + // inside an iframe or frame. Try / catch the error. Not good for + // accessibility, but neither are frames. + var activeEl; + + try { + // Because this approach is destroying and recreating the paging + // elements, focus is lost on the select button which is bad for + // accessibility. So we want to restore focus once the draw has + // completed + activeEl = $(host).find(document.activeElement).data('dt-idx'); + } + catch (e) {} + + attach( $(host).empty(), buttons ); + + if ( activeEl !== undefined ) { + $(host).find( '[data-dt-idx='+activeEl+']' ).focus(); + } + } + } + } ); + + + + // Built in type detection. See model.ext.aTypes for information about + // what is required from this methods. + $.extend( DataTable.ext.type.detect, [ + // Plain numbers - first since V8 detects some plain numbers as dates + // e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...). + function ( d, settings ) + { + var decimal = settings.oLanguage.sDecimal; + return _isNumber( d, decimal ) ? 'num'+decimal : null; + }, + + // Dates (only those recognised by the browser's Date.parse) + function ( d, settings ) + { + // V8 tries _very_ hard to make a string passed into `Date.parse()` + // valid, so we need to use a regex to restrict date formats. Use a + // plug-in for anything other than ISO8601 style strings + if ( d && !(d instanceof Date) && ! _re_date.test(d) ) { + return null; + } + var parsed = Date.parse(d); + return (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null; + }, + + // Formatted numbers + function ( d, settings ) + { + var decimal = settings.oLanguage.sDecimal; + return _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null; + }, + + // HTML numeric + function ( d, settings ) + { + var decimal = settings.oLanguage.sDecimal; + return _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null; + }, + + // HTML numeric, formatted + function ( d, settings ) + { + var decimal = settings.oLanguage.sDecimal; + return _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null; + }, + + // HTML (this is strict checking - there must be html) + function ( d, settings ) + { + return _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ? + 'html' : null; + } + ] ); + + + + // Filter formatting functions. See model.ext.ofnSearch for information about + // what is required from these methods. + // + // Note that additional search methods are added for the html numbers and + // html formatted numbers by `_addNumericSort()` when we know what the decimal + // place is + + + $.extend( DataTable.ext.type.search, { + html: function ( data ) { + return _empty(data) ? + data : + typeof data === 'string' ? + data + .replace( _re_new_lines, " " ) + .replace( _re_html, "" ) : + ''; + }, + + string: function ( data ) { + return _empty(data) ? + data : + typeof data === 'string' ? + data.replace( _re_new_lines, " " ) : + data; + } + } ); + + + + var __numericReplace = function ( d, decimalPlace, re1, re2 ) { + if ( d !== 0 && (!d || d === '-') ) { + return -Infinity; + } + + // If a decimal place other than `.` is used, it needs to be given to the + // function so we can detect it and replace with a `.` which is the only + // decimal place Javascript recognises - it is not locale aware. + if ( decimalPlace ) { + d = _numToDecimal( d, decimalPlace ); + } + + if ( d.replace ) { + if ( re1 ) { + d = d.replace( re1, '' ); + } + + if ( re2 ) { + d = d.replace( re2, '' ); + } + } + + return d * 1; + }; + + + // Add the numeric 'deformatting' functions for sorting and search. This is done + // in a function to provide an easy ability for the language options to add + // additional methods if a non-period decimal place is used. + function _addNumericSort ( decimalPlace ) { + $.each( + { + // Plain numbers + "num": function ( d ) { + return __numericReplace( d, decimalPlace ); + }, + + // Formatted numbers + "num-fmt": function ( d ) { + return __numericReplace( d, decimalPlace, _re_formatted_numeric ); + }, + + // HTML numeric + "html-num": function ( d ) { + return __numericReplace( d, decimalPlace, _re_html ); + }, + + // HTML numeric, formatted + "html-num-fmt": function ( d ) { + return __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric ); + } + }, + function ( key, fn ) { + // Add the ordering method + _ext.type.order[ key+decimalPlace+'-pre' ] = fn; + + // For HTML types add a search formatter that will strip the HTML + if ( key.match(/^html\-/) ) { + _ext.type.search[ key+decimalPlace ] = _ext.type.search.html; + } + } + ); + } + + + // Default sort methods + $.extend( _ext.type.order, { + // Dates + "date-pre": function ( d ) { + return Date.parse( d ) || -Infinity; + }, + + // html + "html-pre": function ( a ) { + return _empty(a) ? + '' : + a.replace ? + a.replace( /<.*?>/g, "" ).toLowerCase() : + a+''; + }, + + // string + "string-pre": function ( a ) { + // This is a little complex, but faster than always calling toString, + // http://jsperf.com/tostring-v-check + return _empty(a) ? + '' : + typeof a === 'string' ? + a.toLowerCase() : + ! a.toString ? + '' : + a.toString(); + }, + + // string-asc and -desc are retained only for compatibility with the old + // sort methods + "string-asc": function ( x, y ) { + return ((x < y) ? -1 : ((x > y) ? 1 : 0)); + }, + + "string-desc": function ( x, y ) { + return ((x < y) ? 1 : ((x > y) ? -1 : 0)); + } + } ); + + + // Numeric sorting types - order doesn't matter here + _addNumericSort( '' ); + + + $.extend( true, DataTable.ext.renderer, { + header: { + _: function ( settings, cell, column, classes ) { + // No additional mark-up required + // Attach a sort listener to update on sort - note that using the + // `DT` namespace will allow the event to be removed automatically + // on destroy, while the `dt` namespaced event is the one we are + // listening for + $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) { + if ( settings !== ctx ) { // need to check this this is the host + return; // table, not a nested one + } + + var colIdx = column.idx; + + cell + .removeClass( + column.sSortingClass +' '+ + classes.sSortAsc +' '+ + classes.sSortDesc + ) + .addClass( columns[ colIdx ] == 'asc' ? + classes.sSortAsc : columns[ colIdx ] == 'desc' ? + classes.sSortDesc : + column.sSortingClass + ); + } ); + }, + + jqueryui: function ( settings, cell, column, classes ) { + $('
                ') + .addClass( classes.sSortJUIWrapper ) + .append( cell.contents() ) + .append( $('') + .addClass( classes.sSortIcon+' '+column.sSortingClassJUI ) + ) + .appendTo( cell ); + + // Attach a sort listener to update on sort + $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) { + if ( settings !== ctx ) { + return; + } + + var colIdx = column.idx; + + cell + .removeClass( classes.sSortAsc +" "+classes.sSortDesc ) + .addClass( columns[ colIdx ] == 'asc' ? + classes.sSortAsc : columns[ colIdx ] == 'desc' ? + classes.sSortDesc : + column.sSortingClass + ); + + cell + .find( 'span.'+classes.sSortIcon ) + .removeClass( + classes.sSortJUIAsc +" "+ + classes.sSortJUIDesc +" "+ + classes.sSortJUI +" "+ + classes.sSortJUIAscAllowed +" "+ + classes.sSortJUIDescAllowed + ) + .addClass( columns[ colIdx ] == 'asc' ? + classes.sSortJUIAsc : columns[ colIdx ] == 'desc' ? + classes.sSortJUIDesc : + column.sSortingClassJUI + ); + } ); + } + } + } ); + + /* + * Public helper functions. These aren't used internally by DataTables, or + * called by any of the options passed into DataTables, but they can be used + * externally by developers working with DataTables. They are helper functions + * to make working with DataTables a little bit easier. + */ + + var __htmlEscapeEntities = function ( d ) { + return typeof d === 'string' ? + d.replace(//g, '>').replace(/"/g, '"') : + d; + }; + + /** + * Helpers for `columns.render`. + * + * The options defined here can be used with the `columns.render` initialisation + * option to provide a display renderer. The following functions are defined: + * + * * `number` - Will format numeric data (defined by `columns.data`) for + * display, retaining the original unformatted data for sorting and filtering. + * It takes 5 parameters: + * * `string` - Thousands grouping separator + * * `string` - Decimal point indicator + * * `integer` - Number of decimal points to show + * * `string` (optional) - Prefix. + * * `string` (optional) - Postfix (/suffix). + * * `text` - Escape HTML to help prevent XSS attacks. It has no optional + * parameters. + * + * @example + * // Column definition using the number renderer + * { + * data: "salary", + * render: $.fn.dataTable.render.number( '\'', '.', 0, '$' ) + * } + * + * @namespace + */ + DataTable.render = { + number: function ( thousands, decimal, precision, prefix, postfix ) { + return { + display: function ( d ) { + if ( typeof d !== 'number' && typeof d !== 'string' ) { + return d; + } + + var negative = d < 0 ? '-' : ''; + var flo = parseFloat( d ); + + // If NaN then there isn't much formatting that we can do - just + // return immediately, escaping any HTML (this was supposed to + // be a number after all) + if ( isNaN( flo ) ) { + return __htmlEscapeEntities( d ); + } + + flo = flo.toFixed( precision ); + d = Math.abs( flo ); + + var intPart = parseInt( d, 10 ); + var floatPart = precision ? + decimal+(d - intPart).toFixed( precision ).substring( 2 ): + ''; + + return negative + (prefix||'') + + intPart.toString().replace( + /\B(?=(\d{3})+(?!\d))/g, thousands + ) + + floatPart + + (postfix||''); + } + }; + }, + + text: function () { + return { + display: __htmlEscapeEntities + }; + } + }; + + + /* + * This is really a good bit rubbish this method of exposing the internal methods + * publicly... - To be fixed in 2.0 using methods on the prototype + */ + + + /** + * Create a wrapper function for exporting an internal functions to an external API. + * @param {string} fn API function name + * @returns {function} wrapped function + * @memberof DataTable#internal + */ + function _fnExternApiFunc (fn) + { + return function() { + var args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat( + Array.prototype.slice.call(arguments) + ); + return DataTable.ext.internal[fn].apply( this, args ); + }; + } + + + /** + * Reference to internal functions for use by plug-in developers. Note that + * these methods are references to internal functions and are considered to be + * private. If you use these methods, be aware that they are liable to change + * between versions. + * @namespace + */ + $.extend( DataTable.ext.internal, { + _fnExternApiFunc: _fnExternApiFunc, + _fnBuildAjax: _fnBuildAjax, + _fnAjaxUpdate: _fnAjaxUpdate, + _fnAjaxParameters: _fnAjaxParameters, + _fnAjaxUpdateDraw: _fnAjaxUpdateDraw, + _fnAjaxDataSrc: _fnAjaxDataSrc, + _fnAddColumn: _fnAddColumn, + _fnColumnOptions: _fnColumnOptions, + _fnAdjustColumnSizing: _fnAdjustColumnSizing, + _fnVisibleToColumnIndex: _fnVisibleToColumnIndex, + _fnColumnIndexToVisible: _fnColumnIndexToVisible, + _fnVisbleColumns: _fnVisbleColumns, + _fnGetColumns: _fnGetColumns, + _fnColumnTypes: _fnColumnTypes, + _fnApplyColumnDefs: _fnApplyColumnDefs, + _fnHungarianMap: _fnHungarianMap, + _fnCamelToHungarian: _fnCamelToHungarian, + _fnLanguageCompat: _fnLanguageCompat, + _fnBrowserDetect: _fnBrowserDetect, + _fnAddData: _fnAddData, + _fnAddTr: _fnAddTr, + _fnNodeToDataIndex: _fnNodeToDataIndex, + _fnNodeToColumnIndex: _fnNodeToColumnIndex, + _fnGetCellData: _fnGetCellData, + _fnSetCellData: _fnSetCellData, + _fnSplitObjNotation: _fnSplitObjNotation, + _fnGetObjectDataFn: _fnGetObjectDataFn, + _fnSetObjectDataFn: _fnSetObjectDataFn, + _fnGetDataMaster: _fnGetDataMaster, + _fnClearTable: _fnClearTable, + _fnDeleteIndex: _fnDeleteIndex, + _fnInvalidate: _fnInvalidate, + _fnGetRowElements: _fnGetRowElements, + _fnCreateTr: _fnCreateTr, + _fnBuildHead: _fnBuildHead, + _fnDrawHead: _fnDrawHead, + _fnDraw: _fnDraw, + _fnReDraw: _fnReDraw, + _fnAddOptionsHtml: _fnAddOptionsHtml, + _fnDetectHeader: _fnDetectHeader, + _fnGetUniqueThs: _fnGetUniqueThs, + _fnFeatureHtmlFilter: _fnFeatureHtmlFilter, + _fnFilterComplete: _fnFilterComplete, + _fnFilterCustom: _fnFilterCustom, + _fnFilterColumn: _fnFilterColumn, + _fnFilter: _fnFilter, + _fnFilterCreateSearch: _fnFilterCreateSearch, + _fnEscapeRegex: _fnEscapeRegex, + _fnFilterData: _fnFilterData, + _fnFeatureHtmlInfo: _fnFeatureHtmlInfo, + _fnUpdateInfo: _fnUpdateInfo, + _fnInfoMacros: _fnInfoMacros, + _fnInitialise: _fnInitialise, + _fnInitComplete: _fnInitComplete, + _fnLengthChange: _fnLengthChange, + _fnFeatureHtmlLength: _fnFeatureHtmlLength, + _fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate, + _fnPageChange: _fnPageChange, + _fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing, + _fnProcessingDisplay: _fnProcessingDisplay, + _fnFeatureHtmlTable: _fnFeatureHtmlTable, + _fnScrollDraw: _fnScrollDraw, + _fnApplyToChildren: _fnApplyToChildren, + _fnCalculateColumnWidths: _fnCalculateColumnWidths, + _fnThrottle: _fnThrottle, + _fnConvertToWidth: _fnConvertToWidth, + _fnGetWidestNode: _fnGetWidestNode, + _fnGetMaxLenString: _fnGetMaxLenString, + _fnStringToCss: _fnStringToCss, + _fnSortFlatten: _fnSortFlatten, + _fnSort: _fnSort, + _fnSortAria: _fnSortAria, + _fnSortListener: _fnSortListener, + _fnSortAttachListener: _fnSortAttachListener, + _fnSortingClasses: _fnSortingClasses, + _fnSortData: _fnSortData, + _fnSaveState: _fnSaveState, + _fnLoadState: _fnLoadState, + _fnSettingsFromNode: _fnSettingsFromNode, + _fnLog: _fnLog, + _fnMap: _fnMap, + _fnBindAction: _fnBindAction, + _fnCallbackReg: _fnCallbackReg, + _fnCallbackFire: _fnCallbackFire, + _fnLengthOverflow: _fnLengthOverflow, + _fnRenderer: _fnRenderer, + _fnDataSource: _fnDataSource, + _fnRowAttributes: _fnRowAttributes, + _fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant + // in 1.10, so this dead-end function is + // added to prevent errors + } ); + + + // jQuery access + $.fn.dataTable = DataTable; + + // Provide access to the host jQuery object (circular reference) + DataTable.$ = $; + + // Legacy aliases + $.fn.dataTableSettings = DataTable.settings; + $.fn.dataTableExt = DataTable.ext; + + // With a capital `D` we return a DataTables API instance rather than a + // jQuery object + $.fn.DataTable = function ( opts ) { + return $(this).dataTable( opts ).api(); + }; + + // All properties that are available to $.fn.dataTable should also be + // available on $.fn.DataTable + $.each( DataTable, function ( prop, val ) { + $.fn.DataTable[ prop ] = val; + } ); + + + // Information about events fired by DataTables - for documentation. + /** + * Draw event, fired whenever the table is redrawn on the page, at the same + * point as fnDrawCallback. This may be useful for binding events or + * performing calculations when the table is altered at all. + * @name DataTable#draw.dt + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ + + /** + * Search event, fired when the searching applied to the table (using the + * built-in global search, or column filters) is altered. + * @name DataTable#search.dt + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ + + /** + * Page change event, fired when the paging of the table is altered. + * @name DataTable#page.dt + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ + + /** + * Order event, fired when the ordering applied to the table is altered. + * @name DataTable#order.dt + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ + + /** + * DataTables initialisation complete event, fired when the table is fully + * drawn, including Ajax data loaded, if Ajax data is required. + * @name DataTable#init.dt + * @event + * @param {event} e jQuery event object + * @param {object} oSettings DataTables settings object + * @param {object} json The JSON object request from the server - only + * present if client-side Ajax sourced data is used + */ + + /** + * State save event, fired when the table has changed state a new state save + * is required. This event allows modification of the state saving object + * prior to actually doing the save, including addition or other state + * properties (for plug-ins) or modification of a DataTables core property. + * @name DataTable#stateSaveParams.dt + * @event + * @param {event} e jQuery event object + * @param {object} oSettings DataTables settings object + * @param {object} json The state information to be saved + */ + + /** + * State load event, fired when the table is loading state from the stored + * data, but prior to the settings object being modified by the saved state + * - allowing modification of the saved state is required or loading of + * state for a plug-in. + * @name DataTable#stateLoadParams.dt + * @event + * @param {event} e jQuery event object + * @param {object} oSettings DataTables settings object + * @param {object} json The saved state information + */ + + /** + * State loaded event, fired when state has been loaded from stored data and + * the settings object has been modified by the loaded data. + * @name DataTable#stateLoaded.dt + * @event + * @param {event} e jQuery event object + * @param {object} oSettings DataTables settings object + * @param {object} json The saved state information + */ + + /** + * Processing event, fired when DataTables is doing some kind of processing + * (be it, order, searcg or anything else). It can be used to indicate to + * the end user that there is something happening, or that something has + * finished. + * @name DataTable#processing.dt + * @event + * @param {event} e jQuery event object + * @param {object} oSettings DataTables settings object + * @param {boolean} bShow Flag for if DataTables is doing processing or not + */ + + /** + * Ajax (XHR) event, fired whenever an Ajax request is completed from a + * request to made to the server for new data. This event is called before + * DataTables processed the returned data, so it can also be used to pre- + * process the data returned from the server, if needed. + * + * Note that this trigger is called in `fnServerData`, if you override + * `fnServerData` and which to use this event, you need to trigger it in you + * success function. + * @name DataTable#xhr.dt + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + * @param {object} json JSON returned from the server + * + * @example + * // Use a custom property returned from the server in another DOM element + * $('#table').dataTable().on('xhr.dt', function (e, settings, json) { + * $('#status').html( json.status ); + * } ); + * + * @example + * // Pre-process the data returned from the server + * $('#table').dataTable().on('xhr.dt', function (e, settings, json) { + * for ( var i=0, ien=json.aaData.length ; i<'col-sm-6'f>>" + + "<'row'<'col-sm-12'tr>>" + + "<'row'<'col-sm-5'i><'col-sm-7'p>>", + renderer: 'bootstrap' +} ); + + +/* Default class modification */ +$.extend( DataTable.ext.classes, { + sWrapper: "dataTables_wrapper form-inline dt-bootstrap", + sFilterInput: "form-control input-sm", + sLengthSelect: "form-control input-sm", + sProcessing: "dataTables_processing panel panel-default" +} ); + + +/* Bootstrap paging button renderer */ +DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) { + var api = new DataTable.Api( settings ); + var classes = settings.oClasses; + var lang = settings.oLanguage.oPaginate; + var aria = settings.oLanguage.oAria.paginate || {}; + var btnDisplay, btnClass, counter=0; + + var attach = function( container, buttons ) { + var i, ien, node, button; + var clickHandler = function ( e ) { + e.preventDefault(); + if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) { + api.page( e.data.action ).draw( 'page' ); + } + }; + + for ( i=0, ien=buttons.length ; i 0 ? + '' : ' disabled'); + break; + + case 'previous': + btnDisplay = lang.sPrevious; + btnClass = button + (page > 0 ? + '' : ' disabled'); + break; + + case 'next': + btnDisplay = lang.sNext; + btnClass = button + (page < pages-1 ? + '' : ' disabled'); + break; + + case 'last': + btnDisplay = lang.sLast; + btnClass = button + (page < pages-1 ? + '' : ' disabled'); + break; + + default: + btnDisplay = button + 1; + btnClass = page === button ? + 'active' : ''; + break; + } + + if ( btnDisplay ) { + node = $('
              • ', { + 'class': classes.sPageButton+' '+btnClass, + 'id': idx === 0 && typeof button === 'string' ? + settings.sTableId +'_'+ button : + null + } ) + .append( $('', { + 'href': '#', + 'aria-controls': settings.sTableId, + 'aria-label': aria[ button ], + 'data-dt-idx': counter, + 'tabindex': settings.iTabIndex + } ) + .html( btnDisplay ) + ) + .appendTo( container ); + + settings.oApi._fnBindAction( + node, {action: button}, clickHandler + ); + + counter++; + } + } + } + }; + + // IE9 throws an 'unknown error' if document.activeElement is used + // inside an iframe or frame. + var activeEl; + + try { + // Because this approach is destroying and recreating the paging + // elements, focus is lost on the select button which is bad for + // accessibility. So we want to restore focus once the draw has + // completed + activeEl = $(host).find(document.activeElement).data('dt-idx'); + } + catch (e) {} + + attach( + $(host).empty().html('
                  ').children('ul'), + buttons + ); + + if ( activeEl !== undefined ) { + $(host).find( '[data-dt-idx='+activeEl+']' ).focus(); + } +}; + + +return DataTable; +})); + + +/*! FixedHeader 3.1.3 + * ©2009-2017 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary FixedHeader + * @description Fix a table's header or footer, so it is always visible while + * scrolling + * @version 3.1.3 + * @file dataTables.fixedHeader.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2009-2017 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +(function( factory ){ + if ( typeof define === 'function' && define.amd ) { + // AMD + define( ['jquery', 'datatables.net'], function ( $ ) { + return factory( $, window, document ); + } ); + } + else if ( typeof exports === 'object' ) { + // CommonJS + module.exports = function (root, $) { + if ( ! root ) { + root = window; + } + + if ( ! $ || ! $.fn.dataTable ) { + $ = require('datatables.net')(root, $).$; + } + + return factory( $, root, root.document ); + }; + } + else { + // Browser + factory( jQuery, window, document ); + } +}(function( $, window, document, undefined ) { +'use strict'; +var DataTable = $.fn.dataTable; + + +var _instCounter = 0; + +var FixedHeader = function ( dt, config ) { + // Sanity check - you just know it will happen + if ( ! (this instanceof FixedHeader) ) { + throw "FixedHeader must be initialised with the 'new' keyword."; + } + + // Allow a boolean true for defaults + if ( config === true ) { + config = {}; + } + + dt = new DataTable.Api( dt ); + + this.c = $.extend( true, {}, FixedHeader.defaults, config ); + + this.s = { + dt: dt, + position: { + theadTop: 0, + tbodyTop: 0, + tfootTop: 0, + tfootBottom: 0, + width: 0, + left: 0, + tfootHeight: 0, + theadHeight: 0, + windowHeight: $(window).height(), + visible: true + }, + headerMode: null, + footerMode: null, + autoWidth: dt.settings()[0].oFeatures.bAutoWidth, + namespace: '.dtfc'+(_instCounter++), + scrollLeft: { + header: -1, + footer: -1 + }, + enable: true + }; + + this.dom = { + floatingHeader: null, + thead: $(dt.table().header()), + tbody: $(dt.table().body()), + tfoot: $(dt.table().footer()), + header: { + host: null, + floating: null, + placeholder: null + }, + footer: { + host: null, + floating: null, + placeholder: null + } + }; + + this.dom.header.host = this.dom.thead.parent(); + this.dom.footer.host = this.dom.tfoot.parent(); + + var dtSettings = dt.settings()[0]; + if ( dtSettings._fixedHeader ) { + throw "FixedHeader already initialised on table "+dtSettings.nTable.id; + } + + dtSettings._fixedHeader = this; + + this._constructor(); +}; + + +/* + * Variable: FixedHeader + * Purpose: Prototype for FixedHeader + * Scope: global + */ +$.extend( FixedHeader.prototype, { + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * API methods + */ + + /** + * Enable / disable the fixed elements + * + * @param {boolean} enable `true` to enable, `false` to disable + */ + enable: function ( enable ) + { + this.s.enable = enable; + + if ( this.c.header ) { + this._modeChange( 'in-place', 'header', true ); + } + + if ( this.c.footer && this.dom.tfoot.length ) { + this._modeChange( 'in-place', 'footer', true ); + } + + this.update(); + }, + + /** + * Set header offset + * + * @param {int} new value for headerOffset + */ + headerOffset: function ( offset ) + { + if ( offset !== undefined ) { + this.c.headerOffset = offset; + this.update(); + } + + return this.c.headerOffset; + }, + + /** + * Set footer offset + * + * @param {int} new value for footerOffset + */ + footerOffset: function ( offset ) + { + if ( offset !== undefined ) { + this.c.footerOffset = offset; + this.update(); + } + + return this.c.footerOffset; + }, + + + /** + * Recalculate the position of the fixed elements and force them into place + */ + update: function () + { + this._positions(); + this._scroll( true ); + }, + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Constructor + */ + + /** + * FixedHeader constructor - adding the required event listeners and + * simple initialisation + * + * @private + */ + _constructor: function () + { + var that = this; + var dt = this.s.dt; + + $(window) + .on( 'scroll'+this.s.namespace, function () { + that._scroll(); + } ) + .on( 'resize'+this.s.namespace, function () { + that.s.position.windowHeight = $(window).height(); + that.update(); + } ); + + var autoHeader = $('.fh-fixedHeader'); + if ( ! this.c.headerOffset && autoHeader.length ) { + this.c.headerOffset = autoHeader.outerHeight(); + } + + var autoFooter = $('.fh-fixedFooter'); + if ( ! this.c.footerOffset && autoFooter.length ) { + this.c.footerOffset = autoFooter.outerHeight(); + } + + dt.on( 'column-reorder.dt.dtfc column-visibility.dt.dtfc draw.dt.dtfc column-sizing.dt.dtfc', function () { + that.update(); + } ); + + dt.on( 'destroy.dtfc', function () { + dt.off( '.dtfc' ); + $(window).off( that.s.namespace ); + } ); + + this._positions(); + this._scroll(); + }, + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Private methods + */ + + /** + * Clone a fixed item to act as a place holder for the original element + * which is moved into a clone of the table element, and moved around the + * document to give the fixed effect. + * + * @param {string} item 'header' or 'footer' + * @param {boolean} force Force the clone to happen, or allow automatic + * decision (reuse existing if available) + * @private + */ + _clone: function ( item, force ) + { + var dt = this.s.dt; + var itemDom = this.dom[ item ]; + var itemElement = item === 'header' ? + this.dom.thead : + this.dom.tfoot; + + if ( ! force && itemDom.floating ) { + // existing floating element - reuse it + itemDom.floating.removeClass( 'fixedHeader-floating fixedHeader-locked' ); + } + else { + if ( itemDom.floating ) { + itemDom.placeholder.remove(); + this._unsize( item ); + itemDom.floating.children().detach(); + itemDom.floating.remove(); + } + + itemDom.floating = $( dt.table().node().cloneNode( false ) ) + .css( 'table-layout', 'fixed' ) + .removeAttr( 'id' ) + .append( itemElement ) + .appendTo( 'body' ); + + // Insert a fake thead/tfoot into the DataTable to stop it jumping around + itemDom.placeholder = itemElement.clone( false ) + itemDom.placeholder + .find( '*[id]' ) + .removeAttr( 'id' ); + + itemDom.host.prepend( itemDom.placeholder ); + + // Clone widths + this._matchWidths( itemDom.placeholder, itemDom.floating ); + } + }, + + /** + * Copy widths from the cells in one element to another. This is required + * for the footer as the footer in the main table takes its sizes from the + * header columns. That isn't present in the footer so to have it still + * align correctly, the sizes need to be copied over. It is also required + * for the header when auto width is not enabled + * + * @param {jQuery} from Copy widths from + * @param {jQuery} to Copy widths to + * @private + */ + _matchWidths: function ( from, to ) { + var get = function ( name ) { + return $(name, from) + .map( function () { + return $(this).width(); + } ).toArray(); + }; + + var set = function ( name, toWidths ) { + $(name, to).each( function ( i ) { + $(this).css( { + width: toWidths[i], + minWidth: toWidths[i] + } ); + } ); + }; + + var thWidths = get( 'th' ); + var tdWidths = get( 'td' ); + + set( 'th', thWidths ); + set( 'td', tdWidths ); + }, + + /** + * Remove assigned widths from the cells in an element. This is required + * when inserting the footer back into the main table so the size is defined + * by the header columns and also when auto width is disabled in the + * DataTable. + * + * @param {string} item The `header` or `footer` + * @private + */ + _unsize: function ( item ) { + var el = this.dom[ item ].floating; + + if ( el && (item === 'footer' || (item === 'header' && ! this.s.autoWidth)) ) { + $('th, td', el).css( { + width: '', + minWidth: '' + } ); + } + else if ( el && item === 'header' ) { + $('th, td', el).css( 'min-width', '' ); + } + }, + + /** + * Reposition the floating elements to take account of horizontal page + * scroll + * + * @param {string} item The `header` or `footer` + * @param {int} scrollLeft Document scrollLeft + * @private + */ + _horizontal: function ( item, scrollLeft ) + { + var itemDom = this.dom[ item ]; + var position = this.s.position; + var lastScrollLeft = this.s.scrollLeft; + + if ( itemDom.floating && lastScrollLeft[ item ] !== scrollLeft ) { + itemDom.floating.css( 'left', position.left - scrollLeft ); + + lastScrollLeft[ item ] = scrollLeft; + } + }, + + /** + * Change from one display mode to another. Each fixed item can be in one + * of: + * + * * `in-place` - In the main DataTable + * * `in` - Floating over the DataTable + * * `below` - (Header only) Fixed to the bottom of the table body + * * `above` - (Footer only) Fixed to the top of the table body + * + * @param {string} mode Mode that the item should be shown in + * @param {string} item 'header' or 'footer' + * @param {boolean} forceChange Force a redraw of the mode, even if already + * in that mode. + * @private + */ + _modeChange: function ( mode, item, forceChange ) + { + var dt = this.s.dt; + var itemDom = this.dom[ item ]; + var position = this.s.position; + + // Record focus. Browser's will cause input elements to loose focus if + // they are inserted else where in the doc + var tablePart = this.dom[ item==='footer' ? 'tfoot' : 'thead' ]; + var focus = $.contains( tablePart[0], document.activeElement ) ? + document.activeElement : + null; + + if ( mode === 'in-place' ) { + // Insert the header back into the table's real header + if ( itemDom.placeholder ) { + itemDom.placeholder.remove(); + itemDom.placeholder = null; + } + + this._unsize( item ); + + if ( item === 'header' ) { + itemDom.host.prepend( this.dom.thead ); + } + else { + itemDom.host.append( this.dom.tfoot ); + } + + if ( itemDom.floating ) { + itemDom.floating.remove(); + itemDom.floating = null; + } + } + else if ( mode === 'in' ) { + // Remove the header from the read header and insert into a fixed + // positioned floating table clone + this._clone( item, forceChange ); + + itemDom.floating + .addClass( 'fixedHeader-floating' ) + .css( item === 'header' ? 'top' : 'bottom', this.c[item+'Offset'] ) + .css( 'left', position.left+'px' ) + .css( 'width', position.width+'px' ); + + if ( item === 'footer' ) { + itemDom.floating.css( 'top', '' ); + } + } + else if ( mode === 'below' ) { // only used for the header + // Fix the position of the floating header at base of the table body + this._clone( item, forceChange ); + + itemDom.floating + .addClass( 'fixedHeader-locked' ) + .css( 'top', position.tfootTop - position.theadHeight ) + .css( 'left', position.left+'px' ) + .css( 'width', position.width+'px' ); + } + else if ( mode === 'above' ) { // only used for the footer + // Fix the position of the floating footer at top of the table body + this._clone( item, forceChange ); + + itemDom.floating + .addClass( 'fixedHeader-locked' ) + .css( 'top', position.tbodyTop ) + .css( 'left', position.left+'px' ) + .css( 'width', position.width+'px' ); + } + + // Restore focus if it was lost + if ( focus && focus !== document.activeElement ) { + focus.focus(); + } + + this.s.scrollLeft.header = -1; + this.s.scrollLeft.footer = -1; + this.s[item+'Mode'] = mode; + }, + + /** + * Cache the positional information that is required for the mode + * calculations that FixedHeader performs. + * + * @private + */ + _positions: function () + { + var dt = this.s.dt; + var table = dt.table(); + var position = this.s.position; + var dom = this.dom; + var tableNode = $(table.node()); + + // Need to use the header and footer that are in the main table, + // regardless of if they are clones, since they hold the positions we + // want to measure from + var thead = tableNode.children('thead'); + var tfoot = tableNode.children('tfoot'); + var tbody = dom.tbody; + + position.visible = tableNode.is(':visible'); + position.width = tableNode.outerWidth(); + position.left = tableNode.offset().left; + position.theadTop = thead.offset().top; + position.tbodyTop = tbody.offset().top; + position.theadHeight = position.tbodyTop - position.theadTop; + + if ( tfoot.length ) { + position.tfootTop = tfoot.offset().top; + position.tfootBottom = position.tfootTop + tfoot.outerHeight(); + position.tfootHeight = position.tfootBottom - position.tfootTop; + } + else { + position.tfootTop = position.tbodyTop + tbody.outerHeight(); + position.tfootBottom = position.tfootTop; + position.tfootHeight = position.tfootTop; + } + }, + + + /** + * Mode calculation - determine what mode the fixed items should be placed + * into. + * + * @param {boolean} forceChange Force a redraw of the mode, even if already + * in that mode. + * @private + */ + _scroll: function ( forceChange ) + { + var windowTop = $(document).scrollTop(); + var windowLeft = $(document).scrollLeft(); + var position = this.s.position; + var headerMode, footerMode; + + if ( ! this.s.enable ) { + return; + } + + if ( this.c.header ) { + if ( ! position.visible || windowTop <= position.theadTop - this.c.headerOffset ) { + headerMode = 'in-place'; + } + else if ( windowTop <= position.tfootTop - position.theadHeight - this.c.headerOffset ) { + headerMode = 'in'; + } + else { + headerMode = 'below'; + } + + if ( forceChange || headerMode !== this.s.headerMode ) { + this._modeChange( headerMode, 'header', forceChange ); + } + + this._horizontal( 'header', windowLeft ); + } + + if ( this.c.footer && this.dom.tfoot.length ) { + if ( ! position.visible || windowTop + position.windowHeight >= position.tfootBottom + this.c.footerOffset ) { + footerMode = 'in-place'; + } + else if ( position.windowHeight + windowTop > position.tbodyTop + position.tfootHeight + this.c.footerOffset ) { + footerMode = 'in'; + } + else { + footerMode = 'above'; + } + + if ( forceChange || footerMode !== this.s.footerMode ) { + this._modeChange( footerMode, 'footer', forceChange ); + } + + this._horizontal( 'footer', windowLeft ); + } + } +} ); + + +/** + * Version + * @type {String} + * @static + */ +FixedHeader.version = "3.1.3"; + +/** + * Defaults + * @type {Object} + * @static + */ +FixedHeader.defaults = { + header: true, + footer: false, + headerOffset: 0, + footerOffset: 0 +}; + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * DataTables interfaces + */ + +// Attach for constructor access +$.fn.dataTable.FixedHeader = FixedHeader; +$.fn.DataTable.FixedHeader = FixedHeader; + + +// DataTables creation - check if the FixedHeader option has been defined on the +// table and if so, initialise +$(document).on( 'init.dt.dtfh', function (e, settings, json) { + if ( e.namespace !== 'dt' ) { + return; + } + + var init = settings.oInit.fixedHeader; + var defaults = DataTable.defaults.fixedHeader; + + if ( (init || defaults) && ! settings._fixedHeader ) { + var opts = $.extend( {}, defaults, init ); + + if ( init !== false ) { + new FixedHeader( settings, opts ); + } + } +} ); + +// DataTables API methods +DataTable.Api.register( 'fixedHeader()', function () {} ); + +DataTable.Api.register( 'fixedHeader.adjust()', function () { + return this.iterator( 'table', function ( ctx ) { + var fh = ctx._fixedHeader; + + if ( fh ) { + fh.update(); + } + } ); +} ); + +DataTable.Api.register( 'fixedHeader.enable()', function ( flag ) { + return this.iterator( 'table', function ( ctx ) { + var fh = ctx._fixedHeader; + + flag = ( flag !== undefined ? flag : true ); + if ( fh && flag !== fh.s.enable ) { + fh.enable( flag ); + } + } ); +} ); + +DataTable.Api.register( 'fixedHeader.disable()', function ( ) { + return this.iterator( 'table', function ( ctx ) { + var fh = ctx._fixedHeader; + + if ( fh && fh.s.enable ) { + fh.enable( false ); + } + } ); +} ); + +$.each( ['header', 'footer'], function ( i, el ) { + DataTable.Api.register( 'fixedHeader.'+el+'Offset()', function ( offset ) { + var ctx = this.context; + + if ( offset === undefined ) { + return ctx.length && ctx[0]._fixedHeader ? + ctx[0]._fixedHeader[el +'Offset']() : + undefined; + } + + return this.iterator( 'table', function ( ctx ) { + var fh = ctx._fixedHeader; + + if ( fh ) { + fh[ el +'Offset' ]( offset ); + } + } ); + } ); +} ); + + +return FixedHeader; +})); + + +/*! Responsive 2.2.1 + * 2014-2017 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary Responsive + * @description Responsive tables plug-in for DataTables + * @version 2.2.1 + * @file dataTables.responsive.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2014-2017 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ +(function( factory ){ + if ( typeof define === 'function' && define.amd ) { + // AMD + define( ['jquery', 'datatables.net'], function ( $ ) { + return factory( $, window, document ); + } ); + } + else if ( typeof exports === 'object' ) { + // CommonJS + module.exports = function (root, $) { + if ( ! root ) { + root = window; + } + + if ( ! $ || ! $.fn.dataTable ) { + $ = require('datatables.net')(root, $).$; + } + + return factory( $, root, root.document ); + }; + } + else { + // Browser + factory( jQuery, window, document ); + } +}(function( $, window, document, undefined ) { +'use strict'; +var DataTable = $.fn.dataTable; + + +/** + * Responsive is a plug-in for the DataTables library that makes use of + * DataTables' ability to change the visibility of columns, changing the + * visibility of columns so the displayed columns fit into the table container. + * The end result is that complex tables will be dynamically adjusted to fit + * into the viewport, be it on a desktop, tablet or mobile browser. + * + * Responsive for DataTables has two modes of operation, which can used + * individually or combined: + * + * * Class name based control - columns assigned class names that match the + * breakpoint logic can be shown / hidden as required for each breakpoint. + * * Automatic control - columns are automatically hidden when there is no + * room left to display them. Columns removed from the right. + * + * In additional to column visibility control, Responsive also has built into + * options to use DataTables' child row display to show / hide the information + * from the table that has been hidden. There are also two modes of operation + * for this child row display: + * + * * Inline - when the control element that the user can use to show / hide + * child rows is displayed inside the first column of the table. + * * Column - where a whole column is dedicated to be the show / hide control. + * + * Initialisation of Responsive is performed by: + * + * * Adding the class `responsive` or `dt-responsive` to the table. In this case + * Responsive will automatically be initialised with the default configuration + * options when the DataTable is created. + * * Using the `responsive` option in the DataTables configuration options. This + * can also be used to specify the configuration options, or simply set to + * `true` to use the defaults. + * + * @class + * @param {object} settings DataTables settings object for the host table + * @param {object} [opts] Configuration options + * @requires jQuery 1.7+ + * @requires DataTables 1.10.3+ + * + * @example + * $('#example').DataTable( { + * responsive: true + * } ); + * } ); + */ +var Responsive = function ( settings, opts ) { + // Sanity check that we are using DataTables 1.10 or newer + if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.10' ) ) { + throw 'DataTables Responsive requires DataTables 1.10.10 or newer'; + } + + this.s = { + dt: new DataTable.Api( settings ), + columns: [], + current: [] + }; + + // Check if responsive has already been initialised on this table + if ( this.s.dt.settings()[0].responsive ) { + return; + } + + // details is an object, but for simplicity the user can give it as a string + // or a boolean + if ( opts && typeof opts.details === 'string' ) { + opts.details = { type: opts.details }; + } + else if ( opts && opts.details === false ) { + opts.details = { type: false }; + } + else if ( opts && opts.details === true ) { + opts.details = { type: 'inline' }; + } + + this.c = $.extend( true, {}, Responsive.defaults, DataTable.defaults.responsive, opts ); + settings.responsive = this; + this._constructor(); +}; + +$.extend( Responsive.prototype, { + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Constructor + */ + + /** + * Initialise the Responsive instance + * + * @private + */ + _constructor: function () + { + var that = this; + var dt = this.s.dt; + var dtPrivateSettings = dt.settings()[0]; + var oldWindowWidth = $(window).width(); + + dt.settings()[0]._responsive = this; + + // Use DataTables' throttle function to avoid processor thrashing on + // resize + $(window).on( 'resize.dtr orientationchange.dtr', DataTable.util.throttle( function () { + // iOS has a bug whereby resize can fire when only scrolling + // See: http://stackoverflow.com/questions/8898412 + var width = $(window).width(); + + if ( width !== oldWindowWidth ) { + that._resize(); + oldWindowWidth = width; + } + } ) ); + + // DataTables doesn't currently trigger an event when a row is added, so + // we need to hook into its private API to enforce the hidden rows when + // new data is added + dtPrivateSettings.oApi._fnCallbackReg( dtPrivateSettings, 'aoRowCreatedCallback', function (tr, data, idx) { + if ( $.inArray( false, that.s.current ) !== -1 ) { + $('>td, >th', tr).each( function ( i ) { + var idx = dt.column.index( 'toData', i ); + + if ( that.s.current[idx] === false ) { + $(this).css('display', 'none'); + } + } ); + } + } ); + + // Destroy event handler + dt.on( 'destroy.dtr', function () { + dt.off( '.dtr' ); + $( dt.table().body() ).off( '.dtr' ); + $(window).off( 'resize.dtr orientationchange.dtr' ); + + // Restore the columns that we've hidden + $.each( that.s.current, function ( i, val ) { + if ( val === false ) { + that._setColumnVis( i, true ); + } + } ); + } ); + + // Reorder the breakpoints array here in case they have been added out + // of order + this.c.breakpoints.sort( function (a, b) { + return a.width < b.width ? 1 : + a.width > b.width ? -1 : 0; + } ); + + this._classLogic(); + this._resizeAuto(); + + // Details handler + var details = this.c.details; + + if ( details.type !== false ) { + that._detailsInit(); + + // DataTables will trigger this event on every column it shows and + // hides individually + dt.on( 'column-visibility.dtr', function (e, ctx, col, vis, recalc) { + if ( recalc ) { + that._classLogic(); + that._resizeAuto(); + that._resize(); + } + } ); + + // Redraw the details box on each draw which will happen if the data + // has changed. This is used until DataTables implements a native + // `updated` event for rows + dt.on( 'draw.dtr', function () { + that._redrawChildren(); + } ); + + $(dt.table().node()).addClass( 'dtr-'+details.type ); + } + + dt.on( 'column-reorder.dtr', function (e, settings, details) { + that._classLogic(); + that._resizeAuto(); + that._resize(); + } ); + + // Change in column sizes means we need to calc + dt.on( 'column-sizing.dtr', function () { + that._resizeAuto(); + that._resize(); + }); + + // On Ajax reload we want to reopen any child rows which are displayed + // by responsive + dt.on( 'preXhr.dtr', function () { + var rowIds = []; + dt.rows().every( function () { + if ( this.child.isShown() ) { + rowIds.push( this.id(true) ); + } + } ); + + dt.one( 'draw.dtr', function () { + that._resizeAuto(); + that._resize(); + + dt.rows( rowIds ).every( function () { + that._detailsDisplay( this, false ); + } ); + } ); + }); + + dt.on( 'init.dtr', function (e, settings, details) { + that._resizeAuto(); + that._resize(); + + // If columns were hidden, then DataTables needs to adjust the + // column sizing + if ( $.inArray( false, that.s.current ) ) { + dt.columns.adjust(); + } + } ); + + // First pass - draw the table for the current viewport size + this._resize(); + }, + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Private methods + */ + + /** + * Calculate the visibility for the columns in a table for a given + * breakpoint. The result is pre-determined based on the class logic if + * class names are used to control all columns, but the width of the table + * is also used if there are columns which are to be automatically shown + * and hidden. + * + * @param {string} breakpoint Breakpoint name to use for the calculation + * @return {array} Array of boolean values initiating the visibility of each + * column. + * @private + */ + _columnsVisiblity: function ( breakpoint ) + { + var dt = this.s.dt; + var columns = this.s.columns; + var i, ien; + + // Create an array that defines the column ordering based first on the + // column's priority, and secondly the column index. This allows the + // columns to be removed from the right if the priority matches + var order = columns + .map( function ( col, idx ) { + return { + columnIdx: idx, + priority: col.priority + }; + } ) + .sort( function ( a, b ) { + if ( a.priority !== b.priority ) { + return a.priority - b.priority; + } + return a.columnIdx - b.columnIdx; + } ); + + // Class logic - determine which columns are in this breakpoint based + // on the classes. If no class control (i.e. `auto`) then `-` is used + // to indicate this to the rest of the function + var display = $.map( columns, function ( col ) { + return col.auto && col.minWidth === null ? + false : + col.auto === true ? + '-' : + $.inArray( breakpoint, col.includeIn ) !== -1; + } ); + + // Auto column control - first pass: how much width is taken by the + // ones that must be included from the non-auto columns + var requiredWidth = 0; + for ( i=0, ien=display.length ; i
              • ') + .append( headerCells ) + .appendTo( clonedHeader ); + + // In the inline case extra padding is applied to the first column to + // give space for the show / hide icon. We need to use this in the + // calculation + if ( this.c.details.type === 'inline' ) { + $(clonedTable).addClass( 'dtr-inline collapsed' ); + } + + // It is unsafe to insert elements with the same name into the DOM + // multiple times. For example, cloning and inserting a checked radio + // clears the chcecked state of the original radio. + $( clonedTable ).find( '[name]' ).removeAttr( 'name' ); + + var inserted = $('
                ') + .css( { + width: 1, + height: 1, + overflow: 'hidden', + clear: 'both' + } ) + .append( clonedTable ); + + inserted.insertBefore( dt.table().node() ); + + // The cloned header now contains the smallest that each column can be + headerCells.each( function (i) { + var idx = dt.column.index( 'fromVisible', i ); + columns[ idx ].minWidth = this.offsetWidth || 0; + } ); + + inserted.remove(); + }, + + /** + * Set a column's visibility. + * + * We don't use DataTables' column visibility controls in order to ensure + * that column visibility can Responsive can no-exist. Since only IE8+ is + * supported (and all evergreen browsers of course) the control of the + * display attribute works well. + * + * @param {integer} col Column index + * @param {boolean} showHide Show or hide (true or false) + * @private + */ + _setColumnVis: function ( col, showHide ) + { + var dt = this.s.dt; + var display = showHide ? '' : 'none'; // empty string will remove the attr + + $( dt.column( col ).header() ).css( 'display', display ); + $( dt.column( col ).footer() ).css( 'display', display ); + dt.column( col ).nodes().to$().css( 'display', display ); + + // If the are child nodes stored, we might need to reinsert them + if ( ! $.isEmptyObject( _childNodeStore ) ) { + dt.cells( null, col ).indexes().each( function (idx) { + _childNodesRestore( dt, idx.row, idx.column ); + } ); + } + }, + + + /** + * Update the cell tab indexes for keyboard accessibility. This is called on + * every table draw - that is potentially inefficient, but also the least + * complex option given that column visibility can change on the fly. Its a + * shame user-focus was removed from CSS 3 UI, as it would have solved this + * issue with a single CSS statement. + * + * @private + */ + _tabIndexes: function () + { + var dt = this.s.dt; + var cells = dt.cells( { page: 'current' } ).nodes().to$(); + var ctx = dt.settings()[0]; + var target = this.c.details.target; + + cells.filter( '[data-dtr-keyboard]' ).removeData( '[data-dtr-keyboard]' ); + + var selector = typeof target === 'number' ? + ':eq('+target+')' : + target; + + // This is a bit of a hack - we need to limit the selected nodes to just + // those of this table + if ( selector === 'td:first-child, th:first-child' ) { + selector = '>td:first-child, >th:first-child'; + } + + $( selector, dt.rows( { page: 'current' } ).nodes() ) + .attr( 'tabIndex', ctx.iTabIndex ) + .data( 'dtr-keyboard', 1 ); + } +} ); + + +/** + * List of default breakpoints. Each item in the array is an object with two + * properties: + * + * * `name` - the breakpoint name. + * * `width` - the breakpoint width + * + * @name Responsive.breakpoints + * @static + */ +Responsive.breakpoints = [ + { name: 'desktop', width: Infinity }, + { name: 'tablet-l', width: 1024 }, + { name: 'tablet-p', width: 768 }, + { name: 'mobile-l', width: 480 }, + { name: 'mobile-p', width: 320 } +]; + + +/** + * Display methods - functions which define how the hidden data should be shown + * in the table. + * + * @namespace + * @name Responsive.defaults + * @static + */ +Responsive.display = { + childRow: function ( row, update, render ) { + if ( update ) { + if ( $(row.node()).hasClass('parent') ) { + row.child( render(), 'child' ).show(); + + return true; + } + } + else { + if ( ! row.child.isShown() ) { + row.child( render(), 'child' ).show(); + $( row.node() ).addClass( 'parent' ); + + return true; + } + else { + row.child( false ); + $( row.node() ).removeClass( 'parent' ); + + return false; + } + } + }, + + childRowImmediate: function ( row, update, render ) { + if ( (! update && row.child.isShown()) || ! row.responsive.hasHidden() ) { + // User interaction and the row is show, or nothing to show + row.child( false ); + $( row.node() ).removeClass( 'parent' ); + + return false; + } + else { + // Display + row.child( render(), 'child' ).show(); + $( row.node() ).addClass( 'parent' ); + + return true; + } + }, + + // This is a wrapper so the modal options for Bootstrap and jQuery UI can + // have options passed into them. This specific one doesn't need to be a + // function but it is for consistency in the `modal` name + modal: function ( options ) { + return function ( row, update, render ) { + if ( ! update ) { + // Show a modal + var close = function () { + modal.remove(); // will tidy events for us + $(document).off( 'keypress.dtr' ); + }; + + var modal = $('
                ') + .append( $('
                ') + .append( $('
                ') + .append( render() ) + ) + .append( $('
                ×
                ' ) + .click( function () { + close(); + } ) + ) + ) + .append( $('
                ') + .click( function () { + close(); + } ) + ) + .appendTo( 'body' ); + + $(document).on( 'keyup.dtr', function (e) { + if ( e.keyCode === 27 ) { + e.stopPropagation(); + + close(); + } + } ); + } + else { + $('div.dtr-modal-content') + .empty() + .append( render() ); + } + + if ( options && options.header ) { + $('div.dtr-modal-content').prepend( + '

                '+options.header( row )+'

                ' + ); + } + }; + } +}; + + +var _childNodeStore = {}; + +function _childNodes( dt, row, col ) { + var name = row+'-'+col; + + if ( _childNodeStore[ name ] ) { + return _childNodeStore[ name ]; + } + + // https://jsperf.com/childnodes-array-slice-vs-loop + var nodes = []; + var children = dt.cell( row, col ).node().childNodes; + for ( var i=0, ien=children.length ; i
                '+ + ' '+ + ''+ + ''; + } ).join(''); + + return $('
                '+col.title+':'+''+col.data+'
                ').append( data ); + } + } +}; + +/** + * Responsive default settings for initialisation + * + * @namespace + * @name Responsive.defaults + * @static + */ +Responsive.defaults = { + /** + * List of breakpoints for the instance. Note that this means that each + * instance can have its own breakpoints. Additionally, the breakpoints + * cannot be changed once an instance has been creased. + * + * @type {Array} + * @default Takes the value of `Responsive.breakpoints` + */ + breakpoints: Responsive.breakpoints, + + /** + * Enable / disable auto hiding calculations. It can help to increase + * performance slightly if you disable this option, but all columns would + * need to have breakpoint classes assigned to them + * + * @type {Boolean} + * @default `true` + */ + auto: true, + + /** + * Details control. If given as a string value, the `type` property of the + * default object is set to that value, and the defaults used for the rest + * of the object - this is for ease of implementation. + * + * The object consists of the following properties: + * + * * `display` - A function that is used to show and hide the hidden details + * * `renderer` - function that is called for display of the child row data. + * The default function will show the data from the hidden columns + * * `target` - Used as the selector for what objects to attach the child + * open / close to + * * `type` - `false` to disable the details display, `inline` or `column` + * for the two control types + * + * @type {Object|string} + */ + details: { + display: Responsive.display.childRow, + + renderer: Responsive.renderer.listHidden(), + + target: 0, + + type: 'inline' + }, + + /** + * Orthogonal data request option. This is used to define the data type + * requested when Responsive gets the data to show in the child row. + * + * @type {String} + */ + orthogonal: 'display' +}; + + +/* + * API + */ +var Api = $.fn.dataTable.Api; + +// Doesn't do anything - work around for a bug in DT... Not documented +Api.register( 'responsive()', function () { + return this; +} ); + +Api.register( 'responsive.index()', function ( li ) { + li = $(li); + + return { + column: li.data('dtr-index'), + row: li.parent().data('dtr-index') + }; +} ); + +Api.register( 'responsive.rebuild()', function () { + return this.iterator( 'table', function ( ctx ) { + if ( ctx._responsive ) { + ctx._responsive._classLogic(); + } + } ); +} ); + +Api.register( 'responsive.recalc()', function () { + return this.iterator( 'table', function ( ctx ) { + if ( ctx._responsive ) { + ctx._responsive._resizeAuto(); + ctx._responsive._resize(); + } + } ); +} ); + +Api.register( 'responsive.hasHidden()', function () { + var ctx = this.context[0]; + + return ctx._responsive ? + $.inArray( false, ctx._responsive.s.current ) !== -1 : + false; +} ); + +Api.registerPlural( 'columns().responsiveHidden()', 'column().responsiveHidden()', function () { + return this.iterator( 'column', function ( settings, column ) { + return settings._responsive ? + settings._responsive.s.current[ column ] : + false; + }, 1 ); +} ); + + +/** + * Version information + * + * @name Responsive.version + * @static + */ +Responsive.version = '2.2.1'; + + +$.fn.dataTable.Responsive = Responsive; +$.fn.DataTable.Responsive = Responsive; + +// Attach a listener to the document which listens for DataTables initialisation +// events so we can automatically initialise +$(document).on( 'preInit.dt.dtr', function (e, settings, json) { + if ( e.namespace !== 'dt' ) { + return; + } + + if ( $(settings.nTable).hasClass( 'responsive' ) || + $(settings.nTable).hasClass( 'dt-responsive' ) || + settings.oInit.responsive || + DataTable.defaults.responsive + ) { + var init = settings.oInit.responsive; + + if ( init !== false ) { + new Responsive( settings, $.isPlainObject( init ) ? init : {} ); + } + } +} ); + + +return Responsive; +})); + + diff --git a/assets/js/lib/datatables.min.js b/assets/js/lib/datatables.min.js new file mode 100644 index 0000000..7c97205 --- /dev/null +++ b/assets/js/lib/datatables.min.js @@ -0,0 +1,4843 @@ +/* + * This combined file was created by the DataTables downloader builder: + * https://datatables.net/download + * + * To rebuild or modify this file with the latest versions of the included + * software please visit: + * https://datatables.net/download/#bs-3.3.7/dt-1.10.15/fh-3.1.2/r-2.1.1 + * + * Included libraries: + * Bootstrap 3.3.7, DataTables 1.10.15, FixedHeader 3.1.2, Responsive 2.1.1 + */ + +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ +if ("undefined" == typeof jQuery) throw new Error("Bootstrap's JavaScript requires jQuery"); ++function (a) { + "use strict"; + var b = a.fn.jquery.split(" ")[0].split("."); + if (b[0] < 2 && b[1] < 9 || 1 == b[0] && 9 == b[1] && b[2] < 1 || b[0] > 3) throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4") +}(jQuery), +function (a) { + "use strict"; + + function b() { + var a = document.createElement("bootstrap"), b = { + WebkitTransition: "webkitTransitionEnd", + MozTransition: "transitionend", + OTransition: "oTransitionEnd otransitionend", + transition: "transitionend" + }; + for (var c in b) if (void 0 !== a.style[c]) return {end: b[c]}; + return !1 + } + + a.fn.emulateTransitionEnd = function (b) { + var c = !1, d = this; + a(this).one("bsTransitionEnd", function () { + c = !0 + }); + var e = function () { + c || a(d).trigger(a.support.transition.end) + }; + return setTimeout(e, b), this + }, a(function () { + a.support.transition = b(), a.support.transition && (a.event.special.bsTransitionEnd = { + bindType: a.support.transition.end, + delegateType: a.support.transition.end, + handle: function (b) { + if (a(b.target).is(this)) return b.handleObj.handler.apply(this, arguments) + } + }) + }) +}(jQuery), +function (a) { + "use strict"; + + function b(b) { + return this.each(function () { + var c = a(this), e = c.data("bs.alert"); + e || c.data("bs.alert", e = new d(this)), "string" == typeof b && e[b].call(c) + }) + } + + var c = '[data-dismiss="alert"]', d = function (b) { + a(b).on("click", c, this.close) + }; + d.VERSION = "3.3.7", d.TRANSITION_DURATION = 150, d.prototype.close = function (b) { + function c() { + g.detach().trigger("closed.bs.alert").remove() + } + + var e = a(this), f = e.attr("data-target"); + f || (f = e.attr("href"), f = f && f.replace(/.*(?=#[^\s]*$)/, "")); + var g = a("#" === f ? [] : f); + b && b.preventDefault(), g.length || (g = e.closest(".alert")), g.trigger(b = a.Event("close.bs.alert")), b.isDefaultPrevented() || (g.removeClass("in"), a.support.transition && g.hasClass("fade") ? g.one("bsTransitionEnd", c).emulateTransitionEnd(d.TRANSITION_DURATION) : c()) + }; + var e = a.fn.alert; + a.fn.alert = b, a.fn.alert.Constructor = d, a.fn.alert.noConflict = function () { + return a.fn.alert = e, this + }, a(document).on("click.bs.alert.data-api", c, d.prototype.close) +}(jQuery), +function (a) { + "use strict"; + + function b(b) { + return this.each(function () { + var d = a(this), e = d.data("bs.button"), f = "object" == typeof b && b; + e || d.data("bs.button", e = new c(this, f)), "toggle" == b ? e.toggle() : b && e.setState(b) + }) + } + + var c = function (b, d) { + this.$element = a(b), this.options = a.extend({}, c.DEFAULTS, d), this.isLoading = !1 + }; + c.VERSION = "3.3.7", c.DEFAULTS = {loadingText: "loading..."}, c.prototype.setState = function (b) { + var c = "disabled", d = this.$element, e = d.is("input") ? "val" : "html", f = d.data(); + b += "Text", null == f.resetText && d.data("resetText", d[e]()), setTimeout(a.proxy(function () { + d[e](null == f[b] ? this.options[b] : f[b]), "loadingText" == b ? (this.isLoading = !0, d.addClass(c).attr(c, c).prop(c, !0)) : this.isLoading && (this.isLoading = !1, d.removeClass(c).removeAttr(c).prop(c, !1)) + }, this), 0) + }, c.prototype.toggle = function () { + var a = !0, b = this.$element.closest('[data-toggle="buttons"]'); + if (b.length) { + var c = this.$element.find("input"); + "radio" == c.prop("type") ? (c.prop("checked") && (a = !1), b.find(".active").removeClass("active"), this.$element.addClass("active")) : "checkbox" == c.prop("type") && (c.prop("checked") !== this.$element.hasClass("active") && (a = !1), this.$element.toggleClass("active")), c.prop("checked", this.$element.hasClass("active")), a && c.trigger("change") + } else this.$element.attr("aria-pressed", !this.$element.hasClass("active")), this.$element.toggleClass("active") + }; + var d = a.fn.button; + a.fn.button = b, a.fn.button.Constructor = c, a.fn.button.noConflict = function () { + return a.fn.button = d, this + }, a(document).on("click.bs.button.data-api", '[data-toggle^="button"]', function (c) { + var d = a(c.target).closest(".btn"); + b.call(d, "toggle"), a(c.target).is('input[type="radio"], input[type="checkbox"]') || (c.preventDefault(), d.is("input,button") ? d.trigger("focus") : d.find("input:visible,button:visible").first().trigger("focus")) + }).on("focus.bs.button.data-api blur.bs.button.data-api", '[data-toggle^="button"]', function (b) { + a(b.target).closest(".btn").toggleClass("focus", /^focus(in)?$/.test(b.type)) + }) +}(jQuery), +function (a) { + "use strict"; + + function b(b) { + return this.each(function () { + var d = a(this), e = d.data("bs.carousel"), + f = a.extend({}, c.DEFAULTS, d.data(), "object" == typeof b && b), + g = "string" == typeof b ? b : f.slide; + e || d.data("bs.carousel", e = new c(this, f)), "number" == typeof b ? e.to(b) : g ? e[g]() : f.interval && e.pause().cycle() + }) + } + + var c = function (b, c) { + this.$element = a(b), this.$indicators = this.$element.find(".carousel-indicators"), this.options = c, this.paused = null, this.sliding = null, this.interval = null, this.$active = null, this.$items = null, this.options.keyboard && this.$element.on("keydown.bs.carousel", a.proxy(this.keydown, this)), "hover" == this.options.pause && !("ontouchstart" in document.documentElement) && this.$element.on("mouseenter.bs.carousel", a.proxy(this.pause, this)).on("mouseleave.bs.carousel", a.proxy(this.cycle, this)) + }; + c.VERSION = "3.3.7", c.TRANSITION_DURATION = 600, c.DEFAULTS = { + interval: 5e3, + pause: "hover", + wrap: !0, + keyboard: !0 + }, c.prototype.keydown = function (a) { + if (!/input|textarea/i.test(a.target.tagName)) { + switch (a.which) { + case 37: + this.prev(); + break; + case 39: + this.next(); + break; + default: + return + } + a.preventDefault() + } + }, c.prototype.cycle = function (b) { + return b || (this.paused = !1), this.interval && clearInterval(this.interval), this.options.interval && !this.paused && (this.interval = setInterval(a.proxy(this.next, this), this.options.interval)), this + }, c.prototype.getItemIndex = function (a) { + return this.$items = a.parent().children(".item"), this.$items.index(a || this.$active) + }, c.prototype.getItemForDirection = function (a, b) { + var c = this.getItemIndex(b), d = "prev" == a && 0 === c || "next" == a && c == this.$items.length - 1; + if (d && !this.options.wrap) return b; + var e = "prev" == a ? -1 : 1, f = (c + e) % this.$items.length; + return this.$items.eq(f) + }, c.prototype.to = function (a) { + var b = this, c = this.getItemIndex(this.$active = this.$element.find(".item.active")); + if (!(a > this.$items.length - 1 || a < 0)) return this.sliding ? this.$element.one("slid.bs.carousel", function () { + b.to(a) + }) : c == a ? this.pause().cycle() : this.slide(a > c ? "next" : "prev", this.$items.eq(a)) + }, c.prototype.pause = function (b) { + return b || (this.paused = !0), this.$element.find(".next, .prev").length && a.support.transition && (this.$element.trigger(a.support.transition.end), this.cycle(!0)), this.interval = clearInterval(this.interval), this + }, c.prototype.next = function () { + if (!this.sliding) return this.slide("next") + }, c.prototype.prev = function () { + if (!this.sliding) return this.slide("prev") + }, c.prototype.slide = function (b, d) { + var e = this.$element.find(".item.active"), f = d || this.getItemForDirection(b, e), g = this.interval, + h = "next" == b ? "left" : "right", i = this; + if (f.hasClass("active")) return this.sliding = !1; + var j = f[0], k = a.Event("slide.bs.carousel", {relatedTarget: j, direction: h}); + if (this.$element.trigger(k), !k.isDefaultPrevented()) { + if (this.sliding = !0, g && this.pause(), this.$indicators.length) { + this.$indicators.find(".active").removeClass("active"); + var l = a(this.$indicators.children()[this.getItemIndex(f)]); + l && l.addClass("active") + } + var m = a.Event("slid.bs.carousel", {relatedTarget: j, direction: h}); + return a.support.transition && this.$element.hasClass("slide") ? (f.addClass(b), f[0].offsetWidth, e.addClass(h), f.addClass(h), e.one("bsTransitionEnd", function () { + f.removeClass([b, h].join(" ")).addClass("active"), e.removeClass(["active", h].join(" ")), i.sliding = !1, setTimeout(function () { + i.$element.trigger(m) + }, 0) + }).emulateTransitionEnd(c.TRANSITION_DURATION)) : (e.removeClass("active"), f.addClass("active"), this.sliding = !1, this.$element.trigger(m)), g && this.cycle(), this + } + }; + var d = a.fn.carousel; + a.fn.carousel = b, a.fn.carousel.Constructor = c, a.fn.carousel.noConflict = function () { + return a.fn.carousel = d, this + }; + var e = function (c) { + var d, e = a(this), f = a(e.attr("data-target") || (d = e.attr("href")) && d.replace(/.*(?=#[^\s]+$)/, "")); + if (f.hasClass("carousel")) { + var g = a.extend({}, f.data(), e.data()), h = e.attr("data-slide-to"); + h && (g.interval = !1), b.call(f, g), h && f.data("bs.carousel").to(h), c.preventDefault() + } + }; + a(document).on("click.bs.carousel.data-api", "[data-slide]", e).on("click.bs.carousel.data-api", "[data-slide-to]", e), a(window).on("load", function () { + a('[data-ride="carousel"]').each(function () { + var c = a(this); + b.call(c, c.data()) + }) + }) +}(jQuery), +function (a) { + "use strict"; + + function b(b) { + var c, d = b.attr("data-target") || (c = b.attr("href")) && c.replace(/.*(?=#[^\s]+$)/, ""); + return a(d) + } + + function c(b) { + return this.each(function () { + var c = a(this), e = c.data("bs.collapse"), + f = a.extend({}, d.DEFAULTS, c.data(), "object" == typeof b && b); + !e && f.toggle && /show|hide/.test(b) && (f.toggle = !1), e || c.data("bs.collapse", e = new d(this, f)), "string" == typeof b && e[b]() + }) + } + + var d = function (b, c) { + this.$element = a(b), this.options = a.extend({}, d.DEFAULTS, c), this.$trigger = a('[data-toggle="collapse"][href="#' + b.id + '"],[data-toggle="collapse"][data-target="#' + b.id + '"]'), this.transitioning = null, this.options.parent ? this.$parent = this.getParent() : this.addAriaAndCollapsedClass(this.$element, this.$trigger), this.options.toggle && this.toggle() + }; + d.VERSION = "3.3.7", d.TRANSITION_DURATION = 350, d.DEFAULTS = {toggle: !0}, d.prototype.dimension = function () { + var a = this.$element.hasClass("width"); + return a ? "width" : "height" + }, d.prototype.show = function () { + if (!this.transitioning && !this.$element.hasClass("in")) { + var b, e = this.$parent && this.$parent.children(".panel").children(".in, .collapsing"); + if (!(e && e.length && (b = e.data("bs.collapse"), b && b.transitioning))) { + var f = a.Event("show.bs.collapse"); + if (this.$element.trigger(f), !f.isDefaultPrevented()) { + e && e.length && (c.call(e, "hide"), b || e.data("bs.collapse", null)); + var g = this.dimension(); + this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded", !0), this.$trigger.removeClass("collapsed").attr("aria-expanded", !0), this.transitioning = 1; + var h = function () { + this.$element.removeClass("collapsing").addClass("collapse in")[g](""), this.transitioning = 0, this.$element.trigger("shown.bs.collapse") + }; + if (!a.support.transition) return h.call(this); + var i = a.camelCase(["scroll", g].join("-")); + this.$element.one("bsTransitionEnd", a.proxy(h, this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i]) + } + } + } + }, d.prototype.hide = function () { + if (!this.transitioning && this.$element.hasClass("in")) { + var b = a.Event("hide.bs.collapse"); + if (this.$element.trigger(b), !b.isDefaultPrevented()) { + var c = this.dimension(); + this.$element[c](this.$element[c]())[0].offsetHeight, this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded", !1), this.$trigger.addClass("collapsed").attr("aria-expanded", !1), this.transitioning = 1; + var e = function () { + this.transitioning = 0, this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse") + }; + return a.support.transition ? void this.$element[c](0).one("bsTransitionEnd", a.proxy(e, this)).emulateTransitionEnd(d.TRANSITION_DURATION) : e.call(this) + } + } + }, d.prototype.toggle = function () { + this[this.$element.hasClass("in") ? "hide" : "show"]() + }, d.prototype.getParent = function () { + return a(this.options.parent).find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]').each(a.proxy(function (c, d) { + var e = a(d); + this.addAriaAndCollapsedClass(b(e), e) + }, this)).end() + }, d.prototype.addAriaAndCollapsedClass = function (a, b) { + var c = a.hasClass("in"); + a.attr("aria-expanded", c), b.toggleClass("collapsed", !c).attr("aria-expanded", c) + }; + var e = a.fn.collapse; + a.fn.collapse = c, a.fn.collapse.Constructor = d, a.fn.collapse.noConflict = function () { + return a.fn.collapse = e, this + }, a(document).on("click.bs.collapse.data-api", '[data-toggle="collapse"]', function (d) { + var e = a(this); + e.attr("data-target") || d.preventDefault(); + var f = b(e), g = f.data("bs.collapse"), h = g ? "toggle" : e.data(); + c.call(f, h) + }) +}(jQuery), +function (a) { + "use strict"; + + function b(b) { + var c = b.attr("data-target"); + c || (c = b.attr("href"), c = c && /#[A-Za-z]/.test(c) && c.replace(/.*(?=#[^\s]*$)/, "")); + var d = c && a(c); + return d && d.length ? d : b.parent() + } + + function c(c) { + c && 3 === c.which || (a(e).remove(), a(f).each(function () { + var d = a(this), e = b(d), f = {relatedTarget: this}; + e.hasClass("open") && (c && "click" == c.type && /input|textarea/i.test(c.target.tagName) && a.contains(e[0], c.target) || (e.trigger(c = a.Event("hide.bs.dropdown", f)), c.isDefaultPrevented() || (d.attr("aria-expanded", "false"), e.removeClass("open").trigger(a.Event("hidden.bs.dropdown", f))))) + })) + } + + function d(b) { + return this.each(function () { + var c = a(this), d = c.data("bs.dropdown"); + d || c.data("bs.dropdown", d = new g(this)), "string" == typeof b && d[b].call(c) + }) + } + + var e = ".dropdown-backdrop", f = '[data-toggle="dropdown"]', g = function (b) { + a(b).on("click.bs.dropdown", this.toggle) + }; + g.VERSION = "3.3.7", g.prototype.toggle = function (d) { + var e = a(this); + if (!e.is(".disabled, :disabled")) { + var f = b(e), g = f.hasClass("open"); + if (c(), !g) { + "ontouchstart" in document.documentElement && !f.closest(".navbar-nav").length && a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click", c); + var h = {relatedTarget: this}; + if (f.trigger(d = a.Event("show.bs.dropdown", h)), d.isDefaultPrevented()) return; + e.trigger("focus").attr("aria-expanded", "true"), f.toggleClass("open").trigger(a.Event("shown.bs.dropdown", h)) + } + return !1 + } + }, g.prototype.keydown = function (c) { + if (/(38|40|27|32)/.test(c.which) && !/input|textarea/i.test(c.target.tagName)) { + var d = a(this); + if (c.preventDefault(), c.stopPropagation(), !d.is(".disabled, :disabled")) { + var e = b(d), g = e.hasClass("open"); + if (!g && 27 != c.which || g && 27 == c.which) return 27 == c.which && e.find(f).trigger("focus"), d.trigger("click"); + var h = " li:not(.disabled):visible a", i = e.find(".dropdown-menu" + h); + if (i.length) { + var j = i.index(c.target); + 38 == c.which && j > 0 && j--, 40 == c.which && j < i.length - 1 && j++, ~j || (j = 0), i.eq(j).trigger("focus") + } + } + } + }; + var h = a.fn.dropdown; + a.fn.dropdown = d, a.fn.dropdown.Constructor = g, a.fn.dropdown.noConflict = function () { + return a.fn.dropdown = h, this + }, a(document).on("click.bs.dropdown.data-api", c).on("click.bs.dropdown.data-api", ".dropdown form", function (a) { + a.stopPropagation() + }).on("click.bs.dropdown.data-api", f, g.prototype.toggle).on("keydown.bs.dropdown.data-api", f, g.prototype.keydown).on("keydown.bs.dropdown.data-api", ".dropdown-menu", g.prototype.keydown) +}(jQuery), +function (a) { + "use strict"; + + function b(b, d) { + return this.each(function () { + var e = a(this), f = e.data("bs.modal"), g = a.extend({}, c.DEFAULTS, e.data(), "object" == typeof b && b); + f || e.data("bs.modal", f = new c(this, g)), "string" == typeof b ? f[b](d) : g.show && f.show(d) + }) + } + + var c = function (b, c) { + this.options = c, this.$body = a(document.body), this.$element = a(b), this.$dialog = this.$element.find(".modal-dialog"), this.$backdrop = null, this.isShown = null, this.originalBodyPad = null, this.scrollbarWidth = 0, this.ignoreBackdropClick = !1, this.options.remote && this.$element.find(".modal-content").load(this.options.remote, a.proxy(function () { + this.$element.trigger("loaded.bs.modal") + }, this)) + }; + c.VERSION = "3.3.7", c.TRANSITION_DURATION = 300, c.BACKDROP_TRANSITION_DURATION = 150, c.DEFAULTS = { + backdrop: !0, + keyboard: !0, + show: !0 + }, c.prototype.toggle = function (a) { + return this.isShown ? this.hide() : this.show(a) + }, c.prototype.show = function (b) { + // var d = this, e = a.Event("show.bs.modal", {relatedTarget: b}); + // this.$element.trigger(e), this.isShown || e.isDefaultPrevented() || (this.isShown = !0, this.checkScrollbar(), this.setScrollbar(), this.$body.addClass("modal-open"), this.escape(), this.resize(), this.$element.on("click.dismiss.bs.modal", '[data-dismiss="modal"]', a.proxy(this.hide, this)), this.$dialog.on("mousedown.dismiss.bs.modal", function () { + // d.$element.one("mouseup.dismiss.bs.modal", function (b) { + // a(b.target).is(d.$element) && (d.ignoreBackdropClick = !0) + // }) + // }), this.backdrop(function () { + // var e = a.support.transition && d.$element.hasClass("fade"); + // d.$element.parent().length || d.$element.appendTo(d.$body), d.$element.show().scrollTop(0), d.adjustDialog(), e && d.$element[0].offsetWidth, d.$element.addClass("in"), d.enforceFocus(); + // var f = a.Event("shown.bs.modal", {relatedTarget: b}); + // e ? d.$dialog.one("bsTransitionEnd", function () { + // d.$element.trigger("focus").trigger(f) + // }).emulateTransitionEnd(c.TRANSITION_DURATION) : d.$element.trigger("focus").trigger(f) + // })) + }, c.prototype.hide = function (b) { + // b && b.preventDefault(), b = a.Event("hide.bs.modal"), this.$element.trigger(b), this.isShown && !b.isDefaultPrevented() && (this.isShown = !1, this.escape(), this.resize(), a(document).off("focusin.bs.modal"), this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"), this.$dialog.off("mousedown.dismiss.bs.modal"), a.support.transition && this.$element.hasClass("fade") ? this.$element.one("bsTransitionEnd", a.proxy(this.hideModal, this)).emulateTransitionEnd(c.TRANSITION_DURATION) : this.hideModal()) + }, c.prototype.enforceFocus = function () { + a(document).off("focusin.bs.modal").on("focusin.bs.modal", a.proxy(function (a) { + document === a.target || this.$element[0] === a.target || this.$element.has(a.target).length || this.$element.trigger("focus") + }, this)) + }, c.prototype.escape = function () { + this.isShown && this.options.keyboard ? this.$element.on("keydown.dismiss.bs.modal", a.proxy(function (a) { + 27 == a.which && this.hide() + }, this)) : this.isShown || this.$element.off("keydown.dismiss.bs.modal") + }, c.prototype.resize = function () { + this.isShown ? a(window).on("resize.bs.modal", a.proxy(this.handleUpdate, this)) : a(window).off("resize.bs.modal") + }, c.prototype.hideModal = function () { + // var a = this; + // this.$element.hide(), this.backdrop(function () { + // a.$body.removeClass("modal-open"), a.resetAdjustments(), a.resetScrollbar(), a.$element.trigger("hidden.bs.modal") + // }) + }, c.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove(), this.$backdrop = null + }, c.prototype.backdrop = function (b) { + var d = this, e = this.$element.hasClass("fade") ? "fade" : ""; + if (this.isShown && this.options.backdrop) { + var f = a.support.transition && e; + if (this.$backdrop = a(document.createElement("div")).addClass("modal-backdrop " + e).appendTo(this.$body), this.$element.on("click.dismiss.bs.modal", a.proxy(function (a) { + return this.ignoreBackdropClick ? void(this.ignoreBackdropClick = !1) : void(a.target === a.currentTarget && ("static" == this.options.backdrop ? this.$element[0].focus() : this.hide())) + }, this)), f && this.$backdrop[0].offsetWidth, this.$backdrop.addClass("in"), !b) return; + f ? this.$backdrop.one("bsTransitionEnd", b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION) : b() + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass("in"); + var g = function () { + d.removeBackdrop(), b && b() + }; + a.support.transition && this.$element.hasClass("fade") ? this.$backdrop.one("bsTransitionEnd", g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION) : g() + } else b && b() + }, c.prototype.handleUpdate = function () { + this.adjustDialog() + }, c.prototype.adjustDialog = function () { + var a = this.$element[0].scrollHeight > document.documentElement.clientHeight; + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && a ? this.scrollbarWidth : "", + paddingRight: this.bodyIsOverflowing && !a ? this.scrollbarWidth : "" + }) + }, c.prototype.resetAdjustments = function () { + this.$element.css({paddingLeft: "", paddingRight: ""}) + }, c.prototype.checkScrollbar = function () { + var a = window.innerWidth; + if (!a) { + var b = document.documentElement.getBoundingClientRect(); + a = b.right - Math.abs(b.left) + } + this.bodyIsOverflowing = document.body.clientWidth < a, this.scrollbarWidth = this.measureScrollbar() + }, c.prototype.setScrollbar = function () { + var a = parseInt(this.$body.css("padding-right") || 0, 10); + this.originalBodyPad = document.body.style.paddingRight || "", this.bodyIsOverflowing && this.$body.css("padding-right", a + this.scrollbarWidth) + }, c.prototype.resetScrollbar = function () { + this.$body.css("padding-right", this.originalBodyPad) + }, c.prototype.measureScrollbar = function () { + var a = document.createElement("div"); + a.className = "modal-scrollbar-measure", this.$body.append(a); + var b = a.offsetWidth - a.clientWidth; + return this.$body[0].removeChild(a), b + }; + var d = a.fn.modal; + a.fn.modal = b, a.fn.modal.Constructor = c, a.fn.modal.noConflict = function () { + return a.fn.modal = d, this + }, a(document).on("click.bs.modal.data-api", '[data-toggle="modal"]', function (c) { + var d = a(this), e = d.attr("href"), f = a(d.attr("data-target") || e && e.replace(/.*(?=#[^\s]+$)/, "")), + g = f.data("bs.modal") ? "toggle" : a.extend({remote: !/#/.test(e) && e}, f.data(), d.data()); + d.is("a") && c.preventDefault(), f.one("show.bs.modal", function (a) { + a.isDefaultPrevented() || f.one("hidden.bs.modal", function () { + d.is(":visible") && d.trigger("focus") + }) + }), b.call(f, g, this) + }) +}(jQuery), +function (a) { + "use strict"; + + function b(b) { + return this.each(function () { + var d = a(this), e = d.data("bs.tooltip"), f = "object" == typeof b && b; + !e && /destroy|hide/.test(b) || (e || d.data("bs.tooltip", e = new c(this, f)), "string" == typeof b && e[b]()) + }) + } + + var c = function (a, b) { + this.type = null, this.options = null, this.enabled = null, this.timeout = null, this.hoverState = null, this.$element = null, this.inState = null, this.init("tooltip", a, b) + }; + c.VERSION = "3.3.7", c.TRANSITION_DURATION = 150, c.DEFAULTS = { + animation: !0, + placement: "top", + selector: !1, + template: '', + trigger: "hover focus", + title: "", + delay: 0, + html: !1, + container: !1, + viewport: {selector: "body", padding: 0} + }, c.prototype.init = function (b, c, d) { + if (this.enabled = !0, this.type = b, this.$element = a(c), this.options = this.getOptions(d), this.$viewport = this.options.viewport && a(a.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : this.options.viewport.selector || this.options.viewport), this.inState = { + click: !1, + hover: !1, + focus: !1 + }, this.$element[0] instanceof document.constructor && !this.options.selector) throw new Error("`selector` option must be specified when initializing " + this.type + " on the window.document object!"); + for (var e = this.options.trigger.split(" "), f = e.length; f--;) { + var g = e[f]; + if ("click" == g) this.$element.on("click." + this.type, this.options.selector, a.proxy(this.toggle, this)); else if ("manual" != g) { + var h = "hover" == g ? "mouseenter" : "focusin", i = "hover" == g ? "mouseleave" : "focusout"; + this.$element.on(h + "." + this.type, this.options.selector, a.proxy(this.enter, this)), this.$element.on(i + "." + this.type, this.options.selector, a.proxy(this.leave, this)) + } + } + this.options.selector ? this._options = a.extend({}, this.options, { + trigger: "manual", + selector: "" + }) : this.fixTitle() + }, c.prototype.getDefaults = function () { + return c.DEFAULTS + }, c.prototype.getOptions = function (b) { + return b = a.extend({}, this.getDefaults(), this.$element.data(), b), b.delay && "number" == typeof b.delay && (b.delay = { + show: b.delay, + hide: b.delay + }), b + }, c.prototype.getDelegateOptions = function () { + var b = {}, c = this.getDefaults(); + return this._options && a.each(this._options, function (a, d) { + c[a] != d && (b[a] = d) + }), b + }, c.prototype.enter = function (b) { + var c = b instanceof this.constructor ? b : a(b.currentTarget).data("bs." + this.type); + return c || (c = new this.constructor(b.currentTarget, this.getDelegateOptions()), a(b.currentTarget).data("bs." + this.type, c)), b instanceof a.Event && (c.inState["focusin" == b.type ? "focus" : "hover"] = !0), c.tip().hasClass("in") || "in" == c.hoverState ? void(c.hoverState = "in") : (clearTimeout(c.timeout), c.hoverState = "in", c.options.delay && c.options.delay.show ? void(c.timeout = setTimeout(function () { + "in" == c.hoverState && c.show() + }, c.options.delay.show)) : c.show()) + }, c.prototype.isInStateTrue = function () { + for (var a in this.inState) if (this.inState[a]) return !0; + return !1 + }, c.prototype.leave = function (b) { + var c = b instanceof this.constructor ? b : a(b.currentTarget).data("bs." + this.type); + if (c || (c = new this.constructor(b.currentTarget, this.getDelegateOptions()), a(b.currentTarget).data("bs." + this.type, c)), b instanceof a.Event && (c.inState["focusout" == b.type ? "focus" : "hover"] = !1), !c.isInStateTrue()) return clearTimeout(c.timeout), c.hoverState = "out", c.options.delay && c.options.delay.hide ? void(c.timeout = setTimeout(function () { + "out" == c.hoverState && c.hide() + }, c.options.delay.hide)) : c.hide() + }, c.prototype.show = function () { + var b = a.Event("show.bs." + this.type); + if (this.hasContent() && this.enabled) { + this.$element.trigger(b); + var d = a.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]); + if (b.isDefaultPrevented() || !d) return; + var e = this, f = this.tip(), g = this.getUID(this.type); + this.setContent(), f.attr("id", g), this.$element.attr("aria-describedby", g), this.options.animation && f.addClass("fade"); + var h = "function" == typeof this.options.placement ? this.options.placement.call(this, f[0], this.$element[0]) : this.options.placement, + i = /\s?auto?\s?/i, j = i.test(h); + j && (h = h.replace(i, "") || "top"), f.detach().css({ + top: 0, + left: 0, + display: "block" + }).addClass(h).data("bs." + this.type, this), this.options.container ? f.appendTo(this.options.container) : f.insertAfter(this.$element), this.$element.trigger("inserted.bs." + this.type); + var k = this.getPosition(), l = f[0].offsetWidth, m = f[0].offsetHeight; + if (j) { + var n = h, o = this.getPosition(this.$viewport); + h = "bottom" == h && k.bottom + m > o.bottom ? "top" : "top" == h && k.top - m < o.top ? "bottom" : "right" == h && k.right + l > o.width ? "left" : "left" == h && k.left - l < o.left ? "right" : h, f.removeClass(n).addClass(h) + } + var p = this.getCalculatedOffset(h, k, l, m); + this.applyPlacement(p, h); + var q = function () { + var a = e.hoverState; + e.$element.trigger("shown.bs." + e.type), e.hoverState = null, "out" == a && e.leave(e) + }; + a.support.transition && this.$tip.hasClass("fade") ? f.one("bsTransitionEnd", q).emulateTransitionEnd(c.TRANSITION_DURATION) : q() + } + }, c.prototype.applyPlacement = function (b, c) { + var d = this.tip(), e = d[0].offsetWidth, f = d[0].offsetHeight, g = parseInt(d.css("margin-top"), 10), + h = parseInt(d.css("margin-left"), 10); + isNaN(g) && (g = 0), isNaN(h) && (h = 0), b.top += g, b.left += h, a.offset.setOffset(d[0], a.extend({ + using: function (a) { + d.css({top: Math.round(a.top), left: Math.round(a.left)}) + } + }, b), 0), d.addClass("in"); + var i = d[0].offsetWidth, j = d[0].offsetHeight; + "top" == c && j != f && (b.top = b.top + f - j); + var k = this.getViewportAdjustedDelta(c, b, i, j); + k.left ? b.left += k.left : b.top += k.top; + var l = /top|bottom/.test(c), m = l ? 2 * k.left - e + i : 2 * k.top - f + j, + n = l ? "offsetWidth" : "offsetHeight"; + d.offset(b), this.replaceArrow(m, d[0][n], l) + }, c.prototype.replaceArrow = function (a, b, c) { + this.arrow().css(c ? "left" : "top", 50 * (1 - a / b) + "%").css(c ? "top" : "left", "") + }, c.prototype.setContent = function () { + var a = this.tip(), b = this.getTitle(); + a.find(".tooltip-inner")[this.options.html ? "html" : "text"](b), a.removeClass("fade in top bottom left right") + }, c.prototype.hide = function (b) { + function d() { + "in" != e.hoverState && f.detach(), e.$element && e.$element.removeAttr("aria-describedby").trigger("hidden.bs." + e.type), b && b() + } + + var e = this, f = a(this.$tip), g = a.Event("hide.bs." + this.type); + if (this.$element.trigger(g), !g.isDefaultPrevented()) return f.removeClass("in"), a.support.transition && f.hasClass("fade") ? f.one("bsTransitionEnd", d).emulateTransitionEnd(c.TRANSITION_DURATION) : d(), this.hoverState = null, this + }, c.prototype.fixTitle = function () { + var a = this.$element; + (a.attr("title") || "string" != typeof a.attr("data-original-title")) && a.attr("data-original-title", a.attr("title") || "").attr("title", "") + }, c.prototype.hasContent = function () { + return this.getTitle() + }, c.prototype.getPosition = function (b) { + b = b || this.$element; + var c = b[0], d = "BODY" == c.tagName, e = c.getBoundingClientRect(); + null == e.width && (e = a.extend({}, e, {width: e.right - e.left, height: e.bottom - e.top})); + var f = window.SVGElement && c instanceof window.SVGElement, g = d ? {top: 0, left: 0} : f ? null : b.offset(), + h = {scroll: d ? document.documentElement.scrollTop || document.body.scrollTop : b.scrollTop()}, + i = d ? {width: a(window).width(), height: a(window).height()} : null; + return a.extend({}, e, h, i, g) + }, c.prototype.getCalculatedOffset = function (a, b, c, d) { + return "bottom" == a ? { + top: b.top + b.height, + left: b.left + b.width / 2 - c / 2 + } : "top" == a ? { + top: b.top - d, + left: b.left + b.width / 2 - c / 2 + } : "left" == a ? {top: b.top + b.height / 2 - d / 2, left: b.left - c} : { + top: b.top + b.height / 2 - d / 2, + left: b.left + b.width + } + }, c.prototype.getViewportAdjustedDelta = function (a, b, c, d) { + var e = {top: 0, left: 0}; + if (!this.$viewport) return e; + var f = this.options.viewport && this.options.viewport.padding || 0, g = this.getPosition(this.$viewport); + if (/right|left/.test(a)) { + var h = b.top - f - g.scroll, i = b.top + f - g.scroll + d; + h < g.top ? e.top = g.top - h : i > g.top + g.height && (e.top = g.top + g.height - i) + } else { + var j = b.left - f, k = b.left + f + c; + j < g.left ? e.left = g.left - j : k > g.right && (e.left = g.left + g.width - k) + } + return e + }, c.prototype.getTitle = function () { + var a, b = this.$element, c = this.options; + return a = b.attr("data-original-title") || ("function" == typeof c.title ? c.title.call(b[0]) : c.title) + }, c.prototype.getUID = function (a) { + do a += ~~(1e6 * Math.random()); while (document.getElementById(a)); + return a + }, c.prototype.tip = function () { + if (!this.$tip && (this.$tip = a(this.options.template), 1 != this.$tip.length)) throw new Error(this.type + " `template` option must consist of exactly 1 top-level element!"); + return this.$tip + }, c.prototype.arrow = function () { + return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow") + }, c.prototype.enable = function () { + this.enabled = !0 + }, c.prototype.disable = function () { + this.enabled = !1 + }, c.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + }, c.prototype.toggle = function (b) { + var c = this; + b && (c = a(b.currentTarget).data("bs." + this.type), c || (c = new this.constructor(b.currentTarget, this.getDelegateOptions()), a(b.currentTarget).data("bs." + this.type, c))), b ? (c.inState.click = !c.inState.click, c.isInStateTrue() ? c.enter(c) : c.leave(c)) : c.tip().hasClass("in") ? c.leave(c) : c.enter(c) + }, c.prototype.destroy = function () { + var a = this; + clearTimeout(this.timeout), this.hide(function () { + a.$element.off("." + a.type).removeData("bs." + a.type), a.$tip && a.$tip.detach(), a.$tip = null, a.$arrow = null, a.$viewport = null, a.$element = null + }) + }; + var d = a.fn.tooltip; + a.fn.tooltip = b, a.fn.tooltip.Constructor = c, a.fn.tooltip.noConflict = function () { + return a.fn.tooltip = d, this + } +}(jQuery), +function (a) { + "use strict"; + + function b(b) { + return this.each(function () { + var d = a(this), e = d.data("bs.popover"), f = "object" == typeof b && b; + !e && /destroy|hide/.test(b) || (e || d.data("bs.popover", e = new c(this, f)), "string" == typeof b && e[b]()) + }) + } + + var c = function (a, b) { + this.init("popover", a, b) + }; + if (!a.fn.tooltip) throw new Error("Popover requires tooltip.js"); + c.VERSION = "3.3.7", c.DEFAULTS = a.extend({}, a.fn.tooltip.Constructor.DEFAULTS, { + placement: "right", + trigger: "click", + content: "", + template: '' + }), c.prototype = a.extend({}, a.fn.tooltip.Constructor.prototype), c.prototype.constructor = c, c.prototype.getDefaults = function () { + return c.DEFAULTS + }, c.prototype.setContent = function () { + var a = this.tip(), b = this.getTitle(), c = this.getContent(); + a.find(".popover-title")[this.options.html ? "html" : "text"](b), a.find(".popover-content").children().detach().end()[this.options.html ? "string" == typeof c ? "html" : "append" : "text"](c), a.removeClass("fade top bottom left right in"), a.find(".popover-title").html() || a.find(".popover-title").hide() + }, c.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + }, c.prototype.getContent = function () { + var a = this.$element, b = this.options; + return a.attr("data-content") || ("function" == typeof b.content ? b.content.call(a[0]) : b.content) + }, c.prototype.arrow = function () { + return this.$arrow = this.$arrow || this.tip().find(".arrow") + }; + var d = a.fn.popover; + a.fn.popover = b, a.fn.popover.Constructor = c, a.fn.popover.noConflict = function () { + return a.fn.popover = d, this + } +}(jQuery), +function (a) { + "use strict"; + + function b(c, d) { + this.$body = a(document.body), this.$scrollElement = a(a(c).is(document.body) ? window : c), this.options = a.extend({}, b.DEFAULTS, d), this.selector = (this.options.target || "") + " .nav li > a", this.offsets = [], this.targets = [], this.activeTarget = null, this.scrollHeight = 0, this.$scrollElement.on("scroll.bs.scrollspy", a.proxy(this.process, this)), this.refresh(), this.process() + } + + function c(c) { + return this.each(function () { + var d = a(this), e = d.data("bs.scrollspy"), f = "object" == typeof c && c; + e || d.data("bs.scrollspy", e = new b(this, f)), "string" == typeof c && e[c]() + }) + } + + b.VERSION = "3.3.7", b.DEFAULTS = {offset: 10}, b.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + }, b.prototype.refresh = function () { + var b = this, c = "offset", d = 0; + this.offsets = [], this.targets = [], this.scrollHeight = this.getScrollHeight(), a.isWindow(this.$scrollElement[0]) || (c = "position", d = this.$scrollElement.scrollTop()), this.$body.find(this.selector).map(function () { + var b = a(this), e = b.data("target") || b.attr("href"), f = /^#./.test(e) && a(e); + return f && f.length && f.is(":visible") && [[f[c]().top + d, e]] || null + }).sort(function (a, b) { + return a[0] - b[0] + }).each(function () { + b.offsets.push(this[0]), b.targets.push(this[1]) + }) + }, b.prototype.process = function () { + var a, b = this.$scrollElement.scrollTop() + this.options.offset, c = this.getScrollHeight(), + d = this.options.offset + c - this.$scrollElement.height(), e = this.offsets, f = this.targets, + g = this.activeTarget; + if (this.scrollHeight != c && this.refresh(), b >= d) return g != (a = f[f.length - 1]) && this.activate(a); + if (g && b < e[0]) return this.activeTarget = null, this.clear(); + for (a = e.length; a--;) g != f[a] && b >= e[a] && (void 0 === e[a + 1] || b < e[a + 1]) && this.activate(f[a]) + }, b.prototype.activate = function (b) { + this.activeTarget = b, this.clear(); + var c = this.selector + '[data-target="' + b + '"],' + this.selector + '[href="' + b + '"]', + d = a(c).parents("li").addClass("active"); + d.parent(".dropdown-menu").length && (d = d.closest("li.dropdown").addClass("active")), d.trigger("activate.bs.scrollspy") + }, b.prototype.clear = function () { + a(this.selector).parentsUntil(this.options.target, ".active").removeClass("active") + }; + var d = a.fn.scrollspy; + a.fn.scrollspy = c, a.fn.scrollspy.Constructor = b, a.fn.scrollspy.noConflict = function () { + return a.fn.scrollspy = d, this + }, a(window).on("load.bs.scrollspy.data-api", function () { + a('[data-spy="scroll"]').each(function () { + var b = a(this); + c.call(b, b.data()) + }) + }) +}(jQuery), +function (a) { + "use strict"; + + function b(b) { + return this.each(function () { + var d = a(this), e = d.data("bs.tab"); + e || d.data("bs.tab", e = new c(this)), "string" == typeof b && e[b]() + }) + } + + var c = function (b) { + this.element = a(b) + }; + c.VERSION = "3.3.7", c.TRANSITION_DURATION = 150, c.prototype.show = function () { + var b = this.element, c = b.closest("ul:not(.dropdown-menu)"), d = b.data("target"); + if (d || (d = b.attr("href"), d = d && d.replace(/.*(?=#[^\s]*$)/, "")), !b.parent("li").hasClass("active")) { + var e = c.find(".active:last a"), f = a.Event("hide.bs.tab", {relatedTarget: b[0]}), + g = a.Event("show.bs.tab", {relatedTarget: e[0]}); + if (e.trigger(f), b.trigger(g), !g.isDefaultPrevented() && !f.isDefaultPrevented()) { + var h = a(d); + this.activate(b.closest("li"), c), this.activate(h, h.parent(), function () { + e.trigger({type: "hidden.bs.tab", relatedTarget: b[0]}), b.trigger({ + type: "shown.bs.tab", + relatedTarget: e[0] + }) + }) + } + } + }, c.prototype.activate = function (b, d, e) { + function f() { + g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded", !1), b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded", !0), h ? (b[0].offsetWidth, b.addClass("in")) : b.removeClass("fade"), b.parent(".dropdown-menu").length && b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded", !0), e && e() + } + + var g = d.find("> .active"), + h = e && a.support.transition && (g.length && g.hasClass("fade") || !!d.find("> .fade").length); + g.length && h ? g.one("bsTransitionEnd", f).emulateTransitionEnd(c.TRANSITION_DURATION) : f(), g.removeClass("in") + }; + var d = a.fn.tab; + a.fn.tab = b, a.fn.tab.Constructor = c, a.fn.tab.noConflict = function () { + return a.fn.tab = d, this + }; + var e = function (c) { + c.preventDefault(), b.call(a(this), "show") + }; + a(document).on("click.bs.tab.data-api", '[data-toggle="tab"]', e).on("click.bs.tab.data-api", '[data-toggle="pill"]', e) +}(jQuery), +function (a) { + "use strict"; + + function b(b) { + return this.each(function () { + var d = a(this), e = d.data("bs.affix"), f = "object" == typeof b && b; + e || d.data("bs.affix", e = new c(this, f)), "string" == typeof b && e[b]() + }) + } + + var c = function (b, d) { + this.options = a.extend({}, c.DEFAULTS, d), this.$target = a(this.options.target).on("scroll.bs.affix.data-api", a.proxy(this.checkPosition, this)).on("click.bs.affix.data-api", a.proxy(this.checkPositionWithEventLoop, this)), this.$element = a(b), this.affixed = null, this.unpin = null, this.pinnedOffset = null, this.checkPosition() + }; + c.VERSION = "3.3.7", c.RESET = "affix affix-top affix-bottom", c.DEFAULTS = { + offset: 0, + target: window + }, c.prototype.getState = function (a, b, c, d) { + var e = this.$target.scrollTop(), f = this.$element.offset(), g = this.$target.height(); + if (null != c && "top" == this.affixed) return e < c && "top"; + if ("bottom" == this.affixed) return null != c ? !(e + this.unpin <= f.top) && "bottom" : !(e + g <= a - d) && "bottom"; + var h = null == this.affixed, i = h ? e : f.top, j = h ? g : b; + return null != c && e <= c ? "top" : null != d && i + j >= a - d && "bottom" + }, c.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset; + this.$element.removeClass(c.RESET).addClass("affix"); + var a = this.$target.scrollTop(), b = this.$element.offset(); + return this.pinnedOffset = b.top - a + }, c.prototype.checkPositionWithEventLoop = function () { + setTimeout(a.proxy(this.checkPosition, this), 1) + }, c.prototype.checkPosition = function () { + if (this.$element.is(":visible")) { + var b = this.$element.height(), d = this.options.offset, e = d.top, f = d.bottom, + g = Math.max(a(document).height(), a(document.body).height()); + "object" != typeof d && (f = e = d), "function" == typeof e && (e = d.top(this.$element)), "function" == typeof f && (f = d.bottom(this.$element)); + var h = this.getState(g, b, e, f); + if (this.affixed != h) { + null != this.unpin && this.$element.css("top", ""); + var i = "affix" + (h ? "-" + h : ""), j = a.Event(i + ".bs.affix"); + if (this.$element.trigger(j), j.isDefaultPrevented()) return; + this.affixed = h, this.unpin = "bottom" == h ? this.getPinnedOffset() : null, this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix", "affixed") + ".bs.affix") + } + "bottom" == h && this.$element.offset({top: g - b - f}) + } + }; + var d = a.fn.affix; + a.fn.affix = b, a.fn.affix.Constructor = c, a.fn.affix.noConflict = function () { + return a.fn.affix = d, this + }, a(window).on("load", function () { + a('[data-spy="affix"]').each(function () { + var c = a(this), d = c.data(); + d.offset = d.offset || {}, null != d.offsetBottom && (d.offset.bottom = d.offsetBottom), null != d.offsetTop && (d.offset.top = d.offsetTop), b.call(c, d) + }) + }) +}(jQuery); + +/*! + DataTables 1.10.15 + ©2008-2017 SpryMedia Ltd - datatables.net/license +*/ +(function (h) { + "function" === typeof define && define.amd ? define(["jquery"], function (E) { + return h(E, window, document) + }) : "object" === typeof exports ? module.exports = function (E, H) { + E || (E = window); + H || (H = "undefined" !== typeof window ? require("jquery") : require("jquery")(E)); + return h(H, E, E.document) + } : h(jQuery, window, document) +})(function (h, E, H, k) { + function Y(a) { + var b, c, d = {}; + h.each(a, function (e) { + if ((b = e.match(/^([^A-Z]+?)([A-Z])/)) && -1 !== "a aa ai ao as b fn i m o s ".indexOf(b[1] + " ")) c = e.replace(b[0], b[2].toLowerCase()), + d[c] = e, "o" === b[1] && Y(a[e]) + }); + a._hungarianMap = d + } + + function J(a, b, c) { + a._hungarianMap || Y(a); + var d; + h.each(b, function (e) { + d = a._hungarianMap[e]; + if (d !== k && (c || b[d] === k)) "o" === d.charAt(0) ? (b[d] || (b[d] = {}), h.extend(!0, b[d], b[e]), J(a[d], b[d], c)) : b[d] = b[e] + }) + } + + function Fa(a) { + var b = m.defaults.oLanguage, c = a.sZeroRecords; + !a.sEmptyTable && (c && "No data available in table" === b.sEmptyTable) && F(a, a, "sZeroRecords", "sEmptyTable"); + !a.sLoadingRecords && (c && "Loading..." === b.sLoadingRecords) && F(a, a, "sZeroRecords", "sLoadingRecords"); + a.sInfoThousands && (a.sThousands = a.sInfoThousands); + (a = a.sDecimal) && fb(a) + } + + function gb(a) { + A(a, "ordering", "bSort"); + A(a, "orderMulti", "bSortMulti"); + A(a, "orderClasses", "bSortClasses"); + A(a, "orderCellsTop", "bSortCellsTop"); + A(a, "order", "aaSorting"); + A(a, "orderFixed", "aaSortingFixed"); + A(a, "paging", "bPaginate"); + A(a, "pagingType", "sPaginationType"); + A(a, "pageLength", "iDisplayLength"); + A(a, "searching", "bFilter"); + "boolean" === typeof a.sScrollX && (a.sScrollX = a.sScrollX ? "100%" : ""); + "boolean" === typeof a.scrollX && (a.scrollX = + a.scrollX ? "100%" : ""); + if (a = a.aoSearchCols) for (var b = 0, c = a.length; b < c; b++) a[b] && J(m.models.oSearch, a[b]) + } + + function hb(a) { + A(a, "orderable", "bSortable"); + A(a, "orderData", "aDataSort"); + A(a, "orderSequence", "asSorting"); + A(a, "orderDataType", "sortDataType"); + var b = a.aDataSort; + "number" === typeof b && !h.isArray(b) && (a.aDataSort = [b]) + } + + function ib(a) { + if (!m.__browser) { + var b = {}; + m.__browser = b; + var c = h("
                ").css({ + position: "fixed", + top: 0, + left: -1 * h(E).scrollLeft(), + height: 1, + width: 1, + overflow: "hidden" + }).append(h("
                ").css({ + position: "absolute", + top: 1, left: 1, width: 100, overflow: "scroll" + }).append(h("
                ").css({width: "100%", height: 10}))).appendTo("body"), d = c.children(), + e = d.children(); + b.barWidth = d[0].offsetWidth - d[0].clientWidth; + b.bScrollOversize = 100 === e[0].offsetWidth && 100 !== d[0].clientWidth; + b.bScrollbarLeft = 1 !== Math.round(e.offset().left); + b.bBounding = c[0].getBoundingClientRect().width ? !0 : !1; + c.remove() + } + h.extend(a.oBrowser, m.__browser); + a.oScroll.iBarWidth = m.__browser.barWidth + } + + function jb(a, b, c, d, e, f) { + var g, j = !1; + c !== k && (g = c, j = !0); + for (; d !== + e;) a.hasOwnProperty(d) && (g = j ? b(g, a[d], d, a) : a[d], j = !0, d += f); + return g + } + + function Ga(a, b) { + var c = m.defaults.column, d = a.aoColumns.length, c = h.extend({}, m.models.oColumn, c, { + nTh: b ? b : H.createElement("th"), + sTitle: c.sTitle ? c.sTitle : b ? b.innerHTML : "", + aDataSort: c.aDataSort ? c.aDataSort : [d], + mData: c.mData ? c.mData : d, + idx: d + }); + a.aoColumns.push(c); + c = a.aoPreSearchCols; + c[d] = h.extend({}, m.models.oSearch, c[d]); + la(a, d, h(b).data()) + } + + function la(a, b, c) { + var b = a.aoColumns[b], d = a.oClasses, e = h(b.nTh); + if (!b.sWidthOrig) { + b.sWidthOrig = + e.attr("width") || null; + var f = (e.attr("style") || "").match(/width:\s*(\d+[pxem%]+)/); + f && (b.sWidthOrig = f[1]) + } + c !== k && null !== c && (hb(c), J(m.defaults.column, c), c.mDataProp !== k && !c.mData && (c.mData = c.mDataProp), c.sType && (b._sManualType = c.sType), c.className && !c.sClass && (c.sClass = c.className), h.extend(b, c), F(b, c, "sWidth", "sWidthOrig"), c.iDataSort !== k && (b.aDataSort = [c.iDataSort]), F(b, c, "aDataSort")); + var g = b.mData, j = R(g), i = b.mRender ? R(b.mRender) : null, c = function (a) { + return "string" === typeof a && -1 !== a.indexOf("@") + }; + b._bAttrSrc = h.isPlainObject(g) && (c(g.sort) || c(g.type) || c(g.filter)); + b._setter = null; + b.fnGetData = function (a, b, c) { + var d = j(a, b, k, c); + return i && b ? i(d, b, a, c) : d + }; + b.fnSetData = function (a, b, c) { + return S(g)(a, b, c) + }; + "number" !== typeof g && (a._rowReadObject = !0); + a.oFeatures.bSort || (b.bSortable = !1, e.addClass(d.sSortableNone)); + a = -1 !== h.inArray("asc", b.asSorting); + c = -1 !== h.inArray("desc", b.asSorting); + !b.bSortable || !a && !c ? (b.sSortingClass = d.sSortableNone, b.sSortingClassJUI = "") : a && !c ? (b.sSortingClass = d.sSortableAsc, b.sSortingClassJUI = + d.sSortJUIAscAllowed) : !a && c ? (b.sSortingClass = d.sSortableDesc, b.sSortingClassJUI = d.sSortJUIDescAllowed) : (b.sSortingClass = d.sSortable, b.sSortingClassJUI = d.sSortJUI) + } + + function Z(a) { + if (!1 !== a.oFeatures.bAutoWidth) { + var b = a.aoColumns; + Ha(a); + for (var c = 0, d = b.length; c < d; c++) b[c].nTh.style.width = b[c].sWidth + } + b = a.oScroll; + ("" !== b.sY || "" !== b.sX) && ma(a); + s(a, null, "column-sizing", [a]) + } + + function $(a, b) { + var c = na(a, "bVisible"); + return "number" === typeof c[b] ? c[b] : null + } + + function aa(a, b) { + var c = na(a, "bVisible"), c = h.inArray(b, + c); + return -1 !== c ? c : null + } + + function ba(a) { + var b = 0; + h.each(a.aoColumns, function (a, d) { + d.bVisible && "none" !== h(d.nTh).css("display") && b++ + }); + return b + } + + function na(a, b) { + var c = []; + h.map(a.aoColumns, function (a, e) { + a[b] && c.push(e) + }); + return c + } + + function Ia(a) { + var b = a.aoColumns, c = a.aoData, d = m.ext.type.detect, e, f, g, j, i, h, l, q, r; + e = 0; + for (f = b.length; e < f; e++) if (l = b[e], r = [], !l.sType && l._sManualType) l.sType = l._sManualType; else if (!l.sType) { + g = 0; + for (j = d.length; g < j; g++) { + i = 0; + for (h = c.length; i < h; i++) { + r[i] === k && (r[i] = B(a, i, e, "type")); + q = d[g](r[i], a); + if (!q && g !== d.length - 1) break; + if ("html" === q) break + } + if (q) { + l.sType = q; + break + } + } + l.sType || (l.sType = "string") + } + } + + function kb(a, b, c, d) { + var e, f, g, j, i, n, l = a.aoColumns; + if (b) for (e = b.length - 1; 0 <= e; e--) { + n = b[e]; + var q = n.targets !== k ? n.targets : n.aTargets; + h.isArray(q) || (q = [q]); + f = 0; + for (g = q.length; f < g; f++) if ("number" === typeof q[f] && 0 <= q[f]) { + for (; l.length <= q[f];) Ga(a); + d(q[f], n) + } else if ("number" === typeof q[f] && 0 > q[f]) d(l.length + q[f], n); else if ("string" === typeof q[f]) { + j = 0; + for (i = l.length; j < i; j++) ("_all" == q[f] || h(l[j].nTh).hasClass(q[f])) && + d(j, n) + } + } + if (c) { + e = 0; + for (a = c.length; e < a; e++) d(e, c[e]) + } + } + + function N(a, b, c, d) { + var e = a.aoData.length, f = h.extend(!0, {}, m.models.oRow, {src: c ? "dom" : "data", idx: e}); + f._aData = b; + a.aoData.push(f); + for (var g = a.aoColumns, j = 0, i = g.length; j < i; j++) g[j].sType = null; + a.aiDisplayMaster.push(e); + b = a.rowIdFn(b); + b !== k && (a.aIds[b] = f); + (c || !a.oFeatures.bDeferRender) && Ja(a, e, c, d); + return e + } + + function oa(a, b) { + var c; + b instanceof h || (b = h(b)); + return b.map(function (b, e) { + c = Ka(a, e); + return N(a, c.data, e, c.cells) + }) + } + + function B(a, b, c, d) { + var e = a.iDraw, + f = a.aoColumns[c], g = a.aoData[b]._aData, j = f.sDefaultContent, + i = f.fnGetData(g, d, {settings: a, row: b, col: c}); + if (i === k) return a.iDrawError != e && null === j && (K(a, 0, "Requested unknown parameter " + ("function" == typeof f.mData ? "{function}" : "'" + f.mData + "'") + " for row " + b + ", column " + c, 4), a.iDrawError = e), j; + if ((i === g || null === i) && null !== j && d !== k) i = j; else if ("function" === typeof i) return i.call(g); + return null === i && "display" == d ? "" : i + } + + function lb(a, b, c, d) { + a.aoColumns[c].fnSetData(a.aoData[b]._aData, d, {settings: a, row: b, col: c}) + } + + function La(a) { + return h.map(a.match(/(\\.|[^\.])+/g) || [""], function (a) { + return a.replace(/\\\./g, ".") + }) + } + + function R(a) { + if (h.isPlainObject(a)) { + var b = {}; + h.each(a, function (a, c) { + c && (b[a] = R(c)) + }); + return function (a, c, f, g) { + var j = b[c] || b._; + return j !== k ? j(a, c, f, g) : a + } + } + if (null === a) return function (a) { + return a + }; + if ("function" === typeof a) return function (b, c, f, g) { + return a(b, c, f, g) + }; + if ("string" === typeof a && (-1 !== a.indexOf(".") || -1 !== a.indexOf("[") || -1 !== a.indexOf("("))) { + var c = function (a, b, f) { + var g, j; + if ("" !== f) { + j = La(f); + for (var i = 0, n = j.length; i < n; i++) { + f = j[i].match(ca); + g = j[i].match(V); + if (f) { + j[i] = j[i].replace(ca, ""); + "" !== j[i] && (a = a[j[i]]); + g = []; + j.splice(0, i + 1); + j = j.join("."); + if (h.isArray(a)) { + i = 0; + for (n = a.length; i < n; i++) g.push(c(a[i], b, j)) + } + a = f[0].substring(1, f[0].length - 1); + a = "" === a ? g : g.join(a); + break + } else if (g) { + j[i] = j[i].replace(V, ""); + a = a[j[i]](); + continue + } + if (null === a || a[j[i]] === k) return k; + a = a[j[i]] + } + } + return a + }; + return function (b, e) { + return c(b, e, a) + } + } + return function (b) { + return b[a] + } + } + + function S(a) { + if (h.isPlainObject(a)) return S(a._); + if (null === a) return function () { + }; + if ("function" === typeof a) return function (b, d, e) { + a(b, "set", d, e) + }; + if ("string" === typeof a && (-1 !== a.indexOf(".") || -1 !== a.indexOf("[") || -1 !== a.indexOf("("))) { + var b = function (a, d, e) { + var e = La(e), f; + f = e[e.length - 1]; + for (var g, j, i = 0, n = e.length - 1; i < n; i++) { + g = e[i].match(ca); + j = e[i].match(V); + if (g) { + e[i] = e[i].replace(ca, ""); + a[e[i]] = []; + f = e.slice(); + f.splice(0, i + 1); + g = f.join("."); + if (h.isArray(d)) { + j = 0; + for (n = d.length; j < n; j++) f = {}, b(f, d[j], g), a[e[i]].push(f) + } else a[e[i]] = d; + return + } + j && (e[i] = e[i].replace(V, + ""), a = a[e[i]](d)); + if (null === a[e[i]] || a[e[i]] === k) a[e[i]] = {}; + a = a[e[i]] + } + if (f.match(V)) a[f.replace(V, "")](d); else a[f.replace(ca, "")] = d + }; + return function (c, d) { + return b(c, d, a) + } + } + return function (b, d) { + b[a] = d + } + } + + function Ma(a) { + return D(a.aoData, "_aData") + } + + function pa(a) { + a.aoData.length = 0; + a.aiDisplayMaster.length = 0; + a.aiDisplay.length = 0; + a.aIds = {} + } + + function qa(a, b, c) { + for (var d = -1, e = 0, f = a.length; e < f; e++) a[e] == b ? d = e : a[e] > b && a[e]--; + -1 != d && c === k && a.splice(d, 1) + } + + function da(a, b, c, d) { + var e = a.aoData[b], f, g = function (c, d) { + for (; c.childNodes.length;) c.removeChild(c.firstChild); + c.innerHTML = B(a, b, d, "display") + }; + if ("dom" === c || (!c || "auto" === c) && "dom" === e.src) e._aData = Ka(a, e, d, d === k ? k : e._aData).data; else { + var j = e.anCells; + if (j) if (d !== k) g(j[d], d); else { + c = 0; + for (f = j.length; c < f; c++) g(j[c], c) + } + } + e._aSortData = null; + e._aFilterData = null; + g = a.aoColumns; + if (d !== k) g[d].sType = null; else { + c = 0; + for (f = g.length; c < f; c++) g[c].sType = null; + Na(a, e) + } + } + + function Ka(a, b, c, d) { + var e = [], f = b.firstChild, g, j, i = 0, n, l = a.aoColumns, q = a._rowReadObject, + d = d !== k ? d : q ? {} : [], r = function (a, b) { + if ("string" === typeof a) { + var c = a.indexOf("@"); + -1 !== c && (c = a.substring(c + 1), S(a)(d, b.getAttribute(c))) + } + }, m = function (a) { + if (c === k || c === i) j = l[i], n = h.trim(a.innerHTML), j && j._bAttrSrc ? (S(j.mData._)(d, n), r(j.mData.sort, a), r(j.mData.type, a), r(j.mData.filter, a)) : q ? (j._setter || (j._setter = S(j.mData)), j._setter(d, n)) : d[i] = n; + i++ + }; + if (f) for (; f;) { + g = f.nodeName.toUpperCase(); + if ("TD" == g || "TH" == g) m(f), e.push(f); + f = f.nextSibling + } else { + e = b.anCells; + f = 0; + for (g = e.length; f < g; f++) m(e[f]) + } + if (b = b.firstChild ? b : b.nTr) (b = b.getAttribute("id")) && S(a.rowId)(d, b); + return {data: d, cells: e} + } + + function Ja(a, b, c, d) { + var e = a.aoData[b], f = e._aData, g = [], j, i, n, l, q; + if (null === e.nTr) { + j = c || H.createElement("tr"); + e.nTr = j; + e.anCells = g; + j._DT_RowIndex = b; + Na(a, e); + l = 0; + for (q = a.aoColumns.length; l < q; l++) { + n = a.aoColumns[l]; + i = c ? d[l] : H.createElement(n.sCellType); + i._DT_CellIndex = {row: b, column: l}; + g.push(i); + if ((!c || n.mRender || n.mData !== l) && (!h.isPlainObject(n.mData) || n.mData._ !== l + ".display")) i.innerHTML = B(a, b, l, "display"); + n.sClass && (i.className += " " + n.sClass); + n.bVisible && !c ? j.appendChild(i) : !n.bVisible && c && i.parentNode.removeChild(i); + n.fnCreatedCell && n.fnCreatedCell.call(a.oInstance, i, B(a, b, l), f, b, l) + } + s(a, "aoRowCreatedCallback", null, [j, f, b]) + } + e.nTr.setAttribute("role", "row") + } + + function Na(a, b) { + var c = b.nTr, d = b._aData; + if (c) { + var e = a.rowIdFn(d); + e && (c.id = e); + d.DT_RowClass && (e = d.DT_RowClass.split(" "), b.__rowc = b.__rowc ? sa(b.__rowc.concat(e)) : e, h(c).removeClass(b.__rowc.join(" ")).addClass(d.DT_RowClass)); + d.DT_RowAttr && h(c).attr(d.DT_RowAttr); + d.DT_RowData && h(c).data(d.DT_RowData) + } + } + + function mb(a) { + var b, c, d, e, f, g = a.nTHead, j = a.nTFoot, i = 0 === + h("th, td", g).length, n = a.oClasses, l = a.aoColumns; + i && (e = h("
                ").appendTo(g)); + b = 0; + for (c = l.length; b < c; b++) f = l[b], d = h(f.nTh).addClass(f.sClass), i && d.appendTo(e), a.oFeatures.bSort && (d.addClass(f.sSortingClass), !1 !== f.bSortable && (d.attr("tabindex", a.iTabIndex).attr("aria-controls", a.sTableId), Oa(a, f.nTh, b))), f.sTitle != d[0].innerHTML && d.html(f.sTitle), Pa(a, "header")(a, d, f, n); + i && ea(a.aoHeader, g); + h(g).find(">tr").attr("role", "row"); + h(g).find(">tr>th, >tr>td").addClass(n.sHeaderTH); + h(j).find(">tr>th, >tr>td").addClass(n.sFooterTH); + if (null !== j) { + a = a.aoFooter[0]; + b = 0; + for (c = a.length; b < c; b++) f = l[b], f.nTf = a[b].cell, f.sClass && h(f.nTf).addClass(f.sClass) + } + } + + function fa(a, b, c) { + var d, e, f, g = [], j = [], i = a.aoColumns.length, n; + if (b) { + c === k && (c = !1); + d = 0; + for (e = b.length; d < e; d++) { + g[d] = b[d].slice(); + g[d].nTr = b[d].nTr; + for (f = i - 1; 0 <= f; f--) !a.aoColumns[f].bVisible && !c && g[d].splice(f, 1); + j.push([]) + } + d = 0; + for (e = g.length; d < e; d++) { + if (a = g[d].nTr) for (; f = a.firstChild;) a.removeChild(f); + f = 0; + for (b = g[d].length; f < b; f++) if (n = i = 1, j[d][f] === k) { + a.appendChild(g[d][f].cell); + for (j[d][f] = 1; g[d + i] !== k && g[d][f].cell == g[d + i][f].cell;) j[d + i][f] = 1, i++; + for (; g[d][f + n] !== k && g[d][f].cell == g[d][f + n].cell;) { + for (c = 0; c < i; c++) j[d + c][f + n] = 1; + n++ + } + h(g[d][f].cell).attr("rowspan", i).attr("colspan", n) + } + } + } + } + + function O(a) { + var b = s(a, "aoPreDrawCallback", "preDraw", [a]); + if (-1 !== h.inArray(!1, b)) C(a, !1); else { + var b = [], c = 0, d = a.asStripeClasses, e = d.length, f = a.oLanguage, g = a.iInitDisplayStart, + j = "ssp" == y(a), i = a.aiDisplay; + a.bDrawing = !0; + g !== k && -1 !== g && (a._iDisplayStart = j ? g : g >= a.fnRecordsDisplay() ? 0 : g, a.iInitDisplayStart = + -1); + var g = a._iDisplayStart, n = a.fnDisplayEnd(); + if (a.bDeferLoading) a.bDeferLoading = !1, a.iDraw++, C(a, !1); else if (j) { + if (!a.bDestroying && !nb(a)) return + } else a.iDraw++; + if (0 !== i.length) { + f = j ? a.aoData.length : n; + for (j = j ? 0 : g; j < f; j++) { + var l = i[j], q = a.aoData[l]; + null === q.nTr && Ja(a, l); + l = q.nTr; + if (0 !== e) { + var r = d[c % e]; + q._sRowStripe != r && (h(l).removeClass(q._sRowStripe).addClass(r), q._sRowStripe = r) + } + s(a, "aoRowCallback", null, [l, q._aData, c, j]); + b.push(l); + c++ + } + } else c = f.sZeroRecords, 1 == a.iDraw && "ajax" == y(a) ? c = f.sLoadingRecords : + f.sEmptyTable && 0 === a.fnRecordsTotal() && (c = f.sEmptyTable), b[0] = h("", {"class": e ? d[0] : ""}).append(h("").appendTo(j.find("tbody")); + j.find("thead, tfoot").remove(); + j.append(h(a.nTHead).clone()).append(h(a.nTFoot).clone()); + j.find("tfoot th, tfoot td").css("width", ""); + n = ta(a, j.find("thead")[0]); + for (m = 0; m < i.length; m++) p = c[i[m]], n[m].style.width = null !== p.sWidthOrig && "" !== p.sWidthOrig ? v(p.sWidthOrig) : "", p.sWidthOrig && f && h(n[m]).append(h("
                ").css({ + width: p.sWidthOrig, + margin: 0, + padding: 0, + border: 0, + height: 1 + })); + if (a.aoData.length) for (m = 0; m < i.length; m++) r = i[m], p = c[r], h(Hb(a, r)).clone(!1).append(p.sContentPadding).appendTo(t); + h("[name]", + j).removeAttr("name"); + p = h("
                ").css(f || e ? { + position: "absolute", + top: 0, + left: 0, + height: 1, + right: 0, + overflow: "hidden" + } : {}).append(j).appendTo(k); + f && g ? j.width(g) : f ? (j.css("width", "auto"), j.removeAttr("width"), j.width() < k.clientWidth && l && j.width(k.clientWidth)) : e ? j.width(k.clientWidth) : l && j.width(l); + for (m = e = 0; m < i.length; m++) k = h(n[m]), g = k.outerWidth() - k.width(), k = o.bBounding ? Math.ceil(n[m].getBoundingClientRect().width) : k.outerWidth(), e += k, c[i[m]].sWidth = v(k - g); + b.style.width = v(e); + p.remove() + } + l && (b.style.width = + v(l)); + if ((l || f) && !a._reszEvt) b = function () { + h(E).on("resize.DT-" + a.sInstance, Qa(function () { + Z(a) + })) + }, d ? setTimeout(b, 1E3) : b(), a._reszEvt = !0 + } + + function Gb(a, b) { + if (!a) return 0; + var c = h("
                ").css("width", v(a)).appendTo(b || H.body), d = c[0].offsetWidth; + c.remove(); + return d + } + + function Hb(a, b) { + var c = Ib(a, b); + if (0 > c) return null; + var d = a.aoData[c]; + return !d.nTr ? h("
                ").appendTo(q)); + o.nTHead = b[0]; + b = q.children("tbody"); + b.length === 0 && (b = h("").appendTo(q)); + o.nTBody = b[0]; + b = q.children("tfoot"); + if (b.length === 0 && a.length > 0 && (o.oScroll.sX !== "" || o.oScroll.sY !== "")) b = h("").appendTo(q); + if (b.length === 0 || b.children().length === 0) q.addClass(u.sNoFooter); else if (b.length > 0) { + o.nTFoot = b[0]; + ea(o.aoFooter, o.nTFoot) + } + if (g.aaData) for (j = 0; j < g.aaData.length; j++) N(o, g.aaData[j]); else (o.bDeferLoading || y(o) == "dom") && oa(o, h(o.nTBody).children("tr")); + o.aiDisplay = o.aiDisplayMaster.slice(); + o.bInitialised = true; + n === false && ha(o) + }; + g.bStateSave ? (U.bStateSave = !0, z(o, "aoDrawCallback", za, "state_save"), Lb(o, g, e)) : e() + } + }); + b = null; + return this + }, x, t, p, u, $a = {}, Pb = /[\r\n]/g, Ca = /<.*?>/g, + cc = /^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/, + dc = RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)", "g"), + Za = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi, M = function (a) { + return !a || !0 === a || "-" === a ? !0 : !1 + }, Qb = function (a) { + var b = parseInt(a, 10); + return !isNaN(b) && + isFinite(a) ? b : null + }, Rb = function (a, b) { + $a[b] || ($a[b] = RegExp(Sa(b), "g")); + return "string" === typeof a && "." !== b ? a.replace(/\./g, "").replace($a[b], ".") : a + }, ab = function (a, b, c) { + var d = "string" === typeof a; + if (M(a)) return !0; + b && d && (a = Rb(a, b)); + c && d && (a = a.replace(Za, "")); + return !isNaN(parseFloat(a)) && isFinite(a) + }, Sb = function (a, b, c) { + return M(a) ? !0 : !(M(a) || "string" === typeof a) ? null : ab(a.replace(Ca, ""), b, c) ? !0 : null + }, D = function (a, b, c) { + var d = [], e = 0, f = a.length; + if (c !== k) for (; e < f; e++) a[e] && a[e][b] && d.push(a[e][b][c]); else for (; e < + f; e++) a[e] && d.push(a[e][b]); + return d + }, ja = function (a, b, c, d) { + var e = [], f = 0, g = b.length; + if (d !== k) for (; f < g; f++) a[b[f]][c] && e.push(a[b[f]][c][d]); else for (; f < g; f++) e.push(a[b[f]][c]); + return e + }, X = function (a, b) { + var c = [], d; + b === k ? (b = 0, d = a) : (d = b, b = a); + for (var e = b; e < d; e++) c.push(e); + return c + }, Tb = function (a) { + for (var b = [], c = 0, d = a.length; c < d; c++) a[c] && b.push(a[c]); + return b + }, sa = function (a) { + var b; + a:{ + if (!(2 > a.length)) { + b = a.slice().sort(); + for (var c = b[0], d = 1, e = b.length; d < e; d++) { + if (b[d] === c) { + b = !1; + break a + } + c = b[d] + } + } + b = !0 + } + if (b) return a.slice(); + b = []; + var e = a.length, f, g = 0, d = 0; + a:for (; d < e; d++) { + c = a[d]; + for (f = 0; f < g; f++) if (b[f] === c) continue a; + b.push(c); + g++ + } + return b + }; + m.util = { + throttle: function (a, b) { + var c = b !== k ? b : 200, d, e; + return function () { + var b = this, g = +new Date, h = arguments; + d && g < d + c ? (clearTimeout(e), e = setTimeout(function () { + d = k; + a.apply(b, h) + }, c)) : (d = g, a.apply(b, h)) + } + }, escapeRegex: function (a) { + return a.replace(dc, "\\$1") + } + }; + var A = function (a, b, c) { + a[b] !== k && (a[c] = a[b]) + }, ca = /\[.*?\]$/, V = /\(\)$/, Sa = m.util.escapeRegex, xa = h("
                ")[0], $b = xa.textContent !== k, bc = + /<.*?>/g, Qa = m.util.throttle, Ub = [], w = Array.prototype, ec = function (a) { + var b, c, d = m.settings, e = h.map(d, function (a) { + return a.nTable + }); + if (a) { + if (a.nTable && a.oApi) return [a]; + if (a.nodeName && "table" === a.nodeName.toLowerCase()) return b = h.inArray(a, e), -1 !== b ? [d[b]] : null; + if (a && "function" === typeof a.settings) return a.settings().toArray(); + "string" === typeof a ? c = h(a) : a instanceof h && (c = a) + } else return []; + if (c) return c.map(function () { + b = h.inArray(this, e); + return -1 !== b ? d[b] : null + }).toArray() + }; + t = function (a, b) { + if (!(this instanceof + t)) return new t(a, b); + var c = [], d = function (a) { + (a = ec(a)) && (c = c.concat(a)) + }; + if (h.isArray(a)) for (var e = 0, f = a.length; e < f; e++) d(a[e]); else d(a); + this.context = sa(c); + b && h.merge(this, b); + this.selector = {rows: null, cols: null, opts: null}; + t.extend(this, this, Ub) + }; + m.Api = t; + h.extend(t.prototype, { + any: function () { + return 0 !== this.count() + }, concat: w.concat, context: [], count: function () { + return this.flatten().length + }, each: function (a) { + for (var b = 0, c = this.length; b < c; b++) a.call(this, this[b], b, this); + return this + }, eq: function (a) { + var b = + this.context; + return b.length > a ? new t(b[a], this[a]) : null + }, filter: function (a) { + var b = []; + if (w.filter) b = w.filter.call(this, a, this); else for (var c = 0, d = this.length; c < d; c++) a.call(this, this[c], c, this) && b.push(this[c]); + return new t(this.context, b) + }, flatten: function () { + var a = []; + return new t(this.context, a.concat.apply(a, this.toArray())) + }, join: w.join, indexOf: w.indexOf || function (a, b) { + for (var c = b || 0, d = this.length; c < d; c++) if (this[c] === a) return c; + return -1 + }, iterator: function (a, b, c, d) { + var e = [], f, g, h, i, n, l = this.context, + m, p, u = this.selector; + "string" === typeof a && (d = c, c = b, b = a, a = !1); + g = 0; + for (h = l.length; g < h; g++) { + var s = new t(l[g]); + if ("table" === b) f = c.call(s, l[g], g), f !== k && e.push(f); else if ("columns" === b || "rows" === b) f = c.call(s, l[g], this[g], g), f !== k && e.push(f); else if ("column" === b || "column-rows" === b || "row" === b || "cell" === b) { + p = this[g]; + "column-rows" === b && (m = Da(l[g], u.opts)); + i = 0; + for (n = p.length; i < n; i++) f = p[i], f = "cell" === b ? c.call(s, l[g], f.row, f.column, g, i) : c.call(s, l[g], f, g, i, m), f !== k && e.push(f) + } + } + return e.length || d ? (a = new t(l, a ? + e.concat.apply([], e) : e), b = a.selector, b.rows = u.rows, b.cols = u.cols, b.opts = u.opts, a) : this + }, lastIndexOf: w.lastIndexOf || function (a, b) { + return this.indexOf.apply(this.toArray.reverse(), arguments) + }, length: 0, map: function (a) { + var b = []; + if (w.map) b = w.map.call(this, a, this); else for (var c = 0, d = this.length; c < d; c++) b.push(a.call(this, this[c], c)); + return new t(this.context, b) + }, pluck: function (a) { + return this.map(function (b) { + return b[a] + }) + }, pop: w.pop, push: w.push, reduce: w.reduce || function (a, b) { + return jb(this, a, b, 0, this.length, + 1) + }, reduceRight: w.reduceRight || function (a, b) { + return jb(this, a, b, this.length - 1, -1, -1) + }, reverse: w.reverse, selector: null, shift: w.shift, slice: function () { + return new t(this.context, this) + }, sort: w.sort, splice: w.splice, toArray: function () { + return w.slice.call(this) + }, to$: function () { + return h(this) + }, toJQuery: function () { + return h(this) + }, unique: function () { + return new t(this.context, sa(this)) + }, unshift: w.unshift + }); + t.extend = function (a, b, c) { + if (c.length && b && (b instanceof t || b.__dt_wrapper)) { + var d, e, f, g = function (a, b, c) { + return function () { + var d = + b.apply(a, arguments); + t.extend(d, d, c.methodExt); + return d + } + }; + d = 0; + for (e = c.length; d < e; d++) f = c[d], b[f.name] = "function" === typeof f.val ? g(a, f.val, f) : h.isPlainObject(f.val) ? {} : f.val, b[f.name].__dt_wrapper = !0, t.extend(a, b[f.name], f.propExt) + } + }; + t.register = p = function (a, b) { + if (h.isArray(a)) for (var c = 0, d = a.length; c < d; c++) t.register(a[c], b); else for (var e = a.split("."), f = Ub, g, j, c = 0, d = e.length; c < d; c++) { + g = (j = -1 !== e[c].indexOf("()")) ? e[c].replace("()", "") : e[c]; + var i; + a:{ + i = 0; + for (var n = f.length; i < n; i++) if (f[i].name === g) { + i = + f[i]; + break a + } + i = null + } + i || (i = {name: g, val: {}, methodExt: [], propExt: []}, f.push(i)); + c === d - 1 ? i.val = b : f = j ? i.methodExt : i.propExt + } + }; + t.registerPlural = u = function (a, b, c) { + t.register(a, c); + t.register(b, function () { + var a = c.apply(this, arguments); + return a === this ? this : a instanceof t ? a.length ? h.isArray(a[0]) ? new t(a.context, a[0]) : a[0] : k : a + }) + }; + p("tables()", function (a) { + var b; + if (a) { + b = t; + var c = this.context; + if ("number" === typeof a) a = [c[a]]; else var d = h.map(c, function (a) { + return a.nTable + }), a = h(d).filter(a).map(function () { + var a = h.inArray(this, + d); + return c[a] + }).toArray(); + b = new b(a) + } else b = this; + return b + }); + p("table()", function (a) { + var a = this.tables(a), b = a.context; + return b.length ? new t(b[0]) : a + }); + u("tables().nodes()", "table().node()", function () { + return this.iterator("table", function (a) { + return a.nTable + }, 1) + }); + u("tables().body()", "table().body()", function () { + return this.iterator("table", function (a) { + return a.nTBody + }, 1) + }); + u("tables().header()", "table().header()", function () { + return this.iterator("table", function (a) { + return a.nTHead + }, 1) + }); + u("tables().footer()", + "table().footer()", function () { + return this.iterator("table", function (a) { + return a.nTFoot + }, 1) + }); + u("tables().containers()", "table().container()", function () { + return this.iterator("table", function (a) { + return a.nTableWrapper + }, 1) + }); + p("draw()", function (a) { + return this.iterator("table", function (b) { + "page" === a ? O(b) : ("string" === typeof a && (a = "full-hold" === a ? !1 : !0), T(b, !1 === a)) + }) + }); + p("page()", function (a) { + return a === k ? this.page.info().page : this.iterator("table", function (b) { + Va(b, a) + }) + }); + p("page.info()", function () { + if (0 === + this.context.length) return k; + var a = this.context[0], b = a._iDisplayStart, c = a.oFeatures.bPaginate ? a._iDisplayLength : -1, + d = a.fnRecordsDisplay(), e = -1 === c; + return { + page: e ? 0 : Math.floor(b / c), + pages: e ? 1 : Math.ceil(d / c), + start: b, + end: a.fnDisplayEnd(), + length: c, + recordsTotal: a.fnRecordsTotal(), + recordsDisplay: d, + serverSide: "ssp" === y(a) + } + }); + p("page.len()", function (a) { + return a === k ? 0 !== this.context.length ? this.context[0]._iDisplayLength : k : this.iterator("table", function (b) { + Ta(b, a) + }) + }); + var Vb = function (a, b, c) { + if (c) { + var d = new t(a); + d.one("draw", function () { + c(d.ajax.json()) + }) + } + if ("ssp" == y(a)) T(a, b); else { + C(a, !0); + var e = a.jqXHR; + e && 4 !== e.readyState && e.abort(); + ua(a, [], function (c) { + pa(a); + for (var c = va(a, c), d = 0, e = c.length; d < e; d++) N(a, c[d]); + T(a, b); + C(a, !1) + }) + } + }; + p("ajax.json()", function () { + var a = this.context; + if (0 < a.length) return a[0].json + }); + p("ajax.params()", function () { + var a = this.context; + if (0 < a.length) return a[0].oAjaxData + }); + p("ajax.reload()", function (a, b) { + return this.iterator("table", function (c) { + Vb(c, !1 === b, a) + }) + }); + p("ajax.url()", function (a) { + var b = + this.context; + if (a === k) { + if (0 === b.length) return k; + b = b[0]; + return b.ajax ? h.isPlainObject(b.ajax) ? b.ajax.url : b.ajax : b.sAjaxSource + } + return this.iterator("table", function (b) { + h.isPlainObject(b.ajax) ? b.ajax.url = a : b.ajax = a + }) + }); + p("ajax.url().load()", function (a, b) { + return this.iterator("table", function (c) { + Vb(c, !1 === b, a) + }) + }); + var bb = function (a, b, c, d, e) { + var f = [], g, j, i, n, l, m; + i = typeof b; + if (!b || "string" === i || "function" === i || b.length === k) b = [b]; + i = 0; + for (n = b.length; i < n; i++) { + j = b[i] && b[i].split && !b[i].match(/[\[\(:]/) ? b[i].split(",") : + [b[i]]; + l = 0; + for (m = j.length; l < m; l++) (g = c("string" === typeof j[l] ? h.trim(j[l]) : j[l])) && g.length && (f = f.concat(g)) + } + a = x.selector[a]; + if (a.length) { + i = 0; + for (n = a.length; i < n; i++) f = a[i](d, e, f) + } + return sa(f) + }, cb = function (a) { + a || (a = {}); + a.filter && a.search === k && (a.search = a.filter); + return h.extend({search: "none", order: "current", page: "all"}, a) + }, db = function (a) { + for (var b = 0, c = a.length; b < c; b++) if (0 < a[b].length) return a[0] = a[b], a[0].length = 1, a.length = 1, a.context = [a.context[b]], a; + a.length = 0; + return a + }, Da = function (a, b) { + var c, + d, e, f = [], g = a.aiDisplay; + c = a.aiDisplayMaster; + var j = b.search; + d = b.order; + e = b.page; + if ("ssp" == y(a)) return "removed" === j ? [] : X(0, c.length); + if ("current" == e) { + c = a._iDisplayStart; + for (d = a.fnDisplayEnd(); c < d; c++) f.push(g[c]) + } else if ("current" == d || "applied" == d) f = "none" == j ? c.slice() : "applied" == j ? g.slice() : h.map(c, function (a) { + return -1 === h.inArray(a, g) ? a : null + }); else if ("index" == d || "original" == d) { + c = 0; + for (d = a.aoData.length; c < d; c++) "none" == j ? f.push(c) : (e = h.inArray(c, g), (-1 === e && "removed" == j || 0 <= e && "applied" == j) && f.push(c)) + } + return f + }; + p("rows()", function (a, b) { + a === k ? a = "" : h.isPlainObject(a) && (b = a, a = ""); + var b = cb(b), c = this.iterator("table", function (c) { + var e = b, f; + return bb("row", a, function (a) { + var b = Qb(a); + if (b !== null && !e) return [b]; + f || (f = Da(c, e)); + if (b !== null && h.inArray(b, f) !== -1) return [b]; + if (a === null || a === k || a === "") return f; + if (typeof a === "function") return h.map(f, function (b) { + var e = c.aoData[b]; + return a(b, e._aData, e.nTr) ? b : null + }); + b = Tb(ja(c.aoData, f, "nTr")); + if (a.nodeName) { + if (a._DT_RowIndex !== k) return [a._DT_RowIndex]; + if (a._DT_CellIndex) return [a._DT_CellIndex.row]; + b = h(a).closest("*[data-dt-row]"); + return b.length ? [b.data("dt-row")] : [] + } + if (typeof a === "string" && a.charAt(0) === "#") { + var i = c.aIds[a.replace(/^#/, "")]; + if (i !== k) return [i.idx] + } + return h(b).filter(a).map(function () { + return this._DT_RowIndex + }).toArray() + }, c, e) + }, 1); + c.selector.rows = a; + c.selector.opts = b; + return c + }); + p("rows().nodes()", function () { + return this.iterator("row", function (a, b) { + return a.aoData[b].nTr || k + }, 1) + }); + p("rows().data()", function () { + return this.iterator(!0, "rows", function (a, b) { + return ja(a.aoData, b, "_aData") + }, + 1) + }); + u("rows().cache()", "row().cache()", function (a) { + return this.iterator("row", function (b, c) { + var d = b.aoData[c]; + return "search" === a ? d._aFilterData : d._aSortData + }, 1) + }); + u("rows().invalidate()", "row().invalidate()", function (a) { + return this.iterator("row", function (b, c) { + da(b, c, a) + }) + }); + u("rows().indexes()", "row().index()", function () { + return this.iterator("row", function (a, b) { + return b + }, 1) + }); + u("rows().ids()", "row().id()", function (a) { + for (var b = [], c = this.context, d = 0, e = c.length; d < e; d++) for (var f = 0, g = this[d].length; f < + g; f++) { + var h = c[d].rowIdFn(c[d].aoData[this[d][f]]._aData); + b.push((!0 === a ? "#" : "") + h) + } + return new t(c, b) + }); + u("rows().remove()", "row().remove()", function () { + var a = this; + this.iterator("row", function (b, c, d) { + var e = b.aoData, f = e[c], g, h, i, n, l; + e.splice(c, 1); + g = 0; + for (h = e.length; g < h; g++) if (i = e[g], l = i.anCells, null !== i.nTr && (i.nTr._DT_RowIndex = g), null !== l) { + i = 0; + for (n = l.length; i < n; i++) l[i]._DT_CellIndex.row = g + } + qa(b.aiDisplayMaster, c); + qa(b.aiDisplay, c); + qa(a[d], c, !1); + Ua(b); + c = b.rowIdFn(f._aData); + c !== k && delete b.aIds[c] + }); + this.iterator("table", function (a) { + for (var c = 0, d = a.aoData.length; c < d; c++) a.aoData[c].idx = c + }); + return this + }); + p("rows.add()", function (a) { + var b = this.iterator("table", function (b) { + var c, f, g, h = []; + f = 0; + for (g = a.length; f < g; f++) c = a[f], c.nodeName && "TR" === c.nodeName.toUpperCase() ? h.push(oa(b, c)[0]) : h.push(N(b, c)); + return h + }, 1), c = this.rows(-1); + c.pop(); + h.merge(c, b); + return c + }); + p("row()", function (a, b) { + return db(this.rows(a, b)) + }); + p("row().data()", function (a) { + var b = this.context; + if (a === k) return b.length && this.length ? b[0].aoData[this[0]]._aData : + k; + b[0].aoData[this[0]]._aData = a; + da(b[0], this[0], "data"); + return this + }); + p("row().node()", function () { + var a = this.context; + return a.length && this.length ? a[0].aoData[this[0]].nTr || null : null + }); + p("row.add()", function (a) { + a instanceof h && a.length && (a = a[0]); + var b = this.iterator("table", function (b) { + return a.nodeName && "TR" === a.nodeName.toUpperCase() ? oa(b, a)[0] : N(b, a) + }); + return this.row(b[0]) + }); + var eb = function (a, b) { + var c = a.context; + if (c.length && (c = c[0].aoData[b !== k ? b : a[0]]) && c._details) c._details.remove(), c._detailsShow = + k, c._details = k + }, Wb = function (a, b) { + var c = a.context; + if (c.length && a.length) { + var d = c[0].aoData[a[0]]; + if (d._details) { + (d._detailsShow = b) ? d._details.insertAfter(d.nTr) : d._details.detach(); + var e = c[0], f = new t(e), g = e.aoData; + f.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details"); + 0 < D(g, "_details").length && (f.on("draw.dt.DT_details", function (a, b) { + e === b && f.rows({page: "current"}).eq(0).each(function (a) { + a = g[a]; + a._detailsShow && a._details.insertAfter(a.nTr) + }) + }), f.on("column-visibility.dt.DT_details", + function (a, b) { + if (e === b) for (var c, d = ba(b), f = 0, h = g.length; f < h; f++) c = g[f], c._details && c._details.children("td[colspan]").attr("colspan", d) + }), f.on("destroy.dt.DT_details", function (a, b) { + if (e === b) for (var c = 0, d = g.length; c < d; c++) g[c]._details && eb(f, c) + })) + } + } + }; + p("row().child()", function (a, b) { + var c = this.context; + if (a === k) return c.length && this.length ? c[0].aoData[this[0]]._details : k; + if (!0 === a) this.child.show(); else if (!1 === a) eb(this); else if (c.length && this.length) { + var d = c[0], c = c[0].aoData[this[0]], e = [], f = function (a, + b) { + if (h.isArray(a) || a instanceof h) for (var c = 0, k = a.length; c < k; c++) f(a[c], b); else a.nodeName && "tr" === a.nodeName.toLowerCase() ? e.push(a) : (c = h("
                ").addClass(b), h("td", c).addClass(b).html(a)[0].colSpan = ba(d), e.push(c[0])) + }; + f(a, b); + c._details && c._details.detach(); + c._details = h(e); + c._detailsShow && c._details.insertAfter(c.nTr) + } + return this + }); + p(["row().child.show()", "row().child().show()"], function () { + Wb(this, !0); + return this + }); + p(["row().child.hide()", "row().child().hide()"], function () { + Wb(this, !1); + return this + }); + p(["row().child.remove()", "row().child().remove()"], function () { + eb(this); + return this + }); + p("row().child.isShown()", function () { + var a = this.context; + return a.length && this.length ? a[0].aoData[this[0]]._detailsShow || !1 : !1 + }); + var fc = /^([^:]+):(name|visIdx|visible)$/, Xb = function (a, b, c, d, e) { + for (var c = [], d = 0, f = e.length; d < f; d++) c.push(B(a, e[d], b)); + return c + }; + p("columns()", function (a, b) { + a === k ? a = "" : h.isPlainObject(a) && (b = a, a = ""); + var b = cb(b), c = this.iterator("table", function (c) { + var e = a, f = b, g = c.aoColumns, + j = D(g, "sName"), i = D(g, "nTh"); + return bb("column", e, function (a) { + var b = Qb(a); + if (a === "") return X(g.length); + if (b !== null) return [b >= 0 ? b : g.length + b]; + if (typeof a === "function") { + var e = Da(c, f); + return h.map(g, function (b, f) { + return a(f, Xb(c, f, 0, 0, e), i[f]) ? f : null + }) + } + var k = typeof a === "string" ? a.match(fc) : ""; + if (k) switch (k[2]) { + case "visIdx": + case "visible": + b = parseInt(k[1], 10); + if (b < 0) { + var m = h.map(g, function (a, b) { + return a.bVisible ? b : null + }); + return [m[m.length + b]] + } + return [$(c, b)]; + case "name": + return h.map(j, function (a, b) { + return a === + k[1] ? b : null + }); + default: + return [] + } + if (a.nodeName && a._DT_CellIndex) return [a._DT_CellIndex.column]; + b = h(i).filter(a).map(function () { + return h.inArray(this, i) + }).toArray(); + if (b.length || !a.nodeName) return b; + b = h(a).closest("*[data-dt-column]"); + return b.length ? [b.data("dt-column")] : [] + }, c, f) + }, 1); + c.selector.cols = a; + c.selector.opts = b; + return c + }); + u("columns().header()", "column().header()", function () { + return this.iterator("column", function (a, b) { + return a.aoColumns[b].nTh + }, 1) + }); + u("columns().footer()", "column().footer()", + function () { + return this.iterator("column", function (a, b) { + return a.aoColumns[b].nTf + }, 1) + }); + u("columns().data()", "column().data()", function () { + return this.iterator("column-rows", Xb, 1) + }); + u("columns().dataSrc()", "column().dataSrc()", function () { + return this.iterator("column", function (a, b) { + return a.aoColumns[b].mData + }, 1) + }); + u("columns().cache()", "column().cache()", function (a) { + return this.iterator("column-rows", function (b, c, d, e, f) { + return ja(b.aoData, f, "search" === a ? "_aFilterData" : "_aSortData", c) + }, 1) + }); + u("columns().nodes()", + "column().nodes()", function () { + return this.iterator("column-rows", function (a, b, c, d, e) { + return ja(a.aoData, e, "anCells", b) + }, 1) + }); + u("columns().visible()", "column().visible()", function (a, b) { + var c = this.iterator("column", function (b, c) { + if (a === k) return b.aoColumns[c].bVisible; + var f = b.aoColumns, g = f[c], j = b.aoData, i, n, l; + if (a !== k && g.bVisible !== a) { + if (a) { + var m = h.inArray(!0, D(f, "bVisible"), c + 1); + i = 0; + for (n = j.length; i < n; i++) l = j[i].nTr, f = j[i].anCells, l && l.insertBefore(f[c], f[m] || null) + } else h(D(b.aoData, "anCells", c)).detach(); + g.bVisible = a; + fa(b, b.aoHeader); + fa(b, b.aoFooter); + za(b) + } + }); + a !== k && (this.iterator("column", function (c, e) { + s(c, null, "column-visibility", [c, e, a, b]) + }), (b === k || b) && this.columns.adjust()); + return c + }); + u("columns().indexes()", "column().index()", function (a) { + return this.iterator("column", function (b, c) { + return "visible" === a ? aa(b, c) : c + }, 1) + }); + p("columns.adjust()", function () { + return this.iterator("table", function (a) { + Z(a) + }, 1) + }); + p("column.index()", function (a, b) { + if (0 !== this.context.length) { + var c = this.context[0]; + if ("fromVisible" === + a || "toData" === a) return $(c, b); + if ("fromData" === a || "toVisible" === a) return aa(c, b) + } + }); + p("column()", function (a, b) { + return db(this.columns(a, b)) + }); + p("cells()", function (a, b, c) { + h.isPlainObject(a) && (a.row === k ? (c = a, a = null) : (c = b, b = null)); + h.isPlainObject(b) && (c = b, b = null); + if (null === b || b === k) return this.iterator("table", function (b) { + var d = a, e = cb(c), f = b.aoData, g = Da(b, e), j = Tb(ja(f, g, "anCells")), + i = h([].concat.apply([], j)), l, n = b.aoColumns.length, m, p, u, t, s, v; + return bb("cell", d, function (a) { + var c = typeof a === "function"; + if (a === null || a === k || c) { + m = []; + p = 0; + for (u = g.length; p < u; p++) { + l = g[p]; + for (t = 0; t < n; t++) { + s = {row: l, column: t}; + if (c) { + v = f[l]; + a(s, B(b, l, t), v.anCells ? v.anCells[t] : null) && m.push(s) + } else m.push(s) + } + } + return m + } + if (h.isPlainObject(a)) return [a]; + c = i.filter(a).map(function (a, b) { + return {row: b._DT_CellIndex.row, column: b._DT_CellIndex.column} + }).toArray(); + if (c.length || !a.nodeName) return c; + v = h(a).closest("*[data-dt-row]"); + return v.length ? [{row: v.data("dt-row"), column: v.data("dt-column")}] : [] + }, b, e) + }); + var d = this.columns(b, c), e = this.rows(a, + c), f, g, j, i, n, l = this.iterator("table", function (a, b) { + f = []; + g = 0; + for (j = e[b].length; g < j; g++) { + i = 0; + for (n = d[b].length; i < n; i++) f.push({row: e[b][g], column: d[b][i]}) + } + return f + }, 1); + h.extend(l.selector, {cols: b, rows: a, opts: c}); + return l + }); + u("cells().nodes()", "cell().node()", function () { + return this.iterator("cell", function (a, b, c) { + return (a = a.aoData[b]) && a.anCells ? a.anCells[c] : k + }, 1) + }); + p("cells().data()", function () { + return this.iterator("cell", function (a, b, c) { + return B(a, b, c) + }, 1) + }); + u("cells().cache()", "cell().cache()", function (a) { + a = + "search" === a ? "_aFilterData" : "_aSortData"; + return this.iterator("cell", function (b, c, d) { + return b.aoData[c][a][d] + }, 1) + }); + u("cells().render()", "cell().render()", function (a) { + return this.iterator("cell", function (b, c, d) { + return B(b, c, d, a) + }, 1) + }); + u("cells().indexes()", "cell().index()", function () { + return this.iterator("cell", function (a, b, c) { + return {row: b, column: c, columnVisible: aa(a, c)} + }, 1) + }); + u("cells().invalidate()", "cell().invalidate()", function (a) { + return this.iterator("cell", function (b, c, d) { + da(b, c, a, d) + }) + }); + p("cell()", + function (a, b, c) { + return db(this.cells(a, b, c)) + }); + p("cell().data()", function (a) { + var b = this.context, c = this[0]; + if (a === k) return b.length && c.length ? B(b[0], c[0].row, c[0].column) : k; + lb(b[0], c[0].row, c[0].column, a); + da(b[0], c[0].row, "data", c[0].column); + return this + }); + p("order()", function (a, b) { + var c = this.context; + if (a === k) return 0 !== c.length ? c[0].aaSorting : k; + "number" === typeof a ? a = [[a, b]] : a.length && !h.isArray(a[0]) && (a = Array.prototype.slice.call(arguments)); + return this.iterator("table", function (b) { + b.aaSorting = a.slice() + }) + }); + p("order.listener()", function (a, b, c) { + return this.iterator("table", function (d) { + Oa(d, a, b, c) + }) + }); + p("order.fixed()", function (a) { + if (!a) { + var b = this.context, b = b.length ? b[0].aaSortingFixed : k; + return h.isArray(b) ? {pre: b} : b + } + return this.iterator("table", function (b) { + b.aaSortingFixed = h.extend(!0, {}, a) + }) + }); + p(["columns().order()", "column().order()"], function (a) { + var b = this; + return this.iterator("table", function (c, d) { + var e = []; + h.each(b[d], function (b, c) { + e.push([c, a]) + }); + c.aaSorting = e + }) + }); + p("search()", function (a, b, c, d) { + var e = + this.context; + return a === k ? 0 !== e.length ? e[0].oPreviousSearch.sSearch : k : this.iterator("table", function (e) { + e.oFeatures.bFilter && ga(e, h.extend({}, e.oPreviousSearch, { + sSearch: a + "", + bRegex: null === b ? !1 : b, + bSmart: null === c ? !0 : c, + bCaseInsensitive: null === d ? !0 : d + }), 1) + }) + }); + u("columns().search()", "column().search()", function (a, b, c, d) { + return this.iterator("column", function (e, f) { + var g = e.aoPreSearchCols; + if (a === k) return g[f].sSearch; + e.oFeatures.bFilter && (h.extend(g[f], { + sSearch: a + "", bRegex: null === b ? !1 : b, bSmart: null === c ? + !0 : c, bCaseInsensitive: null === d ? !0 : d + }), ga(e, e.oPreviousSearch, 1)) + }) + }); + p("state()", function () { + return this.context.length ? this.context[0].oSavedState : null + }); + p("state.clear()", function () { + return this.iterator("table", function (a) { + a.fnStateSaveCallback.call(a.oInstance, a, {}) + }) + }); + p("state.loaded()", function () { + return this.context.length ? this.context[0].oLoadedState : null + }); + p("state.save()", function () { + return this.iterator("table", function (a) { + za(a) + }) + }); + m.versionCheck = m.fnVersionCheck = function (a) { + for (var b = m.version.split("."), + a = a.split("."), c, d, e = 0, f = a.length; e < f; e++) if (c = parseInt(b[e], 10) || 0, d = parseInt(a[e], 10) || 0, c !== d) return c > d; + return !0 + }; + m.isDataTable = m.fnIsDataTable = function (a) { + var b = h(a).get(0), c = !1; + if (a instanceof m.Api) return !0; + h.each(m.settings, function (a, e) { + var f = e.nScrollHead ? h("table", e.nScrollHead)[0] : null, + g = e.nScrollFoot ? h("table", e.nScrollFoot)[0] : null; + if (e.nTable === b || f === b || g === b) c = !0 + }); + return c + }; + m.tables = m.fnTables = function (a) { + var b = !1; + h.isPlainObject(a) && (b = a.api, a = a.visible); + var c = h.map(m.settings, + function (b) { + if (!a || a && h(b.nTable).is(":visible")) return b.nTable + }); + return b ? new t(c) : c + }; + m.camelToHungarian = J; + p("$()", function (a, b) { + var c = this.rows(b).nodes(), c = h(c); + return h([].concat(c.filter(a).toArray(), c.find(a).toArray())) + }); + h.each(["on", "one", "off"], function (a, b) { + p(b + "()", function () { + var a = Array.prototype.slice.call(arguments); + a[0] = h.map(a[0].split(/\s/), function (a) { + return !a.match(/\.dt\b/) ? a + ".dt" : a + }).join(" "); + var d = h(this.tables().nodes()); + d[b].apply(d, a); + return this + }) + }); + p("clear()", function () { + return this.iterator("table", + function (a) { + pa(a) + }) + }); + p("settings()", function () { + return new t(this.context, this.context) + }); + p("init()", function () { + var a = this.context; + return a.length ? a[0].oInit : null + }); + p("data()", function () { + return this.iterator("table", function (a) { + return D(a.aoData, "_aData") + }).flatten() + }); + p("destroy()", function (a) { + a = a || !1; + return this.iterator("table", function (b) { + var c = b.nTableWrapper.parentNode, d = b.oClasses, e = b.nTable, f = b.nTBody, g = b.nTHead, j = b.nTFoot, + i = h(e), f = h(f), k = h(b.nTableWrapper), l = h.map(b.aoData, function (a) { + return a.nTr + }), + p; + b.bDestroying = !0; + s(b, "aoDestroyCallback", "destroy", [b]); + a || (new t(b)).columns().visible(!0); + k.off(".DT").find(":not(tbody *)").off(".DT"); + h(E).off(".DT-" + b.sInstance); + e != g.parentNode && (i.children("thead").detach(), i.append(g)); + j && e != j.parentNode && (i.children("tfoot").detach(), i.append(j)); + b.aaSorting = []; + b.aaSortingFixed = []; + ya(b); + h(l).removeClass(b.asStripeClasses.join(" ")); + h("th, td", g).removeClass(d.sSortable + " " + d.sSortableAsc + " " + d.sSortableDesc + " " + d.sSortableNone); + b.bJUI && (h("th span." + d.sSortIcon + + ", td span." + d.sSortIcon, g).detach(), h("th, td", g).each(function () { + var a = h("div." + d.sSortJUIWrapper, this); + h(this).append(a.contents()); + a.detach() + })); + f.children().detach(); + f.append(l); + g = a ? "remove" : "detach"; + i[g](); + k[g](); + !a && c && (c.insertBefore(e, b.nTableReinsertBefore), i.css("width", b.sDestroyWidth).removeClass(d.sTable), (p = b.asDestroyStripes.length) && f.children().each(function (a) { + h(this).addClass(b.asDestroyStripes[a % p]) + })); + c = h.inArray(b, m.settings); + -1 !== c && m.settings.splice(c, 1) + }) + }); + h.each(["column", + "row", "cell"], function (a, b) { + p(b + "s().every()", function (a) { + var d = this.selector.opts, e = this; + return this.iterator(b, function (f, g, h, i, m) { + a.call(e[b](g, "cell" === b ? h : d, "cell" === b ? d : k), g, h, i, m) + }) + }) + }); + p("i18n()", function (a, b, c) { + var d = this.context[0], a = R(a)(d.oLanguage); + a === k && (a = b); + c !== k && h.isPlainObject(a) && (a = a[c] !== k ? a[c] : a._); + return a.replace("%d", c) + }); + m.version = "1.10.15"; + m.settings = []; + m.models = {}; + m.models.oSearch = {bCaseInsensitive: !0, sSearch: "", bRegex: !1, bSmart: !0}; + m.models.oRow = { + nTr: null, anCells: null, + _aData: [], _aSortData: null, _aFilterData: null, _sFilterRow: null, _sRowStripe: "", src: null, idx: -1 + }; + m.models.oColumn = { + idx: null, + aDataSort: null, + asSorting: null, + bSearchable: null, + bSortable: null, + bVisible: null, + _sManualType: null, + _bAttrSrc: !1, + fnCreatedCell: null, + fnGetData: null, + fnSetData: null, + mData: null, + mRender: null, + nTh: null, + nTf: null, + sClass: null, + sContentPadding: null, + sDefaultContent: null, + sName: null, + sSortDataType: "std", + sSortingClass: null, + sSortingClassJUI: null, + sTitle: null, + sType: null, + sWidth: null, + sWidthOrig: null + }; + m.defaults = + { + aaData: null, + aaSorting: [[0, "asc"]], + aaSortingFixed: [], + ajax: null, + aLengthMenu: [10, 25, 50, 100], + aoColumns: null, + aoColumnDefs: null, + aoSearchCols: [], + asStripeClasses: null, + bAutoWidth: !0, + bDeferRender: !1, + bDestroy: !1, + bFilter: !0, + bInfo: !0, + bJQueryUI: !1, + bLengthChange: !0, + bPaginate: !0, + bProcessing: !1, + bRetrieve: !1, + bScrollCollapse: !1, + bServerSide: !1, + bSort: !0, + bSortMulti: !0, + bSortCellsTop: !1, + bSortClasses: !0, + bStateSave: !1, + fnCreatedRow: null, + fnDrawCallback: null, + fnFooterCallback: null, + fnFormatNumber: function (a) { + return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g, + this.oLanguage.sThousands) + }, + fnHeaderCallback: null, + fnInfoCallback: null, + fnInitComplete: null, + fnPreDrawCallback: null, + fnRowCallback: null, + fnServerData: null, + fnServerParams: null, + fnStateLoadCallback: function (a) { + try { + return JSON.parse((-1 === a.iStateDuration ? sessionStorage : localStorage).getItem("DataTables_" + a.sInstance + "_" + location.pathname)) + } catch (b) { + } + }, + fnStateLoadParams: null, + fnStateLoaded: null, + fnStateSaveCallback: function (a, b) { + try { + (-1 === a.iStateDuration ? sessionStorage : localStorage).setItem("DataTables_" + a.sInstance + + "_" + location.pathname, JSON.stringify(b)) + } catch (c) { + } + }, + fnStateSaveParams: null, + iStateDuration: 7200, + iDeferLoading: null, + iDisplayLength: 10, + iDisplayStart: 0, + iTabIndex: 0, + oClasses: {}, + oLanguage: { + oAria: { + sSortAscending: ": activate to sort column ascending", + sSortDescending: ": activate to sort column descending" + }, + oPaginate: {sFirst: "First", sLast: "Last", sNext: "Next", sPrevious: "Previous"}, + sEmptyTable: "No data available in table", + sInfo: "Showing _START_ to _END_ of _TOTAL_ entries", + sInfoEmpty: "Showing 0 to 0 of 0 entries", + sInfoFiltered: "(filtered from _MAX_ total entries)", + sInfoPostFix: "", + sDecimal: "", + sThousands: ",", + sLengthMenu: "Show _MENU_ entries", + sLoadingRecords: "Loading...", + sProcessing: "Processing...", + sSearch: "Search:", + sSearchPlaceholder: "", + sUrl: "", + sZeroRecords: "No matching records found" + }, + oSearch: h.extend({}, m.models.oSearch), + sAjaxDataProp: "data", + sAjaxSource: null, + sDom: "lfrtip", + searchDelay: null, + sPaginationType: "simple_numbers", + sScrollX: "", + sScrollXInner: "", + sScrollY: "", + sServerMethod: "GET", + renderer: null, + rowId: "DT_RowId" + }; + Y(m.defaults); + m.defaults.column = { + aDataSort: null, + iDataSort: -1, + asSorting: ["asc", "desc"], + bSearchable: !0, + bSortable: !0, + bVisible: !0, + fnCreatedCell: null, + mData: null, + mRender: null, + sCellType: "td", + sClass: "", + sContentPadding: "", + sDefaultContent: null, + sName: "", + sSortDataType: "std", + sTitle: null, + sType: null, + sWidth: null + }; + Y(m.defaults.column); + m.models.oSettings = { + oFeatures: { + bAutoWidth: null, + bDeferRender: null, + bFilter: null, + bInfo: null, + bLengthChange: null, + bPaginate: null, + bProcessing: null, + bServerSide: null, + bSort: null, + bSortMulti: null, + bSortClasses: null, + bStateSave: null + }, + oScroll: {bCollapse: null, iBarWidth: 0, sX: null, sXInner: null, sY: null}, + oLanguage: {fnInfoCallback: null}, + oBrowser: {bScrollOversize: !1, bScrollbarLeft: !1, bBounding: !1, barWidth: 0}, + ajax: null, + aanFeatures: [], + aoData: [], + aiDisplay: [], + aiDisplayMaster: [], + aIds: {}, + aoColumns: [], + aoHeader: [], + aoFooter: [], + oPreviousSearch: {}, + aoPreSearchCols: [], + aaSorting: null, + aaSortingFixed: [], + asStripeClasses: null, + asDestroyStripes: [], + sDestroyWidth: 0, + aoRowCallback: [], + aoHeaderCallback: [], + aoFooterCallback: [], + aoDrawCallback: [], + aoRowCreatedCallback: [], + aoPreDrawCallback: [], + aoInitComplete: [], + aoStateSaveParams: [], + aoStateLoadParams: [], + aoStateLoaded: [], + sTableId: "", + nTable: null, + nTHead: null, + nTFoot: null, + nTBody: null, + nTableWrapper: null, + bDeferLoading: !1, + bInitialised: !1, + aoOpenRows: [], + sDom: null, + searchDelay: null, + sPaginationType: "two_button", + iStateDuration: 0, + aoStateSave: [], + aoStateLoad: [], + oSavedState: null, + oLoadedState: null, + sAjaxSource: null, + sAjaxDataProp: null, + bAjaxDataGet: !0, + jqXHR: null, + json: k, + oAjaxData: k, + fnServerData: null, + aoServerParams: [], + sServerMethod: null, + fnFormatNumber: null, + aLengthMenu: null, + iDraw: 0, + bDrawing: !1, + iDrawError: -1, + _iDisplayLength: 10, + _iDisplayStart: 0, + _iRecordsTotal: 0, + _iRecordsDisplay: 0, + bJUI: null, + oClasses: {}, + bFiltered: !1, + bSorted: !1, + bSortCellsTop: null, + oInit: null, + aoDestroyCallback: [], + fnRecordsTotal: function () { + return "ssp" == y(this) ? 1 * this._iRecordsTotal : this.aiDisplayMaster.length + }, + fnRecordsDisplay: function () { + return "ssp" == y(this) ? 1 * this._iRecordsDisplay : this.aiDisplay.length + }, + fnDisplayEnd: function () { + var a = + this._iDisplayLength, b = this._iDisplayStart, c = b + a, d = this.aiDisplay.length, e = this.oFeatures, + f = e.bPaginate; + return e.bServerSide ? !1 === f || -1 === a ? b + d : Math.min(b + a, this._iRecordsDisplay) : !f || c > d || -1 === a ? d : c + }, + oInstance: null, + sInstance: null, + iTabIndex: 0, + nScrollHead: null, + nScrollFoot: null, + aLastSort: [], + oPlugins: {}, + rowIdFn: null, + rowId: null + }; + m.ext = x = { + buttons: {}, + classes: {}, + build: "bs-3.3.7/dt-1.10.15/fh-3.1.2/r-2.1.1", + errMode: "alert", + feature: [], + search: [], + selector: {cell: [], column: [], row: []}, + internal: {}, + legacy: {ajax: null}, + pager: {}, + renderer: { + pageButton: {}, + header: {} + }, + order: {}, + type: {detect: [], search: {}, order: {}}, + _unique: 0, + fnVersionCheck: m.fnVersionCheck, + iApiIndex: 0, + oJUIClasses: {}, + sVersion: m.version + }; + h.extend(x, { + afnFiltering: x.search, + aTypes: x.type.detect, + ofnSearch: x.type.search, + oSort: x.type.order, + afnSortData: x.order, + aoFeatures: x.feature, + oApi: x.internal, + oStdClasses: x.classes, + oPagination: x.pager + }); + h.extend(m.ext.classes, { + sTable: "dataTable", + sNoFooter: "no-footer", + sPageButton: "paginate_button", + sPageButtonActive: "current", + sPageButtonDisabled: "disabled", + sStripeOdd: "odd", + sStripeEven: "even", + sRowEmpty: "dataTables_empty", + sWrapper: "dataTables_wrapper", + sFilter: "dataTables_filter", + sInfo: "dataTables_info", + sPaging: "dataTables_paginate paging_", + sLength: "dataTables_length", + sProcessing: "dataTables_processing", + sSortAsc: "sorting_asc", + sSortDesc: "sorting_desc", + sSortable: "sorting", + sSortableAsc: "sorting_asc_disabled", + sSortableDesc: "sorting_desc_disabled", + sSortableNone: "sorting_disabled", + sSortColumn: "sorting_", + sFilterInput: "", + sLengthSelect: "", + sScrollWrapper: "dataTables_scroll", + sScrollHead: "dataTables_scrollHead", + sScrollHeadInner: "dataTables_scrollHeadInner", + sScrollBody: "dataTables_scrollBody", + sScrollFoot: "dataTables_scrollFoot", + sScrollFootInner: "dataTables_scrollFootInner", + sHeaderTH: "", + sFooterTH: "", + sSortJUIAsc: "", + sSortJUIDesc: "", + sSortJUI: "", + sSortJUIAscAllowed: "", + sSortJUIDescAllowed: "", + sSortJUIWrapper: "", + sSortIcon: "", + sJUIHeader: "", + sJUIFooter: "" + }); + var Ea = "", Ea = "", G = Ea + "ui-state-default", ka = Ea + "css_right ui-icon ui-icon-", + Yb = Ea + "fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix"; + h.extend(m.ext.oJUIClasses, + m.ext.classes, { + sPageButton: "fg-button ui-button " + G, + sPageButtonActive: "ui-state-disabled", + sPageButtonDisabled: "ui-state-disabled", + sPaging: "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_", + sSortAsc: G + " sorting_asc", + sSortDesc: G + " sorting_desc", + sSortable: G + " sorting", + sSortableAsc: G + " sorting_asc_disabled", + sSortableDesc: G + " sorting_desc_disabled", + sSortableNone: G + " sorting_disabled", + sSortJUIAsc: ka + "triangle-1-n", + sSortJUIDesc: ka + "triangle-1-s", + sSortJUI: ka + "carat-2-n-s", + sSortJUIAscAllowed: ka + "carat-1-n", + sSortJUIDescAllowed: ka + "carat-1-s", + sSortJUIWrapper: "DataTables_sort_wrapper", + sSortIcon: "DataTables_sort_icon", + sScrollHead: "dataTables_scrollHead " + G, + sScrollFoot: "dataTables_scrollFoot " + G, + sHeaderTH: G, + sFooterTH: G, + sJUIHeader: Yb + " ui-corner-tl ui-corner-tr", + sJUIFooter: Yb + " ui-corner-bl ui-corner-br" + }); + var Nb = m.ext.pager; + h.extend(Nb, { + simple: function () { + return ["previous", "next"] + }, full: function () { + return ["first", "previous", "next", "last"] + }, numbers: function (a, b) { + return [ia(a, + b)] + }, simple_numbers: function (a, b) { + return ["previous", ia(a, b), "next"] + }, full_numbers: function (a, b) { + return ["first", "previous", ia(a, b), "next", "last"] + }, first_last_numbers: function (a, b) { + return ["first", ia(a, b), "last"] + }, _numbers: ia, numbers_length: 7 + }); + h.extend(!0, m.ext.renderer, { + pageButton: { + _: function (a, b, c, d, e, f) { + var g = a.oClasses, j = a.oLanguage.oPaginate, i = a.oLanguage.oAria.paginate || {}, m, l, p = 0, + r = function (b, d) { + var k, t, u, s, v = function (b) { + Va(a, b.data.action, true) + }; + k = 0; + for (t = d.length; k < t; k++) { + s = d[k]; + if (h.isArray(s)) { + u = + h("<" + (s.DT_el || "div") + "/>").appendTo(b); + r(u, s) + } else { + m = null; + l = ""; + switch (s) { + case "ellipsis": + b.append(''); + break; + case "first": + m = j.sFirst; + l = s + (e > 0 ? "" : " " + g.sPageButtonDisabled); + break; + case "previous": + m = j.sPrevious; + l = s + (e > 0 ? "" : " " + g.sPageButtonDisabled); + break; + case "next": + m = j.sNext; + l = s + (e < f - 1 ? "" : " " + g.sPageButtonDisabled); + break; + case "last": + m = j.sLast; + l = s + (e < f - 1 ? "" : " " + g.sPageButtonDisabled); + break; + default: + m = s + 1; + l = e === s ? g.sPageButtonActive : "" + } + if (m !== null) { + u = h("", { + "class": g.sPageButton + + " " + l, + "aria-controls": a.sTableId, + "aria-label": i[s], + "data-dt-idx": p, + tabindex: a.iTabIndex, + id: c === 0 && typeof s === "string" ? a.sTableId + "_" + s : null + }).html(m).appendTo(b); + Ya(u, {action: s}, v); + p++ + } + } + } + }, t; + try { + t = h(b).find(H.activeElement).data("dt-idx") + } catch (u) { + } + r(h(b).empty(), d); + t !== k && h(b).find("[data-dt-idx=" + t + "]").focus() + } + } + }); + h.extend(m.ext.type.detect, [function (a, b) { + var c = b.oLanguage.sDecimal; + return ab(a, c) ? "num" + c : null + }, function (a) { + if (a && !(a instanceof Date) && !cc.test(a)) return null; + var b = Date.parse(a); + return null !== b && !isNaN(b) || M(a) ? "date" : null + }, function (a, b) { + var c = b.oLanguage.sDecimal; + return ab(a, c, !0) ? "num-fmt" + c : null + }, function (a, b) { + var c = b.oLanguage.sDecimal; + return Sb(a, c) ? "html-num" + c : null + }, function (a, b) { + var c = b.oLanguage.sDecimal; + return Sb(a, c, !0) ? "html-num-fmt" + c : null + }, function (a) { + return M(a) || "string" === typeof a && -1 !== a.indexOf("<") ? "html" : null + }]); + h.extend(m.ext.type.search, { + html: function (a) { + return M(a) ? a : "string" === typeof a ? a.replace(Pb, " ").replace(Ca, "") : "" + }, string: function (a) { + return M(a) ? + a : "string" === typeof a ? a.replace(Pb, " ") : a + } + }); + var Ba = function (a, b, c, d) { + if (0 !== a && (!a || "-" === a)) return -Infinity; + b && (a = Rb(a, b)); + a.replace && (c && (a = a.replace(c, "")), d && (a = a.replace(d, ""))); + return 1 * a + }; + h.extend(x.type.order, { + "date-pre": function (a) { + return Date.parse(a) || -Infinity + }, "html-pre": function (a) { + return M(a) ? "" : a.replace ? a.replace(/<.*?>/g, "").toLowerCase() : a + "" + }, "string-pre": function (a) { + return M(a) ? "" : "string" === typeof a ? a.toLowerCase() : !a.toString ? "" : a.toString() + }, "string-asc": function (a, b) { + return a < + b ? -1 : a > b ? 1 : 0 + }, "string-desc": function (a, b) { + return a < b ? 1 : a > b ? -1 : 0 + } + }); + fb(""); + h.extend(!0, m.ext.renderer, { + header: { + _: function (a, b, c, d) { + h(a.nTable).on("order.dt.DT", function (e, f, g, h) { + if (a === f) { + e = c.idx; + b.removeClass(c.sSortingClass + " " + d.sSortAsc + " " + d.sSortDesc).addClass(h[e] == "asc" ? d.sSortAsc : h[e] == "desc" ? d.sSortDesc : c.sSortingClass) + } + }) + }, jqueryui: function (a, b, c, d) { + h("
                ").addClass(d.sSortJUIWrapper).append(b.contents()).append(h("").addClass(d.sSortIcon + " " + c.sSortingClassJUI)).appendTo(b); + h(a.nTable).on("order.dt.DT", function (e, f, g, h) { + if (a === f) { + e = c.idx; + b.removeClass(d.sSortAsc + " " + d.sSortDesc).addClass(h[e] == "asc" ? d.sSortAsc : h[e] == "desc" ? d.sSortDesc : c.sSortingClass); + b.find("span." + d.sSortIcon).removeClass(d.sSortJUIAsc + " " + d.sSortJUIDesc + " " + d.sSortJUI + " " + d.sSortJUIAscAllowed + " " + d.sSortJUIDescAllowed).addClass(h[e] == "asc" ? d.sSortJUIAsc : h[e] == "desc" ? d.sSortJUIDesc : c.sSortingClassJUI) + } + }) + } + } + }); + var Zb = function (a) { + return "string" === typeof a ? a.replace(//g, ">").replace(/"/g, + """) : a + }; + m.render = { + number: function (a, b, c, d, e) { + return { + display: function (f) { + if ("number" !== typeof f && "string" !== typeof f) return f; + var g = 0 > f ? "-" : "", h = parseFloat(f); + if (isNaN(h)) return Zb(f); + h = h.toFixed(c); + f = Math.abs(h); + h = parseInt(f, 10); + f = c ? b + (f - h).toFixed(c).substring(2) : ""; + return g + (d || "") + h.toString().replace(/\B(?=(\d{3})+(?!\d))/g, a) + f + (e || "") + } + } + }, text: function () { + return {display: Zb} + } + }; + h.extend(m.ext.internal, { + _fnExternApiFunc: Ob, + _fnBuildAjax: ua, + _fnAjaxUpdate: nb, + _fnAjaxParameters: wb, + _fnAjaxUpdateDraw: xb, + _fnAjaxDataSrc: va, + _fnAddColumn: Ga, + _fnColumnOptions: la, + _fnAdjustColumnSizing: Z, + _fnVisibleToColumnIndex: $, + _fnColumnIndexToVisible: aa, + _fnVisbleColumns: ba, + _fnGetColumns: na, + _fnColumnTypes: Ia, + _fnApplyColumnDefs: kb, + _fnHungarianMap: Y, + _fnCamelToHungarian: J, + _fnLanguageCompat: Fa, + _fnBrowserDetect: ib, + _fnAddData: N, + _fnAddTr: oa, + _fnNodeToDataIndex: function (a, b) { + return b._DT_RowIndex !== k ? b._DT_RowIndex : null + }, + _fnNodeToColumnIndex: function (a, b, c) { + return h.inArray(c, a.aoData[b].anCells) + }, + _fnGetCellData: B, + _fnSetCellData: lb, + _fnSplitObjNotation: La, + _fnGetObjectDataFn: R, + _fnSetObjectDataFn: S, + _fnGetDataMaster: Ma, + _fnClearTable: pa, + _fnDeleteIndex: qa, + _fnInvalidate: da, + _fnGetRowElements: Ka, + _fnCreateTr: Ja, + _fnBuildHead: mb, + _fnDrawHead: fa, + _fnDraw: O, + _fnReDraw: T, + _fnAddOptionsHtml: pb, + _fnDetectHeader: ea, + _fnGetUniqueThs: ta, + _fnFeatureHtmlFilter: rb, + _fnFilterComplete: ga, + _fnFilterCustom: Ab, + _fnFilterColumn: zb, + _fnFilter: yb, + _fnFilterCreateSearch: Ra, + _fnEscapeRegex: Sa, + _fnFilterData: Bb, + _fnFeatureHtmlInfo: ub, + _fnUpdateInfo: Eb, + _fnInfoMacros: Fb, + _fnInitialise: ha, + _fnInitComplete: wa, + _fnLengthChange: Ta, + _fnFeatureHtmlLength: qb, + _fnFeatureHtmlPaginate: vb, + _fnPageChange: Va, + _fnFeatureHtmlProcessing: sb, + _fnProcessingDisplay: C, + _fnFeatureHtmlTable: tb, + _fnScrollDraw: ma, + _fnApplyToChildren: I, + _fnCalculateColumnWidths: Ha, + _fnThrottle: Qa, + _fnConvertToWidth: Gb, + _fnGetWidestNode: Hb, + _fnGetMaxLenString: Ib, + _fnStringToCss: v, + _fnSortFlatten: W, + _fnSort: ob, + _fnSortAria: Kb, + _fnSortListener: Xa, + _fnSortAttachListener: Oa, + _fnSortingClasses: ya, + _fnSortData: Jb, + _fnSaveState: za, + _fnLoadState: Lb, + _fnSettingsFromNode: Aa, + _fnLog: K, + _fnMap: F, + _fnBindAction: Ya, + _fnCallbackReg: z, + _fnCallbackFire: s, + _fnLengthOverflow: Ua, + _fnRenderer: Pa, + _fnDataSource: y, + _fnRowAttributes: Na, + _fnCalculateEnd: function () { + } + }); + h.fn.dataTable = m; + m.$ = h; + h.fn.dataTableSettings = m.settings; + h.fn.dataTableExt = m.ext; + h.fn.DataTable = function (a) { + return h(this).dataTable(a).api() + }; + h.each(m, function (a, b) { + h.fn.DataTable[a] = b + }); + return h.fn.dataTable +}); + + +/*! + DataTables Bootstrap 3 integration + ©2011-2015 SpryMedia Ltd - datatables.net/license +*/ +(function (b) { + "function" === typeof define && define.amd ? define(["jquery", "datatables.net"], function (a) { + return b(a, window, document) + }) : "object" === typeof exports ? module.exports = function (a, d) { + a || (a = window); + if (!d || !d.fn.dataTable) d = require("datatables.net")(a, d).$; + return b(d, a, a.document) + } : b(jQuery, window, document) +})(function (b, a, d, m) { + var f = b.fn.dataTable; + b.extend(!0, f.defaults, { + dom: "<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>", + renderer: "bootstrap" + }); + b.extend(f.ext.classes, + { + sWrapper: "dataTables_wrapper form-inline dt-bootstrap", + sFilterInput: "form-control input-sm", + sLengthSelect: "form-control input-sm", + sProcessing: "dataTables_processing panel panel-default" + }); + f.ext.renderer.pageButton.bootstrap = function (a, h, r, s, j, n) { + var o = new f.Api(a), t = a.oClasses, k = a.oLanguage.oPaginate, u = a.oLanguage.oAria.paginate || {}, e, g, + p = 0, q = function (d, f) { + var l, h, i, c, m = function (a) { + a.preventDefault(); + !b(a.currentTarget).hasClass("disabled") && o.page() != a.data.action && o.page(a.data.action).draw("page") + }; + l = 0; + for (h = f.length; l < h; l++) if (c = f[l], b.isArray(c)) q(d, c); else { + g = e = ""; + switch (c) { + case "ellipsis": + e = "…"; + g = "disabled"; + break; + case "first": + e = k.sFirst; + g = c + (0 < j ? "" : " disabled"); + break; + case "previous": + e = k.sPrevious; + g = c + (0 < j ? "" : " disabled"); + break; + case "next": + e = k.sNext; + g = c + (j < n - 1 ? "" : " disabled"); + break; + case "last": + e = k.sLast; + g = c + (j < n - 1 ? "" : " disabled"); + break; + default: + e = c + 1, g = j === c ? "active" : "" + } + e && (i = b("
              • ", { + "class": t.sPageButton + " " + g, + id: 0 === r && "string" === typeof c ? a.sTableId + "_" + c : null + }).append(b("", { + href: "#", + "aria-controls": a.sTableId, "aria-label": u[c], "data-dt-idx": p, tabindex: a.iTabIndex + }).html(e)).appendTo(d), a.oApi._fnBindAction(i, {action: c}, m), p++) + } + }, i; + try { + i = b(h).find(d.activeElement).data("dt-idx") + } catch (v) { + } + q(b(h).empty().html('
                  ').children("ul"), s); + i !== m && b(h).find("[data-dt-idx=" + i + "]").focus() + }; + return f +}); + + +/*! + FixedHeader 3.1.2 + ©2009-2016 SpryMedia Ltd - datatables.net/license +*/ +(function (d) { + "function" === typeof define && define.amd ? define(["jquery", "datatables.net"], function (g) { + return d(g, window, document) + }) : "object" === typeof exports ? module.exports = function (g, h) { + g || (g = window); + if (!h || !h.fn.dataTable) h = require("datatables.net")(g, h).$; + return d(h, g, g.document) + } : d(jQuery, window, document) +})(function (d, g, h, k) { + var j = d.fn.dataTable, l = 0, i = function (b, a) { + if (!(this instanceof i)) throw"FixedHeader must be initialised with the 'new' keyword."; + !0 === a && (a = {}); + b = new j.Api(b); + this.c = d.extend(!0, + {}, i.defaults, a); + this.s = { + dt: b, + position: { + theadTop: 0, + tbodyTop: 0, + tfootTop: 0, + tfootBottom: 0, + width: 0, + left: 0, + tfootHeight: 0, + theadHeight: 0, + windowHeight: d(g).height(), + visible: !0 + }, + headerMode: null, + footerMode: null, + autoWidth: b.settings()[0].oFeatures.bAutoWidth, + namespace: ".dtfc" + l++, + scrollLeft: {header: -1, footer: -1}, + enable: !0 + }; + this.dom = { + floatingHeader: null, + thead: d(b.table().header()), + tbody: d(b.table().body()), + tfoot: d(b.table().footer()), + header: {host: null, floating: null, placeholder: null}, + footer: { + host: null, floating: null, + placeholder: null + } + }; + this.dom.header.host = this.dom.thead.parent(); + this.dom.footer.host = this.dom.tfoot.parent(); + var e = b.settings()[0]; + if (e._fixedHeader) throw"FixedHeader already initialised on table " + e.nTable.id; + e._fixedHeader = this; + this._constructor() + }; + d.extend(i.prototype, { + enable: function (b) { + this.s.enable = b; + this.c.header && this._modeChange("in-place", "header", !0); + this.c.footer && this.dom.tfoot.length && this._modeChange("in-place", "footer", !0); + this.update() + }, headerOffset: function (b) { + b !== k && (this.c.headerOffset = + b, this.update()); + return this.c.headerOffset + }, footerOffset: function (b) { + b !== k && (this.c.footerOffset = b, this.update()); + return this.c.footerOffset + }, update: function () { + this._positions(); + this._scroll(!0) + }, _constructor: function () { + var b = this, a = this.s.dt; + d(g).on("scroll" + this.s.namespace, function () { + b._scroll() + }).on("resize" + this.s.namespace, function () { + b.s.position.windowHeight = d(g).height(); + b.update() + }); + var e = d(".fh-fixedHeader"); + !this.c.headerOffset && e.length && (this.c.headerOffset = e.outerHeight()); + e = d(".fh-fixedFooter"); + !this.c.footerOffset && e.length && (this.c.footerOffset = e.outerHeight()); + a.on("column-reorder.dt.dtfc column-visibility.dt.dtfc draw.dt.dtfc column-sizing.dt.dtfc", function () { + b.update() + }); + a.on("destroy.dtfc", function () { + a.off(".dtfc"); + d(g).off(b.s.namespace) + }); + this._positions(); + this._scroll() + }, _clone: function (b, a) { + var e = this.s.dt, c = this.dom[b], f = "header" === b ? this.dom.thead : this.dom.tfoot; + !a && c.floating ? c.floating.removeClass("fixedHeader-floating fixedHeader-locked") : (c.floating && (c.placeholder.remove(), + this._unsize(b), c.floating.children().detach(), c.floating.remove()), c.floating = d(e.table().node().cloneNode(!1)).css("table-layout", "fixed").removeAttr("id").append(f).appendTo("body"), c.placeholder = f.clone(!1), c.host.prepend(c.placeholder), this._matchWidths(c.placeholder, c.floating)) + }, _matchWidths: function (b, a) { + var e = function (a) { + return d(a, b).map(function () { + return d(this).width() + }).toArray() + }, c = function (b, c) { + d(b, a).each(function (a) { + d(this).css({width: c[a], minWidth: c[a]}) + }) + }, f = e("th"), e = e("td"); + c("th", + f); + c("td", e) + }, _unsize: function (b) { + var a = this.dom[b].floating; + a && ("footer" === b || "header" === b && !this.s.autoWidth) ? d("th, td", a).css({ + width: "", + minWidth: "" + }) : a && "header" === b && d("th, td", a).css("min-width", "") + }, _horizontal: function (b, a) { + var e = this.dom[b], c = this.s.position, d = this.s.scrollLeft; + e.floating && d[b] !== a && (e.floating.css("left", c.left - a), d[b] = a) + }, _modeChange: function (b, a, e) { + var c = this.dom[a], f = this.s.position, + g = d.contains(this.dom["footer" === a ? "tfoot" : "thead"][0], h.activeElement) ? h.activeElement : + null; + if ("in-place" === b) { + if (c.placeholder && (c.placeholder.remove(), c.placeholder = null), this._unsize(a), "header" === a ? c.host.prepend(this.dom.thead) : c.host.append(this.dom.tfoot), c.floating) c.floating.remove(), c.floating = null + } else "in" === b ? (this._clone(a, e), c.floating.addClass("fixedHeader-floating").css("header" === a ? "top" : "bottom", this.c[a + "Offset"]).css("left", f.left + "px").css("width", f.width + "px"), "footer" === a && c.floating.css("top", "")) : "below" === b ? (this._clone(a, e), c.floating.addClass("fixedHeader-locked").css("top", + f.tfootTop - f.theadHeight).css("left", f.left + "px").css("width", f.width + "px")) : "above" === b && (this._clone(a, e), c.floating.addClass("fixedHeader-locked").css("top", f.tbodyTop).css("left", f.left + "px").css("width", f.width + "px")); + g && g !== h.activeElement && g.focus(); + this.s.scrollLeft.header = -1; + this.s.scrollLeft.footer = -1; + this.s[a + "Mode"] = b + }, _positions: function () { + var b = this.s.dt.table(), a = this.s.position, e = this.dom, b = d(b.node()), c = b.children("thead"), + f = b.children("tfoot"), e = e.tbody; + a.visible = b.is(":visible"); + a.width = b.outerWidth(); + a.left = b.offset().left; + a.theadTop = c.offset().top; + a.tbodyTop = e.offset().top; + a.theadHeight = a.tbodyTop - a.theadTop; + f.length ? (a.tfootTop = f.offset().top, a.tfootBottom = a.tfootTop + f.outerHeight(), a.tfootHeight = a.tfootBottom - a.tfootTop) : (a.tfootTop = a.tbodyTop + e.outerHeight(), a.tfootBottom = a.tfootTop, a.tfootHeight = a.tfootTop) + }, _scroll: function (b) { + var a = d(h).scrollTop(), e = d(h).scrollLeft(), c = this.s.position, f; + if (this.s.enable && (this.c.header && (f = !c.visible || a <= c.theadTop - this.c.headerOffset ? + "in-place" : a <= c.tfootTop - c.theadHeight - this.c.headerOffset ? "in" : "below", (b || f !== this.s.headerMode) && this._modeChange(f, "header", b), this._horizontal("header", e)), this.c.footer && this.dom.tfoot.length)) a = !c.visible || a + c.windowHeight >= c.tfootBottom + this.c.footerOffset ? "in-place" : c.windowHeight + a > c.tbodyTop + c.tfootHeight + this.c.footerOffset ? "in" : "above", (b || a !== this.s.footerMode) && this._modeChange(a, "footer", b), this._horizontal("footer", e) + } + }); + i.version = "3.1.2"; + i.defaults = { + header: !0, footer: !1, headerOffset: 0, + footerOffset: 0 + }; + d.fn.dataTable.FixedHeader = i; + d.fn.DataTable.FixedHeader = i; + d(h).on("init.dt.dtfh", function (b, a) { + if ("dt" === b.namespace) { + var e = a.oInit.fixedHeader, c = j.defaults.fixedHeader; + if ((e || c) && !a._fixedHeader) c = d.extend({}, c, e), !1 !== e && new i(a, c) + } + }); + j.Api.register("fixedHeader()", function () { + }); + j.Api.register("fixedHeader.adjust()", function () { + return this.iterator("table", function (b) { + (b = b._fixedHeader) && b.update() + }) + }); + j.Api.register("fixedHeader.enable()", function (b) { + return this.iterator("table", + function (a) { + (a = a._fixedHeader) && a.enable(b !== k ? b : !0) + }) + }); + j.Api.register("fixedHeader.disable()", function () { + return this.iterator("table", function (b) { + (b = b._fixedHeader) && b.enable(!1) + }) + }); + d.each(["header", "footer"], function (b, a) { + j.Api.register("fixedHeader." + a + "Offset()", function (b) { + var c = this.context; + return b === k ? c.length && c[0]._fixedHeader ? c[0]._fixedHeader[a + "Offset"]() : k : this.iterator("table", function (c) { + if (c = c._fixedHeader) c[a + "Offset"](b) + }) + }) + }); + return i +}); + + +/*! + Responsive 2.1.1 + 2014-2016 SpryMedia Ltd - datatables.net/license +*/ +(function (c) { + "function" === typeof define && define.amd ? define(["jquery", "datatables.net"], function (l) { + return c(l, window, document) + }) : "object" === typeof exports ? module.exports = function (l, k) { + l || (l = window); + if (!k || !k.fn.dataTable) k = require("datatables.net")(l, k).$; + return c(k, l, l.document) + } : c(jQuery, window, document) +})(function (c, l, k, p) { + var m = c.fn.dataTable, j = function (b, a) { + if (!m.versionCheck || !m.versionCheck("1.10.3")) throw"DataTables Responsive requires DataTables 1.10.3 or newer"; + this.s = { + dt: new m.Api(b), columns: [], + current: [] + }; + this.s.dt.settings()[0].responsive || (a && "string" === typeof a.details ? a.details = {type: a.details} : a && !1 === a.details ? a.details = {type: !1} : a && !0 === a.details && (a.details = {type: "inline"}), this.c = c.extend(!0, {}, j.defaults, m.defaults.responsive, a), b.responsive = this, this._constructor()) + }; + c.extend(j.prototype, { + _constructor: function () { + var b = this, a = this.s.dt, d = a.settings()[0], e = c(l).width(); + a.settings()[0]._responsive = this; + c(l).on("resize.dtr orientationchange.dtr", m.util.throttle(function () { + var a = + c(l).width(); + a !== e && (b._resize(), e = a) + })); + d.oApi._fnCallbackReg(d, "aoRowCreatedCallback", function (e) { + -1 !== c.inArray(!1, b.s.current) && c(">td, >th", e).each(function (e) { + e = a.column.index("toData", e); + !1 === b.s.current[e] && c(this).css("display", "none") + }) + }); + a.on("destroy.dtr", function () { + a.off(".dtr"); + c(a.table().body()).off(".dtr"); + c(l).off("resize.dtr orientationchange.dtr"); + c.each(b.s.current, function (a, e) { + !1 === e && b._setColumnVis(a, !0) + }) + }); + this.c.breakpoints.sort(function (a, b) { + return a.width < b.width ? 1 : a.width > + b.width ? -1 : 0 + }); + this._classLogic(); + this._resizeAuto(); + d = this.c.details; + !1 !== d.type && (b._detailsInit(), a.on("column-visibility.dtr", function () { + b._classLogic(); + b._resizeAuto(); + b._resize() + }), a.on("draw.dtr", function () { + b._redrawChildren() + }), c(a.table().node()).addClass("dtr-" + d.type)); + a.on("column-reorder.dtr", function () { + b._classLogic(); + b._resizeAuto(); + b._resize() + }); + a.on("column-sizing.dtr", function () { + b._resizeAuto(); + b._resize() + }); + a.on("preXhr.dtr", function () { + var e = []; + a.rows().every(function () { + this.child.isShown() && + e.push(this.id(true)) + }); + a.one("draw.dtr", function () { + a.rows(e).every(function () { + b._detailsDisplay(this, false) + }) + }) + }); + a.on("init.dtr", function () { + b._resizeAuto(); + b._resize(); + c.inArray(false, b.s.current) && a.columns.adjust() + }); + this._resize() + }, _columnsVisiblity: function (b) { + var a = this.s.dt, d = this.s.columns, e, f, g = d.map(function (a, b) { + return {columnIdx: b, priority: a.priority} + }).sort(function (a, b) { + return a.priority !== b.priority ? a.priority - b.priority : a.columnIdx - b.columnIdx + }), h = c.map(d, function (a) { + return a.auto && + null === a.minWidth ? !1 : !0 === a.auto ? "-" : -1 !== c.inArray(b, a.includeIn) + }), n = 0; + e = 0; + for (f = h.length; e < f; e++) !0 === h[e] && (n += d[e].minWidth); + e = a.settings()[0].oScroll; + e = e.sY || e.sX ? e.iBarWidth : 0; + a = a.table().container().offsetWidth - e - n; + e = 0; + for (f = h.length; e < f; e++) d[e].control && (a -= d[e].minWidth); + n = !1; + e = 0; + for (f = g.length; e < f; e++) { + var i = g[e].columnIdx; + "-" === h[i] && (!d[i].control && d[i].minWidth) && (n || 0 > a - d[i].minWidth ? (n = !0, h[i] = !1) : h[i] = !0, a -= d[i].minWidth) + } + g = !1; + e = 0; + for (f = d.length; e < f; e++) if (!d[e].control && !d[e].never && + !h[e]) { + g = !0; + break + } + e = 0; + for (f = d.length; e < f; e++) d[e].control && (h[e] = g); + -1 === c.inArray(!0, h) && (h[0] = !0); + return h + }, _classLogic: function () { + var b = this, a = this.c.breakpoints, d = this.s.dt, e = d.columns().eq(0).map(function (a) { + var b = this.column(a), e = b.header().className, a = d.settings()[0].aoColumns[a].responsivePriority; + a === p && (b = c(b.header()).data("priority"), a = b !== p ? 1 * b : 1E4); + return { + className: e, + includeIn: [], + auto: !1, + control: !1, + never: e.match(/\bnever\b/) ? !0 : !1, + priority: a + } + }), f = function (a, b) { + var d = e[a].includeIn; + -1 === + c.inArray(b, d) && d.push(b) + }, g = function (c, d, i, g) { + if (i) if ("max-" === i) { + g = b._find(d).width; + d = 0; + for (i = a.length; d < i; d++) a[d].width <= g && f(c, a[d].name) + } else if ("min-" === i) { + g = b._find(d).width; + d = 0; + for (i = a.length; d < i; d++) a[d].width >= g && f(c, a[d].name) + } else { + if ("not-" === i) { + d = 0; + for (i = a.length; d < i; d++) -1 === a[d].name.indexOf(g) && f(c, a[d].name) + } + } else e[c].includeIn.push(d) + }; + e.each(function (b, e) { + for (var d = b.className.split(" "), f = !1, j = 0, l = d.length; j < l; j++) { + var k = c.trim(d[j]); + if ("all" === k) { + f = !0; + b.includeIn = c.map(a, function (a) { + return a.name + }); + return + } + if ("none" === k || b.never) { + f = !0; + return + } + if ("control" === k) { + f = !0; + b.control = !0; + return + } + c.each(a, function (a, b) { + var d = b.name.split("-"), + c = k.match(RegExp("(min\\-|max\\-|not\\-)?(" + d[0] + ")(\\-[_a-zA-Z0-9])?")); + c && (f = !0, c[2] === d[0] && c[3] === "-" + d[1] ? g(e, b.name, c[1], c[2] + c[3]) : c[2] === d[0] && !c[3] && g(e, b.name, c[1], c[2])) + }) + } + f || (b.auto = !0) + }); + this.s.columns = e + }, _detailsDisplay: function (b, a) { + var d = this, e = this.s.dt, f = this.c.details; + if (f && !1 !== f.type) { + var g = f.display(b, a, function () { + return f.renderer(e, b[0], d._detailsObj(b[0])) + }); + (!0 === g || !1 === g) && c(e.table().node()).triggerHandler("responsive-display.dt", [e, b, g, a]) + } + }, _detailsInit: function () { + var b = this, a = this.s.dt, d = this.c.details; + "inline" === d.type && (d.target = "td:first-child, th:first-child"); + a.on("draw.dtr", function () { + b._tabIndexes() + }); + b._tabIndexes(); + c(a.table().body()).on("keyup.dtr", "td, th", function (b) { + b.keyCode === 13 && c(this).data("dtr-keyboard") && c(this).click() + }); + var e = d.target; + c(a.table().body()).on("click.dtr mousedown.dtr mouseup.dtr", "string" === typeof e ? e : "td, th", + function (d) { + if (c(a.table().node()).hasClass("collapsed") && c.inArray(c(this).closest("tr").get(0), a.rows().nodes().toArray()) !== -1) { + if (typeof e === "number") { + var g = e < 0 ? a.columns().eq(0).length + e : e; + if (a.cell(this).index().column !== g) return + } + g = a.row(c(this).closest("tr")); + d.type === "click" ? b._detailsDisplay(g, false) : d.type === "mousedown" ? c(this).css("outline", "none") : d.type === "mouseup" && c(this).blur().css("outline", "") + } + }) + }, _detailsObj: function (b) { + var a = this, d = this.s.dt; + return c.map(this.s.columns, function (e, + c) { + if (!e.never && !e.control) return { + title: d.settings()[0].aoColumns[c].sTitle, + data: d.cell(b, c).render(a.c.orthogonal), + hidden: d.column(c).visible() && !a.s.current[c], + columnIndex: c, + rowIndex: b + } + }) + }, _find: function (b) { + for (var a = this.c.breakpoints, d = 0, c = a.length; d < c; d++) if (a[d].name === b) return a[d] + }, _redrawChildren: function () { + var b = this, a = this.s.dt; + a.rows({page: "current"}).iterator("row", function (c, e) { + a.row(e); + b._detailsDisplay(a.row(e), !0) + }) + }, _resize: function () { + var b = this, a = this.s.dt, d = c(l).width(), e = this.c.breakpoints, + f = e[0].name, g = this.s.columns, h, j = this.s.current.slice(); + for (h = e.length - 1; 0 <= h; h--) if (d <= e[h].width) { + f = e[h].name; + break + } + var i = this._columnsVisiblity(f); + this.s.current = i; + e = !1; + h = 0; + for (d = g.length; h < d; h++) if (!1 === i[h] && !g[h].never && !g[h].control) { + e = !0; + break + } + c(a.table().node()).toggleClass("collapsed", e); + var k = !1; + a.columns().eq(0).each(function (a, c) { + i[c] !== j[c] && (k = !0, b._setColumnVis(a, i[c])) + }); + k && (this._redrawChildren(), c(a.table().node()).trigger("responsive-resize.dt", [a, this.s.current])) + }, _resizeAuto: function () { + var b = + this.s.dt, a = this.s.columns; + if (this.c.auto && -1 !== c.inArray(!0, c.map(a, function (b) { + return b.auto + }))) { + b.table().node(); + var d = b.table().node().cloneNode(!1), e = c(b.table().header().cloneNode(!1)).appendTo(d), + f = c(b.table().body()).clone(!1, !1).empty().appendTo(d), + g = b.columns().header().filter(function (a) { + return b.column(a).visible() + }).to$().clone(!1).css("display", "table-cell"); + c(f).append(c(b.rows({page: "current"}).nodes()).clone(!1)).find("th, td").css("display", ""); + if (f = b.table().footer()) { + var f = c(f.cloneNode(!1)).appendTo(d), + h = b.columns().footer().filter(function (a) { + return b.column(a).visible() + }).to$().clone(!1).css("display", "table-cell"); + c("
              • ").append(h).appendTo(f) + } + c("").append(g).appendTo(e); + "inline" === this.c.details.type && c(d).addClass("dtr-inline collapsed"); + c(d).find("[name]").removeAttr("name"); + d = c("
                ").css({width: 1, height: 1, overflow: "hidden"}).append(d); + d.insertBefore(b.table().node()); + g.each(function (c) { + c = b.column.index("fromVisible", c); + a[c].minWidth = this.offsetWidth || 0 + }); + d.remove() + } + }, _setColumnVis: function (b, + a) { + var d = this.s.dt, e = a ? "" : "none"; + c(d.column(b).header()).css("display", e); + c(d.column(b).footer()).css("display", e); + d.column(b).nodes().to$().css("display", e) + }, _tabIndexes: function () { + var b = this.s.dt, a = b.cells({page: "current"}).nodes().to$(), d = b.settings()[0], + e = this.c.details.target; + a.filter("[data-dtr-keyboard]").removeData("[data-dtr-keyboard]"); + a = "number" === typeof e ? ":eq(" + e + ")" : e; + "td:first-child, th:first-child" === a && (a = ">td:first-child, >th:first-child"); + c(a, b.rows({page: "current"}).nodes()).attr("tabIndex", + d.iTabIndex).data("dtr-keyboard", 1) + } + }); + j.breakpoints = [{name: "desktop", width: Infinity}, {name: "tablet-l", width: 1024}, { + name: "tablet-p", + width: 768 + }, {name: "mobile-l", width: 480}, {name: "mobile-p", width: 320}]; + j.display = { + childRow: function (b, a, d) { + if (a) { + if (c(b.node()).hasClass("parent")) return b.child(d(), "child").show(), !0 + } else { + if (b.child.isShown()) return b.child(!1), c(b.node()).removeClass("parent"), !1; + b.child(d(), "child").show(); + c(b.node()).addClass("parent"); + return !0 + } + }, childRowImmediate: function (b, a, d) { + if (!a && + b.child.isShown() || !b.responsive.hasHidden()) return b.child(!1), c(b.node()).removeClass("parent"), !1; + b.child(d(), "child").show(); + c(b.node()).addClass("parent"); + return !0 + }/*, modal: function (b) { + return function (a, d, e) { + if (d) c("div.dtr-modal-content").empty().append(e()); else { + var f = function () { + g.remove(); + c(k).off("keypress.dtr") + }, + g = c('
                ').append(c('
                ').append(c('
                ').append(e())).append(c('
                ×
                ').click(function () { + f() + }))).append(c('
                ').click(function () { + f() + })).appendTo("body"); + c(k).on("keyup.dtr", function (a) { + 27 === a.keyCode && (a.stopPropagation(), f()) + }) + } + b && b.header && c("div.dtr-modal-content").prepend("

                " + b.header(a) + "

                ") + } + }*/ + }; + j.renderer = { + listHidden: function () { + return function (b, a, d) { + return (b = c.map(d, function (a) { + return a.hidden ? '
              • ' + a.title + ' ' + a.data + "
              • " : "" + }).join("")) ? c('
                  ').append(b) : + !1 + } + }, tableAll: function (b) { + b = c.extend({tableClass: ""}, b); + return function (a, d, e) { + a = c.map(e, function (a) { + return '
                " + }).join(""); + return c('
                ", { + valign: "top", + colSpan: ba(a), + "class": a.oClasses.sRowEmpty + }).html(c))[0]; + s(a, "aoHeaderCallback", "header", [h(a.nTHead).children("tr")[0], Ma(a), g, n, i]); + s(a, "aoFooterCallback", "footer", [h(a.nTFoot).children("tr")[0], Ma(a), g, n, i]); + d = h(a.nTBody); + d.children().detach(); + d.append(h(b)); + s(a, "aoDrawCallback", "draw", [a]); + a.bSorted = !1; + a.bFiltered = !1; + a.bDrawing = !1 + } + } + + function T(a, b) { + var c = a.oFeatures, d = c.bFilter; + c.bSort && ob(a); + d ? ga(a, a.oPreviousSearch) : a.aiDisplay = a.aiDisplayMaster.slice(); + !0 !== b && (a._iDisplayStart = 0); + a._drawHold = b; + O(a); + a._drawHold = !1 + } + + function pb(a) { + var b = a.oClasses, c = h(a.nTable), c = h("
                ").insertBefore(c), d = a.oFeatures, + e = h("
                ", {id: a.sTableId + "_wrapper", "class": b.sWrapper + (a.nTFoot ? "" : " " + b.sNoFooter)}); + a.nHolding = c[0]; + a.nTableWrapper = e[0]; + a.nTableReinsertBefore = a.nTable.nextSibling; + for (var f = a.sDom.split(""), g, j, i, n, l, q, k = 0; k < f.length; k++) { + g = null; + j = f[k]; + if ("<" == j) { + i = h("
                ")[0]; + n = f[k + 1]; + if ("'" == n || '"' == n) { + l = ""; + for (q = 2; f[k + q] != n;) l += f[k + q], q++; + "H" == l ? l = b.sJUIHeader : "F" == l && (l = b.sJUIFooter); + -1 != l.indexOf(".") ? (n = l.split("."), i.id = n[0].substr(1, n[0].length - 1), i.className = n[1]) : "#" == l.charAt(0) ? i.id = l.substr(1, l.length - 1) : i.className = l; + k += q + } + e.append(i); + e = h(i) + } else if (">" == j) e = e.parent(); else if ("l" == j && d.bPaginate && d.bLengthChange) g = qb(a); else if ("f" == j && d.bFilter) g = rb(a); else if ("r" == j && d.bProcessing) g = sb(a); else if ("t" == j) g = tb(a); else if ("i" == j && d.bInfo) g = ub(a); else if ("p" == + j && d.bPaginate) g = vb(a); else if (0 !== m.ext.feature.length) { + i = m.ext.feature; + q = 0; + for (n = i.length; q < n; q++) if (j == i[q].cFeature) { + g = i[q].fnInit(a); + break + } + } + g && (i = a.aanFeatures, i[j] || (i[j] = []), i[j].push(g), e.append(g)) + } + c.replaceWith(e); + a.nHolding = null + } + + function ea(a, b) { + var c = h(b).children("tr"), d, e, f, g, j, i, n, l, q, k; + a.splice(0, a.length); + f = 0; + for (i = c.length; f < i; f++) a.push([]); + f = 0; + for (i = c.length; f < i; f++) { + d = c[f]; + for (e = d.firstChild; e;) { + if ("TD" == e.nodeName.toUpperCase() || "TH" == e.nodeName.toUpperCase()) { + l = 1 * e.getAttribute("colspan"); + q = 1 * e.getAttribute("rowspan"); + l = !l || 0 === l || 1 === l ? 1 : l; + q = !q || 0 === q || 1 === q ? 1 : q; + g = 0; + for (j = a[f]; j[g];) g++; + n = g; + k = 1 === l ? !0 : !1; + for (j = 0; j < l; j++) for (g = 0; g < q; g++) a[f + g][n + j] = { + cell: e, + unique: k + }, a[f + g].nTr = d + } + e = e.nextSibling + } + } + } + + function ta(a, b, c) { + var d = []; + c || (c = a.aoHeader, b && (c = [], ea(c, b))); + for (var b = 0, e = c.length; b < e; b++) for (var f = 0, g = c[b].length; f < g; f++) if (c[b][f].unique && (!d[f] || !a.bSortCellsTop)) d[f] = c[b][f].cell; + return d + } + + function ua(a, b, c) { + s(a, "aoServerParams", "serverParams", [b]); + if (b && h.isArray(b)) { + var d = {}, + e = /(.*?)\[\]$/; + h.each(b, function (a, b) { + var c = b.name.match(e); + c ? (c = c[0], d[c] || (d[c] = []), d[c].push(b.value)) : d[b.name] = b.value + }); + b = d + } + var f, g = a.ajax, j = a.oInstance, i = function (b) { + s(a, null, "xhr", [a, b, a.jqXHR]); + c(b) + }; + if (h.isPlainObject(g) && g.data) { + f = g.data; + var n = h.isFunction(f) ? f(b, a) : f, b = h.isFunction(f) && n ? n : h.extend(!0, b, n); + delete g.data + } + n = { + data: b, success: function (b) { + var c = b.error || b.sError; + c && K(a, 0, c); + a.json = b; + i(b) + }, dataType: "json", cache: !1, type: a.sServerMethod, error: function (b, c) { + var d = s(a, null, "xhr", + [a, null, a.jqXHR]); + -1 === h.inArray(!0, d) && ("parsererror" == c ? K(a, 0, "Invalid JSON response", 1) : 4 === b.readyState && K(a, 0, "Ajax error", 7)); + C(a, !1) + } + }; + a.oAjaxData = b; + s(a, null, "preXhr", [a, b]); + a.fnServerData ? a.fnServerData.call(j, a.sAjaxSource, h.map(b, function (a, b) { + return {name: b, value: a} + }), i, a) : a.sAjaxSource || "string" === typeof g ? a.jqXHR = h.ajax(h.extend(n, {url: g || a.sAjaxSource})) : h.isFunction(g) ? a.jqXHR = g.call(j, b, i, a) : (a.jqXHR = h.ajax(h.extend(n, g)), g.data = f) + } + + function nb(a) { + return a.bAjaxDataGet ? (a.iDraw++, C(a, + !0), ua(a, wb(a), function (b) { + xb(a, b) + }), !1) : !0 + } + + function wb(a) { + var b = a.aoColumns, c = b.length, d = a.oFeatures, e = a.oPreviousSearch, f = a.aoPreSearchCols, g, j = [], i, + n, l, k = W(a); + g = a._iDisplayStart; + i = !1 !== d.bPaginate ? a._iDisplayLength : -1; + var r = function (a, b) { + j.push({name: a, value: b}) + }; + r("sEcho", a.iDraw); + r("iColumns", c); + r("sColumns", D(b, "sName").join(",")); + r("iDisplayStart", g); + r("iDisplayLength", i); + var ra = { + draw: a.iDraw, + columns: [], + order: [], + start: g, + length: i, + search: {value: e.sSearch, regex: e.bRegex} + }; + for (g = 0; g < c; g++) n = b[g], + l = f[g], i = "function" == typeof n.mData ? "function" : n.mData, ra.columns.push({ + data: i, + name: n.sName, + searchable: n.bSearchable, + orderable: n.bSortable, + search: {value: l.sSearch, regex: l.bRegex} + }), r("mDataProp_" + g, i), d.bFilter && (r("sSearch_" + g, l.sSearch), r("bRegex_" + g, l.bRegex), r("bSearchable_" + g, n.bSearchable)), d.bSort && r("bSortable_" + g, n.bSortable); + d.bFilter && (r("sSearch", e.sSearch), r("bRegex", e.bRegex)); + d.bSort && (h.each(k, function (a, b) { + ra.order.push({column: b.col, dir: b.dir}); + r("iSortCol_" + a, b.col); + r("sSortDir_" + + a, b.dir) + }), r("iSortingCols", k.length)); + b = m.ext.legacy.ajax; + return null === b ? a.sAjaxSource ? j : ra : b ? j : ra + } + + function xb(a, b) { + var c = va(a, b), d = b.sEcho !== k ? b.sEcho : b.draw, + e = b.iTotalRecords !== k ? b.iTotalRecords : b.recordsTotal, + f = b.iTotalDisplayRecords !== k ? b.iTotalDisplayRecords : b.recordsFiltered; + if (d) { + if (1 * d < a.iDraw) return; + a.iDraw = 1 * d + } + pa(a); + a._iRecordsTotal = parseInt(e, 10); + a._iRecordsDisplay = parseInt(f, 10); + d = 0; + for (e = c.length; d < e; d++) N(a, c[d]); + a.aiDisplay = a.aiDisplayMaster.slice(); + a.bAjaxDataGet = !1; + O(a); + a._bInitComplete || + wa(a, b); + a.bAjaxDataGet = !0; + C(a, !1) + } + + function va(a, b) { + var c = h.isPlainObject(a.ajax) && a.ajax.dataSrc !== k ? a.ajax.dataSrc : a.sAjaxDataProp; + return "data" === c ? b.aaData || b[c] : "" !== c ? R(c)(b) : b + } + + function rb(a) { + var b = a.oClasses, c = a.sTableId, d = a.oLanguage, e = a.oPreviousSearch, f = a.aanFeatures, + g = '', j = d.sSearch, + j = j.match(/_INPUT_/) ? j.replace("_INPUT_", g) : j + g, + b = h("
                ", {id: !f.f ? c + "_filter" : null, "class": b.sFilter}).append(h("
                ").html(B(a, c, b, "display"))[0] : d.anCells[b] + } + + function Ib(a, b) { + for (var c, d = -1, e = -1, f = 0, g = a.aoData.length; f < g; f++) c = B(a, f, b, "display") + "", c = c.replace(bc, + ""), c = c.replace(/ /g, " "), c.length > d && (d = c.length, e = f); + return e + } + + function v(a) { + return null === a ? "0px" : "number" == typeof a ? 0 > a ? "0px" : a + "px" : a.match(/\d$/) ? a + "px" : a + } + + function W(a) { + var b, c, d = [], e = a.aoColumns, f, g, j, i; + b = a.aaSortingFixed; + c = h.isPlainObject(b); + var n = []; + f = function (a) { + a.length && !h.isArray(a[0]) ? n.push(a) : h.merge(n, a) + }; + h.isArray(b) && f(b); + c && b.pre && f(b.pre); + f(a.aaSorting); + c && b.post && f(b.post); + for (a = 0; a < n.length; a++) { + i = n[a][0]; + f = e[i].aDataSort; + b = 0; + for (c = f.length; b < c; b++) g = f[b], j = e[g].sType || + "string", n[a]._idx === k && (n[a]._idx = h.inArray(n[a][1], e[g].asSorting)), d.push({ + src: i, + col: g, + dir: n[a][1], + index: n[a]._idx, + type: j, + formatter: m.ext.type.order[j + "-pre"] + }) + } + return d + } + + function ob(a) { + var b, c, d = [], e = m.ext.type.order, f = a.aoData, g = 0, j, i = a.aiDisplayMaster, h; + Ia(a); + h = W(a); + b = 0; + for (c = h.length; b < c; b++) j = h[b], j.formatter && g++, Jb(a, j.col); + if ("ssp" != y(a) && 0 !== h.length) { + b = 0; + for (c = i.length; b < c; b++) d[i[b]] = b; + g === h.length ? i.sort(function (a, b) { + var c, e, g, j, i = h.length, k = f[a]._aSortData, m = f[b]._aSortData; + for (g = + 0; g < i; g++) if (j = h[g], c = k[j.col], e = m[j.col], c = c < e ? -1 : c > e ? 1 : 0, 0 !== c) return "asc" === j.dir ? c : -c; + c = d[a]; + e = d[b]; + return c < e ? -1 : c > e ? 1 : 0 + }) : i.sort(function (a, b) { + var c, g, j, i, k = h.length, m = f[a]._aSortData, p = f[b]._aSortData; + for (j = 0; j < k; j++) if (i = h[j], c = m[i.col], g = p[i.col], i = e[i.type + "-" + i.dir] || e["string-" + i.dir], c = i(c, g), 0 !== c) return c; + c = d[a]; + g = d[b]; + return c < g ? -1 : c > g ? 1 : 0 + }) + } + a.bSorted = !0 + } + + function Kb(a) { + for (var b, c, d = a.aoColumns, e = W(a), a = a.oLanguage.oAria, f = 0, g = d.length; f < g; f++) { + c = d[f]; + var j = c.asSorting; + b = c.sTitle.replace(/<.*?>/g, + ""); + var i = c.nTh; + i.removeAttribute("aria-sort"); + c.bSortable && (0 < e.length && e[0].col == f ? (i.setAttribute("aria-sort", "asc" == e[0].dir ? "ascending" : "descending"), c = j[e[0].index + 1] || j[0]) : c = j[0], b += "asc" === c ? a.sSortAscending : a.sSortDescending); + i.setAttribute("aria-label", b) + } + } + + function Xa(a, b, c, d) { + var e = a.aaSorting, f = a.aoColumns[b].asSorting, g = function (a, b) { + var c = a._idx; + c === k && (c = h.inArray(a[1], f)); + return c + 1 < f.length ? c + 1 : b ? null : 0 + }; + "number" === typeof e[0] && (e = a.aaSorting = [e]); + c && a.oFeatures.bSortMulti ? (c = h.inArray(b, + D(e, "0")), -1 !== c ? (b = g(e[c], !0), null === b && 1 === e.length && (b = 0), null === b ? e.splice(c, 1) : (e[c][1] = f[b], e[c]._idx = b)) : (e.push([b, f[0], 0]), e[e.length - 1]._idx = 0)) : e.length && e[0][0] == b ? (b = g(e[0]), e.length = 1, e[0][1] = f[b], e[0]._idx = b) : (e.length = 0, e.push([b, f[0]]), e[0]._idx = 0); + T(a); + "function" == typeof d && d(a) + } + + function Oa(a, b, c, d) { + var e = a.aoColumns[c]; + Ya(b, {}, function (b) { + !1 !== e.bSortable && (a.oFeatures.bProcessing ? (C(a, !0), setTimeout(function () { + Xa(a, c, b.shiftKey, d); + "ssp" !== y(a) && C(a, !1) + }, 0)) : Xa(a, c, b.shiftKey, d)) + }) + } + + function ya(a) { + var b = a.aLastSort, c = a.oClasses.sSortColumn, d = W(a), e = a.oFeatures, f, g; + if (e.bSort && e.bSortClasses) { + e = 0; + for (f = b.length; e < f; e++) g = b[e].src, h(D(a.aoData, "anCells", g)).removeClass(c + (2 > e ? e + 1 : 3)); + e = 0; + for (f = d.length; e < f; e++) g = d[e].src, h(D(a.aoData, "anCells", g)).addClass(c + (2 > e ? e + 1 : 3)) + } + a.aLastSort = d + } + + function Jb(a, b) { + var c = a.aoColumns[b], d = m.ext.order[c.sSortDataType], e; + d && (e = d.call(a.oInstance, a, b, aa(a, b))); + for (var f, g = m.ext.type.order[c.sType + "-pre"], j = 0, i = a.aoData.length; j < i; j++) if (c = a.aoData[j], + c._aSortData || (c._aSortData = []), !c._aSortData[b] || d) f = d ? e[j] : B(a, j, b, "sort"), c._aSortData[b] = g ? g(f) : f + } + + function za(a) { + if (a.oFeatures.bStateSave && !a.bDestroying) { + var b = { + time: +new Date, + start: a._iDisplayStart, + length: a._iDisplayLength, + order: h.extend(!0, [], a.aaSorting), + search: Cb(a.oPreviousSearch), + columns: h.map(a.aoColumns, function (b, d) { + return {visible: b.bVisible, search: Cb(a.aoPreSearchCols[d])} + }) + }; + s(a, "aoStateSaveParams", "stateSaveParams", [a, b]); + a.oSavedState = b; + a.fnStateSaveCallback.call(a.oInstance, a, + b) + } + } + + function Lb(a, b, c) { + var d, e, f = a.aoColumns, b = function (b) { + if (b && b.time) { + var g = s(a, "aoStateLoadParams", "stateLoadParams", [a, b]); + if (-1 === h.inArray(!1, g) && (g = a.iStateDuration, !(0 < g && b.time < +new Date - 1E3 * g) && !(b.columns && f.length !== b.columns.length))) { + a.oLoadedState = h.extend(!0, {}, b); + b.start !== k && (a._iDisplayStart = b.start, a.iInitDisplayStart = b.start); + b.length !== k && (a._iDisplayLength = b.length); + b.order !== k && (a.aaSorting = [], h.each(b.order, function (b, c) { + a.aaSorting.push(c[0] >= f.length ? [0, c[1]] : c) + })); + b.search !== + k && h.extend(a.oPreviousSearch, Db(b.search)); + if (b.columns) { + d = 0; + for (e = b.columns.length; d < e; d++) g = b.columns[d], g.visible !== k && (f[d].bVisible = g.visible), g.search !== k && h.extend(a.aoPreSearchCols[d], Db(g.search)) + } + s(a, "aoStateLoaded", "stateLoaded", [a, b]) + } + } + c() + }; + if (a.oFeatures.bStateSave) { + var g = a.fnStateLoadCallback.call(a.oInstance, a, b); + g !== k && b(g) + } else c() + } + + function Aa(a) { + var b = m.settings, a = h.inArray(a, D(b, "nTable")); + return -1 !== a ? b[a] : null + } + + function K(a, b, c, d) { + c = "DataTables warning: " + (a ? "table id=" + a.sTableId + + " - " : "") + c; + d && (c += ". For more information about this error, please see http://datatables.net/tn/" + d); + if (b) E.console && console.log && console.log(c); else if (b = m.ext, b = b.sErrMode || b.errMode, a && s(a, null, "error", [a, d, c]), "alert" == b) alert(c); else { + if ("throw" == b) throw Error(c); + "function" == typeof b && b(a, d, c) + } + } + + function F(a, b, c, d) { + h.isArray(c) ? h.each(c, function (c, d) { + h.isArray(d) ? F(a, b, d[0], d[1]) : F(a, b, d) + }) : (d === k && (d = c), b[c] !== k && (a[d] = b[c])) + } + + function Mb(a, b, c) { + var d, e; + for (e in b) b.hasOwnProperty(e) && (d = b[e], + h.isPlainObject(d) ? (h.isPlainObject(a[e]) || (a[e] = {}), h.extend(!0, a[e], d)) : a[e] = c && "data" !== e && "aaData" !== e && h.isArray(d) ? d.slice() : d); + return a + } + + function Ya(a, b, c) { + h(a).on("click.DT", b, function (b) { + a.blur(); + c(b) + }).on("keypress.DT", b, function (a) { + 13 === a.which && (a.preventDefault(), c(a)) + }).on("selectstart.DT", function () { + return !1 + }) + } + + function z(a, b, c, d) { + c && a[b].push({fn: c, sName: d}) + } + + function s(a, b, c, d) { + var e = []; + b && (e = h.map(a[b].slice().reverse(), function (b) { + return b.fn.apply(a.oInstance, d) + })); + null !== c && (b = h.Event(c + + ".dt"), h(a.nTable).trigger(b, d), e.push(b.result)); + return e + } + + function Ua(a) { + var b = a._iDisplayStart, c = a.fnDisplayEnd(), d = a._iDisplayLength; + b >= c && (b = c - d); + b -= b % d; + if (-1 === d || 0 > b) b = 0; + a._iDisplayStart = b + } + + function Pa(a, b) { + var c = a.renderer, d = m.ext.renderer[b]; + return h.isPlainObject(c) && c[b] ? d[c[b]] || d._ : "string" === typeof c ? d[c] || d._ : d._ + } + + function y(a) { + return a.oFeatures.bServerSide ? "ssp" : a.ajax || a.sAjaxSource ? "ajax" : "dom" + } + + function ia(a, b) { + var c = [], c = Nb.numbers_length, d = Math.floor(c / 2); + b <= c ? c = X(0, b) : a <= d ? (c = X(0, + c - 2), c.push("ellipsis"), c.push(b - 1)) : (a >= b - 1 - d ? c = X(b - (c - 2), b) : (c = X(a - d + 2, a + d - 1), c.push("ellipsis"), c.push(b - 1)), c.splice(0, 0, "ellipsis"), c.splice(0, 0, 0)); + c.DT_el = "span"; + return c + } + + function fb(a) { + h.each({ + num: function (b) { + return Ba(b, a) + }, "num-fmt": function (b) { + return Ba(b, a, Za) + }, "html-num": function (b) { + return Ba(b, a, Ca) + }, "html-num-fmt": function (b) { + return Ba(b, a, Ca, Za) + } + }, function (b, c) { + x.type.order[b + a + "-pre"] = c; + b.match(/^html\-/) && (x.type.search[b + a] = x.type.search.html) + }) + } + + function Ob(a) { + return function () { + var b = + [Aa(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments)); + return m.ext.internal[a].apply(this, b) + } + } + + var m = function (a) { + this.$ = function (a, b) { + return this.api(!0).$(a, b) + }; + this._ = function (a, b) { + return this.api(!0).rows(a, b).data() + }; + this.api = function (a) { + return a ? new t(Aa(this[x.iApiIndex])) : new t(this) + }; + this.fnAddData = function (a, b) { + var c = this.api(!0), + d = h.isArray(a) && (h.isArray(a[0]) || h.isPlainObject(a[0])) ? c.rows.add(a) : c.row.add(a); + (b === k || b) && c.draw(); + return d.flatten().toArray() + }; + this.fnAdjustColumnSizing = + function (a) { + var b = this.api(!0).columns.adjust(), c = b.settings()[0], d = c.oScroll; + a === k || a ? b.draw(!1) : ("" !== d.sX || "" !== d.sY) && ma(c) + }; + this.fnClearTable = function (a) { + var b = this.api(!0).clear(); + (a === k || a) && b.draw() + }; + this.fnClose = function (a) { + this.api(!0).row(a).child.hide() + }; + this.fnDeleteRow = function (a, b, c) { + var d = this.api(!0), a = d.rows(a), e = a.settings()[0], h = e.aoData[a[0][0]]; + a.remove(); + b && b.call(this, e, h); + (c === k || c) && d.draw(); + return h + }; + this.fnDestroy = function (a) { + this.api(!0).destroy(a) + }; + this.fnDraw = function (a) { + this.api(!0).draw(a) + }; + this.fnFilter = function (a, b, c, d, e, h) { + e = this.api(!0); + null === b || b === k ? e.search(a, c, d, h) : e.column(b).search(a, c, d, h); + e.draw() + }; + this.fnGetData = function (a, b) { + var c = this.api(!0); + if (a !== k) { + var d = a.nodeName ? a.nodeName.toLowerCase() : ""; + return b !== k || "td" == d || "th" == d ? c.cell(a, b).data() : c.row(a).data() || null + } + return c.data().toArray() + }; + this.fnGetNodes = function (a) { + var b = this.api(!0); + return a !== k ? b.row(a).node() : b.rows().nodes().flatten().toArray() + }; + this.fnGetPosition = function (a) { + var b = this.api(!0), c = a.nodeName.toUpperCase(); + return "TR" == c ? b.row(a).index() : "TD" == c || "TH" == c ? (a = b.cell(a).index(), [a.row, a.columnVisible, a.column]) : null + }; + this.fnIsOpen = function (a) { + return this.api(!0).row(a).child.isShown() + }; + this.fnOpen = function (a, b, c) { + return this.api(!0).row(a).child(b, c).show().child()[0] + }; + this.fnPageChange = function (a, b) { + var c = this.api(!0).page(a); + (b === k || b) && c.draw(!1) + }; + this.fnSetColumnVis = function (a, b, c) { + a = this.api(!0).column(a).visible(b); + (c === k || c) && a.columns.adjust().draw() + }; + this.fnSettings = function () { + return Aa(this[x.iApiIndex]) + }; + this.fnSort = function (a) { + this.api(!0).order(a).draw() + }; + this.fnSortListener = function (a, b, c) { + this.api(!0).order.listener(a, b, c) + }; + this.fnUpdate = function (a, b, c, d, e) { + var h = this.api(!0); + c === k || null === c ? h.row(b).data(a) : h.cell(b, c).data(a); + (e === k || e) && h.columns.adjust(); + (d === k || d) && h.draw(); + return 0 + }; + this.fnVersionCheck = x.fnVersionCheck; + var b = this, c = a === k, d = this.length; + c && (a = {}); + this.oApi = this.internal = x.internal; + for (var e in m.ext.internal) e && (this[e] = Ob(e)); + this.each(function () { + var e = {}, g = 1 < d ? Mb(e, a, !0) : + a, j = 0, i, e = this.getAttribute("id"), n = !1, l = m.defaults, q = h(this); + if ("table" != this.nodeName.toLowerCase()) K(null, 0, "Non-table node initialisation (" + this.nodeName + ")", 2); else { + gb(l); + hb(l.column); + J(l, l, !0); + J(l.column, l.column, !0); + J(l, h.extend(g, q.data())); + var r = m.settings, j = 0; + for (i = r.length; j < i; j++) { + var p = r[j]; + if (p.nTable == this || p.nTHead.parentNode == this || p.nTFoot && p.nTFoot.parentNode == this) { + var t = g.bRetrieve !== k ? g.bRetrieve : l.bRetrieve; + if (c || t) return p.oInstance; + if (g.bDestroy !== k ? g.bDestroy : l.bDestroy) { + p.oInstance.fnDestroy(); + break + } else { + K(p, 0, "Cannot reinitialise DataTable", 3); + return + } + } + if (p.sTableId == this.id) { + r.splice(j, 1); + break + } + } + if (null === e || "" === e) this.id = e = "DataTables_Table_" + m.ext._unique++; + var o = h.extend(!0, {}, m.models.oSettings, { + sDestroyWidth: q[0].style.width, + sInstance: e, + sTableId: e + }); + o.nTable = this; + o.oApi = b.internal; + o.oInit = g; + r.push(o); + o.oInstance = 1 === b.length ? b : q.dataTable(); + gb(g); + g.oLanguage && Fa(g.oLanguage); + g.aLengthMenu && !g.iDisplayLength && (g.iDisplayLength = h.isArray(g.aLengthMenu[0]) ? g.aLengthMenu[0][0] : g.aLengthMenu[0]); + g = Mb(h.extend(!0, {}, l), g); + F(o.oFeatures, g, "bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" ")); + F(o, g, ["asStripeClasses", "ajax", "fnServerData", "fnFormatNumber", "sServerMethod", "aaSorting", "aaSortingFixed", "aLengthMenu", "sPaginationType", "sAjaxSource", "sAjaxDataProp", "iStateDuration", "sDom", "bSortCellsTop", "iTabIndex", "fnStateLoadCallback", "fnStateSaveCallback", "renderer", "searchDelay", "rowId", ["iCookieDuration", "iStateDuration"], + ["oSearch", "oPreviousSearch"], ["aoSearchCols", "aoPreSearchCols"], ["iDisplayLength", "_iDisplayLength"], ["bJQueryUI", "bJUI"]]); + F(o.oScroll, g, [["sScrollX", "sX"], ["sScrollXInner", "sXInner"], ["sScrollY", "sY"], ["bScrollCollapse", "bCollapse"]]); + F(o.oLanguage, g, "fnInfoCallback"); + z(o, "aoDrawCallback", g.fnDrawCallback, "user"); + z(o, "aoServerParams", g.fnServerParams, "user"); + z(o, "aoStateSaveParams", g.fnStateSaveParams, "user"); + z(o, "aoStateLoadParams", g.fnStateLoadParams, "user"); + z(o, "aoStateLoaded", g.fnStateLoaded, + "user"); + z(o, "aoRowCallback", g.fnRowCallback, "user"); + z(o, "aoRowCreatedCallback", g.fnCreatedRow, "user"); + z(o, "aoHeaderCallback", g.fnHeaderCallback, "user"); + z(o, "aoFooterCallback", g.fnFooterCallback, "user"); + z(o, "aoInitComplete", g.fnInitComplete, "user"); + z(o, "aoPreDrawCallback", g.fnPreDrawCallback, "user"); + o.rowIdFn = R(g.rowId); + ib(o); + var u = o.oClasses; + g.bJQueryUI ? (h.extend(u, m.ext.oJUIClasses, g.oClasses), g.sDom === l.sDom && "lfrtip" === l.sDom && (o.sDom = '<"H"lfr>t<"F"ip>'), o.renderer) ? h.isPlainObject(o.renderer) && + !o.renderer.header && (o.renderer.header = "jqueryui") : o.renderer = "jqueryui" : h.extend(u, m.ext.classes, g.oClasses); + q.addClass(u.sTable); + o.iInitDisplayStart === k && (o.iInitDisplayStart = g.iDisplayStart, o._iDisplayStart = g.iDisplayStart); + null !== g.iDeferLoading && (o.bDeferLoading = !0, e = h.isArray(g.iDeferLoading), o._iRecordsDisplay = e ? g.iDeferLoading[0] : g.iDeferLoading, o._iRecordsTotal = e ? g.iDeferLoading[1] : g.iDeferLoading); + var v = o.oLanguage; + h.extend(!0, v, g.oLanguage); + v.sUrl && (h.ajax({ + dataType: "json", url: v.sUrl, success: function (a) { + Fa(a); + J(l.oLanguage, a); + h.extend(true, v, a); + ha(o) + }, error: function () { + ha(o) + } + }), n = !0); + null === g.asStripeClasses && (o.asStripeClasses = [u.sStripeOdd, u.sStripeEven]); + var e = o.asStripeClasses, x = q.children("tbody").find("tr").eq(0); + -1 !== h.inArray(!0, h.map(e, function (a) { + return x.hasClass(a) + })) && (h("tbody tr", this).removeClass(e.join(" ")), o.asDestroyStripes = e.slice()); + e = []; + r = this.getElementsByTagName("thead"); + 0 !== r.length && (ea(o.aoHeader, r[0]), e = ta(o)); + if (null === g.aoColumns) { + r = []; + j = 0; + for (i = e.length; j < i; j++) r.push(null) + } else r = + g.aoColumns; + j = 0; + for (i = r.length; j < i; j++) Ga(o, e ? e[j] : null); + kb(o, g.aoColumnDefs, r, function (a, b) { + la(o, a, b) + }); + if (x.length) { + var w = function (a, b) { + return a.getAttribute("data-" + b) !== null ? b : null + }; + h(x[0]).children("th, td").each(function (a, b) { + var c = o.aoColumns[a]; + if (c.mData === a) { + var d = w(b, "sort") || w(b, "order"), e = w(b, "filter") || w(b, "search"); + if (d !== null || e !== null) { + c.mData = { + _: a + ".display", + sort: d !== null ? a + ".@data-" + d : k, + type: d !== null ? a + ".@data-" + d : k, + filter: e !== null ? a + ".@data-" + e : k + }; + la(o, a) + } + } + }) + } + var U = o.oFeatures, + e = function () { + if (g.aaSorting === k) { + var a = o.aaSorting; + j = 0; + for (i = a.length; j < i; j++) a[j][1] = o.aoColumns[j].asSorting[0] + } + ya(o); + U.bSort && z(o, "aoDrawCallback", function () { + if (o.bSorted) { + var a = W(o), b = {}; + h.each(a, function (a, c) { + b[c.src] = c.dir + }); + s(o, null, "order", [o, a, b]); + Kb(o) + } + }); + z(o, "aoDrawCallback", function () { + (o.bSorted || y(o) === "ssp" || U.bDeferRender) && ya(o) + }, "sc"); + var a = q.children("caption").each(function () { + this._captionSide = h(this).css("caption-side") + }), b = q.children("thead"); + b.length === 0 && (b = h("
                ' + a.title + ": " + a.data + "
                ').append(a) + } + } + }; + j.defaults = { + breakpoints: j.breakpoints, + auto: !0, + details: {display: j.display.childRow, renderer: j.renderer.listHidden(), target: 0, type: "inline"}, + orthogonal: "display" + }; + var o = c.fn.dataTable.Api; + o.register("responsive()", function () { + return this + }); + o.register("responsive.index()", function (b) { + b = c(b); + return {column: b.data("dtr-index"), row: b.parent().data("dtr-index")} + }); + o.register("responsive.rebuild()", function () { + return this.iterator("table", function (b) { + b._responsive && b._responsive._classLogic() + }) + }); + o.register("responsive.recalc()", function () { + return this.iterator("table", function (b) { + b._responsive && (b._responsive._resizeAuto(), b._responsive._resize()) + }) + }); + o.register("responsive.hasHidden()", function () { + var b = + this.context[0]; + return b._responsive ? -1 !== c.inArray(!1, b._responsive.s.current) : !1 + }); + j.version = "2.1.1"; + c.fn.dataTable.Responsive = j; + c.fn.DataTable.Responsive = j; + c(k).on("preInit.dt.dtr", function (b, a) { + if ("dt" === b.namespace && (c(a.nTable).hasClass("responsive") || c(a.nTable).hasClass("dt-responsive") || a.oInit.responsive || m.defaults.responsive)) { + var d = a.oInit.responsive; + !1 !== d && new j(a, c.isPlainObject(d) ? d : {}) + } + }); + return j +}); + + +/*! + Bootstrap integration for DataTables' Responsive + ©2015-2016 SpryMedia Ltd - datatables.net/license +*/ +(function (c) { + "function" === typeof define && define.amd ? define(["jquery", "datatables.net-bs", "datatables.net-responsive"], function (a) { + return c(a, window, document) + }) : "object" === typeof exports ? module.exports = function (a, b) { + a || (a = window); + if (!b || !b.fn.dataTable) b = require("datatables.net-bs")(a, b).$; + b.fn.dataTable.Responsive || require("datatables.net-responsive")(a, b); + return c(b, a, a.document) + } : c(jQuery, window, document) +})(function (c) { + var a = c.fn.dataTable, b = a.Responsive.display, g = b.modal, + e = c('
                a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
                t
                ",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
                ",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/
                ","
                "],tr:[2,"","
                "],col:[2,"","
                "],td:[3,"","
                "],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
                ","
                "]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); +u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("',inline_markup:'
                {content}
                ',custom_markup:"",social_tools:''},s);var o=this,u=false,a,f,l,c,h,p,d=e(window).height(),v=e(window).width(),m;doresize=true,scroll_pos=T();e(window).unbind("resize.prettyphoto").bind("resize.prettyphoto",function(){x();N()});if(s.keyboard_shortcuts){e(document).unbind("keydown.prettyphoto").bind("keydown.prettyphoto",function(t){if(typeof $pp_pic_holder!="undefined"){if($pp_pic_holder.is(":visible")){switch(t.keyCode){case 37:e.prettyPhoto.changePage("previous");t.preventDefault();break;case 39:e.prettyPhoto.changePage("next");t.preventDefault();break;case 27:if(!settings.modal)e.prettyPhoto.close();t.preventDefault();break}}}})}e.prettyPhoto.initialize=function(){settings=s;if(settings.theme=="pp_default")settings.horizontal_padding=16;theRel=e(this).attr(settings.hook);galleryRegExp=/\[(?:.*)\]/;isSet=galleryRegExp.exec(theRel)?true:false;pp_images=isSet?jQuery.map(o,function(t,n){if(e(t).attr(settings.hook).indexOf(theRel)!=-1)return e(t).attr("href")}):e.makeArray(e(this).attr("href"));pp_titles=isSet?jQuery.map(o,function(t,n){if(e(t).attr(settings.hook).indexOf(theRel)!=-1)return e(t).find("img").attr("alt")?e(t).find("img").attr("alt"):""}):e.makeArray(e(this).find("img").attr("alt"));pp_descriptions=isSet?jQuery.map(o,function(t,n){if(e(t).attr(settings.hook).indexOf(theRel)!=-1)return e(t).attr("title")?e(t).attr("title"):""}):e.makeArray(e(this).attr("title"));if(pp_images.length>settings.overlay_gallery_max)settings.overlay_gallery=false;set_position=jQuery.inArray(e(this).attr("href"),pp_images);rel_index=isSet?set_position:e("a["+settings.hook+"^='"+theRel+"']").index(e(this));k(this);if(settings.allow_resize)e(window).bind("scroll.prettyphoto",function(){x()});e.prettyPhoto.open();return false};e.prettyPhoto.open=function(t){if(typeof settings=="undefined"){settings=s;pp_images=e.makeArray(arguments[0]);pp_titles=arguments[1]?e.makeArray(arguments[1]):e.makeArray("");pp_descriptions=arguments[2]?e.makeArray(arguments[2]):e.makeArray("");isSet=pp_images.length>1?true:false;set_position=arguments[3]?arguments[3]:0;k(t.target)}if(settings.hideflash)e("object,embed,iframe[src*=youtube],iframe[src*=vimeo]").css("visibility","hidden");b(e(pp_images).size());e(".pp_loaderIcon").show();if(settings.deeplinking)n();if(settings.social_tools){facebook_like_link=settings.social_tools.replace("{location_href}",encodeURIComponent(location.href));$pp_pic_holder.find(".pp_social").html(facebook_like_link)}if($ppt.is(":hidden"))$ppt.css("opacity",0).show();$pp_overlay.show().fadeTo(settings.animation_speed,settings.opacity);$pp_pic_holder.find(".currentTextHolder").text(set_position+1+settings.counter_separator_label+e(pp_images).size());if(typeof pp_descriptions[set_position]!="undefined"&&pp_descriptions[set_position]!=""){$pp_pic_holder.find(".pp_description").show().html(unescape(pp_descriptions[set_position]))}else{$pp_pic_holder.find(".pp_description").hide()}movie_width=parseFloat(i("width",pp_images[set_position]))?i("width",pp_images[set_position]):settings.default_width.toString();movie_height=parseFloat(i("height",pp_images[set_position]))?i("height",pp_images[set_position]):settings.default_height.toString();u=false;if(movie_height.indexOf("%")!=-1){movie_height=parseFloat(e(window).height()*parseFloat(movie_height)/100-150);u=true}if(movie_width.indexOf("%")!=-1){movie_width=parseFloat(e(window).width()*parseFloat(movie_width)/100-150);u=true}$pp_pic_holder.fadeIn(function(){settings.show_title&&pp_titles[set_position]!=""&&typeof pp_titles[set_position]!="undefined"?$ppt.html(unescape(pp_titles[set_position])):$ppt.html(" ");imgPreloader="";skipInjection=false;switch(S(pp_images[set_position])){case"image":imgPreloader=new Image;nextImage=new Image;if(isSet&&set_position0)movie_id=movie_id.substr(0,movie_id.indexOf("?"));if(movie_id.indexOf("&")>0)movie_id=movie_id.substr(0,movie_id.indexOf("&"))}movie="http://www.youtube.com/embed/"+movie_id;i("rel",pp_images[set_position])?movie+="?rel="+i("rel",pp_images[set_position]):movie+="?rel=1";if(settings.autoplay)movie+="&autoplay=1";toInject=settings.iframe_markup.replace(/{width}/g,a["width"]).replace(/{height}/g,a["height"]).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,movie);break;case"vimeo":a=w(movie_width,movie_height);movie_id=pp_images[set_position];var t=/http(s?):\/\/(www\.)?vimeo.com\/(\d+)/;var n=movie_id.match(t);movie="http://player.vimeo.com/video/"+n[3]+"?title=0&byline=0&portrait=0";if(settings.autoplay)movie+="&autoplay=1;";vimeo_width=a["width"]+"/embed/?moog_width="+a["width"];toInject=settings.iframe_markup.replace(/{width}/g,vimeo_width).replace(/{height}/g,a["height"]).replace(/{path}/g,movie);break;case"quicktime":a=w(movie_width,movie_height);a["height"]+=15;a["contentHeight"]+=15;a["containerHeight"]+=15;toInject=settings.quicktime_markup.replace(/{width}/g,a["width"]).replace(/{height}/g,a["height"]).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,pp_images[set_position]).replace(/{autoplay}/g,settings.autoplay);break;case"flash":a=w(movie_width,movie_height);flash_vars=pp_images[set_position];flash_vars=flash_vars.substring(pp_images[set_position].indexOf("flashvars")+10,pp_images[set_position].length);filename=pp_images[set_position];filename=filename.substring(0,filename.indexOf("?"));toInject=settings.flash_markup.replace(/{width}/g,a["width"]).replace(/{height}/g,a["height"]).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,filename+"?"+flash_vars);break;case"iframe":a=w(movie_width,movie_height);frame_url=pp_images[set_position];frame_url=frame_url.substr(0,frame_url.indexOf("iframe")-1);toInject=settings.iframe_markup.replace(/{width}/g,a["width"]).replace(/{height}/g,a["height"]).replace(/{path}/g,frame_url);break;case"ajax":doresize=false;a=w(movie_width,movie_height);doresize=true;skipInjection=true;e.get(pp_images[set_position],function(e){toInject=settings.inline_markup.replace(/{content}/g,e);$pp_pic_holder.find("#pp_full_res")[0].innerHTML=toInject;g()});break;case"custom":a=w(movie_width,movie_height);toInject=settings.custom_markup;break;case"inline":myClone=e(pp_images[set_position]).clone().append('
                ').css({width:settings.default_width}).wrapInner('
                ').appendTo(e("body")).show();doresize=false;a=w(e(myClone).width(),e(myClone).height());doresize=true;e(myClone).remove();toInject=settings.inline_markup.replace(/{content}/g,e(pp_images[set_position]).html());break}if(!imgPreloader&&!skipInjection){$pp_pic_holder.find("#pp_full_res")[0].innerHTML=toInject;g()}});return false};e.prettyPhoto.changePage=function(t){currentGalleryPage=0;if(t=="previous"){set_position--;if(set_position<0)set_position=e(pp_images).size()-1}else if(t=="next"){set_position++;if(set_position>e(pp_images).size()-1)set_position=0}else{set_position=t}rel_index=set_position;if(!doresize)doresize=true;if(settings.allow_expand){e(".pp_contract").removeClass("pp_contract").addClass("pp_expand")}y(function(){e.prettyPhoto.open()})};e.prettyPhoto.changeGalleryPage=function(e){if(e=="next"){currentGalleryPage++;if(currentGalleryPage>totalPage)currentGalleryPage=0}else if(e=="previous"){currentGalleryPage--;if(currentGalleryPage<0)currentGalleryPage=totalPage}else{currentGalleryPage=e}slide_speed=e=="next"||e=="previous"?settings.animation_speed:0;slide_to=currentGalleryPage*itemsPerPage*itemWidth;$pp_gallery.find("ul").animate({left:-slide_to},slide_speed)};e.prettyPhoto.startSlideshow=function(){if(typeof m=="undefined"){$pp_pic_holder.find(".pp_play").unbind("click").removeClass("pp_play").addClass("pp_pause").click(function(){e.prettyPhoto.stopSlideshow();return false});m=setInterval(e.prettyPhoto.startSlideshow,settings.slideshow)}else{e.prettyPhoto.changePage("next")}};e.prettyPhoto.stopSlideshow=function(){$pp_pic_holder.find(".pp_pause").unbind("click").removeClass("pp_pause").addClass("pp_play").click(function(){e.prettyPhoto.startSlideshow();return false});clearInterval(m);m=undefined};e.prettyPhoto.close=function(){if($pp_overlay.is(":animated"))return;e.prettyPhoto.stopSlideshow();$pp_pic_holder.stop().find("object,embed").css("visibility","hidden");e("div.pp_pic_holder,div.ppt,.pp_fade").fadeOut(settings.animation_speed,function(){e(this).remove()});$pp_overlay.fadeOut(settings.animation_speed,function(){if(settings.hideflash)e("object,embed,iframe[src*=youtube],iframe[src*=vimeo]").css("visibility","visible");e(this).remove();e(window).unbind("scroll.prettyphoto");r();settings.callback();doresize=true;f=false;delete settings})};if(!pp_alreadyInitialized&&t()){pp_alreadyInitialized=true;hashIndex=t();hashRel=hashIndex;hashIndex=hashIndex.substring(hashIndex.indexOf("/")+1,hashIndex.length-1);hashRel=hashRel.substring(0,hashRel.indexOf("/"));setTimeout(function(){e("a["+s.hook+"^='"+hashRel+"']:eq("+hashIndex+")").trigger("click")},50)}return this.unbind("click.prettyphoto").bind("click.prettyphoto",e.prettyPhoto.initialize)};})(jQuery);var pp_alreadyInitialized=false \ No newline at end of file diff --git a/assets/js/lib/jquery.tagsinput.js b/assets/js/lib/jquery.tagsinput.js new file mode 100644 index 0000000..b6c75e4 --- /dev/null +++ b/assets/js/lib/jquery.tagsinput.js @@ -0,0 +1,390 @@ +/* + + jQuery Tags Input Plugin 1.3.3 + + Copyright (c) 2011 XOXCO, Inc + + Documentation for this plugin lives here: + http://xoxco.com/clickable/jquery-tags-input + + Licensed under the MIT license: + http://www.opensource.org/licenses/mit-license.php + + ben@xoxco.com + +*/ + +(function($) { + + var delimiter = new Array(); + var tags_callbacks = new Array(); + $.fn.doAutosize = function(o){ + var minWidth = $(this).data('minwidth'), + maxWidth = $(this).data('maxwidth'), + val = '', + input = $(this), + testSubject = $('#'+$(this).data('tester_id')); + + if (val === (val = input.val())) {return;} + + // Enter new content into testSubject + var escaped = val.replace(/&/g, '&').replace(/\s/g,' ').replace(//g, '>'); + testSubject.html(escaped); + // Calculate new width + whether to change + var testerWidth = testSubject.width(), + newWidth = (testerWidth + o.comfortZone) >= minWidth ? testerWidth + o.comfortZone : minWidth, + currentWidth = input.width(), + isValidWidthChange = (newWidth < currentWidth && newWidth >= minWidth) + || (newWidth > minWidth && newWidth < maxWidth); + + // Animate width + if (isValidWidthChange) { + input.width(newWidth); + } + + + }; + $.fn.resetAutosize = function(options){ + // alert(JSON.stringify(options)); + var minWidth = $(this).data('minwidth') || options.minInputWidth || $(this).width(), + maxWidth = $(this).data('maxwidth') || options.maxInputWidth || ($(this).closest('.tagsinput').width() - options.inputPadding), + val = '', + input = $(this), + testSubject = $('').css({ + position: 'absolute', + top: -9999, + left: -9999, + width: 'auto', + fontSize: input.css('fontSize'), + fontFamily: input.css('fontFamily'), + fontWeight: input.css('fontWeight'), + letterSpacing: input.css('letterSpacing'), + whiteSpace: 'nowrap' + }), + testerId = $(this).attr('id')+'_autosize_tester'; + if(! $('#'+testerId).length > 0){ + testSubject.attr('id', testerId); + testSubject.appendTo('body'); + } + + input.data('minwidth', minWidth); + input.data('maxwidth', maxWidth); + input.data('tester_id', testerId); + input.css('width', minWidth); + }; + + $.fn.addTag = function(value,options) { + options = jQuery.extend({focus:false,callback:true},options); + this.each(function() { + var id = $(this).attr('id'); + + var tagslist = $(this).val().split(delimiter[id]); + if (tagslist[0] == '') { + tagslist = new Array(); + } + + value = jQuery.trim(value); + + if (options.unique) { + var skipTag = $(this).tagExist(value); + if(skipTag == true) { + //Marks fake input as not_valid to let styling it + $('#'+id+'_tag').addClass('not_valid'); + } + } else { + var skipTag = false; + } + + if (value !='' && skipTag != true) { + $('').addClass('tag').append( + $('').text(value).append('  '), + $('', { + href : '#', + title : 'Removing tag', + text : 'x' + }).click(function () { + return $('#' + id).removeTag(escape(value)); + }) + ).insertBefore('#' + id + '_addTag'); + + tagslist.push(value); + + $('#'+id+'_tag').val(''); + if (options.focus) { + $('#'+id+'_tag').focus(); + } else { + $('#'+id+'_tag').blur(); + } + + $.fn.tagsInput.updateTagsField(this,tagslist); + + if (options.callback && tags_callbacks[id] && tags_callbacks[id]['onAddTag']) { + var f = tags_callbacks[id]['onAddTag']; + f.call(this, value); + } + if(tags_callbacks[id] && tags_callbacks[id]['onChange']) + { + var i = tagslist.length; + var f = tags_callbacks[id]['onChange']; + f.call(this, $(this), tagslist[i-1]); + } + } + + }); + + return false; + }; + + $.fn.removeTag = function(value) { + value = unescape(value); + this.each(function() { + var id = $(this).attr('id'); + + var old = $(this).val().split(delimiter[id]); + + $('#'+id+'_tagsinput .tag').remove(); + str = ''; + for (i=0; i< old.length; i++) { + if (old[i]!=value) { + str = str + delimiter[id] +old[i]; + } + } + + $.fn.tagsInput.importTags(this,str); + + if (tags_callbacks[id] && tags_callbacks[id]['onRemoveTag']) { + var f = tags_callbacks[id]['onRemoveTag']; + f.call(this, value); + } + }); + + return false; + }; + + $.fn.tagExist = function(val) { + var id = $(this).attr('id'); + var tagslist = $(this).val().split(delimiter[id]); + return (jQuery.inArray(val, tagslist) >= 0); //true when tag exists, false when not + }; + + // clear all existing tags and import new ones from a string + $.fn.importTags = function(str) { + var id = $(this).attr('id'); + $('#'+id+'_tagsinput .tag').remove(); + $.fn.tagsInput.importTags(this,str); + } + + $.fn.tagsInput = function(options) { + var settings = jQuery.extend({ + interactive:true, + defaultText:'add a tag', + minChars:0, + width:'300px', + height:'100px', + autocomplete: {selectFirst: false }, + hide:true, + delimiter: ',', + unique:true, + removeWithBackspace:true, + placeholderColor:'#666666', + autosize: true, + comfortZone: 20, + inputPadding: 6*2 + },options); + + var uniqueIdCounter = 0; + + this.each(function() { + // If we have already initialized the field, do not do it again + if (typeof $(this).attr('data-tagsinput-init') !== 'undefined') { + return; + } + + // Mark the field as having been initialized + $(this).attr('data-tagsinput-init', true); + + if (settings.hide) { + $(this).hide(); + } + var id = $(this).attr('id'); + if (!id || delimiter[$(this).attr('id')]) { + id = $(this).attr('id', 'tags' + new Date().getTime() + (uniqueIdCounter++)).attr('id'); + } + + var data = jQuery.extend({ + pid:id, + real_input: '#'+id, + holder: '#'+id+'_tagsinput', + input_wrapper: '#'+id+'_addTag', + fake_input: '#'+id+'_tag' + },settings); + + delimiter[id] = data.delimiter; + + if (settings.onAddTag || settings.onRemoveTag || settings.onChange) { + tags_callbacks[id] = new Array(); + tags_callbacks[id]['onAddTag'] = settings.onAddTag; + tags_callbacks[id]['onRemoveTag'] = settings.onRemoveTag; + tags_callbacks[id]['onChange'] = settings.onChange; + } + + var markup = '
                '; + + if (settings.interactive) { + markup = markup + ''; + } + + markup = markup + '
                '; + + $(markup).insertAfter(this); + + $(data.holder).css('width',settings.width); + $(data.holder).css('min-height',settings.height); + $(data.holder).css('height',settings.height); + + if ($(data.real_input).val()!='') { + $.fn.tagsInput.importTags($(data.real_input),$(data.real_input).val()); + } + if (settings.interactive) { + $(data.fake_input).val($(data.fake_input).attr('data-default')); + $(data.fake_input).css('color',settings.placeholderColor); + $(data.fake_input).resetAutosize(settings); + + $(data.holder).bind('click',data,function(event) { + $(event.data.fake_input).focus(); + }); + + $(data.fake_input).bind('focus',data,function(event) { + if ($(event.data.fake_input).val()==$(event.data.fake_input).attr('data-default')) { + $(event.data.fake_input).val(''); + } + $(event.data.fake_input).css('color','#000000'); + }); + + if (settings.autocomplete_url != undefined) { + autocomplete_options = {source: settings.autocomplete_url}; + for (attrname in settings.autocomplete) { + autocomplete_options[attrname] = settings.autocomplete[attrname]; + } + + if (jQuery.Autocompleter !== undefined) { + $(data.fake_input).autocomplete(settings.autocomplete_url, settings.autocomplete); + $(data.fake_input).bind('result',data,function(event,data,formatted) { + if (data) { + $('#'+id).addTag(data[0] + "",{focus:true,unique:(settings.unique)}); + } + }); + } else if (jQuery.ui.autocomplete !== undefined) { + $(data.fake_input).autocomplete(autocomplete_options); + $(data.fake_input).bind('autocompleteselect',data,function(event,ui) { + $(event.data.real_input).addTag(ui.item.value,{focus:true,unique:(settings.unique)}); + return false; + }); + } + + + } else { + // if a user tabs out of the field, create a new tag + // this is only available if autocomplete is not used. + $(data.fake_input).bind('blur',data,function(event) { + var d = $(this).attr('data-default'); + if ($(event.data.fake_input).val()!='' && $(event.data.fake_input).val()!=d) { + if( (event.data.minChars <= $(event.data.fake_input).val().length) && (!event.data.maxChars || (event.data.maxChars >= $(event.data.fake_input).val().length)) ) + $(event.data.real_input).addTag($(event.data.fake_input).val(),{focus:true,unique:(settings.unique)}); + } else { + $(event.data.fake_input).val($(event.data.fake_input).attr('data-default')); + $(event.data.fake_input).css('color',settings.placeholderColor); + } + return false; + }); + + } + // if user types a default delimiter like comma,semicolon and then create a new tag + $(data.fake_input).bind('keypress',data,function(event) { + if (_checkDelimiter(event)) { + event.preventDefault(); + if( (event.data.minChars <= $(event.data.fake_input).val().length) && (!event.data.maxChars || (event.data.maxChars >= $(event.data.fake_input).val().length)) ) + $(event.data.real_input).addTag($(event.data.fake_input).val(),{focus:true,unique:(settings.unique)}); + $(event.data.fake_input).resetAutosize(settings); + return false; + } else if (event.data.autosize) { + $(event.data.fake_input).doAutosize(settings); + + } + }); + //Delete last tag on backspace + data.removeWithBackspace && $(data.fake_input).bind('keydown', function(event) + { + if(event.keyCode == 8 && $(this).val() == '') + { + event.preventDefault(); + var last_tag = $(this).closest('.tagsinput').find('.tag:last').text(); + var id = $(this).attr('id').replace(/_tag$/, ''); + last_tag = last_tag.replace(/[\s]+x$/, ''); + $('#' + id).removeTag(escape(last_tag)); + $(this).trigger('focus'); + } + }); + $(data.fake_input).blur(); + + //Removes the not_valid class when user changes the value of the fake input + if(data.unique) { + $(data.fake_input).keydown(function(event){ + if(event.keyCode == 8 || String.fromCharCode(event.which).match(/\w+|[áéíóúÁÉÍÓÚñÑ,/]+/)) { + $(this).removeClass('not_valid'); + } + }); + } + } // if settings.interactive + }); + + return this; + + }; + + $.fn.tagsInput.updateTagsField = function(obj,tagslist) { + var id = $(obj).attr('id'); + $(obj).val(tagslist.join(delimiter[id])); + }; + + $.fn.tagsInput.importTags = function(obj,val) { + $(obj).val(''); + var id = $(obj).attr('id'); + var tags = val.split(delimiter[id]); + for (i=0; i/g,">");g.html(h);var i=g.width(),j=i+b.comfortZone>=c?i+b.comfortZone:c,k=f.width(),l=j=c||j>c&&j").css({position:"absolute",top:-9999,left:-9999,width:"auto",fontSize:f.css("fontSize"),fontFamily:f.css("fontFamily"),fontWeight:f.css("fontWeight"),letterSpacing:f.css("letterSpacing"),whiteSpace:"nowrap"}),h=a(this).attr("id")+"_autosize_tester";!a("#"+h).length>0&&(g.attr("id",h),g.appendTo("body")),f.data("minwidth",c),f.data("maxwidth",d),f.data("tester_id",h),f.css("width",c)},a.fn.addTag=function(d,e){return e=jQuery.extend({focus:!1,callback:!0},e),this.each(function(){var f=a(this).attr("id"),g=a(this).val().split(b[f]);if(""==g[0]&&(g=new Array),d=jQuery.trim(d),e.unique){var h=a(this).tagExist(d);1==h&&a("#"+f+"_tag").addClass("not_valid")}else var h=!1;if(""!=d&&1!=h){if(a("").addClass("tag").append(a("").text(d).append("  "),a("
                ",{href:"#",title:"Removing tag",text:"x"}).click(function(){return a("#"+f).removeTag(escape(d))})).insertBefore("#"+f+"_addTag"),g.push(d),a("#"+f+"_tag").val(""),e.focus?a("#"+f+"_tag").focus():a("#"+f+"_tag").blur(),a.fn.tagsInput.updateTagsField(this,g),e.callback&&c[f]&&c[f].onAddTag){var i=c[f].onAddTag;i.call(this,d)}if(c[f]&&c[f].onChange){var j=g.length,i=c[f].onChange;i.call(this,a(this),g[j-1])}}}),!1},a.fn.removeTag=function(d){return d=unescape(d),this.each(function(){var e=a(this).attr("id"),f=a(this).val().split(b[e]);for(a("#"+e+"_tagsinput .tag").remove(),str="",i=0;i=0},a.fn.importTags=function(b){var c=a(this).attr("id");a("#"+c+"_tagsinput .tag").remove(),a.fn.tagsInput.importTags(this,b)},a.fn.tagsInput=function(e){var f=jQuery.extend({interactive:!0,defaultText:"add a tag",minChars:0,width:"300px",height:"100px",autocomplete:{selectFirst:!1},hide:!0,delimiter:",",unique:!0,removeWithBackspace:!0,placeholderColor:"#666666",autosize:!0,comfortZone:20,inputPadding:12},e),g=0;return this.each(function(){if("undefined"==typeof a(this).attr("data-tagsinput-init")){a(this).attr("data-tagsinput-init",!0),f.hide&&a(this).hide();var e=a(this).attr("id");e&&!b[a(this).attr("id")]||(e=a(this).attr("id","tags"+(new Date).getTime()+g++).attr("id"));var h=jQuery.extend({pid:e,real_input:"#"+e,holder:"#"+e+"_tagsinput",input_wrapper:"#"+e+"_addTag",fake_input:"#"+e+"_tag"},f);b[e]=h.delimiter,(f.onAddTag||f.onRemoveTag||f.onChange)&&(c[e]=new Array,c[e].onAddTag=f.onAddTag,c[e].onRemoveTag=f.onRemoveTag,c[e].onChange=f.onChange);var i='
                ';if(f.interactive&&(i=i+''),i+='
                ',a(i).insertAfter(this),a(h.holder).css("width",f.width),a(h.holder).css("min-height",f.height),a(h.holder).css("height",f.height),""!=a(h.real_input).val()&&a.fn.tagsInput.importTags(a(h.real_input),a(h.real_input).val()),f.interactive){if(a(h.fake_input).val(a(h.fake_input).attr("data-default")),a(h.fake_input).css("color",f.placeholderColor),a(h.fake_input).resetAutosize(f),a(h.holder).bind("click",h,function(b){a(b.data.fake_input).focus()}),a(h.fake_input).bind("focus",h,function(b){a(b.data.fake_input).val()==a(b.data.fake_input).attr("data-default")&&a(b.data.fake_input).val(""),a(b.data.fake_input).css("color","#000000")}),void 0!=f.autocomplete_url){autocomplete_options={source:f.autocomplete_url};for(attrname in f.autocomplete)autocomplete_options[attrname]=f.autocomplete[attrname];void 0!==jQuery.Autocompleter?(a(h.fake_input).autocomplete(f.autocomplete_url,f.autocomplete),a(h.fake_input).bind("result",h,function(b,c,d){c&&a("#"+e).addTag(c[0]+"",{focus:!0,unique:f.unique})})):void 0!==jQuery.ui.autocomplete&&(a(h.fake_input).autocomplete(autocomplete_options),a(h.fake_input).bind("autocompleteselect",h,function(b,c){return a(b.data.real_input).addTag(c.item.value,{focus:!0,unique:f.unique}),!1}))}else a(h.fake_input).bind("blur",h,function(b){var c=a(this).attr("data-default");return""!=a(b.data.fake_input).val()&&a(b.data.fake_input).val()!=c?b.data.minChars<=a(b.data.fake_input).val().length&&(!b.data.maxChars||b.data.maxChars>=a(b.data.fake_input).val().length)&&a(b.data.real_input).addTag(a(b.data.fake_input).val(),{focus:!0,unique:f.unique}):(a(b.data.fake_input).val(a(b.data.fake_input).attr("data-default")),a(b.data.fake_input).css("color",f.placeholderColor)),!1});a(h.fake_input).bind("keypress",h,function(b){return d(b)?(b.preventDefault(),b.data.minChars<=a(b.data.fake_input).val().length&&(!b.data.maxChars||b.data.maxChars>=a(b.data.fake_input).val().length)&&a(b.data.real_input).addTag(a(b.data.fake_input).val(),{focus:!0,unique:f.unique}),a(b.data.fake_input).resetAutosize(f),!1):void(b.data.autosize&&a(b.data.fake_input).doAutosize(f))}),h.removeWithBackspace&&a(h.fake_input).bind("keydown",function(b){if(8==b.keyCode&&""==a(this).val()){b.preventDefault();var c=a(this).closest(".tagsinput").find(".tag:last").text(),d=a(this).attr("id").replace(/_tag$/,"");c=c.replace(/[\s]+x$/,""),a("#"+d).removeTag(escape(c)),a(this).trigger("focus")}}),a(h.fake_input).blur(),h.unique&&a(h.fake_input).keydown(function(b){(8==b.keyCode||String.fromCharCode(b.which).match(/\w+|[áéíóúÁÉÍÓÚñÑ,/]+/))&&a(this).removeClass("not_valid")})}}}),this},a.fn.tagsInput.updateTagsField=function(c,d){var e=a(c).attr("id");a(c).val(d.join(b[e]))},a.fn.tagsInput.importTags=function(d,e){a(d).val("");var f=a(d).attr("id"),g=e.split(b[f]);for(i=0;i + * Released under Apache 2.0 license + * http://apache.org/licenses/LICENSE-2.0.html + */ +(function ($, window, document, undefined) { + + 'use strict'; + + var old = $.fn.twbsPagination; + + // PROTOTYPE AND CONSTRUCTOR + + var TwbsPagination = function (element, options) { + this.$element = $(element); + this.options = $.extend({}, $.fn.twbsPagination.defaults, options); + + if (this.options.startPage < 1 || this.options.startPage > this.options.totalPages) { + throw new Error('Start page option is incorrect'); + } + + this.options.totalPages = parseInt(this.options.totalPages); + if (isNaN(this.options.totalPages)) { + throw new Error('Total pages option is not correct!'); + } + + this.options.visiblePages = parseInt(this.options.visiblePages); + if (isNaN(this.options.visiblePages)) { + throw new Error('Visible pages option is not correct!'); + } + + if (this.options.totalPages < this.options.visiblePages) { + this.options.visiblePages = this.options.totalPages; + } + + if (this.options.onPageClick instanceof Function) { + this.$element.first().on('page', this.options.onPageClick); + } + + if (this.options.href) { + var match, regexp = this.options.href.replace(/[-\/\\^$*+?.|[\]]/g, '\\$&'); + regexp = regexp.replace(this.options.hrefVariable, '(\\d+)'); + if ((match = new RegExp(regexp, 'i').exec(window.location.href)) != null) { + this.options.startPage = parseInt(match[1], 10); + } + } + + var tagName = (typeof this.$element.prop === 'function') ? + this.$element.prop('tagName') : this.$element.attr('tagName'); + + if (tagName === 'UL') { + this.$listContainer = this.$element; + } else { + this.$listContainer = $('
                  '); + } + + this.$listContainer.addClass(this.options.paginationClass); + + if (tagName !== 'UL') { + this.$element.append(this.$listContainer); + } + + this.render(this.getPages(this.options.startPage)); + this.setupEvents(); + + if (this.options.initiateStartPageClick) { + this.$element.trigger('page', this.options.startPage); + } + + return this; + }; + + TwbsPagination.prototype = { + + constructor: TwbsPagination, + + destroy: function () { + this.$element.empty(); + this.$element.removeData('twbs-pagination'); + this.$element.off('page'); + + return this; + }, + + show: function (page) { + if (page < 1 || page > this.options.totalPages) { + throw new Error('Page is incorrect.'); + } + + this.render(this.getPages(page)); + this.setupEvents(); + + this.$element.trigger('page', page); + + return this; + }, + + buildListItems: function (pages) { + var listItems = []; + + if (this.options.first) { + listItems.push(this.buildItem('first', 1)); + } + + if (this.options.prev) { + var prev = pages.currentPage > 1 ? pages.currentPage - 1 : this.options.loop ? this.options.totalPages : 1; + listItems.push(this.buildItem('prev', prev)); + } + + for (var i = 0; i < pages.numeric.length; i++) { + listItems.push(this.buildItem('page', pages.numeric[i])); + } + + if (this.options.next) { + var next = pages.currentPage < this.options.totalPages ? pages.currentPage + 1 : this.options.loop ? 1 : this.options.totalPages; + listItems.push(this.buildItem('next', next)); + } + + if (this.options.last) { + listItems.push(this.buildItem('last', this.options.totalPages)); + } + + return listItems; + }, + + buildItem: function (type, page) { + var $itemContainer = $('
                • '), + $itemContent = $('
                  '), + itemText = null; + + switch (type) { + case 'page': + itemText = page; + $itemContainer.addClass(this.options.pageClass); + break; + case 'first': + itemText = this.options.first; + $itemContainer.addClass(this.options.firstClass); + break; + case 'prev': + itemText = this.options.prev; + $itemContainer.addClass(this.options.prevClass); + break; + case 'next': + itemText = this.options.next; + $itemContainer.addClass(this.options.nextClass); + break; + case 'last': + itemText = this.options.last; + $itemContainer.addClass(this.options.lastClass); + break; + default: + break; + } + + $itemContainer.data('page', page); + $itemContainer.data('page-type', type); + $itemContainer.append($itemContent.attr('href', this.makeHref(page)).html(itemText)); + + return $itemContainer; + }, + + getPages: function (currentPage) { + var pages = []; + + var half = Math.floor(this.options.visiblePages / 2); + var start = currentPage - half + 1 - this.options.visiblePages % 2; + var end = currentPage + half; + + // handle boundary case + if (start <= 0) { + start = 1; + end = this.options.visiblePages; + } + if (end > this.options.totalPages) { + start = this.options.totalPages - this.options.visiblePages + 1; + end = this.options.totalPages; + } + + var itPage = start; + while (itPage <= end) { + pages.push(itPage); + itPage++; + } + + return {"currentPage": currentPage, "numeric": pages}; + }, + + render: function (pages) { + var _this = this; + this.$listContainer.children().remove(); + this.$listContainer.append(this.buildListItems(pages)); + + this.$listContainer.children().each(function () { + var $this = $(this), + pageType = $this.data('page-type'); + + switch (pageType) { + case 'page': + if ($this.data('page') === pages.currentPage) { + $this.addClass(_this.options.activeClass); + } + break; + case 'first': + $this.toggleClass(_this.options.disabledClass, pages.currentPage === 1); + break; + case 'last': + $this.toggleClass(_this.options.disabledClass, pages.currentPage === _this.options.totalPages); + break; + case 'prev': + $this.toggleClass(_this.options.disabledClass, !_this.options.loop && pages.currentPage === 1); + break; + case 'next': + $this.toggleClass(_this.options.disabledClass, + !_this.options.loop && pages.currentPage === _this.options.totalPages); + break; + default: + break; + } + + }); + }, + + setupEvents: function () { + var _this = this; + this.$listContainer.find('li').each(function () { + var $this = $(this); + $this.off(); + if ($this.hasClass(_this.options.disabledClass) || $this.hasClass(_this.options.activeClass)) { + $this.on('click', false); + return; + } + $this.click(function (evt) { + // Prevent click event if href is not set. + !_this.options.href && evt.preventDefault(); + _this.show(parseInt($this.data('page'))); + }); + }); + }, + + makeHref: function (c) { + return this.options.href ? this.options.href.replace(this.options.hrefVariable, c) : "#"; + } + + }; + + // PLUGIN DEFINITION + + $.fn.twbsPagination = function (option) { + var args = Array.prototype.slice.call(arguments, 1); + var methodReturn; + + var $this = $(this); + var data = $this.data('twbs-pagination'); + var options = typeof option === 'object' && option; + + if (!data) $this.data('twbs-pagination', (data = new TwbsPagination(this, options) )); + if (typeof option === 'string') methodReturn = data[ option ].apply(data, args); + + return ( methodReturn === undefined ) ? $this : methodReturn; + }; + + $.fn.twbsPagination.defaults = { + totalPages: 0, + startPage: 1, + visiblePages: 5, + initiateStartPageClick: true, + href: false, + hrefVariable: '{{number}}', + first: 'First', + prev: 'Previous', + next: 'Next', + last: 'Last', + loop: false, + onPageClick: null, + paginationClass: 'pagination', + nextClass: 'next', + prevClass: 'prev', + lastClass: 'last', + firstClass: 'first', + pageClass: 'page', + activeClass: 'active', + disabledClass: 'disabled' + }; + + $.fn.twbsPagination.Constructor = TwbsPagination; + + $.fn.twbsPagination.noConflict = function () { + $.fn.twbsPagination = old; + return this; + }; + +})(window.jQuery, window, document); diff --git a/assets/js/lib/jquery.twbsPagination.min.js b/assets/js/lib/jquery.twbsPagination.min.js new file mode 100644 index 0000000..315f27b --- /dev/null +++ b/assets/js/lib/jquery.twbsPagination.min.js @@ -0,0 +1,10 @@ +/* + * jQuery Bootstrap Pagination v1.4.2 + * https://github.com/josecebe/twbs-pagination + * + * Copyright 2014-2018, Eugene Simakin + * Released under Apache-2.0 license + * http://apache.org/licenses/LICENSE-2.0.html + */ + +!function(o,e,t,s){"use strict";var i=o.fn.twbsPagination,r=function(t,s){if(this.$element=o(t),this.options=o.extend({},o.fn.twbsPagination.defaults,s),this.options.startPage<1||this.options.startPage>this.options.totalPages)throw new Error("Start page option is incorrect");if(this.options.totalPages=parseInt(this.options.totalPages),isNaN(this.options.totalPages))throw new Error("Total pages option is not correct!");if(this.options.visiblePages=parseInt(this.options.visiblePages),isNaN(this.options.visiblePages))throw new Error("Visible pages option is not correct!");if(this.options.beforePageClick instanceof Function&&this.$element.first().on("beforePage",this.options.beforePageClick),this.options.onPageClick instanceof Function&&this.$element.first().on("page",this.options.onPageClick),this.options.hideOnlyOnePage&&1==this.options.totalPages)return this.options.initiateStartPageClick&&this.$element.trigger("page",1),this;if(this.options.href&&(this.options.startPage=this.getPageFromQueryString(),this.options.startPage||(this.options.startPage=1)),"UL"===("function"==typeof this.$element.prop?this.$element.prop("tagName"):this.$element.attr("tagName")))this.$listContainer=this.$element;else{var e=this.$element,i=o([]);e.each(function(t){var s=o("
                    ");o(this).append(s),i.push(s[0])}),this.$listContainer=i,this.$element=i}return this.$listContainer.addClass(this.options.paginationClass),this.options.initiateStartPageClick?this.show(this.options.startPage):(this.currentPage=this.options.startPage,this.render(this.getPages(this.options.startPage)),this.setupEvents()),this};r.prototype={constructor:r,destroy:function(){return this.$element.empty(),this.$element.removeData("twbs-pagination"),this.$element.off("page"),this},show:function(t){if(t<1||t>this.options.totalPages)throw new Error("Page is incorrect.");this.currentPage=t,this.$element.trigger("beforePage",t);var s=this.getPages(t);return this.render(s),this.setupEvents(),this.$element.trigger("page",t),s},enable:function(){this.show(this.currentPage)},disable:function(){var t=this;this.$listContainer.off("click").on("click","li",function(t){t.preventDefault()}),this.$listContainer.children().each(function(){o(this).hasClass(t.options.activeClass)||o(this).addClass(t.options.disabledClass)})},buildListItems:function(t){var s=[];if(this.options.first&&s.push(this.buildItem("first",1)),this.options.prev){var e=1"),i=o(""),a=this.options[t]?this.makeText(this.options[t],s):s;return e.addClass(this.options[t+"Class"]),e.data("page",s),e.data("page-type",t),e.append(i.attr("href",this.makeHref(s)).addClass(this.options.anchorClass).html(a)),e},getPages:function(t){var s=[],e=Math.floor(this.options.visiblePages/2),i=t-e+1-this.options.visiblePages%2,a=t+e,n=this.options.visiblePages;n>this.options.totalPages&&(n=this.options.totalPages),i<=0&&(i=1,a=n),a>this.options.totalPages&&(i=this.options.totalPages-n+1,a=this.options.totalPages);for(var o=i;o<=a;)s.push(o),o++;return{currentPage:t,numeric:s}},render:function(s){var e=this;this.$listContainer.children().remove();var t=this.buildListItems(s);o.each(t,function(t,s){e.$listContainer.append(s)}),this.$listContainer.children().each(function(){var t=o(this);switch(t.data("page-type")){case"page":t.data("page")===s.currentPage&&t.addClass(e.options.activeClass);break;case"first":t.toggleClass(e.options.disabledClass,1===s.currentPage);break;case"last":t.toggleClass(e.options.disabledClass,s.currentPage===e.options.totalPages);break;case"prev":t.toggleClass(e.options.disabledClass,!e.options.loop&&1===s.currentPage);break;case"next":t.toggleClass(e.options.disabledClass,!e.options.loop&&s.currentPage===e.options.totalPages)}})},setupEvents:function(){var e=this;this.$listContainer.off("click").on("click","li",function(t){var s=o(this);if(s.hasClass(e.options.disabledClass)||s.hasClass(e.options.activeClass))return!1;!e.options.href&&t.preventDefault(),e.show(parseInt(s.data("page")))})},changeTotalPages:function(t,s){return this.options.totalPages=t,this.show(s)},makeHref:function(t){return this.options.href?this.generateQueryString(t):"#"},makeText:function(t,s){return t.replace(this.options.pageVariable,s).replace(this.options.totalPagesVariable,this.options.totalPages)},getPageFromQueryString:function(t){var s=this.getSearchString(t),e=new RegExp(this.options.pageVariable+"(=([^&#]*)|&|#|$)").exec(s);return e&&e[2]?(e=decodeURIComponent(e[2]),e=parseInt(e),isNaN(e)?null:e):null},generateQueryString:function(t,s){var e=this.getSearchString(s),i=new RegExp(this.options.pageVariable+"=*[^&#]*");return e?"?"+e.replace(i,this.options.pageVariable+"="+t):""},getSearchString:function(t){var s=t||e.location.search;return""===s?null:(0===s.indexOf("?")&&(s=s.substr(1)),s)},getCurrentPage:function(){return this.currentPage},getTotalPages:function(){return this.options.totalPages}},o.fn.twbsPagination=function(t){var s,e=Array.prototype.slice.call(arguments,1),i=o(this),a=i.data("twbs-pagination"),n="object"==typeof t?t:{};return a||i.data("twbs-pagination",a=new r(this,n)),"string"==typeof t&&(s=a[t].apply(a,e)),void 0===s?i:s},o.fn.twbsPagination.defaults={totalPages:1,startPage:1,visiblePages:5,initiateStartPageClick:!0,hideOnlyOnePage:!1,href:!1,pageVariable:"{{page}}",totalPagesVariable:"{{total_pages}}",page:null,first:"First",prev:"Previous",next:"Next",last:"Last",loop:!1,beforePageClick:null,onPageClick:null,paginationClass:"pagination",nextClass:"page-item next",prevClass:"page-item prev",lastClass:"page-item last",firstClass:"page-item first",pageClass:"page-item",activeClass:"active",disabledClass:"disabled",anchorClass:"page-link"},o.fn.twbsPagination.Constructor=r,o.fn.twbsPagination.noConflict=function(){return o.fn.twbsPagination=i,this},o.fn.twbsPagination.version="1.4.2"}(window.jQuery,window,document); \ No newline at end of file diff --git a/assets/js/lib/jquery.ui.widget.js b/assets/js/lib/jquery.ui.widget.js new file mode 100644 index 0000000..e08df3f --- /dev/null +++ b/assets/js/lib/jquery.ui.widget.js @@ -0,0 +1,572 @@ +/*! jQuery UI - v1.11.4+CommonJS - 2015-08-28 +* http://jqueryui.com +* Includes: widget.js +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ + +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "jquery" ], factory ); + + } else if ( typeof exports === "object" ) { + + // Node/CommonJS + factory( require( "jquery" ) ); + + } else { + + // Browser globals + factory( jQuery ); + } +}(function( $ ) { +/*! + * jQuery UI Widget 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/jQuery.widget/ + */ + + +var widget_uuid = 0, + widget_slice = Array.prototype.slice; + +$.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { + try { + + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} + } + orig( elems ); + }; +})( $.cleanData ); + +$.widget = function( name, base, prototype ) { + var fullName, existingConstructor, constructor, basePrototype, + // proxiedPrototype allows the provided prototype to remain unmodified + // so that it can be used as a mixin for multiple widgets (#8876) + proxiedPrototype = {}, + namespace = name.split( "." )[ 0 ]; + + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { + return !!$.data( elem, fullName ); + }; + + $[ namespace ] = $[ namespace ] || {}; + existingConstructor = $[ namespace ][ name ]; + constructor = $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without "new" keyword + if ( !this._createWidget ) { + return new constructor( options, element ); + } + + // allow instantiation without initializing for simple inheritance + // must use "new" keyword (the code above always passes args) + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + // extend with the existing constructor to carry over any static properties + $.extend( constructor, existingConstructor, { + version: prototype.version, + // copy the object used to create the prototype in case we need to + // redefine the widget later + _proto: $.extend( {}, prototype ), + // track widgets that inherit from this widget in case this widget is + // redefined after a widget inherits from it + _childConstructors: [] + }); + + basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from + basePrototype.options = $.widget.extend( {}, basePrototype.options ); + $.each( prototype, function( prop, value ) { + if ( !$.isFunction( value ) ) { + proxiedPrototype[ prop ] = value; + return; + } + proxiedPrototype[ prop ] = (function() { + var _super = function() { + return base.prototype[ prop ].apply( this, arguments ); + }, + _superApply = function( args ) { + return base.prototype[ prop ].apply( this, args ); + }; + return function() { + var __super = this._super, + __superApply = this._superApply, + returnValue; + + this._super = _super; + this._superApply = _superApply; + + returnValue = value.apply( this, arguments ); + + this._super = __super; + this._superApply = __superApply; + + return returnValue; + }; + })(); + }); + constructor.prototype = $.widget.extend( basePrototype, { + // TODO: remove support for widgetEventPrefix + // always use the name + a colon as the prefix, e.g., draggable:start + // don't prefix for widgets that aren't DOM-based + widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name + }, proxiedPrototype, { + constructor: constructor, + namespace: namespace, + widgetName: name, + widgetFullName: fullName + }); + + // If this widget is being redefined then we need to find all widgets that + // are inheriting from it and redefine all of them so that they inherit from + // the new version of this widget. We're essentially trying to replace one + // level in the prototype chain. + if ( existingConstructor ) { + $.each( existingConstructor._childConstructors, function( i, child ) { + var childPrototype = child.prototype; + + // redefine the child widget using the same prototype that was + // originally used, but inherit from the new version of the base + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); + }); + // remove the list of existing child constructors from the old constructor + // so the old child constructors can be garbage collected + delete existingConstructor._childConstructors; + } else { + base._childConstructors.push( constructor ); + } + + $.widget.bridge( name, constructor ); + + return constructor; +}; + +$.widget.extend = function( target ) { + var input = widget_slice.call( arguments, 1 ), + inputIndex = 0, + inputLength = input.length, + key, + value; + for ( ; inputIndex < inputLength; inputIndex++ ) { + for ( key in input[ inputIndex ] ) { + value = input[ inputIndex ][ key ]; + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { + // Clone objects + if ( $.isPlainObject( value ) ) { + target[ key ] = $.isPlainObject( target[ key ] ) ? + $.widget.extend( {}, target[ key ], value ) : + // Don't extend strings, arrays, etc. with objects + $.widget.extend( {}, value ); + // Copy everything else by reference + } else { + target[ key ] = value; + } + } + } + } + return target; +}; + +$.widget.bridge = function( name, object ) { + var fullName = object.prototype.widgetFullName || name; + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = widget_slice.call( arguments, 1 ), + returnValue = this; + + if ( isMethodCall ) { + this.each(function() { + var methodValue, + instance = $.data( this, fullName ); + if ( options === "instance" ) { + returnValue = instance; + return false; + } + if ( !instance ) { + return $.error( "cannot call methods on " + name + " prior to initialization; " + + "attempted to call method '" + options + "'" ); + } + if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { + return $.error( "no such method '" + options + "' for " + name + " widget instance" ); + } + methodValue = instance[ options ].apply( instance, args ); + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue && methodValue.jquery ? + returnValue.pushStack( methodValue.get() ) : + methodValue; + return false; + } + }); + } else { + + // Allow multiple hashes to be passed on init + if ( args.length ) { + options = $.widget.extend.apply( null, [ options ].concat(args) ); + } + + this.each(function() { + var instance = $.data( this, fullName ); + if ( instance ) { + instance.option( options || {} ); + if ( instance._init ) { + instance._init(); + } + } else { + $.data( this, fullName, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( /* options, element */ ) {}; +$.Widget._childConstructors = []; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + defaultElement: "
                    ", + options: { + disabled: false, + + // callbacks + create: null + }, + _createWidget: function( options, element ) { + element = $( element || this.defaultElement || this )[ 0 ]; + this.element = $( element ); + this.uuid = widget_uuid++; + this.eventNamespace = "." + this.widgetName + this.uuid; + + this.bindings = $(); + this.hoverable = $(); + this.focusable = $(); + + if ( element !== this ) { + $.data( element, this.widgetFullName, this ); + this._on( true, this.element, { + remove: function( event ) { + if ( event.target === element ) { + this.destroy(); + } + } + }); + this.document = $( element.style ? + // element within the document + element.ownerDocument : + // element is window or document + element.document || element ); + this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); + } + + this.options = $.widget.extend( {}, + this.options, + this._getCreateOptions(), + options ); + + this._create(); + this._trigger( "create", null, this._getCreateEventData() ); + this._init(); + }, + _getCreateOptions: $.noop, + _getCreateEventData: $.noop, + _create: $.noop, + _init: $.noop, + + destroy: function() { + this._destroy(); + // we can probably remove the unbind calls in 2.0 + // all event bindings should go through this._on() + this.element + .unbind( this.eventNamespace ) + .removeData( this.widgetFullName ) + // support: jquery <1.6.3 + // http://bugs.jquery.com/ticket/9413 + .removeData( $.camelCase( this.widgetFullName ) ); + this.widget() + .unbind( this.eventNamespace ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetFullName + "-disabled " + + "ui-state-disabled" ); + + // clean up events and states + this.bindings.unbind( this.eventNamespace ); + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + }, + _destroy: $.noop, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key, + parts, + curOption, + i; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.widget.extend( {}, this.options ); + } + + if ( typeof key === "string" ) { + // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } + options = {}; + parts = key.split( "." ); + key = parts.shift(); + if ( parts.length ) { + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); + for ( i = 0; i < parts.length - 1; i++ ) { + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; + curOption = curOption[ parts[ i ] ]; + } + key = parts.pop(); + if ( arguments.length === 1 ) { + return curOption[ key ] === undefined ? null : curOption[ key ]; + } + curOption[ key ] = value; + } else { + if ( arguments.length === 1 ) { + return this.options[ key ] === undefined ? null : this.options[ key ]; + } + options[ key ] = value; + } + } + + this._setOptions( options ); + + return this; + }, + _setOptions: function( options ) { + var key; + + for ( key in options ) { + this._setOption( key, options[ key ] ); + } + + return this; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + .toggleClass( this.widgetFullName + "-disabled", !!value ); + + // If the widget is becoming disabled, then nothing is interactive + if ( value ) { + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + } + } + + return this; + }, + + enable: function() { + return this._setOptions({ disabled: false }); + }, + disable: function() { + return this._setOptions({ disabled: true }); + }, + + _on: function( suppressDisabledCheck, element, handlers ) { + var delegateElement, + instance = this; + + // no suppressDisabledCheck flag, shuffle arguments + if ( typeof suppressDisabledCheck !== "boolean" ) { + handlers = element; + element = suppressDisabledCheck; + suppressDisabledCheck = false; + } + + // no element argument, shuffle and use this.element + if ( !handlers ) { + handlers = element; + element = this.element; + delegateElement = this.widget(); + } else { + element = delegateElement = $( element ); + this.bindings = this.bindings.add( element ); + } + + $.each( handlers, function( event, handler ) { + function handlerProxy() { + // allow widgets to customize the disabled handling + // - disabled as an array instead of boolean + // - disabled class as method for disabling individual parts + if ( !suppressDisabledCheck && + ( instance.options.disabled === true || + $( this ).hasClass( "ui-state-disabled" ) ) ) { + return; + } + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + + // copy the guid so direct unbinding works + if ( typeof handler !== "string" ) { + handlerProxy.guid = handler.guid = + handler.guid || handlerProxy.guid || $.guid++; + } + + var match = event.match( /^([\w:-]*)\s*(.*)$/ ), + eventName = match[1] + instance.eventNamespace, + selector = match[2]; + if ( selector ) { + delegateElement.delegate( selector, eventName, handlerProxy ); + } else { + element.bind( eventName, handlerProxy ); + } + }); + }, + + _off: function( element, eventName ) { + eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + + this.eventNamespace; + element.unbind( eventName ).undelegate( eventName ); + + // Clear the stack to avoid memory leaks (#10056) + this.bindings = $( this.bindings.not( element ).get() ); + this.focusable = $( this.focusable.not( element ).get() ); + this.hoverable = $( this.hoverable.not( element ).get() ); + }, + + _delay: function( handler, delay ) { + function handlerProxy() { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + var instance = this; + return setTimeout( handlerProxy, delay || 0 ); + }, + + _hoverable: function( element ) { + this.hoverable = this.hoverable.add( element ); + this._on( element, { + mouseenter: function( event ) { + $( event.currentTarget ).addClass( "ui-state-hover" ); + }, + mouseleave: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-hover" ); + } + }); + }, + + _focusable: function( element ) { + this.focusable = this.focusable.add( element ); + this._on( element, { + focusin: function( event ) { + $( event.currentTarget ).addClass( "ui-state-focus" ); + }, + focusout: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-focus" ); + } + }); + }, + + _trigger: function( type, event, data ) { + var prop, orig, + callback = this.options[ type ]; + + data = data || {}; + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + // the original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; + + // copy original event properties over to the new event + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } + } + } + + this.element.trigger( event, data ); + return !( $.isFunction( callback ) && + callback.apply( this.element[0], [ event ].concat( data ) ) === false || + event.isDefaultPrevented() ); + } +}; + +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { + if ( typeof options === "string" ) { + options = { effect: options }; + } + var hasOptions, + effectName = !options ? + method : + options === true || typeof options === "number" ? + defaultEffect : + options.effect || defaultEffect; + options = options || {}; + if ( typeof options === "number" ) { + options = { duration: options }; + } + hasOptions = !$.isEmptyObject( options ); + options.complete = callback; + if ( options.delay ) { + element.delay( options.delay ); + } + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { + element[ method ]( options ); + } else if ( effectName !== method && element[ effectName ] ) { + element[ effectName ]( options.duration, options.easing, callback ); + } else { + element.queue(function( next ) { + $( this )[ method ](); + if ( callback ) { + callback.call( element[ 0 ] ); + } + next(); + }); + } + }; +}); + +var widget = $.widget; + + + +})); diff --git a/assets/js/lib/lightslider.min.js b/assets/js/lib/lightslider.min.js new file mode 100644 index 0000000..ea16d58 --- /dev/null +++ b/assets/js/lib/lightslider.min.js @@ -0,0 +1,4 @@ +/*! lightslider - v1.1.6 - 2016-10-25 +* https://github.com/sachinchoolur/lightslider +* Copyright (c) 2016 Sachin N; Licensed MIT */ +!function(a,b){"use strict";var c={item:3,autoWidth:!1,slideMove:1,slideMargin:10,addClass:"",mode:"slide",useCSS:!0,cssEasing:"ease",easing:"linear",speed:400,auto:!1,pauseOnHover:!1,loop:!1,slideEndAnimation:!0,pause:2e3,keyPress:!1,controls:!0,prevHtml:"",nextHtml:"",rtl:!1,adaptiveHeight:!1,vertical:!1,verticalHeight:500,vThumbWidth:100,thumbItem:10,pager:!0,gallery:!1,galleryMargin:5,thumbMargin:5,currentPagerPosition:"middle",enableTouch:!0,enableDrag:!0,freeMove:!0,swipeThreshold:40,responsive:[],onBeforeStart:function(a){},onSliderLoad:function(a){},onBeforeSlide:function(a,b){},onAfterSlide:function(a,b){},onBeforeNextSlide:function(a,b){},onBeforePrevSlide:function(a,b){}};a.fn.lightSlider=function(b){if(0===this.length)return this;if(this.length>1)return this.each(function(){a(this).lightSlider(b)}),this;var d={},e=a.extend(!0,{},c,b),f={},g=this;d.$el=this,"fade"===e.mode&&(e.vertical=!1);var h=g.children(),i=a(window).width(),j=null,k=null,l=0,m=0,n=!1,o=0,p="",q=0,r=e.vertical===!0?"height":"width",s=e.vertical===!0?"margin-bottom":"margin-right",t=0,u=0,v=0,w=0,x=null,y="ontouchstart"in document.documentElement,z={};return z.chbreakpoint=function(){if(i=a(window).width(),e.responsive.length){var b;if(e.autoWidth===!1&&(b=e.item),ie.responsive[0].breakpoint)for(var g in f)f.hasOwnProperty(g)&&(e[g]=f[g]);e.autoWidth===!1&&t>0&&v>0&&b!==e.item&&(q=Math.round(t/((v+e.slideMargin)*e.slideMove)))}},z.calSW=function(){e.autoWidth===!1&&(v=(o-(e.item*e.slideMargin-e.slideMargin))/e.item)},z.calWidth=function(a){var b=a===!0?p.find(".lslide").length:h.length;if(e.autoWidth===!1)m=b*(v+e.slideMargin);else{m=0;for(var c=0;b>c;c++)m+=parseInt(h.eq(c).width())+e.slideMargin}return m},d={doCss:function(){var a=function(){for(var a=["transition","MozTransition","WebkitTransition","OTransition","msTransition","KhtmlTransition"],b=document.documentElement,c=0;c'+e.prevHtml+''+e.nextHtml+"
                    "),e.autoWidth?z.calWidth(!1)
                    '),p=g.parent(".lSSlideWrapper"),e.rtl===!0&&p.parent().addClass("lSrtl"),e.vertical?(p.parent().addClass("vertical"),o=e.verticalHeight,p.css("height",o+"px")):o=g.outerWidth(),h.addClass("lslide"),e.loop===!0&&"slide"===e.mode&&(z.calSW(),z.clone=function(){if(z.calWidth(!0)>o){for(var b=0,c=0,d=0;d=o+e.slideMargin));d++);var f=e.autoWidth===!0?c:e.item;if(fh.length-1-g.find(".clone.right").length;j--)q--,h.eq(j).remove();for(var k=g.find(".clone.right").length;f>k;k++)g.find(".lslide").eq(k).clone().removeClass("lslide").addClass("clone right").appendTo(g),q++;for(var l=g.find(".lslide").length-g.find(".clone.left").length;l>g.find(".lslide").length-f;l--)g.find(".lslide").eq(l-1).clone().removeClass("lslide").addClass("clone left").prependTo(g);h=g.children()}else h.hasClass("clone")&&(g.find(".clone").remove(),a.move(g,0))},z.clone()),z.sSW=function(){l=h.length,e.rtl===!0&&e.vertical===!1&&(s="margin-left"),e.autoWidth===!1&&h.css(r,v+"px"),h.css(s,e.slideMargin+"px"),m=z.calWidth(!1),g.css(r,m+"px"),e.loop===!0&&"slide"===e.mode&&n===!1&&(q=g.find(".clone.left").length)},z.calL=function(){h=g.children(),l=h.length},this.doCss()&&p.addClass("usingCss"),z.calL(),"slide"===e.mode?(z.calSW(),z.sSW(),e.loop===!0&&(t=a.slideValue(),this.move(g,t)),e.vertical===!1&&this.setHeight(g,!1)):(this.setHeight(g,!0),g.addClass("lSFade"),this.doCss()||(h.fadeOut(0),h.eq(q).fadeIn(0))),e.loop===!0&&"slide"===e.mode?h.eq(q).addClass("active"):h.first().addClass("active")},pager:function(){var a=this;if(z.createPager=function(){w=(o-(e.thumbItem*e.thumbMargin-e.thumbMargin))/e.thumbItem;var b=p.find(".lslide"),c=p.find(".lslide").length,d=0,f="",h=0;for(d=0;c>d;d++){"slide"===e.mode&&(e.autoWidth?h+=(parseInt(b.eq(d).width())+e.slideMargin)*e.slideMove:h=d*(v+e.slideMargin)*e.slideMove);var i=b.eq(d*e.slideMove).attr("data-thumb");if(f+=e.gallery===!0?'
                  • ':'
                  • '+(d+1)+"
                  • ","slide"===e.mode&&h>=m-o-e.slideMargin){d+=1;var j=2;e.autoWidth&&(f+='
                  • '+(d+1)+"
                  • ",j=1),j>d?(f=null,p.parent().addClass("noPager")):p.parent().removeClass("noPager");break}}var k=p.parent();k.find(".lSPager").html(f),e.gallery===!0&&(e.vertical===!0&&k.find(".lSPager").css("width",e.vThumbWidth+"px"),u=d*(e.thumbMargin+w)+.5,k.find(".lSPager").css({property:u+"px","transition-duration":e.speed+"ms"}),e.vertical===!0&&p.parent().css("padding-right",e.vThumbWidth+e.galleryMargin+"px"),k.find(".lSPager").css(r,u+"px"));var l=k.find(".lSPager").find("li");l.first().addClass("active"),l.on("click",function(){return e.loop===!0&&"slide"===e.mode?q+=l.index(this)-k.find(".lSPager").find("li.active").index():q=l.index(this),g.mode(!1),e.gallery===!0&&a.slideThumb(),!1})},e.pager){var b="lSpg";e.gallery&&(b="lSGallery"),p.after('
                      ');var c=e.vertical?"margin-left":"margin-top";p.parent().find(".lSPager").css(c,e.galleryMargin+"px"),z.createPager()}setTimeout(function(){z.init()},0)},setHeight:function(a,b){var c=null,d=this;c=e.loop?a.children(".lslide ").first():a.children().first();var f=function(){var d=c.outerHeight(),e=0,f=d;b&&(d=0,e=100*f/o),a.css({height:d+"px","padding-bottom":e+"%"})};f(),c.find("img").length?c.find("img")[0].complete?(f(),x||d.auto()):c.find("img").on("load",function(){setTimeout(function(){f(),x||d.auto()},100)}):x||d.auto()},active:function(a,b){this.doCss()&&"fade"===e.mode&&p.addClass("on");var c=0;if(q*e.slideMove=d&&(c=f)),e.loop===!0&&"slide"===e.mode&&(c=b===!0?q-g.find(".clone.left").length:q*e.slideMove,b===!0&&(d=a.length,f=d-1,c+1===d?c=f:c+1>d&&(c=0))),this.doCss()||"fade"!==e.mode||b!==!1||a.eq(c).fadeIn(e.speed),a.eq(c).addClass("active")}else a.removeClass("active"),a.eq(a.length-1).addClass("active"),this.doCss()||"fade"!==e.mode||b!==!1||(a.fadeOut(e.speed),a.eq(c).fadeIn(e.speed))},move:function(a,b){e.rtl===!0&&(b=-b),this.doCss()?a.css(e.vertical===!0?{transform:"translate3d(0px, "+-b+"px, 0px)","-webkit-transform":"translate3d(0px, "+-b+"px, 0px)"}:{transform:"translate3d("+-b+"px, 0px, 0px)","-webkit-transform":"translate3d("+-b+"px, 0px, 0px)"}):e.vertical===!0?a.css("position","relative").animate({top:-b+"px"},e.speed,e.easing):a.css("position","relative").animate({left:-b+"px"},e.speed,e.easing);var c=p.parent().find(".lSPager").find("li");this.active(c,!0)},fade:function(){this.active(h,!1);var a=p.parent().find(".lSPager").find("li");this.active(a,!0)},slide:function(){var a=this;z.calSlide=function(){m>o&&(t=a.slideValue(),a.active(h,!1),t>m-o-e.slideMargin?t=m-o-e.slideMargin:0>t&&(t=0),a.move(g,t),e.loop===!0&&"slide"===e.mode&&(q>=l-g.find(".clone.left").length/e.slideMove&&a.resetSlide(g.find(".clone.left").length),0===q&&a.resetSlide(p.find(".lslide").length)))},z.calSlide()},resetSlide:function(a){var b=this;p.find(".lSAction a").addClass("disabled"),setTimeout(function(){q=a,p.css("transition-duration","0ms"),t=b.slideValue(),b.active(h,!1),d.move(g,t),setTimeout(function(){p.css("transition-duration",e.speed+"ms"),p.find(".lSAction a").removeClass("disabled")},50)},e.speed+100)},slideValue:function(){var a=0;if(e.autoWidth===!1)a=q*(v+e.slideMargin)*e.slideMove;else{a=0;for(var b=0;q>b;b++)a+=parseInt(h.eq(b).width())+e.slideMargin}return a},slideThumb:function(){var a;switch(e.currentPagerPosition){case"left":a=0;break;case"middle":a=o/2-w/2;break;case"right":a=o-w}var b=q-g.find(".clone.left").length,c=p.parent().find(".lSPager");"slide"===e.mode&&e.loop===!0&&(b>=c.children().length?b=0:0>b&&(b=c.children().length));var d=b*(w+e.thumbMargin)-a;d+o>u&&(d=u-o-e.thumbMargin),0>d&&(d=0),this.move(c,d)},auto:function(){e.auto&&(clearInterval(x),x=setInterval(function(){g.goToNextSlide()},e.pause))},pauseOnHover:function(){var b=this;e.auto&&e.pauseOnHover&&(p.on("mouseenter",function(){a(this).addClass("ls-hover"),g.pause(),e.auto=!0}),p.on("mouseleave",function(){a(this).removeClass("ls-hover"),p.find(".lightSlider").hasClass("lsGrabbing")||b.auto()}))},touchMove:function(a,b){if(p.css("transition-duration","0ms"),"slide"===e.mode){var c=a-b,d=t-c;if(d>=m-o-e.slideMargin)if(e.freeMove===!1)d=m-o-e.slideMargin;else{var f=m-o-e.slideMargin;d=f+(d-f)/5}else 0>d&&(e.freeMove===!1?d=0:d/=5);this.move(g,d)}},touchEnd:function(a){if(p.css("transition-duration",e.speed+"ms"),"slide"===e.mode){var b=!1,c=!0;t-=a,t>m-o-e.slideMargin?(t=m-o-e.slideMargin,e.autoWidth===!1&&(b=!0)):0>t&&(t=0);var d=function(a){var c=0;if(b||a&&(c=1),e.autoWidth)for(var d=0,f=0;f=t));f++);else{var g=t/((v+e.slideMargin)*e.slideMove);q=parseInt(g)+c,t>=m-o-e.slideMargin&&g%1!==0&&q++}};a>=e.swipeThreshold?(d(!1),c=!1):a<=-e.swipeThreshold&&(d(!0),c=!1),g.mode(c),this.slideThumb()}else a>=e.swipeThreshold?g.goToPrevSlide():a<=-e.swipeThreshold&&g.goToNextSlide()},enableDrag:function(){var b=this;if(!y){var c=0,d=0,f=!1;p.find(".lightSlider").addClass("lsGrab"),p.on("mousedown",function(b){return o>m&&0!==m?!1:void("lSPrev"!==a(b.target).attr("class")&&"lSNext"!==a(b.target).attr("class")&&(c=e.vertical===!0?b.pageY:b.pageX,f=!0,b.preventDefault?b.preventDefault():b.returnValue=!1,p.scrollLeft+=1,p.scrollLeft-=1,p.find(".lightSlider").removeClass("lsGrab").addClass("lsGrabbing"),clearInterval(x)))}),a(window).on("mousemove",function(a){f&&(d=e.vertical===!0?a.pageY:a.pageX,b.touchMove(d,c))}),a(window).on("mouseup",function(g){if(f){p.find(".lightSlider").removeClass("lsGrabbing").addClass("lsGrab"),f=!1,d=e.vertical===!0?g.pageY:g.pageX;var h=d-c;Math.abs(h)>=e.swipeThreshold&&a(window).on("click.ls",function(b){b.preventDefault?b.preventDefault():b.returnValue=!1,b.stopImmediatePropagation(),b.stopPropagation(),a(window).off("click.ls")}),b.touchEnd(h)}})}},enableTouch:function(){var a=this;if(y){var b={},c={};p.on("touchstart",function(a){c=a.originalEvent.targetTouches[0],b.pageX=a.originalEvent.targetTouches[0].pageX,b.pageY=a.originalEvent.targetTouches[0].pageY,clearInterval(x)}),p.on("touchmove",function(d){if(o>m&&0!==m)return!1;var f=d.originalEvent;c=f.targetTouches[0];var g=Math.abs(c.pageX-b.pageX),h=Math.abs(c.pageY-b.pageY);e.vertical===!0?(3*h>g&&d.preventDefault(),a.touchMove(c.pageY,b.pageY)):(3*g>h&&d.preventDefault(),a.touchMove(c.pageX,b.pageX))}),p.on("touchend",function(){if(o>m&&0!==m)return!1;var d;d=e.vertical===!0?c.pageY-b.pageY:c.pageX-b.pageX,a.touchEnd(d)})}},build:function(){var b=this;b.initialStyle(),this.doCss()&&(e.enableTouch===!0&&b.enableTouch(),e.enableDrag===!0&&b.enableDrag()),a(window).on("focus",function(){b.auto()}),a(window).on("blur",function(){clearInterval(x)}),b.pager(),b.pauseOnHover(),b.controls(),b.keyPress()}},d.build(),z.init=function(){z.chbreakpoint(),e.vertical===!0?(o=e.item>1?e.verticalHeight:h.outerHeight(),p.css("height",o+"px")):o=p.outerWidth(),e.loop===!0&&"slide"===e.mode&&z.clone(),z.calL(),"slide"===e.mode&&g.removeClass("lSSlide"),"slide"===e.mode&&(z.calSW(),z.sSW()),setTimeout(function(){"slide"===e.mode&&g.addClass("lSSlide")},1e3),e.pager&&z.createPager(),e.adaptiveHeight===!0&&e.vertical===!1&&g.css("height",h.eq(q).outerHeight(!0)),e.adaptiveHeight===!1&&("slide"===e.mode?e.vertical===!1?d.setHeight(g,!1):d.auto():d.setHeight(g,!0)),e.gallery===!0&&d.slideThumb(),"slide"===e.mode&&d.slide(),e.autoWidth===!1?h.length<=e.item?p.find(".lSAction").hide():p.find(".lSAction").show():z.calWidth(!1)0)e.onBeforePrevSlide.call(this,g,q),q--,g.mode(!1),e.gallery===!0&&d.slideThumb();else if(e.loop===!0){if(e.onBeforePrevSlide.call(this,g,q),"fade"===e.mode){var a=l-1;q=parseInt(a/e.slideMove)}g.mode(!1),e.gallery===!0&&d.slideThumb()}else e.slideEndAnimation===!0&&(g.addClass("leftEnd"),setTimeout(function(){g.removeClass("leftEnd")},400))},g.goToNextSlide=function(){var a=!0;if("slide"===e.mode){var b=d.slideValue();a=b=q?b+(q-c):q>=b+c?q-b-c:q-c}return a+1},g.getTotalSlideCount=function(){return p.find(".lslide").length},g.goToSlide=function(a){q=e.loop?a+g.find(".clone.left").length-1:a,g.mode(!1),e.gallery===!0&&d.slideThumb()},g.destroy=function(){g.lightSlider&&(g.goToPrevSlide=function(){},g.goToNextSlide=function(){},g.mode=function(){},g.play=function(){},g.pause=function(){},g.refresh=function(){},g.getCurrentSlideCount=function(){},g.getTotalSlideCount=function(){},g.goToSlide=function(){},g.lightSlider=null,z={init:function(){}},g.parent().parent().find(".lSAction, .lSPager").remove(),g.removeClass("lightSlider lSFade lSSlide lsGrab lsGrabbing leftEnd right").removeAttr("style").unwrap().unwrap(),g.children().removeAttr("style"),h.removeClass("lslide active"),g.find(".clone").remove(),h=null,x=null,n=!1,q=0)},setTimeout(function(){e.onSliderLoad.call(this,g)},10),a(window).on("resize orientationchange",function(a){setTimeout(function(){a.preventDefault?a.preventDefault():a.returnValue=!1,z.init()},200)}),this}}(jQuery); \ No newline at end of file diff --git a/assets/js/lib/medium-editor-insert-plugin.min.js b/assets/js/lib/medium-editor-insert-plugin.min.js new file mode 100644 index 0000000..0ffb6db --- /dev/null +++ b/assets/js/lib/medium-editor-insert-plugin.min.js @@ -0,0 +1,11 @@ +/*! + * medium-editor-insert-plugin v2.4.1 - jQuery insert plugin for MediumEditor + * + * http://linkesch.com/medium-editor-insert-plugin + * + * Copyright (c) 2014 Pavel Linkesch (http://linkesch.com) + * Released under the MIT license + */ + +!function(a){"function"==typeof define&&define.amd?define(["jquery","handlebars/runtime","medium-editor","blueimp-file-upload","jquery-sortable"],a):"object"==typeof module&&module.exports?module.exports=function(b){if("undefined"==typeof window)throw new Error("medium-editor-insert-plugin runs only in a browser.");return void 0===b&&(b=require("jquery")),window.jQuery=b,Handlebars=require("handlebars/runtime"),MediumEditor=require("medium-editor"),require("jquery-sortable"),require("blueimp-file-upload"),a(b,Handlebars,MediumEditor),b}:a(jQuery,Handlebars,MediumEditor)}(function(a,b,c){this.MediumInsert=this.MediumInsert||{},this.MediumInsert.Templates=this.MediumInsert.Templates||{},this.MediumInsert.Templates["src/js/templates/core-buttons.hbs"]=b.template({1:function(a,b,c,d,e){var f,g,h=null!=b?b:{},i=c.helperMissing,j="function";return'
                    • \n"},compiler:[7,">= 4.0.0"],main:function(a,b,c,d,e){var f;return'\n"},useData:!0}),this.MediumInsert.Templates["src/js/templates/core-caption.hbs"]=b.template({compiler:[7,">= 4.0.0"],main:function(a,b,c,d,e){var f;return'
                      '},useData:!0}),this.MediumInsert.Templates["src/js/templates/core-empty-line.hbs"]=b.template({compiler:[7,">= 4.0.0"],main:function(a,b,c,d,e){return"


                      \n"},useData:!0}),this.MediumInsert.Templates["src/js/templates/embeds-toolbar.hbs"]=b.template({1:function(a,b,c,d,e){var f;return'
                      \n
                        \n'+(null!=(f=c.each.call(null!=b?b:{},null!=b?b.styles:b,{name:"each",hash:{},fn:a.program(2,e,0),inverse:a.noop,data:e}))?f:"")+"
                      \n
                      \n"},2:function(a,b,c,d,e){var f;return null!=(f=c.if.call(null!=b?b:{},null!=b?b.label:b,{name:"if",hash:{},fn:a.program(3,e,0),inverse:a.noop,data:e}))?f:""},3:function(a,b,c,d,e){var f,g,h=null!=b?b:{},i=c.helperMissing,j="function";return'
                    • \n \n
                    • \n"},5:function(a,b,c,d,e){var f;return'
                      \n
                        \n'+(null!=(f=c.each.call(null!=b?b:{},null!=b?b.actions:b,{name:"each",hash:{},fn:a.program(2,e,0),inverse:a.noop,data:e}))?f:"")+"
                      \n
                      \n"},compiler:[7,">= 4.0.0"],main:function(a,b,c,d,e){var f,g=null!=b?b:{};return(null!=(f=c.if.call(g,null!=b?b.styles:b,{name:"if",hash:{},fn:a.program(1,e,0),inverse:a.noop,data:e}))?f:"")+"\n"+(null!=(f=c.if.call(g,null!=b?b.actions:b,{name:"if",hash:{},fn:a.program(5,e,0),inverse:a.noop,data:e}))?f:"")},useData:!0}),this.MediumInsert.Templates["src/js/templates/embeds-wrapper.hbs"]=b.template({compiler:[7,">= 4.0.0"],main:function(a,b,c,d,e){var f,g;return'
                      \n\t
                      \n\t\t
                      \n\t\t\t'+(null!=(g=null!=(g=c.html||(null!=b?b.html:b))?g:c.helperMissing,f="function"==typeof g?g.call(null!=b?b:{},{name:"html",hash:{},data:e}):g)?f:"")+'\n\t\t
                      \n\t
                      \n\t
                      \n
                      '},useData:!0}),this.MediumInsert.Templates["src/js/templates/images-fileupload.hbs"]=b.template({compiler:[7,">= 4.0.0"],main:function(a,b,c,d,e){return''},useData:!0}),this.MediumInsert.Templates["src/js/templates/images-image.hbs"]=b.template({1:function(a,b,c,d,e){return'
                      \n'},compiler:[7,">= 4.0.0"],main:function(a,b,c,d,e){var f,g,h=null!=b?b:{};return'
                      \n \n'+(null!=(f=c.if.call(h,null!=b?b.progress:b,{name:"if",hash:{},fn:a.program(1,e,0),inverse:a.noop,data:e}))?f:"")+"
                      \n"},useData:!0}),this.MediumInsert.Templates["src/js/templates/images-progressbar.hbs"]=b.template({compiler:[7,">= 4.0.0"],main:function(a,b,c,d,e){return'0'},useData:!0}),this.MediumInsert.Templates["src/js/templates/images-toolbar.hbs"]=b.template({1:function(a,b,c,d,e){var f;return null!=(f=c.if.call(null!=b?b:{},null!=b?b.label:b,{name:"if",hash:{},fn:a.program(2,e,0),inverse:a.noop,data:e}))?f:""},2:function(a,b,c,d,e){var f,g,h=null!=b?b:{},i=c.helperMissing,j="function";return'
                    • \n \n
                    • \n"},4:function(a,b,c,d,e){var f;return'\t
                      \n\t\t
                        \n'+(null!=(f=c.each.call(null!=b?b:{},null!=b?b.actions:b,{name:"each",hash:{},fn:a.program(5,e,0),inverse:a.noop,data:e}))?f:"")+" \t
                      \n
                      \n"},5:function(a,b,c,d,e){var f;return null!=(f=c.if.call(null!=b?b:{},null!=b?b.label:b,{name:"if",hash:{},fn:a.program(6,e,0),inverse:a.noop,data:e}))?f:""},6:function(a,b,c,d,e){var f,g,h=null!=b?b:{},i=c.helperMissing,j="function";return' \t
                    • \n \t \n \t
                    • \n"},compiler:[7,">= 4.0.0"],main:function(a,b,c,d,e){var f,g=null!=b?b:{};return'
                      \n
                        \n'+(null!=(f=c.each.call(g,null!=b?b.styles:b,{name:"each",hash:{},fn:a.program(1,e,0),inverse:a.noop,data:e}))?f:"")+"
                      \n
                      \n\n"+(null!=(f=c.if.call(g,null!=b?b.actions:b,{name:"if",hash:{},fn:a.program(4,e,0),inverse:a.noop,data:e}))?f:"")},useData:!0}),function(a,b,c,d){"use strict";function e(a){return a.charAt(0).toUpperCase()+a.slice(1)}function f(c,e){var f;this.el=c,this.$el=a(c),this.templates=b.MediumInsert.Templates,e&&(f=e.editor,e.editor=null),this.options=a.extend(!0,{},h,e),this.options.editor=f,this._defaults=h,this._name=g,this.options&&this.options.editor&&(this.options.editor._serialize===d&&(this.options.editor._serialize=this.options.editor.serialize),this.options.editor._destroy===d&&(this.options.editor._destroy=this.options.editor.destroy),this.options.editor._setup===d&&(this.options.editor._setup=this.options.editor.setup),this.options.editor._hideInsertButtons=this.hideButtons,this.options.editor.serialize=this.editorSerialize,this.options.editor.destroy=this.editorDestroy,this.options.editor.setup=this.editorSetup,this.options.editor.getExtensionByName("placeholder")!==d&&(this.options.editor.getExtensionByName("placeholder").updatePlaceholder=this.editorUpdatePlaceholder))}var g="mediumInsert",h={editor:null,enabled:!0,addons:{images:!0,embeds:!0}};f.prototype.init=function(){this.$el.addClass("medium-editor-insert-plugin"),"object"==typeof this.options.addons&&0!==Object.keys(this.options.addons).length||this.disable(),this.initAddons(),this.clean(),this.events()},f.prototype.events=function(){var c=this;this.$el.on("dragover drop",function(a){a.preventDefault()}).on("keyup click",a.proxy(this,"toggleButtons")).on("selectstart mousedown",".medium-insert, .medium-insert-buttons",a.proxy(this,"disableSelection")).on("click",".medium-insert-buttons-show",a.proxy(this,"toggleAddons")).on("click",".medium-insert-action",a.proxy(this,"addonAction")).on("paste",".medium-insert-caption-placeholder",function(b){a.proxy(c,"removeCaptionPlaceholder")(a(b.target))}),a(b).on("resize",a.proxy(this,"positionButtons",null))},f.prototype.getEditor=function(){return this.options.editor},f.prototype.editorSerialize=function(){var b=this._serialize();return a.each(b,function(c){var d=a("
                      ").html(b[c].value);d.find(".medium-insert-buttons").remove(),d.find(".medium-insert-active").removeClass("medium-insert-active"),d.find("[data-embed-code]").each(function(){var b=a(this),c=a("
                      ").html(b.attr("data-embed-code")).text();b.html(c)}),b[c].value=d.html()}),b},f.prototype.editorDestroy=function(){a.each(this.elements,function(b,c){a(c).data("plugin_"+g)instanceof f&&a(c).data("plugin_"+g).disable()}),this._destroy()},f.prototype.editorSetup=function(){this._setup(),a.each(this.elements,function(b,c){a(c).data("plugin_"+g)instanceof f&&a(c).data("plugin_"+g).enable()})},f.prototype.editorUpdatePlaceholder=function(b,c){var d=a(b).children().not(".medium-insert-buttons").contents();c||1!==d.length||"br"!==d[0].nodeName.toLowerCase()?this.hidePlaceholder(b):(this.showPlaceholder(b),this.base._hideInsertButtons(a(b)))},f.prototype.triggerInput=function(){this.getEditor()&&this.getEditor().trigger("editableInput",null,this.el)},f.prototype.deselect=function(){c.getSelection().removeAllRanges()},f.prototype.disable=function(){this.options.enabled=!1,this.$el.find(".medium-insert-buttons").addClass("hide")},f.prototype.enable=function(){this.options.enabled=!0,this.$el.find(".medium-insert-buttons").removeClass("hide")},f.prototype.disableSelection=function(b){var c=a(b.target);(!1===c.is("img")||c.hasClass("medium-insert-buttons-show"))&&b.preventDefault()},f.prototype.initAddons=function(){var b=this;this.options.addons&&0!==this.options.addons.length&&a.each(this.options.addons,function(a,c){var d=g+e(a);if(!1===c)return void delete b.options.addons[a];b.$el[d](c),b.options.addons[a]=b.$el.data("plugin_"+d).options})},f.prototype.clean=function(){var b,c,d,e=this;!1!==this.options.enabled&&(0===this.$el.children().length&&this.$el.html(this.templates["src/js/templates/core-empty-line.hbs"]().trim()),d=this.$el.contents().filter(function(){return"#text"===this.nodeName&&""!==a.trim(a(this).text())||"br"===this.nodeName.toLowerCase()}),d.each(function(){a(this).wrap("

                      "),e.moveCaret(a(this).parent(),a(this).text().length)}),this.addButtons(),b=this.$el.find(".medium-insert-buttons"),c=b.prev(),c.attr("class")&&c.attr("class").match(/medium\-insert(?!\-active)/)&&b.before(this.templates["src/js/templates/core-empty-line.hbs"]().trim()))},f.prototype.getButtons=function(){if(!1!==this.options.enabled)return this.templates["src/js/templates/core-buttons.hbs"]({addons:this.options.addons}).trim()},f.prototype.addButtons=function(){0===this.$el.find(".medium-insert-buttons").length&&this.$el.append(this.getButtons())},f.prototype.toggleButtons=function(c){var d,e,f,g,h=a(c.target),i=b.getSelection(),j=this;!1!==this.options.enabled&&(i&&0!==i.rangeCount?(d=i.getRangeAt(0),e=a(d.commonAncestorContainer)):e=h,e.hasClass("medium-editor-insert-plugin")&&(e=e.find("p:first")),f=e.is("p")?e:e.closest("p"),this.clean(),!1===h.hasClass("medium-editor-placeholder")&&0===h.closest(".medium-insert-buttons").length&&0===e.closest(".medium-insert-buttons").length&&(this.$el.find(".medium-insert-active").removeClass("medium-insert-active"),a.each(this.options.addons,function(a){if(h.closest(".medium-insert-"+a).length&&(e=h),e.closest(".medium-insert-"+a).length)return f=e.closest(".medium-insert-"+a),void(g=a)}),f.length&&(""===f.text().trim()&&!g||"images"===g)?(f.addClass("medium-insert-active"),"images"===g?this.$el.find(".medium-insert-buttons").attr("data-active-addon",g):this.$el.find(".medium-insert-buttons").removeAttr("data-active-addon"),setTimeout(function(){j.positionButtons(g),j.showButtons(g)},g?100:0)):this.hideButtons()))},f.prototype.showButtons=function(a){var b=this.$el.find(".medium-insert-buttons");b.show(),b.find("li").show(),a&&(b.find("li").hide(),b.find('button[data-addon="'+a+'"]').parent().show())},f.prototype.hideButtons=function(a){a=a||this.$el,a.find(".medium-insert-buttons").hide(),a.find(".medium-insert-buttons-addons").hide(),a.find(".medium-insert-buttons-show").removeClass("medium-insert-buttons-rotate")},f.prototype.positionButtons=function(c){var d=this.$el.find(".medium-insert-buttons"),e=this.$el.find(".medium-insert-active"),f=e.hasClass("medium-insert-images-grid")?[]:e.find("figure:last figcaption"),g=this.getEditor()?this.getEditor().options.elementsContainer:a("body").get(0),h=["absolute","fixed"].indexOf(b.getComputedStyle(g).getPropertyValue("position"))>-1,i={};e.length&&(i.left=e.position().left,i.top=e.position().top,c?(i.left+=e.width()-d.find(".medium-insert-buttons-show").width()-10,i.top+=e.height()-20+(f.length?-f.height()-parseInt(f.css("margin-top"),10):10)):(i.left+=-parseInt(d.find(".medium-insert-buttons-addons").css("left"),10)-parseInt(d.find(".medium-insert-buttons-addons button:first").css("margin-left"),10),i.top+=parseInt(e.css("margin-top"),10)),h&&(i.top+=g.scrollTop),!1===this.$el.hasClass("medium-editor-placeholder")&&i.left<0&&(i.left=e.position().left),d.css(i))},f.prototype.toggleAddons=function(){if("images"===this.$el.find(".medium-insert-buttons").attr("data-active-addon"))return void this.$el.find(".medium-insert-buttons").find('button[data-addon="images"]').click();this.$el.find(".medium-insert-buttons-addons").fadeToggle(),this.$el.find(".medium-insert-buttons-show").toggleClass("medium-insert-buttons-rotate")},f.prototype.hideAddons=function(){this.$el.find(".medium-insert-buttons-addons").hide(),this.$el.find(".medium-insert-buttons-show").removeClass("medium-insert-buttons-rotate")},f.prototype.addonAction=function(b){var c=a(b.currentTarget),d=c.data("addon"),f=c.data("action");this.$el.data("plugin_"+g+e(d))[f]()},f.prototype.moveCaret=function(a,d){var e,f,g,h;d=d||0,e=c.createRange(),f=b.getSelection(),g=a.get(0),g.childNodes.length||(h=c.createTextNode(" "),g.appendChild(h)),e.setStart(g.childNodes[0],d),e.collapse(!0),f.removeAllRanges(),f.addRange(e)},f.prototype.addCaption=function(a,b){0===a.find("figcaption").length&&a.append(this.templates["src/js/templates/core-caption.hbs"]({placeholder:b}))},f.prototype.removeCaptions=function(b){var c=this.$el.find("figcaption");b&&(c=c.not(b)),c.each(function(){(a(this).hasClass("medium-insert-caption-placeholder")||""===a(this).text().trim())&&a(this).remove()})},f.prototype.removeCaptionPlaceholder=function(a){var b=a.is("figcaption")?a:a.find("figcaption");b.length&&b.removeClass("medium-insert-caption-placeholder").removeAttr("data-placeholder")},a.fn[g]=function(b){return this.each(function(){var c,d=this;a(d).is("textarea")&&(c=a(d).attr("medium-editor-textarea-id"),d=a(d).siblings('[medium-editor-textarea-id="'+c+'"]').get(0)),a.data(d,"plugin_"+g)?"string"==typeof b&&a.data(d,"plugin_"+g)[b]&&a.data(d,"plugin_"+g)[b]():(a.data(d,"plugin_"+g,new f(d,b)),a.data(d,"plugin_"+g).init())})}}(jQuery,window,document),function(a,b,c,d){"use strict";function e(c,d){this.el=c,this.$el=a(c),this.templates=b.MediumInsert.Templates,this.core=this.$el.data("plugin_"+f),this.options=a.extend(!0,{},h,d),this._defaults=h,this._name=f,this.core.getEditor()&&(this.core.getEditor()._serializePreEmbeds=this.core.getEditor().serialize,this.core.getEditor().serialize=this.editorSerialize),this.init()}var f="mediumInsert",g="Embeds",h={label:'',placeholder:"Paste a YouTube, Vimeo, Facebook, Twitter or Instagram link and press Enter",oembedProxy:"http://medium.iframe.ly/api/oembed?iframe=1",captions:!0,captionPlaceholder:"Type caption (optional)",storeMeta:!1,styles:{wide:{label:''},left:{label:''},right:{label:''}},actions:{remove:{label:'',clicked:function(){var b=a.Event("keydown");b.which=8,a(c).trigger(b)}}},parseOnPaste:!1};e.prototype.init=function(){var b=this.$el.find(".medium-insert-embeds");b.attr("contenteditable",!1),b.each(function(){0===a(this).find(".medium-insert-embeds-overlay").length&&a(this).append(a("

                      ").addClass("medium-insert-embeds-overlay"))}),this.events(),this.backwardsCompatibility()},e.prototype.events=function(){a(c).on("click",a.proxy(this,"unselectEmbed")).on("keydown",a.proxy(this,"removeEmbed")).on("click",".medium-insert-embeds-toolbar .medium-editor-action",a.proxy(this,"toolbarAction")).on("click",".medium-insert-embeds-toolbar2 .medium-editor-action",a.proxy(this,"toolbar2Action")),this.$el.on("keyup click paste",a.proxy(this,"togglePlaceholder")).on("keydown",a.proxy(this,"processLink")).on("click",".medium-insert-embeds-overlay",a.proxy(this,"selectEmbed")).on("contextmenu",".medium-insert-embeds-placeholder",a.proxy(this,"fixRightClickOnPlaceholder")),this.options.parseOnPaste&&this.$el.on("paste",a.proxy(this,"processPasted")),a(b).on("resize",a.proxy(this,"autoRepositionToolbars"))},e.prototype.backwardsCompatibility=function(){var b=this;this.$el.find(".mediumInsert-embeds").removeClass("mediumInsert-embeds").addClass("medium-insert-embeds"),this.$el.find(".medium-insert-embeds").each(function(){0===a(this).find(".medium-insert-embed").length&&(a(this).after(b.templates["src/js/templates/embeds-wrapper.hbs"]({html:a(this).html()})),a(this).remove())})},e.prototype.editorSerialize=function(){var b=this._serializePreEmbeds();return a.each(b,function(c){var d=a("
                      ").html(b[c].value);d.find(".medium-insert-embeds").removeAttr("contenteditable"),d.find(".medium-insert-embeds-overlay").remove(),b[c].value=d.html()}),b},e.prototype.add=function(){var a=this.$el.find(".medium-insert-active");a.html(this.templates["src/js/templates/core-empty-line.hbs"]().trim()),a.is("p")&&(a.replaceWith('
                      '+a.html()+"
                      "),a=this.$el.find(".medium-insert-active"),this.core.moveCaret(a)),a.addClass("medium-insert-embeds medium-insert-embeds-input medium-insert-embeds-active"),this.togglePlaceholder({target:a.get(0)}),a.click(),this.core.hideButtons()},e.prototype.togglePlaceholder=function(c){var d,e,f,g=a(c.target),h=b.getSelection();h&&0!==h.rangeCount&&(d=h.getRangeAt(0),e=a(d.commonAncestorContainer),e.hasClass("medium-insert-embeds-active")?g=e:e.closest(".medium-insert-embeds-active").length&&(g=e.closest(".medium-insert-embeds-active")),g.hasClass("medium-insert-embeds-active")?(f=g.text().trim(),""===f&&!1===g.hasClass("medium-insert-embeds-placeholder")?g.addClass("medium-insert-embeds-placeholder").attr("data-placeholder",this.options.placeholder):""!==f&&g.hasClass("medium-insert-embeds-placeholder")&&g.removeClass("medium-insert-embeds-placeholder").removeAttr("data-placeholder")):this.$el.find(".medium-insert-embeds-active").remove())},e.prototype.fixRightClickOnPlaceholder=function(b){this.core.moveCaret(a(b.target))},e.prototype.processLink=function(a){var b,c=this.$el.find(".medium-insert-embeds-active");if(c.length){if(""===(b=c.text().trim())&&-1!==[8,46,13].indexOf(a.which))return void c.remove();13===a.which&&(a.preventDefault(),a.stopPropagation(),this.options.oembedProxy?this.oembed(b):this.parseUrl(b))}},e.prototype.processPasted=function(b){var c,d;a(".medium-insert-embeds-active").length||(c=b.originalEvent.clipboardData.getData("text"),d=new RegExp("^(http(s?):)?//","i"),d.test(c)&&(this.options.oembedProxy?this.oembed(c,!0):this.parseUrl(c,!0)))},e.prototype.oembed=function(c,d){var e=this;a.support.cors=!0,a.ajax({crossDomain:!0,cache:!1,url:this.options.oembedProxy,dataType:"json",data:{url:c},success:function(b){var f=b&&b.html;if(e.options.storeMeta&&(f+='
                      ':f=a.settings.video_template_callback?a.settings.video_template_callback(e):'"}return f}function h(a){var b={};return new tinymce.html.SaxParser({validate:!1,allow_conditional_comments:!0,special:"script,noscript",start:function(a,c){if(b.source1||"param"!=a||(b.source1=c.map.movie),"iframe"!=a&&"object"!=a&&"embed"!=a&&"video"!=a&&"audio"!=a||(b.type||(b.type=a),b=tinymce.extend(c.map,b)),"script"==a){var e=d(c.map.src);if(!e)return;b={type:"script",source1:c.map.src,width:e.width,height:e.height}}"source"==a&&(b.source1?b.source2||(b.source2=c.map.src):b.source1=c.map.src),"img"!=a||b.poster||(b.poster=c.map.src)}}).parse(a),b.source1=b.source1||b.src||b.data,b.source2=b.source2||"",b.poster=b.poster||"",b}function i(b){return b.getAttribute("data-mce-object")?h(a.serializer.serialize(b,{selection:!0})):{}}function j(b){if(a.settings.media_filter_html===!1)return b;var c,d=new tinymce.html.Writer;return new tinymce.html.SaxParser({validate:!1,allow_conditional_comments:!1,special:"script,noscript",comment:function(a){d.comment(a)},cdata:function(a){d.cdata(a)},text:function(a,b){d.text(a,b)},start:function(b,e,f){if(c=!0,"script"!=b&&"noscript"!=b){for(var g=0;g=g&&(d(h,{src:b["source"+g],type:b["source"+g+"mime"]}),!b["source"+g]))return;break;case"img":if(!b.poster)return;e=!0}f.start(a,h,i)},end:function(a){if("video"==a&&c)for(var h=1;2>=h;h++)if(b["source"+h]){var i=[];i.map={},h>g&&(d(i,{src:b["source"+h],type:b["source"+h+"mime"]}),f.start("source",i,!0))}if(b.poster&&"object"==a&&c&&!e){var j=[];j.map={},d(j,{src:b.poster,width:b.width,height:b.height}),f.start("img",j,!0)}f.end(a)}},new tinymce.html.Schema({})).parse(a),f.getContent()}function l(b,c){var d,e,f,g,h;for(f=b.attributes,g=f.length;g--;)d=f[g].name,e=f[g].value,"width"!==d&&"height"!==d&&"style"!==d&&("data"!=d&&"src"!=d||(e=a.convertURL(e,d)),c.attr("data-mce-p-"+d,e));h=b.firstChild&&b.firstChild.value,h&&(c.attr("data-mce-html",escape(h)),c.firstChild=null)}function m(a){var b,c=a.name;return b=new tinymce.html.Node("img",1),b.shortEnded=!0,l(a,b),b.attr({width:a.attr("width")||"300",height:a.attr("height")||("audio"==c?"30":"150"),style:a.attr("style"),src:tinymce.Env.transparentSrc,"data-mce-object":c,"class":"mce-object mce-object-"+c}),b}function n(a){var b,c,d,e=a.name;return b=new tinymce.html.Node("span",1),b.attr({contentEditable:"false",style:a.attr("style"),"data-mce-object":e,"class":"mce-preview-object mce-object-"+e}),l(a,b),c=new tinymce.html.Node(e,1),c.attr({src:a.attr("src"),allowfullscreen:a.attr("allowfullscreen"),width:a.attr("width")||"300",height:a.attr("height")||("audio"==e?"30":"150"),frameborder:"0"}),d=new tinymce.html.Node("span",1),d.attr("class","mce-shim"),b.append(c),b.append(d),b}var o=[{regex:/youtu\.be\/([\w\-.]+)/,type:"iframe",w:560,h:314,url:"//www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/youtube\.com(.+)v=([^&]+)/,type:"iframe",w:560,h:314,url:"//www.youtube.com/embed/$2",allowFullscreen:!0},{regex:/youtube.com\/embed\/([a-z0-9\-_]+(?:\?.+)?)/i,type:"iframe",w:560,h:314,url:"//www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/vimeo\.com\/([0-9]+)/,type:"iframe",w:425,h:350,url:"//player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc",allowfullscreen:!0},{regex:/vimeo\.com\/(.*)\/([0-9]+)/,type:"iframe",w:425,h:350,url:"//player.vimeo.com/video/$2?title=0&byline=0",allowfullscreen:!0},{regex:/maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/,type:"iframe",w:425,h:350,url:'//maps.google.com/maps/ms?msid=$2&output=embed"',allowFullscreen:!1},{regex:/dailymotion\.com\/video\/([^_]+)/,type:"iframe",w:480,h:270,url:"//www.dailymotion.com/embed/video/$1",allowFullscreen:!0}],p=tinymce.Env.ie&&tinymce.Env.ie<=8?"onChange":"onInput";a.on("ResolveName",function(a){var b;1==a.target.nodeType&&(b=a.target.getAttribute("data-mce-object"))&&(a.name=b)}),a.on("preInit",function(){var b=a.schema.getSpecialElements();tinymce.each("video audio iframe object".split(" "),function(a){b[a]=new RegExp("]*>","gi")});var c=a.schema.getBoolAttrs();tinymce.each("webkitallowfullscreen mozallowfullscreen allowfullscreen".split(" "),function(a){c[a]={}}),a.parser.addNodeFilter("iframe,video,audio,object,embed,script",function(b){for(var c,e,f,g=b.length;g--;)c=b[g],c.parent&&(c.parent.attr("data-mce-object")||("script"!=c.name||(f=d(c.attr("src"))))&&(f&&(f.width&&c.attr("width",f.width.toString()),f.height&&c.attr("height",f.height.toString())),e="iframe"==c.name&&a.settings.media_live_embeds!==!1&&tinymce.Env.ceFalse?n(c):m(c),c.replace(e)))}),a.serializer.addAttributeFilter("data-mce-object",function(a,b){for(var c,d,e,f,g,h,i,k,l=a.length;l--;)if(c=a[l],c.parent){for(i=c.attr(b),d=new tinymce.html.Node(i,1),"audio"!=i&&"script"!=i&&(k=c.attr("class"),k&&-1!==k.indexOf("mce-preview-object")?d.attr({width:c.firstChild.attr("width"),height:c.firstChild.attr("height")}):d.attr({width:c.attr("width"),height:c.attr("height")})),d.attr({style:c.attr("style")}),f=c.attributes,e=f.length;e--;){var m=f[e].name;0===m.indexOf("data-mce-p-")&&d.attr(m.substr(11),f[e].value)}"script"==i&&d.attr("type","text/javascript"),g=c.attr("data-mce-html"),g&&(h=new tinymce.html.Node("#text",3),h.raw=!0,h.value=j(unescape(g)),d.append(h)),c.replace(d)}})}),a.on("click keyup",function(){var b=a.selection.getNode();b&&a.dom.hasClass(b,"mce-preview-object")&&a.dom.getAttrib(b,"data-mce-selected")&&b.setAttribute("data-mce-selected","2")}),a.on("ObjectSelected",function(a){var b=a.target.getAttribute("data-mce-object");"audio"!=b&&"script"!=b||a.preventDefault()}),a.on("objectResized",function(a){var b,c=a.target;c.getAttribute("data-mce-object")&&(b=c.getAttribute("data-mce-html"),b&&(b=unescape(b),c.setAttribute("data-mce-html",escape(k(b,{width:a.width,height:a.height})))))}),a.addButton("media",{tooltip:"Insert/edit video",onclick:e,stateSelector:["img[data-mce-object]","span[data-mce-object]"]}),a.addMenuItem("media",{icon:"media",text:"Insert/edit video",onclick:e,context:"insert",prependToContext:!0}),a.on("setContent",function(){a.$("span.mce-preview-object").each(function(b,c){var d=a.$(c);0===d.find("span.mce-shim",c).length&&d.append('')})}),a.addCommand("mceMedia",e),this.showDialog=e}); +tinymce.PluginManager.add("nonbreaking",function(a){var b=a.getParam("nonbreaking_force_tab");if(a.addCommand("mceNonBreaking",function(){a.insertContent(a.plugins.visualchars&&a.plugins.visualchars.state?' ':" "),a.dom.setAttrib(a.dom.select("span.mce-nbsp"),"data-mce-bogus","1")}),a.addButton("nonbreaking",{title:"Nonbreaking space",cmd:"mceNonBreaking"}),a.addMenuItem("nonbreaking",{text:"Nonbreaking space",cmd:"mceNonBreaking",context:"insert"}),b){var c=+b>1?+b:3;a.on("keydown",function(b){if(9==b.keyCode){if(b.shiftKey)return;b.preventDefault();for(var d=0;c>d;d++)a.execCommand("mceNonBreaking")}})}}); +tinymce.PluginManager.add("noneditable",function(a){function b(a){return function(b){return-1!==(" "+b.attr("class")+" ").indexOf(a)}}function c(b){function c(b){var c=arguments,d=c[c.length-2];return d>0&&'"'==g.charAt(d-1)?b:''+a.dom.encode("string"==typeof c[1]?c[1]:c[0])+""}var d=f.length,g=b.content,h=tinymce.trim(e);if("raw"!=b.format){for(;d--;)g=g.replace(f[d],c);b.content=g}}var d,e,f,g="contenteditable";d=" "+tinymce.trim(a.getParam("noneditable_editable_class","mceEditable"))+" ",e=" "+tinymce.trim(a.getParam("noneditable_noneditable_class","mceNonEditable"))+" ";var h=b(d),i=b(e);f=a.getParam("noneditable_regexp"),f&&!f.length&&(f=[f]),a.on("PreInit",function(){f&&a.on("BeforeSetContent",c),a.parser.addAttributeFilter("class",function(a){for(var b,c=a.length;c--;)b=a[c],h(b)?b.attr(g,"true"):i(b)&&b.attr(g,"false")}),a.serializer.addAttributeFilter(g,function(a){for(var b,c=a.length;c--;)b=a[c],(h(b)||i(b))&&(f&&b.attr("data-mce-content")?(b.name="#text",b.type=3,b.raw=!0,b.value=b.attr("data-mce-content")):b.attr(g,null))})})}); +tinymce.PluginManager.add("pagebreak",function(a){var b="mce-pagebreak",c=a.getParam("pagebreak_separator",""),d=new RegExp(c.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(a){return"\\"+a}),"gi"),e='';a.addCommand("mcePageBreak",function(){a.settings.pagebreak_split_block?a.insertContent("

                      "+e+"

                      "):a.insertContent(e)}),a.addButton("pagebreak",{title:"Page break",cmd:"mcePageBreak"}),a.addMenuItem("pagebreak",{text:"Page break",icon:"pagebreak",cmd:"mcePageBreak",context:"insert"}),a.on("ResolveName",function(c){"IMG"==c.target.nodeName&&a.dom.hasClass(c.target,b)&&(c.name="pagebreak")}),a.on("click",function(c){c=c.target,"IMG"===c.nodeName&&a.dom.hasClass(c,b)&&a.selection.select(c)}),a.on("BeforeSetContent",function(a){a.content=a.content.replace(d,e)}),a.on("PreInit",function(){a.serializer.addNodeFilter("img",function(b){for(var d,e,f=b.length;f--;)if(d=b[f],e=d.attr("class"),e&&-1!==e.indexOf("mce-pagebreak")){var g=d.parent;if(a.schema.getBlockElements()[g.name]&&a.settings.pagebreak_split_block){g.type=3,g.value=c,g.raw=!0,d.remove();continue}d.type=3,d.value=c,d.raw=!0}})})}); +!function(a,b){"use strict";function c(a,b){for(var c,d=[],f=0;f/g]),f(h.parse(e)),i}function f(a){function b(a,b,c){return b||c?"\xa0":" "}return a=d(a,[/^[\s\S]*]*>\s*|\s*<\/body[^>]*>[\s\S]*$/g,/|/g,[/( ?)\u00a0<\/span>( ?)/g,b],/
                      /g,/
                      $/i])}function g(a){var b=0;return function(){return a+b++}}return{filter:d,innerText:e,trimHtml:f,createIdGenerator:g}}),d("tinymce/pasteplugin/Clipboard",["tinymce/Env","tinymce/dom/RangeUtils","tinymce/util/VK","tinymce/pasteplugin/Utils","tinymce/util/Delay"],function(a,b,c,d,e){return function(f){function g(a){var b,c=f.dom;if(b=f.fire("BeforePastePreProcess",{content:a}),b=f.fire("PastePreProcess",b),a=b.content,!b.isDefaultPrevented()){if(f.hasEventListeners("PastePostProcess")&&!b.isDefaultPrevented()){var d=c.add(f.getBody(),"div",{style:"display:none"},a);b=f.fire("PastePostProcess",{node:d}),c.remove(d),a=b.node.innerHTML}b.isDefaultPrevented()||f.insertContent(a,{merge:f.settings.paste_merge_formats!==!1,data:{paste:!0}})}}function h(a){a=f.dom.encode(a).replace(/\r\n/g,"\n");var b,c=f.dom.getParent(f.selection.getStart(),f.dom.isBlock),e=f.settings.forced_root_block;e&&(b=f.dom.createHTML(e,f.settings.forced_root_block_attrs),b=b.substr(0,b.length-3)+">"),c&&/^(PRE|DIV)$/.test(c.nodeName)||!e?a=d.filter(a,[[/\n/g,"
                      "]]):(a=d.filter(a,[[/\n\n/g,"

                      "+b],[/^(.*<\/p>)(

                      )$/,b+"$1"],[/\n/g,"
                      "]]),-1!=a.indexOf("

                      ")&&(a=b+a)),g(a)}function i(){function b(a){var b,c,e,f=a.startContainer;if(b=a.getClientRects(),b.length)return b[0];if(a.collapsed&&1==f.nodeType){for(e=f.childNodes[v.startOffset];e&&3==e.nodeType&&!e.data.length;)e=e.nextSibling;if(e)return"BR"==e.tagName&&(c=d.doc.createTextNode("\ufeff"),e.parentNode.insertBefore(c,e),a=d.createRng(),a.setStartBefore(c),a.setEndAfter(c),b=a.getClientRects(),d.remove(c)),b.length?b[0]:void 0}}var c,d=f.dom,e=f.getBody(),g=f.dom.getViewPort(f.getWin()),h=g.y,i=20;if(v=f.selection.getRng(),f.inline&&(c=f.selection.getScrollContainer(),c&&c.scrollTop>0&&(h=c.scrollTop)),v.getClientRects){var j=b(v);if(j)i=h+(j.top-d.getPos(e).y);else{i=h;var k=v.startContainer;k&&(3==k.nodeType&&k.parentNode!=e&&(k=k.parentNode),1==k.nodeType&&(i=d.getPos(k,c||e).y))}}u=d.add(f.getBody(),"div",{id:"mcepastebin",contentEditable:!0,"data-mce-bogus":"all",style:"position: absolute; top: "+i+"px;width: 10px; height: 10px; overflow: hidden; opacity: 0"},A),(a.ie||a.gecko)&&d.setStyle(u,"left","rtl"==d.getStyle(e,"direction",!0)?65535:-65535),d.bind(u,"beforedeactivate focusin focusout",function(a){a.stopPropagation()}),u.focus(),f.selection.select(u,!0)}function j(){if(u){for(var a;a=f.dom.get("mcepastebin");)f.dom.remove(a),f.dom.unbind(a);v&&f.selection.setRng(v)}u=v=null}function k(){var a,b,c,d,e="";for(a=f.dom.select("div[id=mcepastebin]"),b=0;b0&&-1==c.indexOf(B)&&(b["text/plain"]=c)}if(a.types)for(var d=0;d')}var h,i,j,k=!1;if(d)for(h=0;h0}function s(a){return c.metaKeyPressed(a)&&86==a.keyCode||a.shiftKey&&45==a.keyCode}function t(){function b(a,b,c){var e;return r(a,"text/html")?e=a["text/html"]:(e=k(),e==A&&(c=!0)),e=d.trimHtml(e),u&&u.firstChild&&"mcepastebin"===u.firstChild.id&&(c=!0),j(),e.length||(c=!0),c&&(e=r(a,"text/plain")&&-1==e.indexOf("

                      ")?a["text/plain"]:d.innerText(e)),e==A?void(b||f.windowManager.alert("Please use Ctrl+V/Cmd+V keyboard shortcuts to paste contents.")):void(c?h(e):g(e))}function c(a){return 0===a["text/plain"].indexOf("file://")}f.on("keydown",function(b){function c(a){s(a)&&!a.isDefaultPrevented()&&j()}if(s(b)&&!b.isDefaultPrevented()){if(w=b.shiftKey&&86==b.keyCode,w&&a.webkit&&-1!=navigator.userAgent.indexOf("Version/"))return;if(b.stopImmediatePropagation(),y=(new Date).getTime(),a.ie&&w)return b.preventDefault(),void f.fire("paste",{ieFake:!0});j(),i(),f.once("keyup",c),f.once("paste",function(){f.off("keyup",c)})}});var t=function(){return v||f.selection.getRng()};f.on("paste",function(c){var d=(new Date).getTime(),g=m(c),h=(new Date).getTime()-d,l=(new Date).getTime()-y-h<1e3,q="text"==x.pasteFormat||w;return w=!1,c.isDefaultPrevented()||p(c)?void j():!n(g)&&o(c,t())?void j():(l||c.preventDefault(),!a.ie||l&&!c.ieFake||(i(),f.dom.bind(u,"paste",function(a){a.stopPropagation()}),f.getDoc().execCommand("Paste",!1,null),g["text/html"]=k()),void(r(g,"text/html")?(c.preventDefault(),b(g,l,q)):e.setEditorTimeout(f,function(){b(g,l,q)},0)))}),f.on("dragstart dragend",function(a){z="dragstart"==a.type}),f.on("drop",function(a){var b,i;if(i=q(a),!a.isDefaultPrevented()&&!z&&(b=l(a.dataTransfer),(n(b)&&!c(b)||!o(a,i))&&i&&f.settings.paste_filter_drop!==!1)){var j=b["mce-internal"]||b["text/html"]||b["text/plain"];j&&(a.preventDefault(),e.setEditorTimeout(f,function(){f.undoManager.transact(function(){b["mce-internal"]&&f.execCommand("Delete"),f.selection.setRng(i),j=d.trimHtml(j),b["text/html"]?g(j):h(j)})}))}}),f.on("dragover dragend",function(a){f.settings.paste_data_images&&a.preventDefault()})}var u,v,w,x=this,y=0,z=!1,A="%MCEPASTEBIN%",B="data:text/mce-internal,",C=d.createIdGenerator("mceclip");x.pasteHtml=g,x.pasteText=h,f.on("preInit",function(){t(),f.parser.addNodeFilter("img",function(b,c,d){function e(a){return a.data&&a.data.paste===!0}function g(b){b.attr("data-mce-object")||k===a.transparentSrc||b.remove()}function h(a){return 0===a.indexOf("webkit-fake-url")}function i(a){return 0===a.indexOf("data:")}if(!f.settings.paste_data_images&&e(d))for(var j=b.length;j--;){var k=b[j].attributes.map.src;k&&(h(k)?g(b[j]):!f.settings.allow_html_data_urls&&i(k)&&g(b[j]))}})})}}),d("tinymce/pasteplugin/WordFilter",["tinymce/util/Tools","tinymce/html/DomParser","tinymce/html/Schema","tinymce/html/Serializer","tinymce/html/Node","tinymce/pasteplugin/Utils"],function(a,b,c,d,e,f){function g(a){return/h?g&&(g=g.parent.parent):(j=g,g=null)),g&&g.name==b?g.append(a):(j=j||g,g=new e(b,1),f>1&&g.attr("start",""+f),a.wrap(g)),a.name="li",h>k&&j&&j.lastChild.append(g),k=h,d(a),c(a,/^\u00a0+/),c(a,/^\s*([\u2022\u00b7\u00a7\u25CF]|\w+\.)/),c(a,/^\u00a0+/)}for(var g,j,k=1,l=[],m=a.firstChild;"undefined"!=typeof m&&null!==m;)if(l.push(m),m=m.walk(),null!==m)for(;"undefined"!=typeof m&&m.parent!==a;)m=m.walk();for(var n=0;n]+id="?docs-internal-[^>]*>/gi,""),q=q.replace(/
                      /gi,""),o=k.paste_retain_style_properties,o&&(p=a.makeMap(o.split(/[, ]/))),k.paste_enable_default_filters!==!1&&g(l.content)){l.wordContent=!0,q=f.filter(q,[//gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/ /gi,"\xa0"],[/([\s\u00a0]*)<\/span>/gi,function(a,b){return b.length>0?b.replace(/./," ").slice(Math.floor(b.length/2)).split("").join("\xa0"):""}]]);var r=k.paste_word_valid_elements;r||(r="-strong/b,-em/i,-u,-span,-p,-ol,-ul,-li,-h1,-h2,-h3,-h4,-h5,-h6,-p/div,-a[href|name],sub,sup,strike,br,del,table[width],tr,td[colspan|rowspan|width],th[colspan|rowspan|width],thead,tfoot,tbody");var s=new c({valid_elements:r,valid_children:"-li[p]"});a.each(s.elements,function(a){a.attributes["class"]||(a.attributes["class"]={},a.attributesOrder.push("class")),a.attributes.style||(a.attributes.style={},a.attributesOrder.push("style"))});var t=new b({},s);t.addAttributeFilter("style",function(a){for(var b,c=a.length;c--;)b=a[c],b.attr("style",n(b,b.attr("style"))),"span"==b.name&&b.parent&&!b.attributes.length&&b.unwrap()}),t.addAttributeFilter("class",function(a){for(var b,c,d=a.length;d--;)b=a[d],c=b.attr("class"),/^(MsoCommentReference|MsoCommentText|msoDel)$/i.test(c)&&b.remove(),b.attr("class",null)}),t.addNodeFilter("del",function(a){for(var b=a.length;b--;)a[b].remove()}),t.addNodeFilter("a",function(a){for(var b,c,d,e=a.length;e--;)if(b=a[e],c=b.attr("href"),d=b.attr("name"),c&&-1!=c.indexOf("#_msocom_"))b.remove();else if(c&&0===c.indexOf("file://")&&(c=c.split("#")[1],c&&(c="#"+c)),c||d){if(d&&!/^_?(?:toc|edn|ftn)/i.test(d)){b.unwrap();continue}b.attr({href:c,name:d})}else b.unwrap()});var u=t.parse(q);k.paste_convert_word_fake_lists!==!1&&m(u),l.content=new d({validate:k.validate},s).serialize(u)}})}return j.isWordContent=g,j}),d("tinymce/pasteplugin/Quirks",["tinymce/Env","tinymce/util/Tools","tinymce/pasteplugin/WordFilter","tinymce/pasteplugin/Utils"],function(a,b,c,d){return function(e){function f(a){e.on("BeforePastePreProcess",function(b){b.content=a(b.content)})}function g(a){if(!c.isWordContent(a))return a;var f=[];b.each(e.schema.getBlockElements(),function(a,b){f.push(b)});var g=new RegExp("(?:
                       [\\s\\r\\n]+|
                      )*(<\\/?("+f.join("|")+")[^>]*>)(?:
                       [\\s\\r\\n]+|
                      )*","g");return a=d.filter(a,[[g,"$1"]]),a=d.filter(a,[[/

                      /g,"

                      "],[/
                      /g," "],[/

                      /g,"
                      "]])}function h(a){if(c.isWordContent(a))return a;var b=e.settings.paste_webkit_styles;if(e.settings.paste_remove_styles_if_webkit===!1||"all"==b)return a;if(b&&(b=b.split(/[, ]/)),b){var d=e.dom,f=e.selection.getNode();a=a.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi,function(a,c,e,g){var h=d.parseStyle(e,"span"),i={};if("none"===b)return c+g;for(var j=0;j]+) style="([^"]*)"([^>]*>)/gi,"$1$3");return a=a.replace(/(<[^>]+) data-mce-style="([^"]+)"([^>]*>)/gi,function(a,b,c,d){return b+' style="'+c+'"'+d})}a.webkit&&f(h),a.ie&&f(g)}}),d("tinymce/pasteplugin/Plugin",["tinymce/PluginManager","tinymce/pasteplugin/Clipboard","tinymce/pasteplugin/WordFilter","tinymce/pasteplugin/Quirks"],function(a,b,c,d){var e;a.add("paste",function(a){function f(){return e||a.settings.paste_plaintext_inform===!1}function g(){if("text"==h.pasteFormat)this.active(!1),h.pasteFormat="html",a.fire("PastePlainTextToggle",{state:!1});else if(h.pasteFormat="text",this.active(!0),!f()){var b=a.translate("Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.");a.notificationManager.open({text:b,type:"info"}),e=!0,a.fire("PastePlainTextToggle",{state:!0})}a.focus()}var h,i=this,j=a.settings;i.clipboard=h=new b(a),i.quirks=new d(a),i.wordFilter=new c(a),a.settings.paste_as_text&&(i.clipboard.pasteFormat="text"),j.paste_preprocess&&a.on("PastePreProcess",function(a){j.paste_preprocess.call(i,i,a)}),j.paste_postprocess&&a.on("PastePostProcess",function(a){j.paste_postprocess.call(i,i,a)}),a.addCommand("mceInsertClipboardContent",function(a,b){b.content&&i.clipboard.pasteHtml(b.content),b.text&&i.clipboard.pasteText(b.text)}),a.settings.paste_block_drop&&a.on("dragend dragover draggesture dragdrop drop drag",function(a){a.preventDefault(),a.stopPropagation()}),a.settings.paste_data_images||a.on("drop",function(a){var b=a.dataTransfer;b&&b.files&&b.files.length>0&&a.preventDefault()}),a.addButton("pastetext",{icon:"pastetext",tooltip:"Paste as text",onclick:g,active:"text"==i.clipboard.pasteFormat}),a.addMenuItem("pastetext",{text:"Paste as text",selectable:!0,active:h.pasteFormat,onclick:g})})}),f(["tinymce/pasteplugin/Utils"])}(this); +tinymce.PluginManager.add("preview",function(a){var b=a.settings,c=!tinymce.Env.ie;a.addCommand("mcePreview",function(){a.windowManager.open({title:"Preview",width:parseInt(a.getParam("plugin_preview_width","650"),10),height:parseInt(a.getParam("plugin_preview_height","500"),10),html:'",buttons:{text:"Close",onclick:function(){this.parent().parent().close()}},onPostRender:function(){var d,e="";e+='',tinymce.each(a.contentCSS,function(b){e+=''});var f=b.body_id||"tinymce";-1!=f.indexOf("=")&&(f=a.getParam("body_id","","hash"),f=f[a.id]||f);var g=b.body_class||"";-1!=g.indexOf("=")&&(g=a.getParam("body_class","","hash"),g=g[a.id]||"");var h=' ',i=a.settings.directionality?' dir="'+a.settings.directionality+'"':"";if(d=""+e+'"+a.getContent()+h+"",c)this.getEl("body").firstChild.src="data:text/html;charset=utf-8,"+encodeURIComponent(d);else{var j=this.getEl("body").firstChild.contentWindow.document;j.open(),j.write(d),j.close()}}})}),a.addButton("preview",{title:"Preview",cmd:"mcePreview"}),a.addMenuItem("preview",{text:"Preview",cmd:"mcePreview",context:"view"})}); +tinymce.PluginManager.add("print",function(a){a.addCommand("mcePrint",function(){a.getWin().print()}),a.addButton("print",{title:"Print",cmd:"mcePrint"}),a.addShortcut("Meta+P","","mcePrint"),a.addMenuItem("print",{text:"Print",cmd:"mcePrint",icon:"print",shortcut:"Meta+P",context:"file"})}); +tinymce.PluginManager.add("save",function(a){function b(){var b;return b=tinymce.DOM.getParent(a.id,"form"),!a.getParam("save_enablewhendirty",!0)||a.isDirty()?(tinymce.triggerSave(),a.getParam("save_onsavecallback")?(a.execCallback("save_onsavecallback",a),void a.nodeChanged()):void(b?(a.setDirty(!1),b.onsubmit&&!b.onsubmit()||("function"==typeof b.submit?b.submit():c(a.translate("Error: Form submit field collision."))),a.nodeChanged()):c(a.translate("Error: No form element found.")))):void 0}function c(b){a.notificationManager.open({text:b,type:"error"})}function d(){var b=tinymce.trim(a.startContent);return a.getParam("save_oncancelcallback")?void a.execCallback("save_oncancelcallback",a):(a.setContent(b),a.undoManager.clear(),void a.nodeChanged())}function e(){var b=this;a.on("nodeChange dirty",function(){b.disabled(a.getParam("save_enablewhendirty",!0)&&!a.isDirty())})}a.addCommand("mceSave",b),a.addCommand("mceCancel",d),a.addButton("save",{icon:"save",text:"Save",cmd:"mceSave",disabled:!0,onPostRender:e}),a.addButton("cancel",{text:"Cancel",icon:!1,cmd:"mceCancel",disabled:!0,onPostRender:e}),a.addShortcut("Meta+S","","mceSave")}); +!function(){function a(a){return a&&1==a.nodeType&&"false"===a.contentEditable}function b(b,c,d,e,f){function g(a,b){if(b=b||0,!a[0])throw"findAndReplaceDOMText cannot handle zero-length matches";var c=a.index;if(b>0){var d=a[b];if(!d)throw"Invalid capture group";c+=a[0].indexOf(d),a[0]=d}return[c,c+a[0].length,[a[0]]]}function h(b){var c;if(3===b.nodeType)return b.data;if(o[b.nodeName]&&!n[b.nodeName])return"";if(c="",a(b))return"\n";if((n[b.nodeName]||p[b.nodeName])&&(c+="\n"),b=b.firstChild)do c+=h(b);while(b=b.nextSibling);return c}function i(b,c,d){var e,f,g,h,i=[],j=0,k=b,l=c.shift(),m=0;a:for(;;){if((n[k.nodeName]||p[k.nodeName]||a(k))&&j++,3===k.nodeType&&(!f&&k.length+j>=l[1]?(f=k,h=l[1]-j):e&&i.push(k),!e&&k.length+j>l[0]&&(e=k,g=l[0]-j),j+=k.length),e&&f){if(k=d({startNode:e,startNodeIndex:g,endNode:f,endNodeIndex:h,innerNodes:i,match:l[2],matchIndex:m}),j-=f.length-h,e=null,f=null,i=[],l=c.shift(),m++,!l)break}else if(o[k.nodeName]&&!n[k.nodeName]||!k.firstChild){if(k.nextSibling){k=k.nextSibling;continue}}else if(!a(k)){k=k.firstChild;continue}for(;;){if(k.nextSibling){k=k.nextSibling;break}if(k.parentNode===b)break a;k=k.parentNode}}}function j(a){var b;if("function"!=typeof a){var c=a.nodeType?a:m.createElement(a);b=function(a,b){var d=c.cloneNode(!1);return d.setAttribute("data-mce-index",b),a&&d.appendChild(m.createTextNode(a)),d}}else b=a;return function(a){var c,d,e,f=a.startNode,g=a.endNode,h=a.matchIndex;if(f===g){var i=f;e=i.parentNode,a.startNodeIndex>0&&(c=m.createTextNode(i.data.substring(0,a.startNodeIndex)),e.insertBefore(c,i));var j=b(a.match[0],h);return e.insertBefore(j,i),a.endNodeIndexn;++n){var p=a.innerNodes[n],q=b(p.data,h);p.parentNode.replaceChild(q,p),l.push(q)}var r=b(g.data.substring(0,a.endNodeIndex),h);return e=f.parentNode,e.insertBefore(c,f),e.insertBefore(k,f),e.removeChild(f),e=g.parentNode,e.insertBefore(r,g),e.insertBefore(d,g),e.removeChild(g),r}}var k,l,m,n,o,p,q=[],r=0;if(m=c.ownerDocument,n=f.getBlockElements(),o=f.getWhiteSpaceElements(),p=f.getShortEndedElements(),l=h(c)){if(b.global)for(;k=b.exec(l);)q.push(g(k,e));else k=l.match(b),q.push(g(k,e));return q.length&&(r=q.length,i(c,q,j(d))),r}}function c(a){function c(){function b(){f.statusbar.find("#next").disabled(!g(l+1).length),f.statusbar.find("#prev").disabled(!g(l-1).length)}function c(){a.windowManager.alert("Could not find the specified string.",function(){f.find("#find")[0].focus()})}var d,e={};d=tinymce.trim(a.selection.getContent({format:"text"}));var f=a.windowManager.open({layout:"flex",pack:"center",align:"center",onClose:function(){a.focus(),k.done()},onSubmit:function(a){var d,h,i,j;return a.preventDefault(),h=f.find("#case").checked(),j=f.find("#words").checked(),i=f.find("#find").value(),i.length?e.text==i&&e.caseState==h&&e.wholeWord==j?0===g(l+1).length?void c():(k.next(),void b()):(d=k.find(i,h,j),d||c(),f.statusbar.items().slice(1).disabled(0===d),b(),void(e={text:i,caseState:h,wholeWord:j})):(k.done(!1),void f.statusbar.items().slice(1).disabled(!0))},buttons:[{text:"Find",subtype:"primary",onclick:function(){f.submit()}},{text:"Replace",disabled:!0,onclick:function(){k.replace(f.find("#replace").value())||(f.statusbar.items().slice(1).disabled(!0),l=-1,e={})}},{text:"Replace all",disabled:!0,onclick:function(){k.replace(f.find("#replace").value(),!0,!0),f.statusbar.items().slice(1).disabled(!0),e={}}},{type:"spacer",flex:1},{text:"Prev",name:"prev",disabled:!0,onclick:function(){k.prev(),b()}},{text:"Next",name:"next",disabled:!0,onclick:function(){k.next(),b()}}],title:"Find and replace",items:{type:"form",padding:20,labelGap:30,spacing:10,items:[{type:"textbox",name:"find",size:40,label:"Find",value:d},{type:"textbox",name:"replace",size:40,label:"Replace with"},{type:"checkbox",name:"case",text:"Match case",label:" "},{type:"checkbox",name:"words",text:"Whole words",label:" "}]}})}function d(a){var b=a.getAttribute("data-mce-index");return"number"==typeof b?""+b:b}function e(c){var d,e;return e=a.dom.create("span",{"data-mce-bogus":1}),e.className="mce-match-marker",d=a.getBody(),k.done(!1),b(c,d,e,!1,a.schema)}function f(a){var b=a.parentNode;a.firstChild&&b.insertBefore(a.firstChild,a),a.parentNode.removeChild(a)}function g(b){var c,e=[];if(c=tinymce.toArray(a.getBody().getElementsByTagName("span")),c.length)for(var f=0;f0}var k=this,l=-1;k.init=function(a){a.addMenuItem("searchreplace",{text:"Find and replace",shortcut:"Meta+F",onclick:c,separator:"before",context:"edit"}),a.addButton("searchreplace",{tooltip:"Find and replace",shortcut:"Meta+F",onclick:c}),a.addCommand("SearchReplace",c),a.shortcuts.add("Meta+F","",c)},k.find=function(a,b,c){a=a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),a=c?"\\b"+a+"\\b":a;var d=e(new RegExp(a,b?"g":"gi"));return d&&(l=-1,l=h(!0)),d},k.next=function(){var a=h(!0);-1!==a&&(l=a)},k.prev=function(){var a=h(!1);-1!==a&&(l=a)},k.replace=function(b,c,e){var h,m,n,o,p,q,r=l;for(c=c!==!1,n=a.getBody(),m=tinymce.grep(tinymce.toArray(n.getElementsByTagName("span")),j),h=0;hl&&m[h].setAttribute("data-mce-index",p-1)}return a.undoManager.add(),l=r,c?(q=g(r+1).length>0,k.next()):(q=g(r-1).length>0,k.prev()),!e&&q},k.done=function(b){var c,e,g,h;for(e=tinymce.toArray(a.getBody().getElementsByTagName("span")),c=0;c=i.end?(f=l,h=i.end-k):e&&j.push(l),!e&&l.length+k>i.start&&(e=l,g=i.start-k),k+=l.length),e&&f){if(l=d({startNode:e,startNodeIndex:g,endNode:f,endNodeIndex:h,innerNodes:j,match:i.text,matchIndex:m}),k-=f.length-h,e=null,f=null,j=[],i=c.shift(),m++,!i)break}else if(y[l.nodeName]&&!x[l.nodeName]||!l.firstChild){if(l.nextSibling){l=l.nextSibling;continue}}else if(!a(l)){l=l.firstChild;continue}for(;;){if(l.nextSibling){l=l.nextSibling;break}if(l.parentNode===b)break a;l=l.parentNode}}}function g(a){function b(b,c){var d=A[c];d.stencil||(d.stencil=a(d));var e=d.stencil.cloneNode(!1);return e.setAttribute("data-mce-index",c),b&&e.appendChild(B.doc.createTextNode(b)),e}return function(a){var c,d,e,f=a.startNode,g=a.endNode,h=a.matchIndex,i=B.doc;if(f===g){var j=f;e=j.parentNode,a.startNodeIndex>0&&(c=i.createTextNode(j.data.substring(0,a.startNodeIndex)),e.insertBefore(c,j));var k=b(a.match,h);return e.insertBefore(k,j),a.endNodeIndexn;++n){var p=a.innerNodes[n],q=b(p.data,h);p.parentNode.replaceChild(q,p),m.push(q)}var r=b(g.data.substring(0,a.endNodeIndex),h);return e=f.parentNode,e.insertBefore(c,f),e.insertBefore(l,f),e.removeChild(f),e=g.parentNode,e.insertBefore(r,g),e.insertBefore(d,g),e.removeChild(g),r}}function h(a){var b=a.parentNode;b.insertBefore(a.firstChild,a),a.parentNode.removeChild(a)}function i(a){var c=b.getElementsByTagName("*"),d=[];a="number"==typeof a?""+a:null;for(var e=0;eb&&a(A[b],b)!==!1;b++);return this}function m(a){return A.length&&f(b,A,g(a)),this}function n(a,b){if(w&&a.global)for(;v=a.exec(w);)A.push(d(v,b));return this}function o(a){var b,c=i(a?j(a):null);for(b=c.length;b--;)h(c[b]);return this}function p(a){return A[a.getAttribute("data-mce-index")]}function q(a){return i(j(a))[0]}function r(a,b,c){return A.push({start:a,end:a+b,text:w.substr(a,b),data:c}),this}function s(a){var b=i(j(a)),d=c.dom.createRng();return d.setStartBefore(b[0]),d.setEndAfter(b[b.length-1]),d}function t(a,b){var d=s(a);return d.deleteContents(),b.length>0&&d.insertNode(c.dom.doc.createTextNode(b)),d}function u(){return A.splice(0,A.length),o(),this}var v,w,x,y,z,A=[],B=c.dom;return x=c.schema.getBlockElements(),y=c.schema.getWhiteSpaceElements(),z=c.schema.getShortEndedElements(),w=e(b),{text:w,matches:A,each:l,filter:k,reset:u,matchFromElement:p,elementFromMatch:q,find:n,add:r,wrap:m,unwrap:o,replace:t,rangeFromMatch:s,indexOf:j}}}),d("tinymce/spellcheckerplugin/Plugin",["tinymce/spellcheckerplugin/DomTextMatcher","tinymce/PluginManager","tinymce/util/Tools","tinymce/ui/Menu","tinymce/dom/DOMUtils","tinymce/util/XHR","tinymce/util/URI","tinymce/util/JSON"],function(a,b,c,d,e,f,g,h){b.add("spellchecker",function(b,i){function j(){return E.textMatcher||(E.textMatcher=new a(b.getBody(),b)),E.textMatcher}function k(a,b){var d=[];return c.each(b,function(a){d.push({selectable:!0,text:a.name,data:a.value})}),d}function l(a){for(var b in a)return!1;return!0}function m(a,f){var g=[],h=A[a];c.each(h,function(a){g.push({text:a,onclick:function(){b.insertContent(b.dom.encode(a)),b.dom.remove(f),r()}})}),g.push({text:"-"}),D&&g.push({text:"Add to Dictionary",onclick:function(){s(a,f)}}),g.push.apply(g,[{text:"Ignore",onclick:function(){t(a,f)}},{text:"Ignore all",onclick:function(){t(a,f,!0)}}]),C=new d({items:g,context:"contextmenu",onautohide:function(a){-1!=a.target.className.indexOf("spellchecker")&&a.preventDefault()},onhide:function(){C.remove(),C=null}}),C.renderTo(document.body);var i=e.DOM.getPos(b.getContentAreaContainer()),j=b.dom.getPos(f[0]),k=b.dom.getRoot();"BODY"==k.nodeName?(j.x-=k.ownerDocument.documentElement.scrollLeft||k.scrollLeft,j.y-=k.ownerDocument.documentElement.scrollTop||k.scrollTop):(j.x-=k.scrollLeft,j.y-=k.scrollTop),i.x+=j.x,i.y+=j.y,C.moveTo(i.x,i.y+f[0].offsetHeight)}function n(){return b.getParam("spellchecker_wordchar_pattern")||new RegExp('[^\\s!"#$%&()*+,-./:;<=>?@[\\]^_{|}`\xa7\xa9\xab\xae\xb1\xb6\xb7\xb8\xbb\xbc\xbd\xbe\xbf\xd7\xf7\xa4\u201d\u201c\u201e\xa0\u2002\u2003\u2009]+',"g")}function o(a,d,e,j){var k={method:a,lang:F.spellchecker_language},l="";k["addToDictionary"==a?"word":"text"]=d,c.each(k,function(a,b){l&&(l+="&"),l+=b+"="+encodeURIComponent(a)}),f.send({url:new g(i).toAbsolute(F.spellchecker_rpc_url),type:"post",content_type:"application/x-www-form-urlencoded",data:l,success:function(a){if(a=h.parse(a))a.error?j(a.error):e(a);else{var c=b.translate("Server response wasn't proper JSON.");j(c)}},error:function(){var a=b.translate("The spelling service was not found: (")+F.spellchecker_rpc_url+b.translate(")");j(a)}})}function p(a,b,c,d){var e=F.spellchecker_callback||o;e.call(E,a,b,c,d)}function q(){function a(a){b.notificationManager.open({text:a,type:"error"}),b.setProgressState(!1),u()}u()||(b.setProgressState(!0),p("spellcheck",j().text,y,a),b.focus())}function r(){b.dom.select("span.mce-spellchecker-word").length||u()}function s(a,c){b.setProgressState(!0),p("addToDictionary",a,function(){b.setProgressState(!1),b.dom.remove(c,!0),r()},function(a){b.notificationManager.open({text:a,type:"error"}),b.setProgressState(!1)})}function t(a,d,e){b.selection.collapse(),e?c.each(b.dom.select("span.mce-spellchecker-word"),function(c){c.getAttribute("data-mce-word")==a&&b.dom.remove(c,!0)}):b.dom.remove(d,!0),r()}function u(){return j().reset(),E.textMatcher=null,B?(B=!1,b.fire("SpellcheckEnd"),!0):void 0}function v(a){var b=a.getAttribute("data-mce-index");return"number"==typeof b?""+b:b}function w(a){var d,e=[];if(d=c.toArray(b.getBody().getElementsByTagName("span")),d.length)for(var f=0;f0){var e=b.dom.createRng();e.setStartBefore(d[0]),e.setEndAfter(d[d.length-1]),b.selection.setRng(e),m(c.getAttribute("data-mce-word"),d)}}}),b.addMenuItem("spellchecker",{text:"Spellcheck",context:"tools",onclick:q,selectable:!0,onPostRender:function(){var a=this;a.active(B),b.on("SpellcheckStart SpellcheckEnd",function(){a.active(B)})}});var H={tooltip:"Spellcheck",onclick:q,onPostRender:function(){var a=this;b.on("SpellcheckStart SpellcheckEnd",function(){a.active(B)})}};z.length>1&&(H.type="splitbutton",H.menu=z,H.onshow=x,H.onselect=function(a){F.spellchecker_language=a.control.settings.data}),b.addButton("spellchecker",H),b.addCommand("mceSpellCheck",q),b.on("remove",function(){C&&(C.remove(),C=null)}),b.on("change",r),this.getTextMatcher=j,this.getWordCharPattern=n,this.markErrors=y,this.getLanguage=function(){return F.spellchecker_language},F.spellchecker_language=F.spellchecker_language||F.language||"en"})}),f(["tinymce/spellcheckerplugin/DomTextMatcher"])}(this); +tinymce.PluginManager.add("tabfocus",function(a){function b(a){9!==a.keyCode||a.ctrlKey||a.altKey||a.metaKey||a.preventDefault()}function c(b){function c(c){function f(a){return"BODY"===a.nodeName||"hidden"!=a.type&&"none"!=a.style.display&&"hidden"!=a.style.visibility&&f(a.parentNode)}function i(a){return/INPUT|TEXTAREA|BUTTON/.test(a.tagName)&&tinymce.get(b.id)&&-1!=a.tabIndex&&f(a)}if(h=d.select(":input:enabled,*[tabindex]:not(iframe)"),e(h,function(b,c){return b.id==a.id?(g=c,!1):void 0}),c>0){for(j=g+1;j=0;j--)if(i(h[j]))return h[j];return null}var g,h,i,j;if(!(9!==b.keyCode||b.ctrlKey||b.altKey||b.metaKey||b.isDefaultPrevented())&&(i=f(a.getParam("tab_focus",a.getParam("tabfocus_elements",":prev,:next"))),1==i.length&&(i[1]=i[0],i[0]=":prev"),h=b.shiftKey?":prev"==i[0]?c(-1):d.get(i[0]):":next"==i[1]?c(1):d.get(i[1]))){var k=tinymce.get(h.id||h.name);h.id&&k?k.focus():tinymce.util.Delay.setTimeout(function(){tinymce.Env.webkit||window.focus(),h.focus()},10),b.preventDefault()}}var d=tinymce.DOM,e=tinymce.each,f=tinymce.explode;a.on("init",function(){a.inline&&tinymce.DOM.setAttrib(a.getBody(),"tabIndex",null),a.on("keyup",b),tinymce.Env.gecko?a.on("keypress keydown",c):a.on("keydown",c)})}); +!function(a,b){"use strict";function c(a,b){for(var c,d=[],g=0;g9)&&(b.hasChildNodes()||(b.innerHTML='
                      '))}return{getSpanVal:b,paddCell:c}}),d("tinymce/tableplugin/TableGrid",["tinymce/util/Tools","tinymce/Env","tinymce/tableplugin/Utils"],function(a,c,d){var e=a.each,f=d.getSpanVal;return function(g,h,i){function j(){g.$("td[data-mce-selected],th[data-mce-selected]").removeAttr("data-mce-selected")}function k(a){return a===g.getBody()}function l(b,c){return b?(c=a.map(c.split(","),function(a){return a.toLowerCase()}),a.grep(b.childNodes,function(b){return-1!==a.inArray(c,b.nodeName.toLowerCase())})):[]}function m(){var a=0;O=[],P=0,e(["thead","tbody","tfoot"],function(b){var c=l(h,b)[0],d=l(c,"tr");e(d,function(c,d){d+=a,e(l(c,"td,th"),function(a,c){var e,g,h,i;if(O[d])for(;O[d][c];)c++;for(h=f(a,"rowspan"),i=f(a,"colspan"),g=d;d+h>g;g++)for(O[g]||(O[g]=[]),e=c;c+i>e;e++)O[g][e]={part:b,real:g==d&&e==c,elm:a,rowspan:h,colspan:i};P=Math.max(P,c+1)})}),a+=d.length})}function n(a){return g.fire("newrow",{node:a}),a}function o(a){return g.fire("newcell",{node:a}),a}function p(a,b){return a=a.cloneNode(b),a.removeAttribute("id"),a}function q(a,b){var c;return c=O[b],c?c[a]:void 0}function r(a,b,c){a&&(c=parseInt(c,10),1===c?a.removeAttribute(b,1):a.setAttribute(b,c,1))}function s(a){return a&&(!!T.getAttrib(a.elm,"data-mce-selected")||a==i)}function t(){var a=[];return e(h.rows,function(b){e(b.cells,function(c){return T.getAttrib(c,"data-mce-selected")||i&&c==i.elm?(a.push(b),!1):void 0})}),a}function u(){var a=T.createRng();k(h)||(a.setStartAfter(h),a.setEndAfter(h),S.setRng(a),T.remove(h))}function v(b){var f,h={};return g.settings.table_clone_elements!==!1&&(h=a.makeMap((g.settings.table_clone_elements||"strong em b i span font h1 h2 h3 h4 h5 h6 p div").toUpperCase(),/[ ,]/)),a.walk(b,function(a){var d;return 3==a.nodeType?(e(T.getParents(a.parentNode,null,b).reverse(),function(a){h[a.nodeName]&&(a=p(a,!1),f?d&&d.appendChild(a):f=d=a,d=a)}),d&&(d.innerHTML=c.ie&&c.ie<10?" ":'
                      '),!1):void 0},"childNodes"),b=p(b,!1),o(b),r(b,"rowSpan",1),r(b,"colSpan",1),f?b.appendChild(f):d.paddCell(b),b}function w(){var a,b=T.createRng();return e(T.select("tr",h),function(a){0===a.cells.length&&T.remove(a)}),0===T.select("tr",h).length?(b.setStartBefore(h),b.setEndBefore(h),S.setRng(b),void T.remove(h)):(e(T.select("thead,tbody,tfoot",h),function(a){0===a.rows.length&&T.remove(a)}),m(),void(Q&&(a=O[Math.min(O.length-1,Q.y)],a&&(S.select(a[Math.min(a.length-1,Q.x)].elm,!0),S.collapse(!0)))))}function x(a,b,c,d){var e,f,g,h,i;for(e=O[b][a].elm.parentNode,g=1;c>=g;g++)if(e=T.getNext(e,"tr")){for(f=a;f>=0;f--)if(i=O[b+g][f].elm,i.parentNode==e){for(h=1;d>=h;h++)T.insertAfter(v(i),i);break}if(-1==f)for(h=1;d>=h;h++)e.insertBefore(v(e.cells[0]),e.cells[0])}}function y(){e(O,function(a,b){e(a,function(a,c){var d,e,g;if(s(a)&&(a=a.elm,d=f(a,"colspan"),e=f(a,"rowspan"),d>1||e>1)){for(r(a,"rowSpan",1),r(a,"colSpan",1),g=0;d-1>g;g++)T.insertAfter(v(a),a);x(c,b,e-1,d)}})})}function z(b,c,d){var f,g,h,i,j,k,l,n,o,p,t;if(b?(f=J(b),g=f.x,h=f.y,i=g+(c-1),j=h+(d-1)):(Q=R=null,e(O,function(a,b){e(a,function(a,c){s(a)&&(Q||(Q={x:c,y:b}),R={x:c,y:b})})}),Q&&(g=Q.x,h=Q.y,i=R.x,j=R.y)),n=q(g,h),o=q(i,j),n&&o&&n.part==o.part){for(y(),m(),n=q(g,h).elm,r(n,"colSpan",i-g+1),r(n,"rowSpan",j-h+1),l=h;j>=l;l++)for(k=g;i>=k;k++)O[l]&&O[l][k]&&(b=O[l][k].elm,b!=n&&(p=a.grep(b.childNodes),e(p,function(a){n.appendChild(a)}),p.length&&(p=a.grep(n.childNodes),t=0,e(p,function(a){"BR"==a.nodeName&&t++0&&O[c-1][h]&&(l=O[c-1][h].elm,m=f(l,"rowSpan"),m>1)){r(l,"rowSpan",m+1);continue}}else if(m=f(d,"rowspan"),m>1){r(d,"rowSpan",m+1);continue}k=v(d),r(k,"colSpan",d.colSpan),j.appendChild(k),g=d}j.hasChildNodes()&&(a?i.parentNode.insertBefore(j,i):T.insertAfter(j,i))}}function B(a){var b,c;e(O,function(c){return e(c,function(c,d){return s(c)&&(b=d,a)?!1:void 0}),a?!b:void 0}),e(O,function(d,e){var g,h,i;d[b]&&(g=d[b].elm,g!=c&&(i=f(g,"colspan"),h=f(g,"rowspan"),1==i?a?(g.parentNode.insertBefore(v(g),g),x(b,e,h-1,i)):(T.insertAfter(v(g),g),x(b,e,h-1,i)):r(g,"colSpan",g.colSpan+1),c=g))})}function C(b){return a.grep(D(b),s)}function D(a){var b=[];return e(a,function(a){e(a,function(a){b.push(a)})}),b}function E(){var b=[];if(k(h)){if(1==O[0].length)return;if(C(O).length==D(O).length)return}e(O,function(c){e(c,function(c,d){s(c)&&-1===a.inArray(b,d)&&(e(O,function(a){var b,c=a[d].elm;b=f(c,"colSpan"),b>1?r(c,"colSpan",b-1):T.remove(c)}),b.push(d))})}),w()}function F(){function a(a){var b,c;e(a.cells,function(a){var c=f(a,"rowSpan");c>1&&(r(a,"rowSpan",c-1),b=J(a),x(b.x,b.y,1,1))}),b=J(a.cells[0]),e(O[b.y],function(a){var b;a=a.elm,a!=c&&(b=f(a,"rowSpan"),1>=b?T.remove(a):r(a,"rowSpan",b-1),c=a)})}var b;b=t(),k(h)&&b.length==h.rows.length||(e(b.reverse(),function(b){a(b)}),w())}function G(){var a=t();if(!k(h)||a.length!=h.rows.length)return T.remove(a),w(),a}function H(){var a=t();return e(a,function(b,c){a[c]=p(b,!0)}),a}function I(a,b){var c=t(),d=c[b?0:c.length-1],f=d.cells.length;a&&(e(O,function(a){var b;return f=0,e(a,function(a){a.real&&(f+=a.colspan),a.elm.parentNode==d&&(b=1)}),b?!1:void 0}),b||a.reverse(),e(a,function(a){var c,e,g=a.cells.length;for(n(a),c=0;g>c;c++)e=a.cells[c],o(e),r(e,"colSpan",1),r(e,"rowSpan",1);for(c=g;f>c;c++)a.appendChild(o(v(a.cells[g-1])));for(c=f;g>c;c++)T.remove(a.cells[c]);b?d.parentNode.insertBefore(a,d):T.insertAfter(a,d)}),j())}function J(a){var b;return e(O,function(c,d){return e(c,function(c,e){return c.elm==a?(b={x:e,y:d},!1):void 0}),!b}),b}function K(a){Q=J(a)}function L(){var a,b;return a=b=0,e(O,function(c,d){e(c,function(c,e){var f,g;s(c)&&(c=O[d][e],e>a&&(a=e),d>b&&(b=d),c.real&&(f=c.colspan-1,g=c.rowspan-1,f&&e+f>a&&(a=e+f),g&&d+g>b&&(b=d+g)))})}),{x:a,y:b}}function M(a){var b,c,d,e,f,g,h,i,k,l;if(R=J(a),Q&&R){for(b=Math.min(Q.x,R.x),c=Math.min(Q.y,R.y),d=Math.max(Q.x,R.x),e=Math.max(Q.y,R.y),f=d,g=e,l=c;e>=l;l++)for(k=b;d>=k;k++)a=O[l][k],a.real&&(h=a.colspan-1,i=a.rowspan-1,h&&k+h>f&&(f=k+h),i&&l+i>g&&(g=l+i));for(j(),l=c;g>=l;l++)for(k=b;f>=k;k++)O[l][k]&&T.setAttrib(O[l][k].elm,"data-mce-selected","1")}}function N(a,b){var c,d,e;c=J(a),d=c.y*P+c.x;do{if(d+=b,e=q(d%P,Math.floor(d/P)),!e)break;if(e.elm!=a)return S.select(e.elm,!0),T.isEmpty(e.elm)&&S.collapse(!0),!0}while(e.elm==a);return!1}var O,P,Q,R,S=g.selection,T=S.dom;h=h||T.getParent(S.getStart(!0),"table"),m(),i=i||T.getParent(S.getStart(!0),"th,td"),i&&(Q=J(i),R=L(),i=q(Q.x,Q.y)),a.extend(this,{deleteTable:u,split:y,merge:z,insertRow:A,insertCol:B,deleteCols:E,deleteRows:F,cutRows:G,copyRows:H,pasteRows:I,getPos:J,setStartCell:K,setEndCell:M,moveRelIdx:N,refresh:m})}}),d("tinymce/tableplugin/Quirks",["tinymce/util/VK","tinymce/util/Delay","tinymce/Env","tinymce/util/Tools","tinymce/tableplugin/Utils"],function(a,b,c,d,e){var f=d.each,g=e.getSpanVal;return function(h){function i(){function c(c){function d(a,b){var d=a?"previousSibling":"nextSibling",f=h.dom.getParent(b,"tr"),g=f[d];if(g)return r(h,b,g,a),c.preventDefault(),!0;var i=h.dom.getParent(f,"table"),l=f.parentNode,m=l.nodeName.toLowerCase();if("tbody"===m||m===(a?"tfoot":"thead")){var n=e(a,i,l,"tbody");if(null!==n)return j(a,n,b)}return k(a,f,d,i)}function e(a,b,c,d){var e=h.dom.select(">"+d,b),f=e.indexOf(c);if(a&&0===f||!a&&f===e.length-1)return i(a,b);if(-1===f){var g="thead"===c.tagName.toLowerCase()?0:e.length-1;return e[g]}return e[f+(a?-1:1)]}function i(a,b){var c=a?"thead":"tfoot",d=h.dom.select(">"+c,b);return 0!==d.length?d[0]:null}function j(a,b,d){var e=l(b,a);return e&&r(h,d,e,a),c.preventDefault(),!0}function k(a,b,e,f){var g=f[e];if(g)return m(g),!0;var i=h.dom.getParent(f,"td,th");if(i)return d(a,i,c);var j=l(b,!a);return m(j),c.preventDefault(),!1}function l(a,b){var c=a&&a[b?"lastChild":"firstChild"];return c&&"BR"===c.nodeName?h.dom.getParent(c,"td,th"):c}function m(a){h.selection.setCursorLocation(a,0)}function n(){return u==a.UP||u==a.DOWN}function o(a){var b=a.selection.getNode(),c=a.dom.getParent(b,"tr");return null!==c}function p(a){for(var b=0,c=a;c.previousSibling;)c=c.previousSibling,b+=g(c,"colspan");return b}function q(a,b){var c=0,d=0;return f(a.children,function(a,e){return c+=g(a,"colspan"),d=e,c>b?!1:void 0}),d}function r(a,b,c,d){var e=p(h.dom.getParent(b,"td,th")),f=q(c,e),g=c.childNodes[f],i=l(g,d);m(i||g)}function s(a){var b=h.selection.getNode(),c=h.dom.getParent(b,"td,th"),d=h.dom.getParent(a,"td,th");return c&&c!==d&&t(c,d)}function t(a,b){return h.dom.getParent(a,"TABLE")===h.dom.getParent(b,"TABLE")}var u=c.keyCode;if(n()&&o(h)){var v=h.selection.getNode();b.setEditorTimeout(h,function(){s(v)&&d(!c.shiftKey&&u===a.UP,v,c)},0)}}h.on("KeyDown",function(a){c(a)})}function j(){function a(a,b){var c,d=b.ownerDocument,e=d.createRange();return e.setStartBefore(b),e.setEnd(a.endContainer,a.endOffset),c=d.createElement("body"),c.appendChild(e.cloneContents()),0===c.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length}h.on("KeyDown",function(b){var c,d,e=h.dom;37!=b.keyCode&&38!=b.keyCode||(c=h.selection.getRng(),d=e.getParent(c.startContainer,"table"),d&&h.getBody().firstChild==d&&a(c,d)&&(c=e.createRng(),c.setStartBefore(d),c.setEndBefore(d),h.selection.setRng(c),b.preventDefault()))})}function k(){h.on("KeyDown SetContent VisualAid",function(){var a;for(a=h.getBody().lastChild;a;a=a.previousSibling)if(3==a.nodeType){if(a.nodeValue.length>0)break}else if(1==a.nodeType&&("BR"==a.tagName||!a.getAttribute("data-mce-bogus")))break;a&&"TABLE"==a.nodeName&&(h.settings.forced_root_block?h.dom.add(h.getBody(),h.settings.forced_root_block,h.settings.forced_root_block_attrs,c.ie&&c.ie<10?" ":'
                      '):h.dom.add(h.getBody(),"br",{"data-mce-bogus":"1"}))}),h.on("PreProcess",function(a){var b=a.node.lastChild;b&&("BR"==b.nodeName||1==b.childNodes.length&&("BR"==b.firstChild.nodeName||"\xa0"==b.firstChild.nodeValue))&&b.previousSibling&&"TABLE"==b.previousSibling.nodeName&&h.dom.remove(b)})}function l(){function a(a,b,c,d){var e,f,g,h=3,i=a.dom.getParent(b.startContainer,"TABLE");return i&&(e=i.parentNode),f=b.startContainer.nodeType==h&&0===b.startOffset&&0===b.endOffset&&d&&("TR"==c.nodeName||c==e),g=("TD"==c.nodeName||"TH"==c.nodeName)&&!d,f||g}function b(){var b=h.selection.getRng(),c=h.selection.getNode(),d=h.dom.getParent(b.startContainer,"TD,TH");if(a(h,b,c,d)){d||(d=c);for(var e=d.lastChild;e.lastChild;)e=e.lastChild;3==e.nodeType&&(b.setEnd(e,e.data.length),h.selection.setRng(b))}}h.on("KeyDown",function(){b()}),h.on("MouseDown",function(a){2!=a.button&&b()})}function m(){function b(a){h.selection.select(a,!0),h.selection.collapse(!0)}function c(a){h.$(a).empty(),e.paddCell(a)}h.on("keydown",function(e){if((e.keyCode==a.DELETE||e.keyCode==a.BACKSPACE)&&!e.isDefaultPrevented()){var f,g,i,j;if(f=h.dom.getParent(h.selection.getStart(),"table")){if(g=h.dom.select("td,th",f),i=d.grep(g,function(a){return!!h.dom.getAttrib(a,"data-mce-selected")}),0===i.length)return j=h.dom.getParent(h.selection.getStart(),"td,th"),void(h.selection.isCollapsed()&&j&&h.dom.isEmpty(j)&&(e.preventDefault(),c(j),b(j)));e.preventDefault(),h.undoManager.transact(function(){g.length==i.length?h.execCommand("mceTableDelete"):(d.each(i,c),b(i[0]))})}}})}m(),c.webkit&&(i(),l()),c.gecko&&(j(),k()),c.ie>9&&(j(),k())}}),d("tinymce/tableplugin/CellSelection",["tinymce/tableplugin/TableGrid","tinymce/dom/TreeWalker","tinymce/util/Tools"],function(a,b,c){return function(d,e){function f(a){d.getBody().style.webkitUserSelect="",(a||o)&&(d.$("td[data-mce-selected],th[data-mce-selected]").removeAttr("data-mce-selected"),o=!1)}function g(a,b){return a&&b?a===n.getParent(b,"table"):!1}function h(b){var c,f,h=b.target;if(!m&&h!==l&&(l=h,k&&j)){if(f=n.getParent(h,"td,th"),g(k,f)||(f=n.getParent(k,"td,th")),j===f&&!o)return;if(e(!0),g(k,f)){b.preventDefault(),i||(i=new a(d,k,j),d.getBody().style.webkitUserSelect="none"),i.setEndCell(f),o=!0,c=d.selection.getSel();try{c.removeAllRanges?c.removeAllRanges():c.empty()}catch(p){}}}}var i,j,k,l,m,n=d.dom,o=!0,p=function(){j=i=k=l=null,e(!1)};return d.on("SelectionChange",function(a){o&&a.stopImmediatePropagation()},!0),d.on("MouseDown",function(a){2==a.button||m||(f(),j=n.getParent(a.target,"td,th"),k=n.getParent(j,"table"))}),d.on("mouseover",h),d.on("remove",function(){n.unbind(d.getDoc(),"mouseover",h),f()}),d.on("MouseUp",function(){function a(a,d){var f=new b(a,a);do{if(3==a.nodeType&&0!==c.trim(a.nodeValue).length)return void(d?e.setStart(a,0):e.setEnd(a,a.nodeValue.length));if("BR"==a.nodeName)return void(d?e.setStartBefore(a):e.setEndBefore(a))}while(a=d?f.next():f.prev())}var e,f,g,h,k,l=d.selection;if(j){if(i&&(d.getBody().style.webkitUserSelect=""),f=n.select("td[data-mce-selected],th[data-mce-selected]"),f.length>0){e=n.createRng(),h=f[0],e.setStartBefore(h),e.setEndAfter(h),a(h,1),g=new b(h,n.getParent(f[0],"table"));do if("TD"==h.nodeName||"TH"==h.nodeName){if(!n.getAttrib(h,"data-mce-selected"))break;k=h}while(h=g.next());a(k),l.setRng(e)}d.nodeChanged(),p()}}),d.on("KeyUp Drop SetContent",function(a){f("setcontent"==a.type),p(),m=!1}),d.on("ObjectResizeStart ObjectResized",function(a){m="objectresized"!=a.type}),{clear:f}}}),d("tinymce/tableplugin/Dialogs",["tinymce/util/Tools","tinymce/Env"],function(a,b){var c=a.each;return function(d){function e(){var a=d.settings.color_picker_callback;return a?function(){var b=this;a.call(d,function(a){b.value(a).fire("change")},b.value())}:void 0}function f(a){return{title:"Advanced",type:"form",defaults:{onchange:function(){l(a,this.parents().reverse()[0],"style"==this.name())}},items:[{label:"Style",name:"style",type:"textbox"},{type:"form",padding:0,formItemDefaults:{layout:"grid",alignH:["start","right"]},defaults:{size:7},items:[{label:"Border color",type:"colorbox",name:"borderColor",onaction:e()},{label:"Background color",type:"colorbox",name:"backgroundColor",onaction:e()}]}]}}function g(a){return a?a.replace(/px$/,""):""}function h(a){return/^[0-9]+$/.test(a)&&(a+="px"),a}function i(a){c("left center right".split(" "),function(b){d.formatter.remove("align"+b,{},a)})}function j(a){c("top middle bottom".split(" "),function(b){d.formatter.remove("valign"+b,{},a)})}function k(b,c,d){function e(b,d){return d=d||[],a.each(b,function(a){var b={text:a.text||a.title};a.menu?b.menu=e(a.menu):(b.value=a.value,c&&c(b)),d.push(b)}),d}return e(b,d||[])}function l(a,b,c){var d=b.toJSON(),e=a.parseStyle(d.style);c?(b.find("#borderColor").value(e["border-color"]||"")[0].fire("change"),b.find("#backgroundColor").value(e["background-color"]||"")[0].fire("change")):(e["border-color"]=d.borderColor,e["background-color"]=d.backgroundColor),b.find("#style").value(a.serializeStyle(a.parseStyle(a.serializeStyle(e))))}function m(a,b,c){var d=a.parseStyle(a.getAttrib(c,"style"));d["border-color"]&&(b.borderColor=d["border-color"]),d["background-color"]&&(b.backgroundColor=d["background-color"]),b.style=a.serializeStyle(d)}function n(a,b,d){var e=a.parseStyle(a.getAttrib(b,"style"));c(d,function(a){e[a.name]=a.value}),a.setAttrib(b,"style",a.serializeStyle(a.parseStyle(a.serializeStyle(e))))}var o=this;o.tableProps=function(){o.table(!0)},o.table=function(e){function j(){function c(a,b,d){if("TD"===a.tagName||"TH"===a.tagName)v.setStyle(a,b,d);else if(a.children)for(var e=0;e',p.insertBefore(e,p.firstChild)),i(p),w.align&&d.formatter.apply("align"+w.align,{},p),d.focus(),d.addVisual()})}function o(a,b){function c(a,c){for(var d=0;dd;d++)c.push(d);return c}function C(a,b,c){for(var d,e=a(),f=0;f0?t(f,g,d):[],k=h.length>0?t(m,n,h):[];x(j,a.offsetWidth,i),y(k,a.offsetHeight,i)}function G(a,b,c,d){if(0>b||b>=a.length-1)return"";var e=a[b];if(e)e={value:e,delta:0};else for(var f=a.slice(0,b).reverse(),g=0;g0?e:f}function J(b,c,d){for(var e=D(b),f=a.map(e,function(a){return m(a.colIndex,a.element).x}),g=[],h=0;h1?G(f,h):I(e[h].element,c,d);j=j?j:wa,g.push(j)}return g}function K(a){var b=H(a,"height"),c=parseInt(b,10);return R(b)&&(c=0),!isNaN(c)&&c>0?c:p(a,"height")}function L(b){for(var c=E(b),d=a.map(c,function(a){return f(a.rowIndex,a.element).y}),e=[],g=0;g1?G(d,g):K(c[g].element);i=i?i:xa,e.push(i)}return e}function M(b,c,d,e,f){function g(b){return a.map(b,function(){return 0})}function h(){var a;if(f)a=[100-l[0]];else{var b=Math.max(e,l[0]+d);a=[b-l[0]]}return a}function i(a,b){var c,f=g(l.slice(0,a)),h=g(l.slice(b+1));if(d>=0){var i=Math.max(e,l[b]-d);c=f.concat([d,i-l[b]]).concat(h)}else{var j=Math.max(e,l[a]+d),k=l[a]-j;c=f.concat([j-l[a],k]).concat(h)}return c}function j(a,b){var c,f=g(l.slice(0,b));if(d>=0)c=f.concat([d]);else{var h=Math.max(e,l[b]+d);c=f.concat([h-l[b]])}return c}var k,l=b.slice(0);return k=0===b.length?[]:1===b.length?h():0===c?i(0,1):c>0&&ce;e++)d+=c[e];return d}function O(b,c){var d=b.getAllCells();return a.map(d,function(a){var b=N(a.colIndex,a.colIndex+a.colspan,c);return{element:a.element,width:b,colspan:a.colspan}})}function P(b,c){var d=b.getAllCells();return a.map(d,function(a){var b=N(a.rowIndex,a.rowIndex+a.rowspan,c);return{element:a.element,height:b,rowspan:a.rowspan}})}function Q(b,c){var d=b.getAllRows();return a.map(d,function(a,b){return{element:a.element,height:c[b]}})}function R(a){return za.test(a)}function S(a){return Aa.test(a)}function T(b,c,d){function f(b,c){a.each(b,function(a){e.dom.setStyle(a.element,"width",a.width+c),e.dom.setAttrib(a.element,"width",null)})}function g(){return dc;c++){for(e+="
                      ",d=0;a>d;d++)e+="";e+=""}return e+="
                      "+(h.ie&&h.ie<10?" ":"
                      ")+"
                      ",f.undoManager.transact(function(){f.insertContent(e),g=f.dom.get("__mce"),f.dom.setAttrib(g,"id",null),f.$("tr",g).each(function(a,b){f.fire("newrow",{node:b}),f.$("th,td",b).each(function(a,b){f.fire("newcell",{node:b})})}),f.dom.setAttribs(g,f.settings.table_default_attributes||{}),f.dom.setStyles(g,f.settings.table_default_styles||{})}),g}function j(a,b,c){function d(){var d,e,g,h={},i=0;e=f.dom.select("td[data-mce-selected],th[data-mce-selected]"),d=e[0],d||(d=f.selection.getStart()),c&&e.length>0?(k(e,function(a){return h[a.parentNode.parentNode.nodeName]=1}),k(h,function(a){i+=a}),g=1!==i):g=!f.dom.getParent(d,b),a.disabled(g),f.selection.selectorChanged(b,function(b){a.disabled(!b)})}f.initialized?d():f.on("init",d)}function l(){j(this,"table")}function m(){j(this,"td,th")}function n(){j(this,"td,th",!0)}function o(){var a="";a='';for(var b=0;10>b;b++){a+="";for(var c=0;10>c;c++)a+='';a+=""}return a+="
                      ",a+=''}function p(a,b,c){var d,e,g,h,i,j=c.getEl().getElementsByTagName("table")[0],k=c.isRtl()||"tl-tr"==c.parent().rel;for(j.nextSibling.innerHTML=a+1+" x "+(b+1),k&&(a=9-a),e=0;10>e;e++)for(d=0;10>d;d++)h=j.rows[e].childNodes[d].firstChild,i=(k?d>=a:a>=d)&&b>=e,f.dom.toggleClass(h,"mce-active",i),i&&(g=h);return g.parentNode}function q(){f.addButton("tableprops",{title:"Table properties",onclick:w.tableProps,icon:"table"}),f.addButton("tabledelete",{title:"Delete table",onclick:g("mceTableDelete")}),f.addButton("tablecellprops",{title:"Cell properties",onclick:g("mceTableCellProps")}),f.addButton("tablemergecells",{title:"Merge cells",onclick:g("mceTableMergeCells")}),f.addButton("tablesplitcells",{title:"Split cell",onclick:g("mceTableSplitCells")}),f.addButton("tableinsertrowbefore",{title:"Insert row before",onclick:g("mceTableInsertRowBefore")}),f.addButton("tableinsertrowafter",{title:"Insert row after",onclick:g("mceTableInsertRowAfter")}),f.addButton("tabledeleterow",{title:"Delete row",onclick:g("mceTableDeleteRow")}),f.addButton("tablerowprops",{title:"Row properties",onclick:g("mceTableRowProps")}),f.addButton("tablecutrow",{title:"Cut row",onclick:g("mceTableCutRow")}),f.addButton("tablecopyrow",{title:"Copy row",onclick:g("mceTableCopyRow")}),f.addButton("tablepasterowbefore",{title:"Paste row before",onclick:g("mceTablePasteRowBefore")}),f.addButton("tablepasterowafter",{title:"Paste row after",onclick:g("mceTablePasteRowAfter")}),f.addButton("tableinsertcolbefore",{title:"Insert column before",onclick:g("mceTableInsertColBefore")}),f.addButton("tableinsertcolafter",{title:"Insert column after",onclick:g("mceTableInsertColAfter")}),f.addButton("tabledeletecol",{title:"Delete column",onclick:g("mceTableDeleteCol")})}function r(a){var b=f.dom.is(a,"table")&&f.getBody().contains(a);return b}function s(){var a=f.settings.table_toolbar;""!==a&&a!==!1&&(a||(a="tableprops tabledelete | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol"),f.addContextToolbar(r,a))}var t,u,v=this,w=new d(f);!f.settings.object_resizing||f.settings.table_resize_bars===!1||f.settings.object_resizing!==!0&&"table"!==f.settings.object_resizing||(u=e(f)),f.settings.table_grid===!1?f.addMenuItem("inserttable",{text:"Insert table",icon:"table",context:"table",onclick:w.table}):f.addMenuItem("inserttable",{text:"Insert table",icon:"table",context:"table",ariaHideMenu:!0,onclick:function(a){a.aria&&(this.parent().hideAll(),a.stopImmediatePropagation(),w.table())},onshow:function(){p(0,0,this.menu.items()[0])},onhide:function(){var a=this.menu.items()[0].getEl().getElementsByTagName("a");f.dom.removeClass(a,"mce-active"),f.dom.addClass(a[0],"mce-active")},menu:[{type:"container",html:o(),onPostRender:function(){this.lastX=this.lastY=0},onmousemove:function(a){var b,c,d=a.target;"A"==d.tagName.toUpperCase()&&(b=parseInt(d.getAttribute("data-mce-x"),10),c=parseInt(d.getAttribute("data-mce-y"),10),(this.isRtl()||"tl-tr"==this.parent().rel)&&(b=9-b),b===this.lastX&&c===this.lastY||(p(b,c,a.control),this.lastX=b,this.lastY=c))},onclick:function(a){var b=this;"A"==a.target.tagName.toUpperCase()&&(a.preventDefault(),a.stopPropagation(),b.parent().cancel(),f.undoManager.transact(function(){i(b.lastX+1,b.lastY+1)}),f.addVisual())}}]}),f.addMenuItem("tableprops",{text:"Table properties",context:"table",onPostRender:l,onclick:w.tableProps}),f.addMenuItem("deletetable",{text:"Delete table",context:"table",onPostRender:l,cmd:"mceTableDelete"}),f.addMenuItem("cell",{separator:"before",text:"Cell",context:"table",menu:[{text:"Cell properties",onclick:g("mceTableCellProps"),onPostRender:m},{text:"Merge cells",onclick:g("mceTableMergeCells"),onPostRender:n},{text:"Split cell",onclick:g("mceTableSplitCells"),onPostRender:m}]}),f.addMenuItem("row",{text:"Row",context:"table",menu:[{text:"Insert row before",onclick:g("mceTableInsertRowBefore"),onPostRender:m},{text:"Insert row after",onclick:g("mceTableInsertRowAfter"),onPostRender:m},{text:"Delete row",onclick:g("mceTableDeleteRow"),onPostRender:m},{text:"Row properties",onclick:g("mceTableRowProps"),onPostRender:m},{text:"-"},{text:"Cut row",onclick:g("mceTableCutRow"),onPostRender:m},{text:"Copy row",onclick:g("mceTableCopyRow"),onPostRender:m},{text:"Paste row before",onclick:g("mceTablePasteRowBefore"),onPostRender:m},{text:"Paste row after",onclick:g("mceTablePasteRowAfter"),onPostRender:m}]}),f.addMenuItem("column",{text:"Column",context:"table",menu:[{text:"Insert column before",onclick:g("mceTableInsertColBefore"),onPostRender:m},{text:"Insert column after",onclick:g("mceTableInsertColAfter"),onPostRender:m},{text:"Delete column",onclick:g("mceTableDeleteCol"),onPostRender:m}]});var x=[];k("inserttable tableprops deletetable | cell row column".split(" "),function(a){"|"==a?x.push({text:"-"}):x.push(f.menuItems[a])}),f.addButton("table",{type:"menubutton",title:"Table",menu:x}),h.isIE||f.on("click",function(a){a=a.target,"TABLE"===a.nodeName&&(f.selection.select(a),f.nodeChanged())}),v.quirks=new b(f),f.on("Init",function(){v.cellSelection=new c(f,function(a){a&&u.clearBars()}),v.resizeBars=u}),f.on("PreInit",function(){f.serializer.addAttributeFilter("data-mce-cell-padding,data-mce-border,data-mce-border-color",function(a,b){for(var c=a.length;c--;)a[c].attr(b,null)})}),k({mceTableSplitCells:function(a){a.split()},mceTableMergeCells:function(a){var b;b=f.dom.getParent(f.selection.getStart(),"th,td"),f.dom.select("td[data-mce-selected],th[data-mce-selected]").length?a.merge():w.merge(a,b)},mceTableInsertRowBefore:function(a){a.insertRow(!0)},mceTableInsertRowAfter:function(a){a.insertRow()},mceTableInsertColBefore:function(a){a.insertCol(!0)},mceTableInsertColAfter:function(a){a.insertCol()},mceTableDeleteCol:function(a){a.deleteCols()},mceTableDeleteRow:function(a){a.deleteRows()},mceTableCutRow:function(a){t=a.cutRows()},mceTableCopyRow:function(a){t=a.copyRows()},mceTablePasteRowBefore:function(a){a.pasteRows(t,!0)},mceTablePasteRowAfter:function(a){a.pasteRows(t)},mceTableDelete:function(a){u&&u.clearBars(),a.deleteTable()}},function(b,c){f.addCommand(c,function(){var c=new a(f);c&&(b(c),f.execCommand("mceRepaint"),v.cellSelection.clear())})}),k({mceInsertTable:w.table,mceTableProps:function(){w.table(!0)},mceTableRowProps:w.row,mceTableCellProps:w.cell},function(a,b){f.addCommand(b,function(b,c){a(c)})}),q(),s(),f.settings.table_tab_navigation!==!1&&f.on("keydown",function(b){var c,d,e;9==b.keyCode&&(c=f.dom.getParent(f.selection.getStart(),"th,td"),c&&(b.preventDefault(),d=new a(f),e=b.shiftKey?-1:1,f.undoManager.transact(function(){!d.moveRelIdx(c,e)&&e>0&&(d.insertRow(),d.refresh(),d.moveRelIdx(c,e))})))}),v.insertTable=i}var k=f.each;i.add("table",j)})}(this); +tinymce.PluginManager.add("template",function(a){function b(b){return function(){var c=a.settings.templates;return"function"==typeof c?void c(b):void("string"==typeof c?tinymce.util.XHR.send({url:c,success:function(a){b(tinymce.util.JSON.parse(a))}}):b(c))}}function c(b){function c(b){function c(b){if(-1==b.indexOf("")){var c="";tinymce.each(a.contentCSS,function(b){c+=''});var e=a.settings.body_class||"";-1!=e.indexOf("=")&&(e=a.getParam("body_class","","hash"),e=e[a.id]||""),b=""+c+''+b+""}b=f(b,"template_preview_replace_values");var g=d.find("iframe")[0].getEl().contentWindow.document;g.open(),g.write(b),g.close()}var g=b.control.value();g.url?tinymce.util.XHR.send({url:g.url,success:function(a){e=a,c(e)}}):(e=g.content,c(e)),d.find("#description")[0].text(b.control.value().description)}var d,e,h=[];if(!b||0===b.length){var i=a.translate("No templates defined.");return void a.notificationManager.open({text:i,type:"info"})}tinymce.each(b,function(a){h.push({selected:!h.length,text:a.title,value:{url:a.url,content:a.content,description:a.description}})}),d=a.windowManager.open({title:"Insert template",layout:"flex",direction:"column",align:"stretch",padding:15,spacing:10,items:[{type:"form",flex:0,padding:0,items:[{type:"container",label:"Templates",items:{type:"listbox",label:"Templates",name:"template",values:h,onselect:c}}]},{type:"label",name:"description",label:"Description",text:"\xa0"},{type:"iframe",flex:1,border:1}],onsubmit:function(){g(!1,e)},width:a.getParam("template_popup_width",600),height:a.getParam("template_popup_height",500)}),d.find("listbox")[0].fire("select")}function d(b,c){function d(a,b){if(a=""+a,a.length0&&(i=k.create("div",null),i.appendChild(j[0].cloneNode(!0))),h(k.select("*",i),function(b){g(b,a.getParam("template_cdate_classes","cdate").replace(/\s+/g,"|"))&&(b.innerHTML=d(a.getParam("template_cdate_format",a.getLang("template.cdate_format")))),g(b,a.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))&&(b.innerHTML=d(a.getParam("template_mdate_format",a.getLang("template.mdate_format")))),g(b,a.getParam("template_selected_content_classes","selcontent").replace(/\s+/g,"|"))&&(b.innerHTML=l)}),e(i),a.execCommand("mceInsertContent",!1,i.innerHTML),a.addVisual()}var h=tinymce.each;a.addCommand("mceInsertTemplate",g),a.addButton("template",{title:"Insert template",onclick:b(c)}),a.addMenuItem("template",{text:"Insert template",onclick:b(c),context:"insert"}),a.on("PreProcess",function(b){var c=a.dom;h(c.select("div",b.node),function(b){c.hasClass(b,"mceTmpl")&&(h(c.select("*",b),function(b){c.hasClass(b,a.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))&&(b.innerHTML=d(a.getParam("template_mdate_format",a.getLang("template.mdate_format"))))}),e(b))})})}); +tinymce.PluginManager.add("textcolor",function(a){function b(b){var c;return a.dom.getParents(a.selection.getStart(),function(a){var d;(d=a.style["forecolor"==b?"color":"background-color"])&&(c=d)}),c}function c(b){var c,d,e=[];for(d=["000000","Black","993300","Burnt orange","333300","Dark olive","003300","Dark green","003366","Dark azure","000080","Navy Blue","333399","Indigo","333333","Very dark gray","800000","Maroon","FF6600","Orange","808000","Olive","008000","Green","008080","Teal","0000FF","Blue","666699","Grayish blue","808080","Gray","FF0000","Red","FF9900","Amber","99CC00","Yellow green","339966","Sea green","33CCCC","Turquoise","3366FF","Royal blue","800080","Purple","999999","Medium gray","FF00FF","Magenta","FFCC00","Gold","FFFF00","Yellow","00FF00","Lime","00FFFF","Aqua","00CCFF","Sky blue","993366","Red violet","FFFFFF","White","FF99CC","Pink","FFCC99","Peach","FFFF99","Light yellow","CCFFCC","Pale green","CCFFFF","Pale cyan","99CCFF","Light sky blue","CC99FF","Plum"],d=a.settings.textcolor_map||d,d=a.settings[b+"_map"]||d,c=0;c
                      '+(c?"×":"")+"
                      ',g=d.length-1,k=0;k",h=0;hg?f+="":(e=d[l],f+=b(e.color,e.text));f+=""}if(a.settings.color_picker_callback){for(f+='",f+="",h=0;hb.start.length?-1:a.start.length'+a+""}function f(){var a,b="";for(a in n)b+=a;return new RegExp("["+b+"]","g")}function g(){var a,b="";for(a in n)b&&(b+=","),b+="span.mce-"+n[a];return b}var h,i,j,k,l,m,n,o,p=a.getBody(),q=a.selection;if(n={"\xa0":"nbsp","\xad":"shy"},d=!d,e.state=d,a.fire("VisualChars",{state:d}),o=f(),b&&(m=q.getBookmark()),d)for(i=[],tinymce.walk(p,function(a){3==a.nodeType&&a.nodeValue&&o.test(a.nodeValue)&&i.push(a)},"childNodes"),j=0;j=0;j--)a.dom.remove(i[j],1);q.moveToBookmark(m)}function c(){var b=this;a.on("VisualChars",function(a){b.active(a.state)})}var d,e=this;a.addCommand("mceVisualChars",b),a.addButton("visualchars",{title:"Show invisible characters",cmd:"mceVisualChars",onPostRender:c}),a.addMenuItem("visualchars",{text:"Show invisible characters",cmd:"mceVisualChars",onPostRender:c,selectable:!0,context:"view",prependToContext:!0}),a.on("beforegetcontent",function(a){d&&"raw"!=a.format&&!a.draft&&(d=!0,b(!1))})}); +tinymce.PluginManager.add("wordcount",function(a){function b(){a.theme.panel.find("#wordcount").text(["Words: {0}",e.getCount()])}var c,d,e=this;c=a.getParam("wordcount_countregex",/[\w\u2019\x27\-\u00C0-\u1FFF]+/g),d=a.getParam("wordcount_cleanregex",/[0-9.(),;:!?%#$?\x27\x22_+=\\\/\-]*/g),a.on("init",function(){var c=a.theme.panel&&a.theme.panel.find("#statusbar")[0];c&&tinymce.util.Delay.setEditorTimeout(a,function(){c.insert({type:"label",name:"wordcount",text:["Words: {0}",e.getCount()],classes:"wordcount",disabled:a.settings.readonly},0),a.on("setcontent beforeaddundo",b),a.on("keyup",function(a){32==a.keyCode&&b()})},0)}),e.getCount=function(){var b=a.getContent({format:"raw"}),e=0;if(b){b=b.replace(/\.\.\./g," "),b=b.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," "),b=b.replace(/(\w+)(&#?[a-z0-9]+;)+(\w+)/i,"$1$3").replace(/&.+?;/g," "),b=b.replace(d,"");var f=b.match(c);f&&(e=f.length)}return e}}); \ No newline at end of file diff --git a/assets/js/lib/typeahead.bundle.min.js b/assets/js/lib/typeahead.bundle.min.js new file mode 100644 index 0000000..4c2f398 --- /dev/null +++ b/assets/js/lib/typeahead.bundle.min.js @@ -0,0 +1 @@ +!function(a,b){"function"==typeof define&&define.amd?define("bloodhound",["jquery"],function(c){return a.Bloodhound=b(c)}):"object"==typeof exports?module.exports=b(require("jquery")):a.Bloodhound=b(jQuery)}(this,function(a){var b=function(){"use strict";return{isMsie:function(){return/(msie|trident)/i.test(navigator.userAgent)?navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2]:!1},isBlankString:function(a){return!a||/^\s*$/.test(a)},escapeRegExChars:function(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isString:function(a){return"string"==typeof a},isNumber:function(a){return"number"==typeof a},isArray:a.isArray,isFunction:a.isFunction,isObject:a.isPlainObject,isUndefined:function(a){return"undefined"==typeof a},isElement:function(a){return!(!a||1!==a.nodeType)},isJQuery:function(b){return b instanceof a},toStr:function(a){return b.isUndefined(a)||null===a?"":a+""},bind:a.proxy,each:function(b,c){function d(a,b){return c(b,a)}a.each(b,d)},map:a.map,filter:a.grep,every:function(b,c){var d=!0;return b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?void 0:!1}),!!d):d},some:function(b,c){var d=!1;return b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?!1:void 0}),!!d):d},mixin:a.extend,identity:function(a){return a},clone:function(b){return a.extend(!0,{},b)},getIdGenerator:function(){var a=0;return function(){return a++}},templatify:function(b){function c(){return String(b)}return a.isFunction(b)?b:c},defer:function(a){setTimeout(a,0)},debounce:function(a,b,c){var d,e;return function(){var f,g,h=this,i=arguments;return f=function(){d=null,c||(e=a.apply(h,i))},g=c&&!d,clearTimeout(d),d=setTimeout(f,b),g&&(e=a.apply(h,i)),e}},throttle:function(a,b){var c,d,e,f,g,h;return g=0,h=function(){g=new Date,e=null,f=a.apply(c,d)},function(){var i=new Date,j=b-(i-g);return c=this,d=arguments,0>=j?(clearTimeout(e),e=null,g=i,f=a.apply(c,d)):e||(e=setTimeout(h,j)),f}},stringify:function(a){return b.isString(a)?a:JSON.stringify(a)},noop:function(){}}}(),c="0.11.1",d=function(){"use strict";function a(a){return a=b.toStr(a),a?a.split(/\s+/):[]}function c(a){return a=b.toStr(a),a?a.split(/\W+/):[]}function d(a){return function(c){return c=b.isArray(c)?c:[].slice.call(arguments,0),function(d){var e=[];return b.each(c,function(c){e=e.concat(a(b.toStr(d[c])))}),e}}}return{nonword:c,whitespace:a,obj:{nonword:d(c),whitespace:d(a)}}}(),e=function(){"use strict";function c(c){this.maxSize=b.isNumber(c)?c:100,this.reset(),this.maxSize<=0&&(this.set=this.get=a.noop)}function d(){this.head=this.tail=null}function e(a,b){this.key=a,this.val=b,this.prev=this.next=null}return b.mixin(c.prototype,{set:function(a,b){var c,d=this.list.tail;this.size>=this.maxSize&&(this.list.remove(d),delete this.hash[d.key],this.size--),(c=this.hash[a])?(c.val=b,this.list.moveToFront(c)):(c=new e(a,b),this.list.add(c),this.hash[a]=c,this.size++)},get:function(a){var b=this.hash[a];return b?(this.list.moveToFront(b),b.val):void 0},reset:function(){this.size=0,this.hash={},this.list=new d}}),b.mixin(d.prototype,{add:function(a){this.head&&(a.next=this.head,this.head.prev=a),this.head=a,this.tail=this.tail||a},remove:function(a){a.prev?a.prev.next=a.next:this.head=a.next,a.next?a.next.prev=a.prev:this.tail=a.prev},moveToFront:function(a){this.remove(a),this.add(a)}}),c}(),f=function(){"use strict";function c(a,c){this.prefix=["__",a,"__"].join(""),this.ttlKey="__ttl__",this.keyMatcher=new RegExp("^"+b.escapeRegExChars(this.prefix)),this.ls=c||h,!this.ls&&this._noop()}function d(){return(new Date).getTime()}function e(a){return JSON.stringify(b.isUndefined(a)?null:a)}function f(b){return a.parseJSON(b)}function g(a){var b,c,d=[],e=h.length;for(b=0;e>b;b++)(c=h.key(b)).match(a)&&d.push(c.replace(a,""));return d}var h;try{h=window.localStorage,h.setItem("~~~","!"),h.removeItem("~~~")}catch(i){h=null}return b.mixin(c.prototype,{_prefix:function(a){return this.prefix+a},_ttlKey:function(a){return this._prefix(a)+this.ttlKey},_noop:function(){this.get=this.set=this.remove=this.clear=this.isExpired=b.noop},_safeSet:function(a,b){try{this.ls.setItem(a,b)}catch(c){"QuotaExceededError"===c.name&&(this.clear(),this._noop())}},get:function(a){return this.isExpired(a)&&this.remove(a),f(this.ls.getItem(this._prefix(a)))},set:function(a,c,f){return b.isNumber(f)?this._safeSet(this._ttlKey(a),e(d()+f)):this.ls.removeItem(this._ttlKey(a)),this._safeSet(this._prefix(a),e(c))},remove:function(a){return this.ls.removeItem(this._ttlKey(a)),this.ls.removeItem(this._prefix(a)),this},clear:function(){var a,b=g(this.keyMatcher);for(a=b.length;a--;)this.remove(b[a]);return this},isExpired:function(a){var c=f(this.ls.getItem(this._ttlKey(a)));return b.isNumber(c)&&d()>c?!0:!1}}),c}(),g=function(){"use strict";function c(a){a=a||{},this.cancelled=!1,this.lastReq=null,this._send=a.transport,this._get=a.limiter?a.limiter(this._get):this._get,this._cache=a.cache===!1?new e(0):h}var d=0,f={},g=6,h=new e(10);return c.setMaxPendingRequests=function(a){g=a},c.resetCache=function(){h.reset()},b.mixin(c.prototype,{_fingerprint:function(b){return b=b||{},b.url+b.type+a.param(b.data||{})},_get:function(a,b){function c(a){b(null,a),k._cache.set(i,a)}function e(){b(!0)}function h(){d--,delete f[i],k.onDeckRequestArgs&&(k._get.apply(k,k.onDeckRequestArgs),k.onDeckRequestArgs=null)}var i,j,k=this;i=this._fingerprint(a),this.cancelled||i!==this.lastReq||((j=f[i])?j.done(c).fail(e):g>d?(d++,f[i]=this._send(a).done(c).fail(e).always(h)):this.onDeckRequestArgs=[].slice.call(arguments,0))},get:function(c,d){var e,f;d=d||a.noop,c=b.isString(c)?{url:c}:c||{},f=this._fingerprint(c),this.cancelled=!1,this.lastReq=f,(e=this._cache.get(f))?d(null,e):this._get(c,d)},cancel:function(){this.cancelled=!0}}),c}(),h=window.SearchIndex=function(){"use strict";function c(c){c=c||{},c.datumTokenizer&&c.queryTokenizer||a.error("datumTokenizer and queryTokenizer are both required"),this.identify=c.identify||b.stringify,this.datumTokenizer=c.datumTokenizer,this.queryTokenizer=c.queryTokenizer,this.reset()}function d(a){return a=b.filter(a,function(a){return!!a}),a=b.map(a,function(a){return a.toLowerCase()})}function e(){var a={};return a[i]=[],a[h]={},a}function f(a){for(var b={},c=[],d=0,e=a.length;e>d;d++)b[a[d]]||(b[a[d]]=!0,c.push(a[d]));return c}function g(a,b){var c=0,d=0,e=[];a=a.sort(),b=b.sort();for(var f=a.length,g=b.length;f>c&&g>d;)a[c]b[d]?d++:(e.push(a[c]),c++,d++);return e}var h="c",i="i";return b.mixin(c.prototype,{bootstrap:function(a){this.datums=a.datums,this.trie=a.trie},add:function(a){var c=this;a=b.isArray(a)?a:[a],b.each(a,function(a){var f,g;c.datums[f=c.identify(a)]=a,g=d(c.datumTokenizer(a)),b.each(g,function(a){var b,d,g;for(b=c.trie,d=a.split("");g=d.shift();)b=b[h][g]||(b[h][g]=e()),b[i].push(f)})})},get:function(a){var c=this;return b.map(a,function(a){return c.datums[a]})},search:function(a){var c,e,j=this;return c=d(this.queryTokenizer(a)),b.each(c,function(a){var b,c,d,f;if(e&&0===e.length)return!1;for(b=j.trie,c=a.split("");b&&(d=c.shift());)b=b[h][d];return b&&0===c.length?(f=b[i].slice(0),void(e=e?g(e,f):f)):(e=[],!1)}),e?b.map(f(e),function(a){return j.datums[a]}):[]},all:function(){var a=[];for(var b in this.datums)a.push(this.datums[b]);return a},reset:function(){this.datums={},this.trie=e()},serialize:function(){return{datums:this.datums,trie:this.trie}}}),c}(),i=function(){"use strict";function a(a){this.url=a.url,this.ttl=a.ttl,this.cache=a.cache,this.prepare=a.prepare,this.transform=a.transform,this.transport=a.transport,this.thumbprint=a.thumbprint,this.storage=new f(a.cacheKey)}var c;return c={data:"data",protocol:"protocol",thumbprint:"thumbprint"},b.mixin(a.prototype,{_settings:function(){return{url:this.url,type:"GET",dataType:"json"}},store:function(a){this.cache&&(this.storage.set(c.data,a,this.ttl),this.storage.set(c.protocol,location.protocol,this.ttl),this.storage.set(c.thumbprint,this.thumbprint,this.ttl))},fromCache:function(){var a,b={};return this.cache?(b.data=this.storage.get(c.data),b.protocol=this.storage.get(c.protocol),b.thumbprint=this.storage.get(c.thumbprint),a=b.thumbprint!==this.thumbprint||b.protocol!==location.protocol,b.data&&!a?b.data:null):null},fromNetwork:function(a){function b(){a(!0)}function c(b){a(null,e.transform(b))}var d,e=this;a&&(d=this.prepare(this._settings()),this.transport(d).fail(b).done(c))},clear:function(){return this.storage.clear(),this}}),a}(),j=function(){"use strict";function a(a){this.url=a.url,this.prepare=a.prepare,this.transform=a.transform,this.transport=new g({cache:a.cache,limiter:a.limiter,transport:a.transport})}return b.mixin(a.prototype,{_settings:function(){return{url:this.url,type:"GET",dataType:"json"}},get:function(a,b){function c(a,c){b(a?[]:e.transform(c))}var d,e=this;if(b)return a=a||"",d=this.prepare(a,this._settings()),this.transport.get(d,c)},cancelLastRequest:function(){this.transport.cancel()}}),a}(),k=function(){"use strict";function d(d){var e;return d?(e={url:null,ttl:864e5,cache:!0,cacheKey:null,thumbprint:"",prepare:b.identity,transform:b.identity,transport:null},d=b.isString(d)?{url:d}:d,d=b.mixin(e,d),!d.url&&a.error("prefetch requires url to be set"),d.transform=d.filter||d.transform,d.cacheKey=d.cacheKey||d.url,d.thumbprint=c+d.thumbprint,d.transport=d.transport?h(d.transport):a.ajax,d):null}function e(c){var d;if(c)return d={url:null,cache:!0,prepare:null,replace:null,wildcard:null,limiter:null,rateLimitBy:"debounce",rateLimitWait:300,transform:b.identity,transport:null},c=b.isString(c)?{url:c}:c,c=b.mixin(d,c),!c.url&&a.error("remote requires url to be set"),c.transform=c.filter||c.transform,c.prepare=f(c),c.limiter=g(c),c.transport=c.transport?h(c.transport):a.ajax,delete c.replace,delete c.wildcard,delete c.rateLimitBy,delete c.rateLimitWait,c}function f(a){function b(a,b){return b.url=f(b.url,a),b}function c(a,b){return b.url=b.url.replace(g,encodeURIComponent(a)),b}function d(a,b){return b}var e,f,g;return e=a.prepare,f=a.replace,g=a.wildcard,e?e:e=f?b:a.wildcard?c:d}function g(a){function c(a){return function(c){return b.debounce(c,a)}}function d(a){return function(c){return b.throttle(c,a)}}var e,f,g;return e=a.limiter,f=a.rateLimitBy,g=a.rateLimitWait,e||(e=/^throttle$/i.test(f)?d(g):c(g)),e}function h(c){return function(d){function e(a){b.defer(function(){g.resolve(a)})}function f(a){b.defer(function(){g.reject(a)})}var g=a.Deferred();return c(d,e,f),g}}return function(c){var f,g;return f={initialize:!0,identify:b.stringify,datumTokenizer:null,queryTokenizer:null,sufficient:5,sorter:null,local:[],prefetch:null,remote:null},c=b.mixin(f,c||{}),!c.datumTokenizer&&a.error("datumTokenizer is required"),!c.queryTokenizer&&a.error("queryTokenizer is required"),g=c.sorter,c.sorter=g?function(a){return a.sort(g)}:b.identity,c.local=b.isFunction(c.local)?c.local():c.local,c.prefetch=d(c.prefetch),c.remote=e(c.remote),c}}(),l=function(){"use strict";function c(a){a=k(a),this.sorter=a.sorter,this.identify=a.identify,this.sufficient=a.sufficient,this.local=a.local,this.remote=a.remote?new j(a.remote):null,this.prefetch=a.prefetch?new i(a.prefetch):null,this.index=new h({identify:this.identify,datumTokenizer:a.datumTokenizer,queryTokenizer:a.queryTokenizer}),a.initialize!==!1&&this.initialize()}var e;return e=window&&window.Bloodhound,c.noConflict=function(){return window&&(window.Bloodhound=e),c},c.tokenizers=d,b.mixin(c.prototype,{__ttAdapter:function(){function a(a,b,d){return c.search(a,b,d)}function b(a,b){return c.search(a,b)}var c=this;return this.remote?a:b},_loadPrefetch:function(){function b(a,b){return a?c.reject():(e.add(b),e.prefetch.store(e.index.serialize()),void c.resolve())}var c,d,e=this;return c=a.Deferred(),this.prefetch?(d=this.prefetch.fromCache())?(this.index.bootstrap(d),c.resolve()):this.prefetch.fromNetwork(b):c.resolve(),c.promise()},_initialize:function(){function a(){b.add(b.local)}var b=this;return this.clear(),(this.initPromise=this._loadPrefetch()).done(a),this.initPromise},initialize:function(a){return!this.initPromise||a?this._initialize():this.initPromise},add:function(a){return this.index.add(a),this},get:function(a){return a=b.isArray(a)?a:[].slice.call(arguments),this.index.get(a)},search:function(a,c,d){function e(a){var c=[];b.each(a,function(a){!b.some(f,function(b){return g.identify(a)===g.identify(b)})&&c.push(a)}),d&&d(c)}var f,g=this;return f=this.sorter(this.index.search(a)),c(this.remote?f.slice():f),this.remote&&f.length=j?(clearTimeout(e),e=null,g=i,f=a.apply(c,d)):e||(e=setTimeout(h,j)),f}},stringify:function(a){return b.isString(a)?a:JSON.stringify(a)},noop:function(){}}}(),c=function(){"use strict";function a(a){var g,h;return h=b.mixin({},f,a),g={css:e(),classes:h,html:c(h),selectors:d(h)},{css:g.css,html:g.html,classes:g.classes,selectors:g.selectors,mixin:function(a){b.mixin(a,g)}}}function c(a){return{wrapper:'',menu:'
                      '}}function d(a){var c={};return b.each(a,function(a,b){c[b]="."+a}),c}function e(){var a={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},menu:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:" 0"}};return b.isMsie()&&b.mixin(a.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),a}var f={wrapper:"twitter-typeahead",input:"tt-input",hint:"tt-hint",menu:"tt-menu",dataset:"tt-dataset",suggestion:"tt-suggestion",selectable:"tt-selectable",empty:"tt-empty",open:"tt-open",cursor:"tt-cursor",highlight:"tt-highlight"};return a}(),d=function(){"use strict";function c(b){b&&b.el||a.error("EventBus initialized without el"),this.$el=a(b.el)}var d,e;return d="typeahead:",e={render:"rendered",cursorchange:"cursorchanged",select:"selected",autocomplete:"autocompleted"},b.mixin(c.prototype,{_trigger:function(b,c){var e;return e=a.Event(d+b),(c=c||[]).unshift(e),this.$el.trigger.apply(this.$el,c),e},before:function(a){var b,c;return b=[].slice.call(arguments,1),c=this._trigger("before"+a,b),c.isDefaultPrevented()},trigger:function(a){var b;this._trigger(a,[].slice.call(arguments,1)),(b=e[a])&&this._trigger(b,[].slice.call(arguments,1))}}),c}(),e=function(){"use strict";function a(a,b,c,d){var e;if(!c)return this;for(b=b.split(i),c=d?h(c,d):c,this._callbacks=this._callbacks||{};e=b.shift();)this._callbacks[e]=this._callbacks[e]||{sync:[],async:[]},this._callbacks[e][a].push(c);return this}function b(b,c,d){return a.call(this,"async",b,c,d)}function c(b,c,d){return a.call(this,"sync",b,c,d)}function d(a){var b;if(!this._callbacks)return this;for(a=a.split(i);b=a.shift();)delete this._callbacks[b];return this}function e(a){var b,c,d,e,g;if(!this._callbacks)return this;for(a=a.split(i),d=[].slice.call(arguments,1);(b=a.shift())&&(c=this._callbacks[b]);)e=f(c.sync,this,[b].concat(d)),g=f(c.async,this,[b].concat(d)),e()&&j(g);return this}function f(a,b,c){function d(){for(var d,e=0,f=a.length;!d&&f>e;e+=1)d=a[e].apply(b,c)===!1;return!d}return d}function g(){var a;return a=window.setImmediate?function(a){setImmediate(function(){a()})}:function(a){setTimeout(function(){a()},0)}}function h(a,b){return a.bind?a.bind(b):function(){a.apply(b,[].slice.call(arguments,0))}}var i=/\s+/,j=g();return{onSync:c,onAsync:b,off:d,trigger:e}}(),f=function(a){"use strict";function c(a,c,d){for(var e,f=[],g=0,h=a.length;h>g;g++)f.push(b.escapeRegExChars(a[g]));return e=d?"\\b("+f.join("|")+")\\b":"("+f.join("|")+")",c?new RegExp(e):new RegExp(e,"i")}var d={node:null,pattern:null,tagName:"strong",className:null,wordsOnly:!1,caseSensitive:!1};return function(e){function f(b){var c,d,f;return(c=h.exec(b.data))&&(f=a.createElement(e.tagName),e.className&&(f.className=e.className),d=b.splitText(c.index),d.splitText(c[0].length),f.appendChild(d.cloneNode(!0)),b.parentNode.replaceChild(f,d)),!!c}function g(a,b){for(var c,d=3,e=0;e
                      ';var i=f(),j=Math.min(i.length,25),k=Math.ceil(i.length/j);for(e=0;k>e;e++){for(c+="",d=0;j>d;d++){var l=e*j+d;if(l
                      '+(m?String.fromCharCode(parseInt(m[0],10)):" ")+"
                      "}else c+="
                      "}c+="";var n={type:"container",html:c,onclick:function(a){var c=a.target;/^(TD|DIV)$/.test(c.nodeName)&&b(c).firstChild&&(g(tinymce.trim(c.innerText||c.textContent)),a.ctrlKey||h.close())},onmouseover:function(a){var c=b(a.target);c&&c.firstChild?(h.find("#preview").text(c.firstChild.firstChild.data),h.find("#previewTitle").text(c.title)):(h.find("#preview").text(" "),h.find("#previewTitle").text(" "))}};h=a.windowManager.open({title:"Special character",spacing:10,padding:10,items:[n,{type:"container",layout:"flex",direction:"column",align:"center",spacing:5,minWidth:160,minHeight:160,items:[{type:"label",name:"preview",text:" ",style:"font-size: 40px; text-align: center",border:1,minWidth:140,minHeight:80},{type:"label",name:"previewTitle",text:" ",style:"text-align: center",border:1,minWidth:140,minHeight:80}]}],buttons:[{text:"Close",onclick:function(){h.close()}}]})}var i=tinymce.util.Tools.isArray;return a.addCommand("mceShowCharmap",h),a.addButton("charmap",{icon:"charmap",tooltip:"Special character",cmd:"mceShowCharmap"}),a.addMenuItem("charmap",{icon:"charmap",text:"Special character",cmd:"mceShowCharmap",context:"insert"}),{getCharMap:f,insertChar:g}}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/code/plugin.min.js b/assets/js/tinymce/plugins/code/plugin.min.js new file mode 100644 index 0000000..d6331f8 --- /dev/null +++ b/assets/js/tinymce/plugins/code/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("code",function(a){function b(){var b=a.windowManager.open({title:"Source code",body:{type:"textbox",name:"code",multiline:!0,minWidth:a.getParam("code_dialog_width",600),minHeight:a.getParam("code_dialog_height",Math.min(tinymce.DOM.getViewPort().h-200,500)),spellcheck:!1,style:"direction: ltr; text-align: left"},onSubmit:function(b){a.focus(),a.undoManager.transact(function(){a.setContent(b.data.code)}),a.selection.setCursorLocation(),a.nodeChanged()}});b.find("#code").value(a.getContent({source_view:!0}))}a.addCommand("mceCodeEditor",b),a.addButton("code",{icon:"code",tooltip:"Source code",onclick:b}),a.addMenuItem("code",{icon:"code",text:"Source code",context:"tools",onclick:b})}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/codesample/css/prism.css b/assets/js/tinymce/plugins/codesample/css/prism.css new file mode 100644 index 0000000..28622b5 --- /dev/null +++ b/assets/js/tinymce/plugins/codesample/css/prism.css @@ -0,0 +1,138 @@ +/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ + +code[class*="language-"], +pre[class*="language-"] { + color: black; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + direction: ltr; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #a67f59; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + diff --git a/assets/js/tinymce/plugins/codesample/plugin.min.js b/assets/js/tinymce/plugins/codesample/plugin.min.js new file mode 100644 index 0000000..6cdbf9b --- /dev/null +++ b/assets/js/tinymce/plugins/codesample/plugin.min.js @@ -0,0 +1 @@ +!function(a,b){"use strict";function c(a,b){for(var c,d=[],f=0;fa.length)break a;if(!(q instanceof e)){k.lastIndex=0;var r=k.exec(q);if(r){m&&(n=r[1].length);var s=r.index-1+n,r=r[0].slice(n),t=r.length,u=s+t,v=q.slice(0,s+1),w=q.slice(u+1),x=[p,1];v&&x.push(v);var y=new e(h,l?c.tokenize(r,l):r,o);x.push(y),w&&x.push(w),Array.prototype.splice.apply(f,x)}}}}}return f},hooks:{all:{},add:function(a,b){var d=c.hooks.all;d[a]=d[a]||[],d[a].push(b)},run:function(a,b){var d=c.hooks.all[a];if(d&&d.length)for(var e,f=0;e=d[f++];)e(b)}}},d=c.Token=function(a,b,c){this.type=a,this.content=b,this.alias=c};return d.stringify=function(a,b,e){if("string"==typeof a)return a;if("Array"===c.util.type(a))return a.map(function(c){return d.stringify(c,b,a)}).join("");var f={type:a.type,content:d.stringify(a.content,b,e),tag:"span",classes:["token",a.type],attributes:{},language:b,parent:e};if("comment"==f.type&&(f.attributes.spellcheck="true"),a.alias){var g="Array"===c.util.type(a.alias)?a.alias:[a.alias];Array.prototype.push.apply(f.classes,g)}c.hooks.run("wrap",f);var h="";for(var i in f.attributes)h+=(h?" ":"")+i+'="'+(f.attributes[i]||"")+'"';return"<"+f.tag+' class="'+f.classes.join(" ")+'" '+h+">"+f.content+""},b.document?void 0:b.addEventListener?(b.addEventListener("message",function(a){var d=JSON.parse(a.data),e=d.language,f=d.code,g=d.immediateClose;b.postMessage(c.highlight(f,c.languages[e],e)),g&&b.close()},!1),b.Prism):b.Prism}();return"undefined"!=typeof module&&module.exports&&(module.exports=c),"undefined"!=typeof global&&(global.Prism=c),c.languages.markup={comment://,prolog:/<\?[\w\W]+?\?>/,doctype://,cdata://i,tag:{pattern:/<\/?[^\s>\/=.]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},c.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),c.languages.xml=c.languages.markup,c.languages.html=c.languages.markup,c.languages.mathml=c.languages.markup,c.languages.svg=c.languages.markup,c.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},c.languages.css.atrule.inside.rest=c.util.clone(c.languages.css),c.languages.markup&&(c.languages.insertBefore("markup","tag",{style:{pattern:/[\w\W]*?<\/style>/i,inside:{tag:{pattern:/|<\/style>/i,inside:c.languages.markup.tag.inside},rest:c.languages.css},alias:"language-css"}}),c.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').*?\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:c.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:c.languages.css}},alias:"language-css"}},c.languages.markup.tag)),c.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:/(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},c.languages.javascript=c.languages.extend("clike",{keyword:/\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i}),c.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}}),c.languages.insertBefore("javascript","class-name",{"template-string":{pattern:/`(?:\\`|\\?[^`])*`/,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:c.languages.javascript}},string:/[\s\S]+/}}}),c.languages.markup&&c.languages.insertBefore("markup","tag",{script:{pattern:/[\w\W]*?<\/script>/i,inside:{tag:{pattern:/|<\/script>/i,inside:c.languages.markup.tag.inside},rest:c.languages.javascript},alias:"language-javascript"}}),c.languages.js=c.languages.javascript,c.languages.c=c.languages.extend("clike",{keyword:/\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,operator:/\-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*\/]/,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)[ful]*\b/i}),c.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+([^\r\n\\]|\\.|\\(?:\r\n?|\n))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(<.+?>|("|')(\\?.)+?\3)/,lookbehind:!0}}}}),delete c.languages.c["class-name"],delete c.languages.c["boolean"],c.languages.csharp=c.languages.extend("clike",{keyword:/\b(abstract|as|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|async|await|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)\b/,string:[/@("|')(\1\1|\\\1|\\?(?!\1)[\s\S])*\1/,/("|')(\\?.)*?\1/],number:/\b-?(0x[\da-f]+|\d*\.?\d+)\b/i}),c.languages.insertBefore("csharp","keyword",{preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0}}),c.languages.cpp=c.languages.extend("c",{keyword:/\b(alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,"boolean":/\b(true|false)\b/,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|:{1,2}|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\/|\b(and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/}),c.languages.insertBefore("cpp","keyword",{"class-name":{pattern:/(class\s+)[a-z0-9_]+/i,lookbehind:!0}}),c.languages.java=c.languages.extend("clike",{keyword:/\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/,number:/\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp\-]+\b|\b\d*\.?\d+(?:e[+-]?\d+)?[df]?\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|!=?|<>?>?=?|==?|&[&=]?|\|[|=]?|\*=?|\/=?|%=?|\^=?|[?:~])/m,lookbehind:!0}}),c.languages.php=c.languages.extend("clike",{keyword:/\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/i,constant:/\b[A-Z0-9_]{2,}\b/,comment:{pattern:/(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/,lookbehind:!0}}),c.languages.insertBefore("php","class-name",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),c.languages.insertBefore("php","keyword",{delimiter:/\?>|<\?(?:php)?/i,variable:/\$\w+\b/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),c.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}}),c.languages.markup&&(c.hooks.add("before-highlight",function(a){"php"===a.language&&(a.tokenStack=[],a.backupCode=a.code,a.code=a.code.replace(/(?:<\?php|<\?)[\w\W]*?(?:\?>)/gi,function(b){return a.tokenStack.push(b),"{{{PHP"+a.tokenStack.length+"}}}"}))}),c.hooks.add("before-insert",function(a){"php"===a.language&&(a.code=a.backupCode,delete a.backupCode)}),c.hooks.add("after-highlight",function(a){if("php"===a.language){for(var b,d=0;b=a.tokenStack[d];d++)a.highlightedCode=a.highlightedCode.replace("{{{PHP"+(d+1)+"}}}",c.highlight(b,a.grammar,"php").replace(/\$/g,"$$$$"));a.element.innerHTML=a.highlightedCode}}),c.hooks.add("wrap",function(a){"php"===a.language&&"markup"===a.type&&(a.content=a.content.replace(/(\{\{\{PHP[0-9]+\}\}\})/g,'$1'))}),c.languages.insertBefore("php","comment",{markup:{pattern:/<[^?]\/?(.*?)>/,inside:c.languages.markup},php:/\{\{\{PHP[0-9]+\}\}\}/})),c.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:/"""[\s\S]+?"""|'''[\s\S]+?'''|("|')(?:\\?.)*?\1/,"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_][a-zA-Z0-9_]*(?=\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)[a-z0-9_]+/i,lookbehind:!0},keyword:/\b(?:as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|pass|print|raise|return|try|while|with|yield)\b/,"boolean":/\b(?:True|False)\b/,number:/\b-?(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not)\b/,punctuation:/[{}[\];(),.:]/},function(a){a.languages.ruby=a.languages.extend("clike",{comment:/#(?!\{[^\r\n]*?\}).*/,keyword:/\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/});var b={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:a.util.clone(a.languages.ruby)}};a.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1[gim]{0,3}/,inside:{interpolation:b}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,inside:{interpolation:b}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,inside:{interpolation:b}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,inside:{interpolation:b}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,inside:{interpolation:b}},{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}],variable:/[@$]+[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/,symbol:/:[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/}),a.languages.insertBefore("ruby","number",{builtin:/\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z][a-zA-Z_0-9]*(?:[?!]|\b)/}),a.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1/,inside:{interpolation:b}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,inside:{interpolation:b}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,inside:{interpolation:b}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,inside:{interpolation:b}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,inside:{interpolation:b}},{pattern:/("|')(#\{[^}]+\}|\\(?:\r?\n|\r)|\\?.)*?\1/,inside:{interpolation:b}}]}(c),c}),d("tinymce/codesampleplugin/Utils",[],function(){function a(a){return a&&"PRE"==a.nodeName&&-1!==a.className.indexOf("language-")}function b(a){return function(b,c){return a(c)}}return{isCodeSample:a,trimArg:b}}),d("tinymce/codesampleplugin/Dialog",["tinymce/dom/DOMUtils","tinymce/codesampleplugin/Utils","tinymce/codesampleplugin/Prism"],function(a,b,c){function d(a){var b=[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}],c=a.settings.codesample_languages;return c?c:b}function e(a,b,d){a.undoManager.transact(function(){var e=f(a);d=i.encode(d),e?(a.dom.setAttrib(e,"class","language-"+b),e.innerHTML=d,c.highlightElement(e),a.selection.select(e)):(a.insertContent('
                      '+d+"
                      "),a.selection.select(a.$("#__new").removeAttr("id")[0]))})}function f(a){var c=a.selection.getNode();return b.isCodeSample(c)?c:null}function g(a){var b=f(a);return b?b.textContent:""}function h(a){var b,c=f(a);return c?(b=c.className.match(/language-(\w+)/),b?b[1]:""):""}var i=a.DOM;return{open:function(a){a.windowManager.open({title:"Insert/Edit code sample",minWidth:Math.min(i.getViewPort().w,a.getParam("codesample_dialog_width",800)),minHeight:Math.min(i.getViewPort().h,a.getParam("codesample_dialog_height",650)),layout:"flex",direction:"column",align:"stretch",body:[{type:"listbox",name:"language",label:"Language",maxWidth:200,value:h(a),values:d(a)},{type:"textbox",name:"code",multiline:!0,spellcheck:!1,ariaLabel:"Code view",flex:1,style:"direction: ltr; text-align: left",classes:"monospace",value:g(a),autofocus:!0}],onSubmit:function(b){e(a,b.data.language,b.data.code)}})}}}),d("tinymce/codesampleplugin/Plugin",["tinymce/Env","tinymce/PluginManager","tinymce/codesampleplugin/Prism","tinymce/codesampleplugin/Dialog","tinymce/codesampleplugin/Utils"],function(a,b,c,d,e){var f,g=e.trimArg;b.add("codesample",function(b,h){function i(){var a;b.inline&&f||!b.inline&&j||(b.inline?f=!0:j=!0,a=b.dom.create("link",{rel:"stylesheet",href:h+"/css/prism.css"}),b.getDoc().getElementsByTagName("head")[0].appendChild(a))}var j,k=b.$;a.ceFalse&&(b.on("PreProcess",function(a){k("pre[contenteditable=false]",a.node).filter(g(e.isCodeSample)).each(function(a,b){var c=k(b),d=b.textContent;c.attr("class",k.trim(c.attr("class"))),c.removeAttr("contentEditable"),c.empty().append(k("").each(function(){this.textContent=d}))})}),b.on("SetContent",function(){var a=k("pre").filter(g(e.isCodeSample)).filter(function(a,b){return"false"!==b.contentEditable});a.length&&b.undoManager.transact(function(){a.each(function(a,d){k(d).find("br").each(function(a,c){c.parentNode.replaceChild(b.getDoc().createTextNode("\n"),c)}),d.contentEditable=!1,d.innerHTML=b.dom.encode(d.textContent),c.highlightElement(d),d.className=k.trim(d.className)})})}),b.addCommand("codesample",function(){d.open(b)}),b.addButton("codesample",{cmd:"codesample",title:"Insert/Edit code sample"}),b.on("init",i))})}),f(["tinymce/codesampleplugin/Prism","tinymce/codesampleplugin/Utils","tinymce/codesampleplugin/Dialog","tinymce/codesampleplugin/Plugin"])}(this); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/colorpicker/plugin.min.js b/assets/js/tinymce/plugins/colorpicker/plugin.min.js new file mode 100644 index 0000000..66ea69c --- /dev/null +++ b/assets/js/tinymce/plugins/colorpicker/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("colorpicker",function(a){function b(b,c){function d(a){var b=new tinymce.util.Color(a),c=b.toRgb();f.fromJSON({r:c.r,g:c.g,b:c.b,hex:b.toHex().substr(1)}),e(b.toHex())}function e(a){f.find("#preview")[0].getEl().style.background=a}var f=a.windowManager.open({title:"Color",items:{type:"container",layout:"flex",direction:"row",align:"stretch",padding:5,spacing:10,items:[{type:"colorpicker",value:c,onchange:function(){var a=this.rgb();f&&(f.find("#r").value(a.r),f.find("#g").value(a.g),f.find("#b").value(a.b),f.find("#hex").value(this.value().substr(1)),e(this.value()))}},{type:"form",padding:0,labelGap:5,defaults:{type:"textbox",size:7,value:"0",flex:1,spellcheck:!1,onchange:function(){var a,b,c=f.find("colorpicker")[0];return a=this.name(),b=this.value(),"hex"==a?(b="#"+b,d(b),void c.value(b)):(b={r:f.find("#r").value(),g:f.find("#g").value(),b:f.find("#b").value()},c.value(b),void d(b))}},items:[{name:"r",label:"R",autofocus:1},{name:"g",label:"G"},{name:"b",label:"B"},{name:"hex",label:"#",value:"000000"},{name:"preview",type:"container",border:1}]}]},onSubmit:function(){b("#"+this.toJSON().hex)}});d(c)}a.settings.color_picker_callback||(a.settings.color_picker_callback=b)}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/contextmenu/plugin.min.js b/assets/js/tinymce/plugins/contextmenu/plugin.min.js new file mode 100644 index 0000000..13cd3d2 --- /dev/null +++ b/assets/js/tinymce/plugins/contextmenu/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("contextmenu",function(a){var b,c=a.settings.contextmenu_never_use_native,d=function(a){return a.ctrlKey&&!c},e=function(){return tinymce.Env.mac&&tinymce.Env.webkit};a.on("mousedown",function(b){e()&&2===b.button&&!d(b)&&a.selection.isCollapsed()&&a.once("contextmenu",function(b){a.selection.placeCaretAt(b.clientX,b.clientY)})}),a.on("contextmenu",function(c){var e;if(!d(c)){if(c.preventDefault(),e=a.settings.contextmenu||"link image inserttable | cell row column deletetable",b)b.show();else{var f=[];tinymce.each(e.split(/[ ,]/),function(b){var c=a.menuItems[b];"|"==b&&(c={text:b}),c&&(c.shortcut="",f.push(c))});for(var g=0;g'}),a+=""}),a+=""}var d=[["cool","cry","embarassed","foot-in-mouth"],["frown","innocent","kiss","laughing"],["money-mouth","sealed","smile","surprised"],["tongue-out","undecided","wink","yell"]];a.addButton("emoticons",{type:"panelbutton",panel:{role:"application",autohide:!0,html:c,onclick:function(b){var c=a.dom.getParent(b.target,"a");c&&(a.insertContent(''+c.getAttribute('),this.hide())}},tooltip:"Emoticons"})}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/example/dialog.html b/assets/js/tinymce/plugins/example/dialog.html new file mode 100644 index 0000000..565f06f --- /dev/null +++ b/assets/js/tinymce/plugins/example/dialog.html @@ -0,0 +1,8 @@ + + + +

                      Custom dialog

                      + Input some text: + + + \ No newline at end of file diff --git a/assets/js/tinymce/plugins/example/plugin.min.js b/assets/js/tinymce/plugins/example/plugin.min.js new file mode 100644 index 0000000..88687c7 --- /dev/null +++ b/assets/js/tinymce/plugins/example/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("example",function(a,b){a.addButton("example",{text:"My button",icon:!1,onclick:function(){a.windowManager.open({title:"Example plugin",body:[{type:"textbox",name:"title",label:"Title"}],onsubmit:function(b){a.insertContent("Title: "+b.data.title)}})}}),a.addMenuItem("example",{text:"Example plugin",context:"tools",onclick:function(){a.windowManager.open({title:"TinyMCE site",url:b+"/dialog.html",width:600,height:400,buttons:[{text:"Insert",onclick:function(){var b=a.windowManager.getWindows()[0];a.insertContent(b.getContentWindow().document.getElementById("content").value),b.close()}},{text:"Close",onclick:"close"}]})}})}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/example_dependency/plugin.min.js b/assets/js/tinymce/plugins/example_dependency/plugin.min.js new file mode 100644 index 0000000..e61bf47 --- /dev/null +++ b/assets/js/tinymce/plugins/example_dependency/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("example_dependency",function(){},["example"]); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/fullpage/plugin.min.js b/assets/js/tinymce/plugins/fullpage/plugin.min.js new file mode 100644 index 0000000..1ea5c36 --- /dev/null +++ b/assets/js/tinymce/plugins/fullpage/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("fullpage",function(a){function b(){var b=c();a.windowManager.open({title:"Document properties",data:b,defaults:{type:"textbox",size:40},body:[{name:"title",label:"Title"},{name:"keywords",label:"Keywords"},{name:"description",label:"Description"},{name:"robots",label:"Robots"},{name:"author",label:"Author"},{name:"docencoding",label:"Encoding"}],onSubmit:function(a){d(tinymce.extend(b,a.data))}})}function c(){function b(a,b){var c=a.attr(b);return c||""}var c,d,f=e(),g={};return g.fontface=a.getParam("fullpage_default_fontface",""),g.fontsize=a.getParam("fullpage_default_fontsize",""),c=f.firstChild,7==c.type&&(g.xml_pi=!0,d=/encoding="([^"]+)"/.exec(c.value),d&&(g.docencoding=d[1])),c=f.getAll("#doctype")[0],c&&(g.doctype=""),c=f.getAll("title")[0],c&&c.firstChild&&(g.title=c.firstChild.value),k(f.getAll("meta"),function(a){var b,c=a.attr("name"),d=a.attr("http-equiv");c?g[c.toLowerCase()]=a.attr("content"):"Content-Type"==d&&(b=/charset\s*=\s*(.*)\s*/gi.exec(a.attr("content")),b&&(g.docencoding=b[1]))}),c=f.getAll("html")[0],c&&(g.langcode=b(c,"lang")||b(c,"xml:lang")),g.stylesheets=[],tinymce.each(f.getAll("link"),function(a){"stylesheet"==a.attr("rel")&&g.stylesheets.push(a.attr("href"))}),c=f.getAll("body")[0],c&&(g.langdir=b(c,"dir"),g.style=b(c,"style"),g.visited_color=b(c,"vlink"),g.link_color=b(c,"link"),g.active_color=b(c,"alink")),g}function d(b){function c(a,b,c){a.attr(b,c?c:void 0)}function d(a){g.firstChild?g.insert(a,g.firstChild):g.append(a)}var f,g,h,j,m,n=a.dom;f=e(),g=f.getAll("head")[0],g||(j=f.getAll("html")[0],g=new l("head",1),j.firstChild?j.insert(g,j.firstChild,!0):j.append(g)),j=f.firstChild,b.xml_pi?(m='version="1.0"',b.docencoding&&(m+=' encoding="'+b.docencoding+'"'),7!=j.type&&(j=new l("xml",7),f.insert(j,f.firstChild,!0)),j.value=m):j&&7==j.type&&j.remove(),j=f.getAll("#doctype")[0],b.doctype?(j||(j=new l("#doctype",10),b.xml_pi?f.insert(j,f.firstChild):d(j)),j.value=b.doctype.substring(9,b.doctype.length-1)):j&&j.remove(),j=null,k(f.getAll("meta"),function(a){"Content-Type"==a.attr("http-equiv")&&(j=a)}),b.docencoding?(j||(j=new l("meta",1),j.attr("http-equiv","Content-Type"),j.shortEnded=!0,d(j)),j.attr("content","text/html; charset="+b.docencoding)):j&&j.remove(),j=f.getAll("title")[0],b.title?(j?j.empty():(j=new l("title",1),d(j)),j.append(new l("#text",3)).value=b.title):j&&j.remove(),k("keywords,description,author,copyright,robots".split(","),function(a){var c,e,g=f.getAll("meta"),h=b[a];for(c=0;c"))}function e(){return new tinymce.html.DomParser({validate:!1,root_name:"#document"}).parse(i)}function f(b){function c(a){return a.replace(/<\/?[A-Z]+/g,function(a){return a.toLowerCase()})}var d,f,h,l,m=b.content,n="",o=a.dom;if(!b.selection&&!("raw"==b.format&&i||b.source_view&&a.getParam("fullpage_hide_in_source_view"))){0!==m.length||b.source_view||(m=tinymce.trim(i)+"\n"+tinymce.trim(m)+"\n"+tinymce.trim(j)),m=m.replace(/<(\/?)BODY/gi,"<$1body"),d=m.indexOf("",d),i=c(m.substring(0,d+1)),f=m.indexOf("\n"),h=e(),k(h.getAll("style"),function(a){a.firstChild&&(n+=a.firstChild.value)}),l=h.getAll("body")[0],l&&o.setAttribs(a.getBody(),{style:l.attr("style")||"",dir:l.attr("dir")||"",vLink:l.attr("vlink")||"",link:l.attr("link")||"",aLink:l.attr("alink")||""}),o.remove("fullpage_styles");var p=a.getDoc().getElementsByTagName("head")[0];n&&(o.add(p,"style",{id:"fullpage_styles"},n),l=o.get("fullpage_styles"),l.styleSheet&&(l.styleSheet.cssText=n));var q={};tinymce.each(p.getElementsByTagName("link"),function(a){"stylesheet"==a.rel&&a.getAttribute("data-mce-fullpage")&&(q[a.href]=a)}),tinymce.each(h.getAll("link"),function(a){var b=a.attr("href");q[b]||"stylesheet"!=a.attr("rel")||o.add(p,"link",{rel:"stylesheet",text:"text/css",href:b,"data-mce-fullpage":"1"}),delete q[b]}),tinymce.each(q,function(a){a.parentNode.removeChild(a)})}}function g(){var b,c="",d="";return a.getParam("fullpage_default_xml_pi")&&(c+='\n'),c+=a.getParam("fullpage_default_doctype",""),c+="\n\n\n",(b=a.getParam("fullpage_default_title"))&&(c+=""+b+"\n"),(b=a.getParam("fullpage_default_encoding"))&&(c+='\n'),(b=a.getParam("fullpage_default_font_family"))&&(d+="font-family: "+b+";"),(b=a.getParam("fullpage_default_font_size"))&&(d+="font-size: "+b+";"),(b=a.getParam("fullpage_default_text_color"))&&(d+="color: "+b+";"),c+="\n\n"}function h(b){b.selection||b.source_view&&a.getParam("fullpage_hide_in_source_view")||(b.content=tinymce.trim(i)+"\n"+tinymce.trim(b.content)+"\n"+tinymce.trim(j))}var i,j,k=tinymce.each,l=tinymce.html.Node;a.addCommand("mceFullPageProperties",b),a.addButton("fullpage",{title:"Document properties",cmd:"mceFullPageProperties"}),a.addMenuItem("fullpage",{text:"Document properties",cmd:"mceFullPageProperties",context:"file"}),a.on("BeforeSetContent",f),a.on("GetContent",h)}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/fullscreen/plugin.min.js b/assets/js/tinymce/plugins/fullscreen/plugin.min.js new file mode 100644 index 0000000..8edbe13 --- /dev/null +++ b/assets/js/tinymce/plugins/fullscreen/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("fullscreen",function(a){function b(){var a,b,c=window,d=document,e=d.body;return e.offsetWidth&&(a=e.offsetWidth,b=e.offsetHeight),c.innerWidth&&c.innerHeight&&(a=c.innerWidth,b=c.innerHeight),{w:a,h:b}}function c(){var a=tinymce.DOM.getViewPort();return{x:a.x,y:a.y}}function d(a){scrollTo(a.x,a.y)}function e(){function e(){m.setStyle(p,"height",b().h-(o.clientHeight-p.clientHeight))}var n,o,p,q,r=document.body,s=document.documentElement;l=!l,o=a.getContainer(),n=o.style,p=a.getContentAreaContainer().firstChild,q=p.style,l?(k=c(),f=q.width,g=q.height,q.width=q.height="100%",i=n.width,j=n.height,n.width=n.height="",m.addClass(r,"mce-fullscreen"),m.addClass(s,"mce-fullscreen"),m.addClass(o,"mce-fullscreen"),m.bind(window,"resize",e),e(),h=e):(q.width=f,q.height=g,i&&(n.width=i),j&&(n.height=j),m.removeClass(r,"mce-fullscreen"),m.removeClass(s,"mce-fullscreen"),m.removeClass(o,"mce-fullscreen"),m.unbind(window,"resize",h),d(k)),a.fire("FullscreenStateChanged",{state:l})}var f,g,h,i,j,k,l=!1,m=tinymce.DOM;return a.settings.inline?void 0:(a.on("init",function(){a.addShortcut("Ctrl+Shift+F","",e)}),a.on("remove",function(){h&&m.unbind(window,"resize",h)}),a.addCommand("mceFullScreen",e),a.addMenuItem("fullscreen",{text:"Fullscreen",shortcut:"Ctrl+Shift+F",selectable:!0,onClick:function(){e(),a.focus()},onPostRender:function(){var b=this;a.on("FullscreenStateChanged",function(a){b.active(a.state)})},context:"view"}),a.addButton("fullscreen",{tooltip:"Fullscreen",shortcut:"Ctrl+Shift+F",onClick:e,onPostRender:function(){var b=this;a.on("FullscreenStateChanged",function(a){b.active(a.state)})}}),{isFullscreen:function(){return l}})}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/hr/plugin.min.js b/assets/js/tinymce/plugins/hr/plugin.min.js new file mode 100644 index 0000000..25abb0c --- /dev/null +++ b/assets/js/tinymce/plugins/hr/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("hr",function(a){a.addCommand("InsertHorizontalRule",function(){a.execCommand("mceInsertContent",!1,"
                      ")}),a.addButton("hr",{icon:"hr",tooltip:"Horizontal line",cmd:"InsertHorizontalRule"}),a.addMenuItem("hr",{icon:"hr",text:"Horizontal line",cmd:"InsertHorizontalRule",context:"insert"})}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/image/plugin.min.js b/assets/js/tinymce/plugins/image/plugin.min.js new file mode 100644 index 0000000..90de1a4 --- /dev/null +++ b/assets/js/tinymce/plugins/image/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("image",function(a){function b(a,b){function c(a,c){d.parentNode&&d.parentNode.removeChild(d),b({width:a,height:c})}var d=document.createElement("img");d.onload=function(){c(Math.max(d.width,d.clientWidth),Math.max(d.height,d.clientHeight))},d.onerror=function(){c()};var e=d.style;e.visibility="hidden",e.position="fixed",e.bottom=e.left=0,e.width=e.height="auto",document.body.appendChild(d),d.src=a}function c(a,b,c){function d(a,c){return c=c||[],tinymce.each(a,function(a){var e={text:a.text||a.title};a.menu?e.menu=d(a.menu):(e.value=a.value,b(e)),c.push(e)}),c}return d(a,c||[])}function d(b){return function(){var c=a.settings.image_list;"string"==typeof c?tinymce.util.XHR.send({url:c,success:function(a){b(tinymce.util.JSON.parse(a))}}):"function"==typeof c?c(b):b(c)}}function e(d){function e(){var a,b,c,d;a=l.find("#width")[0],b=l.find("#height")[0],a&&b&&(c=a.value(),d=b.value(),l.find("#constrain")[0].checked()&&o&&p&&c&&d&&(o!=c?(d=Math.round(c/o*d),isNaN(d)||b.value(d)):(c=Math.round(d/p*c),isNaN(c)||a.value(c))),o=c,p=d)}function f(){function b(b){function c(){b.onload=b.onerror=null,a.selection&&(a.selection.select(b),a.nodeChanged())}b.onload=function(){s.width||s.height||!u||t.setAttribs(b,{width:b.clientWidth,height:b.clientHeight}),c()},b.onerror=c}var c,d;j(),e(),s=tinymce.extend(s,l.toJSON()),s.alt||(s.alt=""),s.title||(s.title=""),""===s.width&&(s.width=null),""===s.height&&(s.height=null),s.style||(s.style=null),s={src:s.src,alt:s.alt,title:s.title,width:s.width,height:s.height,style:s.style,caption:s.caption,"class":s["class"]},a.undoManager.transact(function(){function e(b){return a.schema.getTextBlockElements()[b.nodeName]}if(!s.src)return void(m&&(t.remove(m),a.focus(),a.nodeChanged()));if(""===s.title&&(s.title=null),m?t.setAttribs(m,s):(s.id="__mcenew",a.focus(),a.selection.setContent(t.createHTML("img",s)),m=t.get("__mcenew"),t.setAttrib(m,"id",null)),a.editorUpload.uploadImagesAuto(),s.caption===!1&&t.is(m.parentNode,"figure.image")&&(c=m.parentNode,t.insertAfter(m,c),t.remove(c)),s.caption!==!0)b(m);else if(!t.is(m.parentNode,"figure.image")){d=m,m=m.cloneNode(!0),c=t.create("figure",{"class":"image"}),c.appendChild(m),c.appendChild(t.create("figcaption",{contentEditable:!0},"Caption")),c.contentEditable=!1;var f=t.getParent(d,e);f?t.split(f,d,c):t.replace(c,d),a.selection.select(c)}})}function g(a){return a&&(a=a.replace(/px$/,"")),a}function h(c){var d,e,f,g=c.meta||{};q&&q.value(a.convertURL(this.value(),"src")),tinymce.each(g,function(a,b){l.find("#"+b).value(a)}),g.width||g.height||(d=a.convertURL(this.value(),"src"),e=a.settings.image_prepend_url,f=new RegExp("^(?:[a-z]+:)?//","i"),e&&!f.test(d)&&d.substring(0,e.length)!==e&&(d=e+d),this.value(d),b(a.documentBaseURI.toAbsolute(this.value()),function(a){a.width&&a.height&&u&&(o=a.width,p=a.height,l.find("#width").value(o),l.find("#height").value(p))}))}function i(a){if(a.margin){var b=a.margin.split(" ");switch(b.length){case 1:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[0],a["margin-bottom"]=a["margin-bottom"]||b[0],a["margin-left"]=a["margin-left"]||b[0];break;case 2:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[1],a["margin-bottom"]=a["margin-bottom"]||b[0],a["margin-left"]=a["margin-left"]||b[1];break;case 3:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[1],a["margin-bottom"]=a["margin-bottom"]||b[2],a["margin-left"]=a["margin-left"]||b[1];break;case 4:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[1],a["margin-bottom"]=a["margin-bottom"]||b[2],a["margin-left"]=a["margin-left"]||b[3]}delete a.margin}return a}function j(){function b(a){return a.length>0&&/^[0-9]+$/.test(a)&&(a+="px"),a}if(a.settings.image_advtab){var c=l.toJSON(),d=t.parseStyle(c.style);d=i(d),c.vspace&&(d["margin-top"]=d["margin-bottom"]=b(c.vspace)),c.hspace&&(d["margin-left"]=d["margin-right"]=b(c.hspace)),c.border&&(d["border-width"]=b(c.border)),l.find("#style").value(t.serializeStyle(t.parseStyle(t.serializeStyle(d))))}}function k(){if(a.settings.image_advtab){var b=l.toJSON(),c=t.parseStyle(b.style);l.find("#vspace").value(""),l.find("#hspace").value(""),c=i(c),(c["margin-top"]&&c["margin-bottom"]||c["margin-right"]&&c["margin-left"])&&(c["margin-top"]===c["margin-bottom"]?l.find("#vspace").value(g(c["margin-top"])):l.find("#vspace").value(""),c["margin-right"]===c["margin-left"]?l.find("#hspace").value(g(c["margin-right"])):l.find("#hspace").value("")),c["border-width"]&&l.find("#border").value(g(c["border-width"])),l.find("#style").value(t.serializeStyle(t.parseStyle(t.serializeStyle(c))))}}var l,m,n,o,p,q,r,s={},t=a.dom,u=a.settings.image_dimensions!==!1;m=a.selection.getNode(),n=t.getParent(m,"figure.image"),n&&(m=t.select("img",n)[0]),m&&("IMG"!=m.nodeName||m.getAttribute("data-mce-object")||m.getAttribute("data-mce-placeholder"))&&(m=null),m&&(o=t.getAttrib(m,"width"),p=t.getAttrib(m,"height"),s={src:t.getAttrib(m,"src"),alt:t.getAttrib(m,"alt"),title:t.getAttrib(m,"title"),"class":t.getAttrib(m,"class"),width:o,height:p,caption:!!n}),d&&(q={type:"listbox",label:"Image list",values:c(d,function(b){b.value=a.convertURL(b.value||b.url,"src")},[{text:"None",value:""}]),value:s.src&&a.convertURL(s.src,"src"),onselect:function(a){var b=l.find("#alt");(!b.value()||a.lastControl&&b.value()==a.lastControl.text())&&b.value(a.control.text()),l.find("#src").value(a.control.value()).fire("change")},onPostRender:function(){q=this}}),a.settings.image_class_list&&(r={name:"class",type:"listbox",label:"Class",values:c(a.settings.image_class_list,function(b){b.value&&(b.textStyle=function(){return a.formatter.getCssText({inline:"img",classes:[b.value]})})})});var v=[{name:"src",type:"filepicker",filetype:"image",label:"Source",autofocus:!0,onchange:h},q];a.settings.image_description!==!1&&v.push({name:"alt",type:"textbox",label:"Image description"}),a.settings.image_title&&v.push({name:"title",type:"textbox",label:"Image Title"}),u&&v.push({type:"container",label:"Dimensions",layout:"flex",direction:"row",align:"center",spacing:5,items:[{name:"width",type:"textbox",maxLength:5,size:3,onchange:e,ariaLabel:"Width"},{type:"label",text:"x"},{name:"height",type:"textbox",maxLength:5,size:3,onchange:e,ariaLabel:"Height"},{name:"constrain",type:"checkbox",checked:!0,text:"Constrain proportions"}]}),v.push(r),a.settings.image_caption&&tinymce.Env.ceFalse&&v.push({name:"caption",type:"checkbox",label:"Caption"}),a.settings.image_advtab?(m&&(m.style.marginLeft&&m.style.marginRight&&m.style.marginLeft===m.style.marginRight&&(s.hspace=g(m.style.marginLeft)),m.style.marginTop&&m.style.marginBottom&&m.style.marginTop===m.style.marginBottom&&(s.vspace=g(m.style.marginTop)),m.style.borderWidth&&(s.border=g(m.style.borderWidth)),s.style=a.dom.serializeStyle(a.dom.parseStyle(a.dom.getAttrib(m,"style")))),l=a.windowManager.open({title:"Insert/edit image",data:s,bodyType:"tabpanel",body:[{title:"General",type:"form",items:v},{title:"Advanced",type:"form",pack:"start",items:[{label:"Style",name:"style",type:"textbox",onchange:k},{type:"form",layout:"grid",packV:"start",columns:2,padding:0,alignH:["left","right"],defaults:{type:"textbox",maxWidth:50,onchange:j},items:[{label:"Vertical space",name:"vspace"},{label:"Horizontal space",name:"hspace"},{label:"Border",name:"border"}]}]}],onSubmit:f})):l=a.windowManager.open({title:"Insert/edit image",data:s,body:v,onSubmit:f})}a.on("preInit",function(){function b(a){var b=a.attr("class");return b&&/\bimage\b/.test(b)}function c(a){return function(c){function d(b){b.attr("contenteditable",a?"true":null)}for(var e,f=c.length;f--;)e=c[f],b(e)&&(e.attr("contenteditable",a?"false":null),tinymce.each(e.getAll("figcaption"),d))}}a.parser.addNodeFilter("figure",c(!0)),a.serializer.addNodeFilter("figure",c(!1))}),a.addButton("image",{icon:"image",tooltip:"Insert/edit image",onclick:d(e),stateSelector:"img:not([data-mce-object],[data-mce-placeholder]),figure.image"}),a.addMenuItem("image",{icon:"image",text:"Insert/edit image",onclick:d(e),context:"insert",prependToContext:!0}),a.addCommand("mceImage",d(e))}); \ No newline at end of file diff --git a/assets/js/tinymce/plugins/imagetools/plugin.min.js b/assets/js/tinymce/plugins/imagetools/plugin.min.js new file mode 100644 index 0000000..4d2ee3d --- /dev/null +++ b/assets/js/tinymce/plugins/imagetools/plugin.min.js @@ -0,0 +1 @@ +!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;g>i;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;c>f;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("1",tinymce.PluginManager),h("2",tinymce.Env),h("3",tinymce.util.Promise),h("4",tinymce.util.URI),h("5",tinymce.util.Tools),h("6",tinymce.util.Delay),g("m",[],function(){function a(a,b){return d(document.createElement("canvas"),a,b)}function b(a){return a.getContext("2d")}function c(a){var b=null;try{b=a.getContext("webgl")||a.getContext("experimental-webgl")}catch(c){}return b||(b=null),b}function d(a,b,c){return a.width=b,a.height=c,a}return{create:a,resize:d,get2dContext:b,get3dContext:c}}),g("n",[],function(){function a(a){return a.naturalWidth||a.width}function b(a){return a.naturalHeight||a.height}return{getWidth:a,getHeight:b}}),g("o",[],function(){function a(a,b){return function(){a.apply(b,arguments)}}function b(b){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof b)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],h(b,a(d,this),a(e,this))}function c(a){var b=this;return null===this._state?void this._deferreds.push(a):void i(function(){var c=b._state?a.onFulfilled:a.onRejected;if(null===c)return void(b._state?a.resolve:a.reject)(b._value);var d;try{d=c(b._value)}catch(e){return void a.reject(e)}a.resolve(d)})}function d(b){try{if(b===this)throw new TypeError("A promise cannot be resolved with itself.");if(b&&("object"==typeof b||"function"==typeof b)){var c=b.then;if("function"==typeof c)return void h(a(c,b),a(d,this),a(e,this))}this._state=!0,this._value=b,f.call(this)}catch(g){e.call(this,g)}}function e(a){this._state=!1,this._value=a,f.call(this)}function f(){for(var a=0,b=this._deferreds.length;b>a;a++)c.call(this,this._deferreds[a]);this._deferreds=null}function g(a,b,c,d){this.onFulfilled="function"==typeof a?a:null,this.onRejected="function"==typeof b?b:null,this.resolve=c,this.reject=d}function h(a,b,c){var d=!1;try{a(function(a){d||(d=!0,b(a))},function(a){d||(d=!0,c(a))})}catch(e){if(d)return;d=!0,c(e)}}if(window.Promise)return window.Promise;var i=b.immediateFn||"function"==typeof setImmediate&&setImmediate||function(a){setTimeout(a,1)},j=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)};return b.prototype["catch"]=function(a){return this.then(null,a)},b.prototype.then=function(a,d){var e=this;return new b(function(b,f){c.call(e,new g(a,d,b,f))})},b.all=function(){var a=Array.prototype.slice.call(1===arguments.length&&j(arguments[0])?arguments[0]:arguments);return new b(function(b,c){function d(f,g){try{if(g&&("object"==typeof g||"function"==typeof g)){var h=g.then;if("function"==typeof h)return void h.call(g,function(a){d(f,a)},c)}a[f]=g,0===--e&&b(a)}catch(i){c(i)}}if(0===a.length)return b([]);for(var e=a.length,f=0;fd;d++)a[d].then(b,c)})},b}),g("p",[],function(){function a(a){var b=document.createElement("a");return b.href=a,b.pathname}function b(b){var c=a(b).split("."),d=c[c.length-1],e={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png"};return d&&(d=d.toLowerCase()),e[d]}return{guessMimeType:b}}),g("e",["o","m","p","n"],function(a,b,c,d){function e(b){return new a(function(a){function c(){b.removeEventListener("load",c),a(b)}b.complete?a(b):b.addEventListener("load",c)})}function f(a){return e(a).then(function(a){var c,e;return e=b.create(d.getWidth(a),d.getHeight(a)),c=b.get2dContext(e),c.drawImage(a,0,0),e})}function g(a){return e(a).then(function(a){var b=a.src;return 0===b.indexOf("blob:")?i(b):0===b.indexOf("data:")?j(b):f(a).then(function(a){return j(a.toDataURL(c.guessMimeType(b)))})})}function h(b){return new a(function(a){function c(){d.removeEventListener("load",c),a(d)}var d=new Image;d.addEventListener("load",c),d.src=URL.createObjectURL(b),d.complete&&c()})}function i(b){return new a(function(a){var c=new XMLHttpRequest;c.open("GET",b,!0),c.responseType="blob",c.onload=function(){200==this.status&&a(this.response)},c.send()})}function j(b){return new a(function(a){var c,d,e,f,g,h;if(b=b.split(","),f=/data:([^;]+)/.exec(b[0]),f&&(g=f[1]),c=atob(b[1]),window.WebKitBlobBuilder){for(h=new WebKitBlobBuilder,d=new ArrayBuffer(c.length),e=0;ec?a=c:b>a&&(a=b),a}function b(){return[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1]}function c(a,b){var c,d,e,f,g=[],h=new Array(10);for(c=0;5>c;c++){for(d=0;5>d;d++)g[d]=b[d+5*c];for(d=0;5>d;d++){for(f=0,e=0;5>e;e++)f+=a[d+5*e]*g[e];h[d+5*c]=f}}return h}function d(b,c){return c=a(c,0,1),b.map(function(b,d){return d%6===0?b=1-(1-b)*c:b*=c,a(b,0,1)})}function e(b,d){var e;return d=a(d,-1,1),d*=100,0>d?e=127+d/100*127:(e=d%1,e=0===e?l[d]:l[Math.floor(d)]*(1-e)+l[Math.floor(d)+1]*e,e=127*e+127),c(b,[e/127,0,0,0,.5*(127-e),0,e/127,0,0,.5*(127-e),0,0,e/127,0,.5*(127-e),0,0,0,1,0,0,0,0,0,1])}function f(b,d){var e,f,g,h;return d=a(d,-1,1),e=1+(d>0?3*d:d),f=.3086,g=.6094,h=.082,c(b,[f*(1-e)+e,g*(1-e),h*(1-e),0,0,f*(1-e),g*(1-e)+e,h*(1-e),0,0,f*(1-e),g*(1-e),h*(1-e)+e,0,0,0,0,0,1,0,0,0,0,0,1])}function g(b,d){var e,f,g,h,i;return d=a(d,-180,180)/180*Math.PI,e=Math.cos(d),f=Math.sin(d),g=.213,h=.715,i=.072,c(b,[g+e*(1-g)+f*-g,h+e*-h+f*-h,i+e*-i+f*(1-i),0,0,g+e*-g+.143*f,h+e*(1-h)+.14*f,i+e*-i+f*-.283,0,0,g+e*-g+f*-(1-g),h+e*-h+f*h,i+e*(1-i)+f*i,0,0,0,0,0,1,0,0,0,0,0,1])}function h(b,d){return d=a(255*d,-255,255),c(b,[1,0,0,0,d,0,1,0,0,d,0,0,1,0,d,0,0,0,1,0,0,0,0,0,1])}function i(b,d,e,f){return d=a(d,0,2),e=a(e,0,2),f=a(f,0,2),c(b,[d,0,0,0,0,0,e,0,0,0,0,0,f,0,0,0,0,0,1,0,0,0,0,0,1])}function j(b,e){return e=a(e,0,1),c(b,d([.393,.769,.189,0,0,.349,.686,.168,0,0,.272,.534,.131,0,0,0,0,0,1,0,0,0,0,0,1],e))}function k(b,e){return e=a(e,0,1),c(b,d([.33,.34,.33,0,0,.33,.34,.33,0,0,.33,.34,.33,0,0,0,0,0,1,0,0,0,0,0,1],e))}var l=[0,.01,.02,.04,.05,.06,.07,.08,.1,.11,.12,.14,.15,.16,.17,.18,.2,.21,.22,.24,.25,.27,.28,.3,.32,.34,.36,.38,.4,.42,.44,.46,.48,.5,.53,.56,.59,.62,.65,.68,.71,.74,.77,.8,.83,.86,.89,.92,.95,.98,1,1.06,1.12,1.18,1.24,1.3,1.36,1.42,1.48,1.54,1.6,1.66,1.72,1.78,1.84,1.9,1.96,2,2.12,2.25,2.37,2.5,2.62,2.75,2.87,3,3.2,3.4,3.6,3.8,4,4.3,4.7,4.9,5,5.5,6,6.5,6.8,7,7.3,7.5,7.8,8,8.4,8.7,9,9.4,9.6,9.8,10];return{identity:b,adjust:d,multiply:c,adjustContrast:e,adjustBrightness:h,adjustSaturation:f,adjustHue:g,adjustColors:i,adjustSepia:j,adjustGrayscale:k}}),g("c",["m","n","e","q"],function(a,b,c,d){function e(d,e){return c.blobToImage(d).then(function(d){function f(a,b){var c,d,e,f,g,h=a.data,i=b[0],j=b[1],k=b[2],l=b[3],m=b[4],n=b[5],o=b[6],p=b[7],q=b[8],r=b[9],s=b[10],t=b[11],u=b[12],v=b[13],w=b[14],x=b[15],y=b[16],z=b[17],A=b[18],B=b[19];for(g=0;gc?a=c:b>a&&(a=b),a}var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;for(g=Math.round(Math.sqrt(c.length)),h=Math.floor(g/2),e=a.data,f=b.data,t=a.width,u=a.height,j=0;u>j;j++)for(i=0;t>i;i++){for(k=l=m=0,o=0;g>o;o++)for(n=0;g>n;n++)p=d(i+n-h,0,t-1),q=d(j+o-h,0,u-1),r=4*(q*t+p),s=c[o*g+n],k+=e[r]*s,l+=e[r+1]*s,m+=e[r+2]*s;r=4*(j*t+i),f[r]=d(k,0,255),f[r+1]=d(l,0,255),f[r+2]=d(m,0,255)}return b}var g,h,i=a.create(b.getWidth(d),b.getHeight(d)),j=a.get2dContext(i);return j.drawImage(d,0,0),k(d),g=j.getImageData(0,0,i.width,i.height),h=j.getImageData(0,0,i.width,i.height),h=f(g,h,e),j.putImageData(h,0,0),c.canvasToBlob(i)})}function g(d){return function(e,f){return c.blobToImage(e).then(function(e){function g(a,b){var c,d=a.data;for(c=0;ci||i>2)&&(i=.5>i?.5:2,k=!0),(.5>j||j>2)&&(j=.5>j?.5:2,k=!0);var l=f(a,i,j);return k?l.then(function(a){return e(a,b,c)}):l}function f(b,e,f){return new a(function(a){var g=d.getWidth(b),h=d.getHeight(b),i=Math.floor(g*e),j=Math.floor(h*f),k=c.create(i,j),l=c.get2dContext(k);l.drawImage(b,0,0,g,h,0,0,i,j),a(k)})}return{scale:e}}),g("d",["e","m","n","r"],function(a,b,c,d){function e(d,e){return a.blobToImage(d).then(function(f){var g=b.create(c.getWidth(f),c.getHeight(f)),h=b.get2dContext(g),j=0,k=0;return e=0>e?360+e:e,90!=e&&270!=e||b.resize(g,g.height,g.width),90!=e&&180!=e||(j=g.width),270!=e&&180!=e||(k=g.height),h.translate(j,k),h.rotate(e*Math.PI/180),h.drawImage(f,0,0),i(f),a.canvasToBlob(g,d.type)})}function f(d,e){return a.blobToImage(d).then(function(d){var f=b.create(c.getWidth(d),c.getHeight(d)),g=b.get2dContext(f);return"v"==e?(g.scale(1,-1),g.drawImage(d,0,-f.height)):(g.scale(-1,1),g.drawImage(d,-f.width,0)),i(d),a.canvasToBlob(f)})}function g(c,d,e,f,g){return a.blobToImage(c).then(function(c){var h=b.create(f,g),j=b.get2dContext(h);return j.drawImage(c,-d,-e),i(c),a.canvasToBlob(h)})}function h(b,c,e){return a.blobToImage(b).then(function(f){var g;return g=d.scale(f,c,e).then(function(c){return a.canvasToBlob(c,b.type)}).then(j(f))["catch"](j(f))})}var i=a.revokeImageUrl,j=function(a){return function(b){return i(a),b}};return{rotate:e,flip:f,crop:g,resize:h}}),g("7",["c","d"],function(a,b){var c=function(b){return a.invert(b)},d=function(b){return a.sharpen(b)},e=function(b){return a.emboss(b)},f=function(b,c){return a.gamma(b,c)},g=function(b,c){return a.exposure(b,c)},h=function(b,c,d,e){return a.colorize(b,c,d,e)},i=function(b,c){return a.brightness(b,c)},j=function(b,c){return a.hue(b,c)},k=function(b,c){return a.saturate(b,c)},l=function(b,c){return a.contrast(b,c)},m=function(b,c){return a.grayscale(b,c)},n=function(b,c){return a.sepia(b,c)},o=function(a,c){return b.flip(a,c)},p=function(a,c,d,e,f){return b.crop(a,c,d,e,f)},q=function(a,c,d){return b.resize(a,c,d)},r=function(a,c){return b.rotate(a,c)};return{invert:c,sharpen:d,emboss:e,brightness:i,hue:j,saturate:k,contrast:l,grayscale:m,sepia:n,colorize:h,gamma:f,exposure:g,flip:o,crop:p,resize:q,rotate:r}}),g("8",["e"],function(a){var b=function(b){return a.blobToImage(b)},c=function(b){return a.imageToBlob(b)},d=function(b){return a.blobToDataUri(b)},e=function(b){return a.blobToBase64(b)};return{blobToImage:b,imageToBlob:c,blobToDataUri:d,blobToBase64:e}}),h("f",tinymce.dom.DOMUtils),h("g",tinymce.ui.Factory),h("h",tinymce.ui.Form),h("i",tinymce.ui.Container),h("s",tinymce.ui.Control),h("t",tinymce.ui.DragHelper),h("u",tinymce.geom.Rect),h("w",tinymce.dom.DomQuery),h("x",tinymce.util.Observable),h("y",tinymce.util.VK),g("v",["w","t","u","5","x","y"],function(a,b,c,d,e,f){var g=0;return function(h,i,j,k,l){function m(a,b){return{x:b.x+a.x,y:b.y+a.y,w:b.w,h:b.h}}function n(a,b){return{x:b.x-a.x,y:b.y-a.y,w:b.w,h:b.h}}function o(){return n(j,h)}function p(a,b,d,e){var f,g,i,k,l;f=b.x,g=b.y,i=b.w,k=b.h,f+=d*a.deltaX,g+=e*a.deltaY,i+=d*a.deltaW,k+=e*a.deltaH,20>i&&(i=20),20>k&&(k=20),l=h=c.clamp({x:f,y:g,w:i,h:k},j,"move"==a.name),l=n(j,l),y.fire("updateRect",{rect:l}),v(l)}function q(){function c(a){var c;return new b(D,{document:k.ownerDocument,handle:D+"-"+a.name,start:function(){c=h},drag:function(b){p(a,c,b.deltaX,b.deltaY)}})}a('
                      ').appendTo(k),d.each(B,function(b){a("#"+D,k).append('"},postRender:function(){var e=this,t=e.settings,n=t.textStyle;if("function"==typeof n&&(n=n.call(this)),n){var i=e.getEl("text");i&&i.setAttribute("style",n)}return e.on("mouseenter click",function(n){n.control===e&&(t.menu||"click"!==n.type?(e.showMenu(),n.aria&&e.menu.focus(!0)):(e.fire("select"),r.requestAnimationFrame(function(){e.parent().hideAll()})))}),e._super(),e},hover:function(){var e=this;return e.parent().items().each(function(e){e.classes.remove("selected")}),e.classes.toggle("selected",!0),e},active:function(e){return"undefined"!=typeof e&&this.aria("checked",e),this._super(e)},remove:function(){this._super(),this.menu&&this.menu.remove()}})}),r(Ut,[g,ye,u],function(e,t,n){return function(r,i){var o=this,a,s=t.classPrefix,l;o.show=function(t,c){function u(){a&&(e(r).append('
                      '),c&&c())}return o.hide(),a=!0,t?l=n.setTimeout(u,t):u(),o},o.hide=function(){var e=r.lastChild;return n.clearTimeout(l),e&&-1!=e.className.indexOf("throbber")&&e.parentNode.removeChild(e),a=!1,o}}}),r(Wt,[ke,zt,Ut,m],function(e,t,n,r){return e.extend({Defaults:{defaultType:"menuitem",border:1,layout:"stack",role:"application",bodyRole:"menu",ariaRoot:!0},init:function(e){var t=this;if(e.autohide=!0,e.constrainToViewport=!0,"function"==typeof e.items&&(e.itemsFactory=e.items,e.items=[]),e.itemDefaults)for(var n=e.items,i=n.length;i--;)n[i]=r.extend({},e.itemDefaults,n[i]);t._super(e),t.classes.add("menu")},repaint:function(){return this.classes.toggle("menu-align",!0),this._super(),this.getEl().style.height="",this.getEl("body").style.height="",this},cancel:function(){var e=this;e.hideAll(),e.fire("select")},load:function(){function e(){t.throbber&&(t.throbber.hide(),t.throbber=null)}var t=this,r,i;i=t.settings.itemsFactory,i&&(t.throbber||(t.throbber=new n(t.getEl("body"),!0),0===t.items().length?(t.throbber.show(),t.fire("loading")):t.throbber.show(100,function(){t.items().remove(),t.fire("loading")}),t.on("hide close",e)),t.requestTime=r=(new Date).getTime(),t.settings.itemsFactory(function(n){return 0===n.length?void t.hide():void(t.requestTime===r&&(t.getEl().style.width="",t.getEl("body").style.width="",e(),t.items().remove(),t.getEl("body").innerHTML="",t.add(n),t.renderNew(),t.fire("loaded")))}))},hideAll:function(){var e=this;return this.find("menuitem").exec("hideMenu"),e._super()},preRender:function(){var e=this;return e.items().each(function(t){var n=t.settings;return n.icon||n.image||n.selectable?(e._hasIcons=!0,!1):void 0}),e.settings.itemsFactory&&e.on("postrender",function(){e.settings.itemsFactory&&e.load()}),e._super()}})}),r(Vt,[Ft,Wt],function(e,t){return e.extend({init:function(e){function t(r){for(var a=0;a0&&(o=r[0].text,n.state.set("value",r[0].value)),n.state.set("menu",r)),n.state.set("text",e.text||o),n.classes.add("listbox"),n.on("select",function(t){var r=t.control;a&&(t.lastControl=a),e.multiple?r.active(!r.active()):n.value(t.control.value()),a=r})},bindStates:function(){function e(e,n){e instanceof t&&e.items().each(function(e){e.hasMenus()||e.active(e.value()===n)})}function n(e,t){var r;if(e)for(var i=0;i
                      '},postRender:function(){var e=this;e._super(),e.resizeDragHelper=new t(this._id,{start:function(){e.fire("ResizeStart")},drag:function(t){"both"!=e.settings.direction&&(t.deltaX=0),e.fire("Resize",t)},stop:function(){e.fire("ResizeEnd")}})},remove:function(){return this.resizeDragHelper&&this.resizeDragHelper.destroy(),this._super()}})}),r(jt,[De],function(e){function t(e){var t="";if(e)for(var n=0;n'+e[n]+"";return t}return e.extend({Defaults:{classes:"selectbox",role:"selectbox",options:[]},init:function(e){var t=this;t._super(e),t.settings.size&&(t.size=t.settings.size),t.settings.options&&(t._options=t.settings.options),t.on("keydown",function(e){var n;13==e.keyCode&&(e.preventDefault(),t.parents().reverse().each(function(e){return e.toJSON?(n=e,!1):void 0}),t.fire("submit",{data:n.toJSON()}))})},options:function(e){return arguments.length?(this.state.set("options",e),this):this.state.get("options")},renderHtml:function(){var e=this,n,r="";return n=t(e._options),e.size&&(r=' size = "'+e.size+'"'),'"},bindStates:function(){var e=this;return e.state.on("change:options",function(n){e.getEl().innerHTML=t(n.value)}),e._super()}})}),r(Yt,[De,we,pe],function(e,t,n){function r(e,t,n){return t>e&&(e=t),e>n&&(e=n),e}function i(e,t,n){e.setAttribute("aria-"+t,n)}function o(e,t){var r,o,a,s,l,c;"v"==e.settings.orientation?(s="top",a="height",o="h"):(s="left",a="width",o="w"),c=e.getEl("handle"),r=(e.layoutRect()[o]||100)-n.getSize(c)[a],l=r*((t-e._minValue)/(e._maxValue-e._minValue))+"px",c.style[s]=l,c.style.height=e.layoutRect().h+"px",i(c,"valuenow",t),i(c,"valuetext",""+e.settings.previewFilter(t)),i(c,"valuemin",e._minValue),i(c,"valuemax",e._maxValue)}return e.extend({init:function(e){var t=this;e.previewFilter||(e.previewFilter=function(e){return Math.round(100*e)/100}),t._super(e),t.classes.add("slider"),"v"==e.orientation&&t.classes.add("vertical"),t._minValue=e.minValue||0,t._maxValue=e.maxValue||100,t._initValue=t.state.get("value")},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix;return'
                      '},reset:function(){this.value(this._initValue).repaint()},postRender:function(){function e(e,t,n){return(n+e)/(t-e)}function i(e,t,n){return n*(t-e)-e}function o(t,n){function o(o){var a;a=s.value(),a=i(t,n,e(t,n,a)+.05*o),a=r(a,t,n),s.value(a),s.fire("dragstart",{value:a}),s.fire("drag",{value:a}),s.fire("dragend",{value:a})}s.on("keydown",function(e){switch(e.keyCode){case 37:case 38:o(-1);break;case 39:case 40:o(1)}})}function a(e,i,o){var a,l,c,p,m;s._dragHelper=new t(s._id,{handle:s._id+"-handle",start:function(e){a=e[u],l=parseInt(s.getEl("handle").style[d],10),c=(s.layoutRect()[h]||100)-n.getSize(o)[f],s.fire("dragstart",{value:m})},drag:function(t){var n=t[u]-a;p=r(l+n,0,c),o.style[d]=p+"px",m=e+p/c*(i-e),s.value(m),s.tooltip().text(""+s.settings.previewFilter(m)).show().moveRel(o,"bc tc"),s.fire("drag",{value:m})},stop:function(){s.tooltip().hide(),s.fire("dragend",{value:m})}})}var s=this,l,c,u,d,f,h;l=s._minValue,c=s._maxValue,"v"==s.settings.orientation?(u="screenY",d="top",f="height",h="h"):(u="screenX",d="left",f="width",h="w"),s._super(),o(l,c,s.getEl("handle")),a(l,c,s.getEl("handle"))},repaint:function(){this._super(),o(this,this.value())},bindStates:function(){var e=this;return e.state.on("change:value",function(t){o(e,t.value)}),e._super()}})}),r(Xt,[De],function(e){return e.extend({renderHtml:function(){var e=this;return e.classes.add("spacer"),e.canFocus=!1,'
                      '}})}),r(Kt,[Ft,pe,g],function(e,t,n){return e.extend({Defaults:{classes:"widget btn splitbtn",role:"button"},repaint:function(){var e=this,r=e.getEl(),i=e.layoutRect(),o,a;return e._super(),o=r.firstChild,a=r.lastChild,n(o).css({width:i.w-t.getSize(a).width,height:i.h-2}),n(a).css({height:i.h-2}),e},activeMenu:function(e){var t=this;n(t.getEl().lastChild).toggleClass(t.classPrefix+"active",e)},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r,i=e.state.get("icon"),o=e.state.get("text"),a="";return r=e.settings.image,r?(i="none","string"!=typeof r&&(r=window.getSelection?r[0]:r[1]),r=" style=\"background-image: url('"+r+"')\""):r="",i=e.settings.icon?n+"ico "+n+"i-"+i:"",o&&(e.classes.add("btn-has-text"),a=''+e.encode(o)+""),'
                      '},postRender:function(){var e=this,t=e.settings.onclick;return e.on("click",function(e){var n=e.target;if(e.control==this)for(;n;){if(e.aria&&"down"!=e.aria.key||"BUTTON"==n.nodeName&&-1==n.className.indexOf("open"))return e.stopImmediatePropagation(),void(t&&t.call(this,e));n=n.parentNode}}),delete e.settings.onclick,e._super()}})}),r(Gt,[Bt],function(e){return e.extend({Defaults:{containerClass:"stack-layout",controlClass:"stack-layout-item",endClass:"break"},isNative:function(){return!0}})}),r(Jt,[Ee,g,pe],function(e,t,n){return e.extend({Defaults:{layout:"absolute",defaults:{type:"panel"}},activateTab:function(e){var n;this.activeTabId&&(n=this.getEl(this.activeTabId),t(n).removeClass(this.classPrefix+"active"),n.setAttribute("aria-selected","false")),this.activeTabId="t"+e,n=this.getEl("t"+e),n.setAttribute("aria-selected","true"),t(n).addClass(this.classPrefix+"active"),this.items()[e].show().fire("showtab"),this.reflow(),this.items().each(function(t,n){e!=n&&t.hide()})},renderHtml:function(){var e=this,t=e._layout,n="",r=e.classPrefix;return e.preRender(),t.preRender(e),e.items().each(function(t,i){var o=e._id+"-t"+i;t.aria("role","tabpanel"),t.aria("labelledby",o),n+='"}),'
                      '+n+'
                      '+t.renderHtml(e)+"
                      "},postRender:function(){var e=this;e._super(),e.settings.activeTab=e.settings.activeTab||0,e.activateTab(e.settings.activeTab),this.on("click",function(t){var n=t.target.parentNode;if(t.target.parentNode.id==e._id+"-head")for(var r=n.childNodes.length;r--;)n.childNodes[r]==t.target&&e.activateTab(r)})},initLayoutRect:function(){var e=this,t,r,i;r=n.getSize(e.getEl("head")).width,r=0>r?0:r,i=0,e.items().each(function(e){r=Math.max(r,e.layoutRect().minW),i=Math.max(i,e.layoutRect().minH)}),e.items().each(function(e){e.settings.x=0,e.settings.y=0,e.settings.w=r,e.settings.h=i,e.layoutRect({x:0,y:0,w:r,h:i})});var o=n.getSize(e.getEl("head")).height;return e.settings.minWidth=r,e.settings.minHeight=i+o,t=e._super(),t.deltaH+=o,t.innerH=t.h-t.deltaH,t}})}),r(Qt,[De,m,pe],function(e,t,n){return e.extend({init:function(e){var t=this;t._super(e),t.classes.add("textbox"),e.multiline?t.classes.add("multiline"):(t.on("keydown",function(e){var n;13==e.keyCode&&(e.preventDefault(),t.parents().reverse().each(function(e){return e.toJSON?(n=e,!1):void 0}),t.fire("submit",{data:n.toJSON()}))}),t.on("keyup",function(e){t.state.set("value",e.target.value)}))},repaint:function(){var e=this,t,n,r,i,o=0,a;t=e.getEl().style,n=e._layoutRect,a=e._lastRepaintRect||{};var s=document;return!e.settings.multiline&&s.all&&(!s.documentMode||s.documentMode<=8)&&(t.lineHeight=n.h-o+"px"),r=e.borderBox,i=r.left+r.right+8,o=r.top+r.bottom+(e.settings.multiline?8:0),n.x!==a.x&&(t.left=n.x+"px",a.x=n.x),n.y!==a.y&&(t.top=n.y+"px",a.y=n.y),n.w!==a.w&&(t.width=n.w-i+"px",a.w=n.w),n.h!==a.h&&(t.height=n.h-o+"px",a.h=n.h),e._lastRepaintRect=a,e.fire("repaint",{},!1),e},renderHtml:function(){var e=this,r=e.settings,i,o;return i={id:e._id,hidefocus:"1"},t.each(["rows","spellcheck","maxLength","size","readonly","min","max","step","list","pattern","placeholder","required","multiple"],function(e){i[e]=r[e]}),e.disabled()&&(i.disabled="disabled"),r.subtype&&(i.type=r.subtype),o=n.create(r.multiline?"textarea":"input",i),o.value=e.state.get("value"),o.className=e.classes,o.outerHTML},value:function(e){return arguments.length?(this.state.set("value",e),this):(this.state.get("rendered")&&this.state.set("value",this.getEl().value),this.state.get("value"))},postRender:function(){var e=this;e.getEl().value=e.state.get("value"),e._super(),e.$el.on("change",function(t){ +e.state.set("value",t.target.value),e.fire("change",t)})},bindStates:function(){var e=this;return e.state.on("change:value",function(t){e.getEl().value!=t.value&&(e.getEl().value=t.value)}),e.state.on("change:disabled",function(t){e.getEl().disabled=t.value}),e._super()},remove:function(){this.$el.off(),this._super()}})}),r(Zt,[],function(){var e=this||window,t=function(){return e.tinymce};return"function"==typeof e.define&&(e.define.amd||e.define("ephox/tinymce",[],t)),{}}),a([l,c,u,d,f,h,m,g,v,y,C,w,N,E,T,A,B,D,L,M,P,O,I,F,j,Y,J,Q,oe,ae,se,le,ue,fe,he,ve,ye,be,Ce,xe,we,Ne,Ee,_e,Se,ke,Te,Re,Ae,Be,De,Le,Me,Pe,Ie,ze,tt,nt,rt,it,at,st,lt,ct,ut,dt,ft,ht,pt,mt,gt,vt,yt,bt,Ct,xt,wt,Nt,Et,_t,St,kt,Tt,Rt,At,Bt,Dt,Lt,Mt,Pt,Ot,Ht,It,Ft,zt,Ut,Wt,Vt,$t,qt,jt,Yt,Xt,Kt,Gt,Jt,Qt])}(this); \ No newline at end of file diff --git a/assets/js/ui/color-picker.js b/assets/js/ui/color-picker.js new file mode 100644 index 0000000..b1f85dc --- /dev/null +++ b/assets/js/ui/color-picker.js @@ -0,0 +1,35 @@ +import Picker from './picker'; + + +class ColorPicker extends Picker { + constructor(select, label) { + super(select); + this.label.innerHTML = label; + this.container.classList.add('ql-color-picker'); + [].slice.call(this.container.querySelectorAll('.ql-picker-item'), 0, 7).forEach(function(item) { + item.classList.add('ql-primary'); + }); + } + + buildItem(option) { + let item = super.buildItem(option); + item.style.backgroundColor = option.getAttribute('value') || ''; + return item; + } + + selectItem(item, trigger) { + super.selectItem(item, trigger); + let colorLabel = this.label.querySelector('.ql-color-label'); + let value = item ? item.getAttribute('data-value') || '' : ''; + if (colorLabel) { + if (colorLabel.tagName === 'line') { + colorLabel.style.stroke = value; + } else { + colorLabel.style.fill = value; + } + } + } +} + + +export default ColorPicker; diff --git a/assets/js/ui/icon-picker.js b/assets/js/ui/icon-picker.js new file mode 100644 index 0000000..1a8ee27 --- /dev/null +++ b/assets/js/ui/icon-picker.js @@ -0,0 +1,23 @@ +import Picker from './picker'; + + +class IconPicker extends Picker { + constructor(select, icons) { + super(select); + this.container.classList.add('ql-icon-picker'); + [].forEach.call(this.container.querySelectorAll('.ql-picker-item'), (item) => { + item.innerHTML = icons[item.getAttribute('data-value') || '']; + }); + this.defaultItem = this.container.querySelector('.ql-selected'); + this.selectItem(this.defaultItem); + } + + selectItem(item, trigger) { + super.selectItem(item, trigger); + item = item || this.defaultItem; + this.label.innerHTML = item.innerHTML; + } +} + + +export default IconPicker; diff --git a/assets/js/ui/icons.js b/assets/js/ui/icons.js new file mode 100644 index 0000000..7616b9a --- /dev/null +++ b/assets/js/ui/icons.js @@ -0,0 +1,49 @@ +module.exports = { + 'align': { + '' : require('../assets/icons/align-left.svg'), + 'center' : require('../assets/icons/align-center.svg'), + 'right' : require('../assets/icons/align-right.svg'), + 'justify' : require('../assets/icons/align-justify.svg') + }, + 'background': require('../assets/icons/background.svg'), + 'blockquote': require('../assets/icons/blockquote.svg'), + 'bold' : require('../assets/icons/bold.svg'), + 'clean' : require('../assets/icons/clean.svg'), + 'code' : require('../assets/icons/code.svg'), + 'code-block': require('../assets/icons/code.svg'), + 'color' : require('../assets/icons/color.svg'), + 'direction' : { + '' : require('../assets/icons/direction-ltr.svg'), + 'rtl' : require('../assets/icons/direction-rtl.svg') + }, + 'float': { + 'center' : require('../assets/icons/float-center.svg'), + 'full' : require('../assets/icons/float-full.svg'), + 'left' : require('../assets/icons/float-left.svg'), + 'right' : require('../assets/icons/float-right.svg') + }, + 'formula' : require('../assets/icons/formula.svg'), + 'header': { + '1' : require('../assets/icons/header.svg'), + '2' : require('../assets/icons/header-2.svg') + }, + 'italic' : require('../assets/icons/italic.svg'), + 'image' : require('../assets/icons/image.svg'), + 'indent': { + '+1' : require('../assets/icons/indent.svg'), + '-1' : require('../assets/icons/outdent.svg') + }, + 'link' : require('../assets/icons/link.svg'), + 'list': { + 'ordered' : require('../assets/icons/list-ordered.svg'), + 'bullet' : require('../assets/icons/list-bullet.svg'), + 'check' : require('../assets/icons/list-check.svg') + }, + 'script': { + 'sub' : require('../assets/icons/subscript.svg'), + 'super' : require('../assets/icons/superscript.svg'), + }, + 'strike' : require('../assets/icons/strike.svg'), + 'underline' : require('../assets/icons/underline.svg'), + 'video' : require('../assets/icons/video.svg') +}; diff --git a/assets/js/ui/picker.js b/assets/js/ui/picker.js new file mode 100644 index 0000000..957a614 --- /dev/null +++ b/assets/js/ui/picker.js @@ -0,0 +1,186 @@ +import Keyboard from '../modules/keyboard'; +import DropdownIcon from '../assets/icons/dropdown.svg'; + +let optionsCounter = 0; + +function toggleAriaAttribute(element, attribute) { + element.setAttribute(attribute, !(element.getAttribute(attribute) === 'true')); +} + +class Picker { + constructor(select) { + this.select = select; + this.container = document.createElement('span'); + this.buildPicker(); + this.select.style.display = 'none'; + this.select.parentNode.insertBefore(this.container, this.select); + + this.label.addEventListener('mousedown', () => { + this.togglePicker(); + }); + this.label.addEventListener('keydown', (event) => { + switch(event.keyCode) { + // Allows the "Enter" key to open the picker + case Keyboard.keys.ENTER: + this.togglePicker(); + break; + + // Allows the "Escape" key to close the picker + case Keyboard.keys.ESCAPE: + this.escape(); + event.preventDefault(); + break; + default: + } + }); + this.select.addEventListener('change', this.update.bind(this)); + } + + togglePicker() { + this.container.classList.toggle('ql-expanded'); + // Toggle aria-expanded and aria-hidden to make the picker accessible + toggleAriaAttribute(this.label, 'aria-expanded'); + toggleAriaAttribute(this.options, 'aria-hidden'); + } + + buildItem(option) { + let item = document.createElement('span'); + item.tabIndex = '0'; + item.setAttribute('role', 'button'); + + item.classList.add('ql-picker-item'); + if (option.hasAttribute('value')) { + item.setAttribute('data-value', option.getAttribute('value')); + } + if (option.textContent) { + item.setAttribute('data-label', option.textContent); + } + item.addEventListener('click', () => { + this.selectItem(item, true); + }); + item.addEventListener('keydown', (event) => { + switch(event.keyCode) { + // Allows the "Enter" key to select an item + case Keyboard.keys.ENTER: + this.selectItem(item, true); + event.preventDefault(); + break; + + // Allows the "Escape" key to close the picker + case Keyboard.keys.ESCAPE: + this.escape(); + event.preventDefault(); + break; + default: + } + }); + + return item; + } + + buildLabel() { + let label = document.createElement('span'); + label.classList.add('ql-picker-label'); + label.innerHTML = DropdownIcon; + label.tabIndex = '0'; + label.setAttribute('role', 'button'); + label.setAttribute('aria-expanded', 'false'); + this.container.appendChild(label); + return label; + } + + buildOptions() { + let options = document.createElement('span'); + options.classList.add('ql-picker-options'); + + // Don't want screen readers to read this until options are visible + options.setAttribute('aria-hidden', 'true'); + options.tabIndex = '-1'; + + // Need a unique id for aria-controls + options.id = `ql-picker-options-${optionsCounter}`; + optionsCounter += 1; + this.label.setAttribute('aria-controls', options.id); + + this.options = options; + + [].slice.call(this.select.options).forEach((option) => { + let item = this.buildItem(option); + options.appendChild(item); + if (option.selected === true) { + this.selectItem(item); + } + }); + this.container.appendChild(options); + } + + buildPicker() { + [].slice.call(this.select.attributes).forEach((item) => { + this.container.setAttribute(item.name, item.value); + }); + this.container.classList.add('ql-picker'); + this.label = this.buildLabel(); + this.buildOptions(); + } + + escape() { + // Close menu and return focus to trigger label + this.close(); + // Need setTimeout for accessibility to ensure that the browser executes + // focus on the next process thread and after any DOM content changes + setTimeout(() => this.label.focus(), 1); + } + + close() { + this.container.classList.remove('ql-expanded'); + this.label.setAttribute('aria-expanded', 'false'); + this.options.setAttribute('aria-hidden', 'true'); + } + + selectItem(item, trigger = false) { + let selected = this.container.querySelector('.ql-selected'); + if (item === selected) return; + if (selected != null) { + selected.classList.remove('ql-selected'); + } + if (item == null) return; + item.classList.add('ql-selected'); + this.select.selectedIndex = [].indexOf.call(item.parentNode.children, item); + if (item.hasAttribute('data-value')) { + this.label.setAttribute('data-value', item.getAttribute('data-value')); + } else { + this.label.removeAttribute('data-value'); + } + if (item.hasAttribute('data-label')) { + this.label.setAttribute('data-label', item.getAttribute('data-label')); + } else { + this.label.removeAttribute('data-label'); + } + if (trigger) { + if (typeof Event === 'function') { + this.select.dispatchEvent(new Event('change')); + } else if (typeof Event === 'object') { // IE11 + let event = document.createEvent('Event'); + event.initEvent('change', true, true); + this.select.dispatchEvent(event); + } + this.close(); + } + } + + update() { + let option; + if (this.select.selectedIndex > -1) { + let item = this.container.querySelector('.ql-picker-options').children[this.select.selectedIndex]; + option = this.select.options[this.select.selectedIndex]; + this.selectItem(item); + } else { + this.selectItem(null); + } + let isActive = option != null && option !== this.select.querySelector('option[selected]'); + this.label.classList.toggle('ql-active', isActive); + } +} + + +export default Picker; diff --git a/assets/js/ui/tooltip.js b/assets/js/ui/tooltip.js new file mode 100644 index 0000000..3a72736 --- /dev/null +++ b/assets/js/ui/tooltip.js @@ -0,0 +1,53 @@ +class Tooltip { + constructor(quill, boundsContainer) { + this.quill = quill; + this.boundsContainer = boundsContainer || document.body; + this.root = quill.addContainer('ql-tooltip'); + this.root.innerHTML = this.constructor.TEMPLATE; + if (this.quill.root === this.quill.scrollingContainer) { + this.quill.root.addEventListener('scroll', () => { + this.root.style.marginTop = (-1*this.quill.root.scrollTop) + 'px'; + }); + } + this.hide(); + } + + hide() { + this.root.classList.add('ql-hidden'); + } + + position(reference) { + let left = reference.left + reference.width/2 - this.root.offsetWidth/2; + // root.scrollTop should be 0 if scrollContainer !== root + let top = reference.bottom + this.quill.root.scrollTop; + this.root.style.left = left + 'px'; + this.root.style.top = top + 'px'; + this.root.classList.remove('ql-flip'); + let containerBounds = this.boundsContainer.getBoundingClientRect(); + let rootBounds = this.root.getBoundingClientRect(); + let shift = 0; + if (rootBounds.right > containerBounds.right) { + shift = containerBounds.right - rootBounds.right; + this.root.style.left = (left + shift) + 'px'; + } + if (rootBounds.left < containerBounds.left) { + shift = containerBounds.left - rootBounds.left; + this.root.style.left = (left + shift) + 'px'; + } + if (rootBounds.bottom > containerBounds.bottom) { + let height = rootBounds.bottom - rootBounds.top; + let verticalShift = reference.bottom - reference.top + height; + this.root.style.top = (top - verticalShift) + 'px'; + this.root.classList.add('ql-flip'); + } + return shift; + } + + show() { + this.root.classList.remove('ql-editing'); + this.root.classList.remove('ql-hidden'); + } +} + + +export default Tooltip; diff --git a/assets/webfonts/fa-brands-400.eot b/assets/webfonts/fa-brands-400.eot new file mode 100644 index 0000000..f7accfa Binary files /dev/null and b/assets/webfonts/fa-brands-400.eot differ diff --git a/assets/webfonts/fa-brands-400.svg b/assets/webfonts/fa-brands-400.svg new file mode 100644 index 0000000..c94b526 --- /dev/null +++ b/assets/webfonts/fa-brands-400.svg @@ -0,0 +1,1148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/webfonts/fa-brands-400.ttf b/assets/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000..2ffa92d Binary files /dev/null and b/assets/webfonts/fa-brands-400.ttf differ diff --git a/assets/webfonts/fa-brands-400.woff b/assets/webfonts/fa-brands-400.woff new file mode 100644 index 0000000..34110b2 Binary files /dev/null and b/assets/webfonts/fa-brands-400.woff differ diff --git a/assets/webfonts/fa-brands-400.woff2 b/assets/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000..540dffd Binary files /dev/null and b/assets/webfonts/fa-brands-400.woff2 differ diff --git a/assets/webfonts/fa-regular-400.eot b/assets/webfonts/fa-regular-400.eot new file mode 100644 index 0000000..c6b1218 Binary files /dev/null and b/assets/webfonts/fa-regular-400.eot differ diff --git a/assets/webfonts/fa-regular-400.svg b/assets/webfonts/fa-regular-400.svg new file mode 100644 index 0000000..43fa6b7 --- /dev/null +++ b/assets/webfonts/fa-regular-400.svg @@ -0,0 +1,467 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/webfonts/fa-regular-400.ttf b/assets/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000..43406e8 Binary files /dev/null and b/assets/webfonts/fa-regular-400.ttf differ diff --git a/assets/webfonts/fa-regular-400.woff b/assets/webfonts/fa-regular-400.woff new file mode 100644 index 0000000..d49d464 Binary files /dev/null and b/assets/webfonts/fa-regular-400.woff differ diff --git a/assets/webfonts/fa-regular-400.woff2 b/assets/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000..ecd00ed Binary files /dev/null and b/assets/webfonts/fa-regular-400.woff2 differ diff --git a/assets/webfonts/fa-solid-900.eot b/assets/webfonts/fa-solid-900.eot new file mode 100644 index 0000000..3968757 Binary files /dev/null and b/assets/webfonts/fa-solid-900.eot differ diff --git a/assets/webfonts/fa-solid-900.svg b/assets/webfonts/fa-solid-900.svg new file mode 100644 index 0000000..10cd5b0 --- /dev/null +++ b/assets/webfonts/fa-solid-900.svg @@ -0,0 +1,2312 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/webfonts/fa-solid-900.ttf b/assets/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000..a1da1bb Binary files /dev/null and b/assets/webfonts/fa-solid-900.ttf differ diff --git a/assets/webfonts/fa-solid-900.woff b/assets/webfonts/fa-solid-900.woff new file mode 100644 index 0000000..41cbd7d Binary files /dev/null and b/assets/webfonts/fa-solid-900.woff differ diff --git a/assets/webfonts/fa-solid-900.woff2 b/assets/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000..b307c26 Binary files /dev/null and b/assets/webfonts/fa-solid-900.woff2 differ diff --git a/combine.php b/combine.php new file mode 100644 index 0000000..19a62b6 --- /dev/null +++ b/combine.php @@ -0,0 +1,253 @@ +'); +define('X', "\x1A"); + +function n($s) +{ + return str_replace(["\r\n", "\r"], "\n", $s); +} + +function t($a, $b) +{ + if ($a && strpos($a, $b) === 0 && substr($a, -strlen($b)) === $b) { + return substr(substr($a, strlen($b)), 0, -strlen($b)); + } + return $a; +} + +function fn_minify($pattern, $input) +{ + return preg_split('#(' . implode('|', $pattern) . ')#', $input, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); +} + +function fn_minify_css($input, $comment = 2, $quote = 2) +{ + if (!is_string($input) || !$input = n(trim($input))) return $input; + $output = $prev = ""; + foreach (fn_minify([MINIFY_COMMENT_CSS, MINIFY_STRING], $input) as $part) { + if (trim($part) === "") continue; + if ($comment !== 1 && strpos($part, '/*') === 0 && substr($part, -2) === '*/') { + if ( + $comment === 2 && ( + // Detect special comment(s) from the third character. It should be a `!` or `*` → `/*! keep */` or `/** keep */` + strpos('*!', $part[2]) !== false || + // Detect license comment(s) from the content. It should contains character(s) like `@license` + stripos($part, '@licence') !== false || // noun + stripos($part, '@license') !== false || // verb + stripos($part, '@preserve') !== false + ) + ) { + $output .= $part; + } + continue; + } + if ($part[0] === '"' && substr($part, -1) === '"' || $part[0] === "'" && substr($part, -1) === "'") { + // Remove quote(s) where possible … + $q = $part[0]; + if ( + $quote !== 1 && ( + // + substr($prev, -4) === 'url(' && preg_match('#\burl\($#', $prev) || + // + substr($prev, -1) === '=' && preg_match('#^' . $q . '[a-zA-Z_][\w-]*?' . $q . '$#', $part) + ) + ) { + $part = t($part, $q); // trim quote(s) + } + $output .= $part; + } else { + $output .= fn_minify_css_union($part); + } + $prev = $part; + } + return trim($output); +} + +function fn_minify_css_union($input) +{ + if (stripos($input, 'calc(') !== false) { + // Keep important white–space(s) in `calc()` + $input = preg_replace_callback('#\b(calc\()\s*(.*?)\s*\)#i', function ($m) { + return $m[1] . preg_replace('#\s+#', X, $m[2]) . ')'; + }, $input); + } + $input = preg_replace([ + // Fix case for `#foo[bar="baz"]`, `#foo*` and `#foo:first-child` [^1] + '#(?<=[\w])\s+(\*|\[|:[\w-]+)#', + // Fix case for `[bar="baz"].foo`, `*.foo`, `:nth-child(2).foo` and `@media(foo: bar)and(baz: qux)` [^2] + '#([*\]\)])\s+(?=[\w\#.])#', '#\b\s+\(#', '#\)\s+\b#', + // Minify HEX color code … [^3] + '#\#([a-f\d])\1([a-f\d])\2([a-f\d])\3\b#i', + // Remove white–space(s) around punctuation(s) [^4] + '#\s*([~!@*\(\)+=\{\}\[\]:;,>\/])\s*#', + // Replace zero unit(s) with `0` [^5] + '#\b(?=5.3.0", + "symfony/config": "^2.3|^3.0", + "symfony/translation": "^2.3|^3.0", + "symfony/yaml": "^2.3|^3.0" + }, + "require-dev": { + "phpspec/phpspec": "^2", + "phpunit/phpunit": "^4.5|^5.0", + "thunderer/shortcode": "~0.5" + }, + "suggest": { + "ext-intl": "Required if you are going to use humanizer with different locales than en_EN" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "": "src", + "Coduo\\PHPHumanizer\\Tests\\": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Norbert Orzechowicz", + "email": "norbert@orzechowicz.pl" + }, + { + "name": "Michał Dąbrowski", + "email": "dabrowski@brillante.pl" + } + ], + "keywords": [ + "humanize", + "humanizer", + "php" + ], + "time": "2016-02-21T12:53:26+00:00" + }, + { + "name": "paquettg/php-html-parser", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/paquettg/php-html-parser.git", + "reference": "18845e09831dd0772b88b51e788a4f74c701224c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paquettg/php-html-parser/zipball/18845e09831dd0772b88b51e788a4f74c701224c", + "reference": "18845e09831dd0772b88b51e788a4f74c701224c", + "shasum": "" + }, + "require": { + "paquettg/string-encode": "~0.1.0", + "php": ">=5.4" + }, + "require-dev": { + "mockery/mockery": "~0.9.0", + "phpunit/phpunit": "~4.8.0", + "satooshi/php-coveralls": "~0.6.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "PHPHtmlParser": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gilles Paquette", + "email": "paquettg@gmail.com", + "homepage": "http://gillespaquette.ca" + } + ], + "description": "An HTML DOM parser. It allows you to manipulate HTML. Find tags on an HTML page with selectors just like jQuery.", + "homepage": "https://github.com/paquettg/php-html-parser", + "keywords": [ + "dom", + "html", + "parser" + ], + "time": "2016-04-06T15:24:40+00:00" + }, + { + "name": "paquettg/string-encode", + "version": "0.1.1", + "source": { + "type": "git", + "url": "https://github.com/paquettg/string-encoder.git", + "reference": "cf08343649701979f581c1601d01247fa3782439" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paquettg/string-encoder/zipball/cf08343649701979f581c1601d01247fa3782439", + "reference": "cf08343649701979f581c1601d01247fa3782439", + "shasum": "" + }, + "require": { + "php": ">=5.4" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "autoload": { + "psr-0": { + "stringEncode": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gilles Paquette", + "email": "paquettg@gmail.com", + "homepage": "http://gillespaquette.ca" + } + ], + "description": "Facilitating the process of altering string encoding in PHP.", + "homepage": "https://github.com/paquettg/string-encoder", + "keywords": [ + "charset", + "encoding", + "string" + ], + "time": "2014-05-29T18:38:09+00:00" + }, + { + "name": "symfony/config", + "version": "v3.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "c5ea878b5a7f6a01b9a2f182f905831711b9ff3f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/c5ea878b5a7f6a01b9a2f182f905831711b9ff3f", + "reference": "c5ea878b5a7f6a01b9a2f182f905831711b9ff3f", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "symfony/filesystem": "~2.8|~3.0" + }, + "require-dev": { + "symfony/yaml": "~3.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "time": "2017-01-02T20:32:22+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v3.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "a0c6ef2dc78d33b58d91d3a49f49797a184d06f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/a0c6ef2dc78d33b58d91d3a49f49797a184d06f4", + "reference": "a0c6ef2dc78d33b58d91d3a49f49797a184d06f4", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2017-01-08T20:47:33+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4", + "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2016-11-14T01:06:16+00:00" + }, + { + "name": "symfony/translation", + "version": "v3.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "6520f3d4cce604d9dd1e86cac7af954984dd9bda" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/6520f3d4cce604d9dd1e86cac7af954984dd9bda", + "reference": "6520f3d4cce604d9dd1e86cac7af954984dd9bda", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/config": "<2.8" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.8|~3.0", + "symfony/intl": "~2.8|~3.0", + "symfony/yaml": "~2.8|~3.0" + }, + "suggest": { + "psr/log": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com", + "time": "2017-01-02T20:32:22+00:00" + }, + { + "name": "symfony/yaml", + "version": "v3.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "50eadbd7926e31842893c957eca362b21592a97d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/50eadbd7926e31842893c957eca362b21592a97d", + "reference": "50eadbd7926e31842893c957eca362b21592a97d", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "require-dev": { + "symfony/console": "~2.8|~3.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2017-01-03T13:51:32+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/duplicates.py b/duplicates.py new file mode 100644 index 0000000..a97cc9a --- /dev/null +++ b/duplicates.py @@ -0,0 +1,58 @@ +#!/usr/bin/python3 + +from os import listdir, remove +from os.path import isfile, join +import hashlib, pymysql + +files = [f for f in listdir('files') if isfile(join('files', f))] +thumbs = [t for t in listdir('files/thumbs') if isfile(join('files/thumbs', t))] + +newFiles = {} + +db = pymysql.connect('localhost', + 'kingofdog', + 'XrE#513*IOC&tA*B', + 'kingofdog') +cur = db.cursor() + +def removeThumbs(originalImage): + originalName = originalImage.split('.')[0] + imageThumbs = [a for a in thumbs if a.startswith(originalName)] + + for thumb in imageThumbs: + remove('./files/thumbs/' + thumb) + print(thumb) + +def pushToDatabase(oldName, newFile): + try: + cur.execute('UPDATE files SET path = "files/' + newFile + '" WHERE name = "' + oldName + '";') + db.commit() + except: + db.rollback() + +def removeDuplicates(): + for file in files: + with open('./files/' + file, 'rb') as imageFile: + image = imageFile.read() + md5 = hashlib.md5(image).hexdigest() + if md5 not in newFiles: + newFiles[md5] = [] + newFiles[md5].append(file) + + for uniqueFile, entries in newFiles.items(): + if(len(entries) > 1): + for entry in entries[1:]: + remove('./files/' + entry) + removeThumbs(entry) + + pushToDatabase(entry.split('.')[0], entries[0]) + + print('Deleting: ' + entry) + print('-> New Location: "files/' + entries[0] + '"') + print('-> Updating location in databasee') + +print('Deleting duplicate files...') +removeDuplicates() +print('Finished deleting all duplicate files and their thumbnails') + +db.close() diff --git a/files/043f802a89b2407a6bb2fc3a5bb6e00a.jpg b/files/043f802a89b2407a6bb2fc3a5bb6e00a.jpg new file mode 100644 index 0000000..83b800d Binary files /dev/null and b/files/043f802a89b2407a6bb2fc3a5bb6e00a.jpg differ diff --git a/files/055535ca35f9270840ef2f5131760f03.png b/files/055535ca35f9270840ef2f5131760f03.png new file mode 100644 index 0000000..f5192f8 Binary files /dev/null and b/files/055535ca35f9270840ef2f5131760f03.png differ diff --git a/files/05f4e0e8be882d2426d8088ced03db8b.jpg b/files/05f4e0e8be882d2426d8088ced03db8b.jpg new file mode 100644 index 0000000..5f3afc6 Binary files /dev/null and b/files/05f4e0e8be882d2426d8088ced03db8b.jpg differ diff --git a/files/0653c492c5c27f361d43af215649f51c.jpg b/files/0653c492c5c27f361d43af215649f51c.jpg new file mode 100644 index 0000000..83b800d Binary files /dev/null and b/files/0653c492c5c27f361d43af215649f51c.jpg differ diff --git a/files/0719cb23b5fb86e76305261431c31287.jpg b/files/0719cb23b5fb86e76305261431c31287.jpg new file mode 100644 index 0000000..5f3afc6 Binary files /dev/null and b/files/0719cb23b5fb86e76305261431c31287.jpg differ diff --git a/files/09ae7236fe64a83f41759413cdd6cf18.jpg b/files/09ae7236fe64a83f41759413cdd6cf18.jpg new file mode 100644 index 0000000..8515806 Binary files /dev/null and b/files/09ae7236fe64a83f41759413cdd6cf18.jpg differ diff --git a/files/0cd6fd8dae64551849442d6cf918dee9.png b/files/0cd6fd8dae64551849442d6cf918dee9.png new file mode 100644 index 0000000..ba351c3 Binary files /dev/null and b/files/0cd6fd8dae64551849442d6cf918dee9.png differ diff --git a/files/0d94e394486dbdd290541c960e4bb4b9.png b/files/0d94e394486dbdd290541c960e4bb4b9.png new file mode 100644 index 0000000..ce0702b Binary files /dev/null and b/files/0d94e394486dbdd290541c960e4bb4b9.png differ diff --git a/files/10cd71ccd48cf196efa0854bc3736037.png b/files/10cd71ccd48cf196efa0854bc3736037.png new file mode 100644 index 0000000..9e5a860 Binary files /dev/null and b/files/10cd71ccd48cf196efa0854bc3736037.png differ diff --git a/files/11da6fcb20245b65e39764058e277de0.jpg b/files/11da6fcb20245b65e39764058e277de0.jpg new file mode 100644 index 0000000..5f3afc6 Binary files /dev/null and b/files/11da6fcb20245b65e39764058e277de0.jpg differ diff --git a/files/1473d4a1d7dad2f8032cfbec72095d58.jpg b/files/1473d4a1d7dad2f8032cfbec72095d58.jpg new file mode 100644 index 0000000..3f83a06 Binary files /dev/null and b/files/1473d4a1d7dad2f8032cfbec72095d58.jpg differ diff --git a/files/1777f2f6f2db6939807c369327c961c6.jpg b/files/1777f2f6f2db6939807c369327c961c6.jpg new file mode 100644 index 0000000..261a7fc Binary files /dev/null and b/files/1777f2f6f2db6939807c369327c961c6.jpg differ diff --git a/files/1bf194761cfeee8852950aa8e3780e2b.jpg b/files/1bf194761cfeee8852950aa8e3780e2b.jpg new file mode 100644 index 0000000..5fb6b1c Binary files /dev/null and b/files/1bf194761cfeee8852950aa8e3780e2b.jpg differ diff --git a/files/23c0829255864ac8c761b4316e66754b.jpg b/files/23c0829255864ac8c761b4316e66754b.jpg new file mode 100644 index 0000000..597dcbe Binary files /dev/null and b/files/23c0829255864ac8c761b4316e66754b.jpg differ diff --git a/files/247b4872baf61432dd3886bb30e1239e.png b/files/247b4872baf61432dd3886bb30e1239e.png new file mode 100644 index 0000000..700ed27 Binary files /dev/null and b/files/247b4872baf61432dd3886bb30e1239e.png differ diff --git a/files/2d4debea8650d4d2f82ab55361b7f4fb.jpg b/files/2d4debea8650d4d2f82ab55361b7f4fb.jpg new file mode 100644 index 0000000..b229701 Binary files /dev/null and b/files/2d4debea8650d4d2f82ab55361b7f4fb.jpg differ diff --git a/files/2d82c389aac9418b797e4787a773d3e0.png b/files/2d82c389aac9418b797e4787a773d3e0.png new file mode 100644 index 0000000..2cf47b0 Binary files /dev/null and b/files/2d82c389aac9418b797e4787a773d3e0.png differ diff --git a/files/31118976917b731231719bd9c534dac2.png b/files/31118976917b731231719bd9c534dac2.png new file mode 100644 index 0000000..c2c40eb Binary files /dev/null and b/files/31118976917b731231719bd9c534dac2.png differ diff --git a/files/32c5abd32ecc3d61e5972d71d06255d0.jpg b/files/32c5abd32ecc3d61e5972d71d06255d0.jpg new file mode 100644 index 0000000..83b800d Binary files /dev/null and b/files/32c5abd32ecc3d61e5972d71d06255d0.jpg differ diff --git a/files/3334c6db81a9b3e35f53d8838a9f647f.jpg b/files/3334c6db81a9b3e35f53d8838a9f647f.jpg new file mode 100644 index 0000000..5f3afc6 Binary files /dev/null and b/files/3334c6db81a9b3e35f53d8838a9f647f.jpg differ diff --git a/files/333d4ab2ee765452d5a70be367fed912.png b/files/333d4ab2ee765452d5a70be367fed912.png new file mode 100644 index 0000000..c2c40eb Binary files /dev/null and b/files/333d4ab2ee765452d5a70be367fed912.png differ diff --git a/files/3ae22286d812588023c86501d98bdc0a.jpg b/files/3ae22286d812588023c86501d98bdc0a.jpg new file mode 100644 index 0000000..261a7fc Binary files /dev/null and b/files/3ae22286d812588023c86501d98bdc0a.jpg differ diff --git a/files/3c470f7761d8cd652e0ee3634325118e.jpg b/files/3c470f7761d8cd652e0ee3634325118e.jpg new file mode 100644 index 0000000..cdb13c6 Binary files /dev/null and b/files/3c470f7761d8cd652e0ee3634325118e.jpg differ diff --git a/files/4172ac70ae49fe5664983d9de3dee6d3.jpg b/files/4172ac70ae49fe5664983d9de3dee6d3.jpg new file mode 100644 index 0000000..61e313b Binary files /dev/null and b/files/4172ac70ae49fe5664983d9de3dee6d3.jpg differ diff --git a/files/42f25a4f08eeeef4bc8f7fcb4bddb95f.png b/files/42f25a4f08eeeef4bc8f7fcb4bddb95f.png new file mode 100644 index 0000000..5c42394 Binary files /dev/null and b/files/42f25a4f08eeeef4bc8f7fcb4bddb95f.png differ diff --git a/files/4439368397621b27d4e7611e3f203ab3.png b/files/4439368397621b27d4e7611e3f203ab3.png new file mode 100644 index 0000000..6ffb005 Binary files /dev/null and b/files/4439368397621b27d4e7611e3f203ab3.png differ diff --git a/files/449633b8fead67e16389c9f248e699db.png b/files/449633b8fead67e16389c9f248e699db.png new file mode 100644 index 0000000..a411569 Binary files /dev/null and b/files/449633b8fead67e16389c9f248e699db.png differ diff --git a/files/44a4180407925120d84d770289daf682.png b/files/44a4180407925120d84d770289daf682.png new file mode 100644 index 0000000..1574e26 Binary files /dev/null and b/files/44a4180407925120d84d770289daf682.png differ diff --git a/files/46f34e7e7b1fa9219603889f540a8610.png b/files/46f34e7e7b1fa9219603889f540a8610.png new file mode 100644 index 0000000..96c22a4 Binary files /dev/null and b/files/46f34e7e7b1fa9219603889f540a8610.png differ diff --git a/files/481e8a3b4b4bb9f11fedf58c09c3965f.png b/files/481e8a3b4b4bb9f11fedf58c09c3965f.png new file mode 100644 index 0000000..9744df5 Binary files /dev/null and b/files/481e8a3b4b4bb9f11fedf58c09c3965f.png differ diff --git a/files/4d4991be009c8e63dd1aeaeca59b1338.png b/files/4d4991be009c8e63dd1aeaeca59b1338.png new file mode 100644 index 0000000..5235aea Binary files /dev/null and b/files/4d4991be009c8e63dd1aeaeca59b1338.png differ diff --git a/files/515622107f78959f46cf8f6c836e6cac.png b/files/515622107f78959f46cf8f6c836e6cac.png new file mode 100644 index 0000000..c89a52c Binary files /dev/null and b/files/515622107f78959f46cf8f6c836e6cac.png differ diff --git a/files/5306419bcc9ddf7d1cb9be447abc902d.png b/files/5306419bcc9ddf7d1cb9be447abc902d.png new file mode 100644 index 0000000..1299549 Binary files /dev/null and b/files/5306419bcc9ddf7d1cb9be447abc902d.png differ diff --git a/files/5972480a1126617e686d18917cd93c84.png b/files/5972480a1126617e686d18917cd93c84.png new file mode 100644 index 0000000..700ed27 Binary files /dev/null and b/files/5972480a1126617e686d18917cd93c84.png differ diff --git a/files/59768b61257e439b593ff2fb112d5079.png b/files/59768b61257e439b593ff2fb112d5079.png new file mode 100644 index 0000000..a4002ed Binary files /dev/null and b/files/59768b61257e439b593ff2fb112d5079.png differ diff --git a/files/59a870203c3eae5aa1d9c831f64b32fd.png b/files/59a870203c3eae5aa1d9c831f64b32fd.png new file mode 100644 index 0000000..55574eb Binary files /dev/null and b/files/59a870203c3eae5aa1d9c831f64b32fd.png differ diff --git a/files/5aa4adc6924d996ed195c3df3e804080.jpg b/files/5aa4adc6924d996ed195c3df3e804080.jpg new file mode 100644 index 0000000..4853d6d Binary files /dev/null and b/files/5aa4adc6924d996ed195c3df3e804080.jpg differ diff --git a/files/5ae362031e9a8a8dc59d9ffeda451004.jpg b/files/5ae362031e9a8a8dc59d9ffeda451004.jpg new file mode 100644 index 0000000..6859205 Binary files /dev/null and b/files/5ae362031e9a8a8dc59d9ffeda451004.jpg differ diff --git a/files/5c37b451ae0b3b024c7374faed6dd66e.png b/files/5c37b451ae0b3b024c7374faed6dd66e.png new file mode 100644 index 0000000..1f380c9 Binary files /dev/null and b/files/5c37b451ae0b3b024c7374faed6dd66e.png differ diff --git a/files/6d5f618cfdd9482a3ccce78f457cdb44.jpg b/files/6d5f618cfdd9482a3ccce78f457cdb44.jpg new file mode 100644 index 0000000..4853d6d Binary files /dev/null and b/files/6d5f618cfdd9482a3ccce78f457cdb44.jpg differ diff --git a/files/6d9abc1502875ae657ebf321b0be0f31.jpg b/files/6d9abc1502875ae657ebf321b0be0f31.jpg new file mode 100644 index 0000000..4853d6d Binary files /dev/null and b/files/6d9abc1502875ae657ebf321b0be0f31.jpg differ diff --git a/files/766f9c8857931394fa6da1843cbeab62.png b/files/766f9c8857931394fa6da1843cbeab62.png new file mode 100644 index 0000000..8449637 Binary files /dev/null and b/files/766f9c8857931394fa6da1843cbeab62.png differ diff --git a/files/77ef5ed62383bf015e5eae6c4c7cc421.jpg b/files/77ef5ed62383bf015e5eae6c4c7cc421.jpg new file mode 100644 index 0000000..83b800d Binary files /dev/null and b/files/77ef5ed62383bf015e5eae6c4c7cc421.jpg differ diff --git a/files/7a06618704b1868479bd1fab1a28660b.jpg b/files/7a06618704b1868479bd1fab1a28660b.jpg new file mode 100644 index 0000000..0aaec6d Binary files /dev/null and b/files/7a06618704b1868479bd1fab1a28660b.jpg differ diff --git a/files/7b3fd0b5fb3ef9565f396a266db14a64.png b/files/7b3fd0b5fb3ef9565f396a266db14a64.png new file mode 100644 index 0000000..5c0fdb4 Binary files /dev/null and b/files/7b3fd0b5fb3ef9565f396a266db14a64.png differ diff --git a/files/7bf2dda16e6bccbb0011473b780a82cc.jpg b/files/7bf2dda16e6bccbb0011473b780a82cc.jpg new file mode 100644 index 0000000..031283f Binary files /dev/null and b/files/7bf2dda16e6bccbb0011473b780a82cc.jpg differ diff --git a/files/7cbaf4a970e896bb1ceda47b1afe960e.png b/files/7cbaf4a970e896bb1ceda47b1afe960e.png new file mode 100644 index 0000000..6ffb005 Binary files /dev/null and b/files/7cbaf4a970e896bb1ceda47b1afe960e.png differ diff --git a/files/7cc108b67f33f32bd5448758cb3f8df8.png b/files/7cc108b67f33f32bd5448758cb3f8df8.png new file mode 100644 index 0000000..8ccfc0d Binary files /dev/null and b/files/7cc108b67f33f32bd5448758cb3f8df8.png differ diff --git a/files/7ddd24b24616bb2a27917c623d9164bc.png b/files/7ddd24b24616bb2a27917c623d9164bc.png new file mode 100644 index 0000000..ccee353 Binary files /dev/null and b/files/7ddd24b24616bb2a27917c623d9164bc.png differ diff --git a/files/7f20f0acd280932c4b2c1ebe1a7ce91e.jpg b/files/7f20f0acd280932c4b2c1ebe1a7ce91e.jpg new file mode 100644 index 0000000..5f4a444 Binary files /dev/null and b/files/7f20f0acd280932c4b2c1ebe1a7ce91e.jpg differ diff --git a/files/81cf18fdca71a17490e20582bf4da58a.jpg b/files/81cf18fdca71a17490e20582bf4da58a.jpg new file mode 100644 index 0000000..907c085 Binary files /dev/null and b/files/81cf18fdca71a17490e20582bf4da58a.jpg differ diff --git a/files/8555d5340de37c0712044ca102889e47.png b/files/8555d5340de37c0712044ca102889e47.png new file mode 100644 index 0000000..96072eb Binary files /dev/null and b/files/8555d5340de37c0712044ca102889e47.png differ diff --git a/files/85e14d06e85f72ae4dadb47cf09a6edb.jpg b/files/85e14d06e85f72ae4dadb47cf09a6edb.jpg new file mode 100644 index 0000000..ab235af Binary files /dev/null and b/files/85e14d06e85f72ae4dadb47cf09a6edb.jpg differ diff --git a/files/85ed5d83699ed163186e84b9f76be487.png b/files/85ed5d83699ed163186e84b9f76be487.png new file mode 100644 index 0000000..6ce25db Binary files /dev/null and b/files/85ed5d83699ed163186e84b9f76be487.png differ diff --git a/files/8855a6040af777e4197a36ae13bb589a.png b/files/8855a6040af777e4197a36ae13bb589a.png new file mode 100644 index 0000000..70cecee Binary files /dev/null and b/files/8855a6040af777e4197a36ae13bb589a.png differ diff --git a/files/8d0f2d58d2e4a0542479f037519458d6.png b/files/8d0f2d58d2e4a0542479f037519458d6.png new file mode 100644 index 0000000..fa3359f Binary files /dev/null and b/files/8d0f2d58d2e4a0542479f037519458d6.png differ diff --git a/files/8d204712d8132b36d765640ce775ce15.png b/files/8d204712d8132b36d765640ce775ce15.png new file mode 100644 index 0000000..1f82641 Binary files /dev/null and b/files/8d204712d8132b36d765640ce775ce15.png differ diff --git a/files/90eaa5bac82631d9c0aee9d3bb907e68.png b/files/90eaa5bac82631d9c0aee9d3bb907e68.png new file mode 100644 index 0000000..83b3d02 Binary files /dev/null and b/files/90eaa5bac82631d9c0aee9d3bb907e68.png differ diff --git a/files/91200698b76de87f559d104781e1eacf.jpg b/files/91200698b76de87f559d104781e1eacf.jpg new file mode 100644 index 0000000..18d8bca Binary files /dev/null and b/files/91200698b76de87f559d104781e1eacf.jpg differ diff --git a/files/954e4c38a23e6564760b50bb499ac365.png b/files/954e4c38a23e6564760b50bb499ac365.png new file mode 100644 index 0000000..1f4f2eb Binary files /dev/null and b/files/954e4c38a23e6564760b50bb499ac365.png differ diff --git a/files/972a648bc945712b44dd2b020150d3d5.png b/files/972a648bc945712b44dd2b020150d3d5.png new file mode 100644 index 0000000..46cdb3e Binary files /dev/null and b/files/972a648bc945712b44dd2b020150d3d5.png differ diff --git a/files/9951854d71724f084139bc55705e75bf.jpg b/files/9951854d71724f084139bc55705e75bf.jpg new file mode 100644 index 0000000..b229701 Binary files /dev/null and b/files/9951854d71724f084139bc55705e75bf.jpg differ diff --git a/files/99aa208aed46774971ff21af75525108.jpg b/files/99aa208aed46774971ff21af75525108.jpg new file mode 100644 index 0000000..02a8721 Binary files /dev/null and b/files/99aa208aed46774971ff21af75525108.jpg differ diff --git a/files/9b4dccd19e8804566bce21bf360d5297.jpg b/files/9b4dccd19e8804566bce21bf360d5297.jpg new file mode 100644 index 0000000..9f14d88 Binary files /dev/null and b/files/9b4dccd19e8804566bce21bf360d5297.jpg differ diff --git a/files/a578544ca5f28ed3ac6960fcd3f7295b.jpg b/files/a578544ca5f28ed3ac6960fcd3f7295b.jpg new file mode 100644 index 0000000..83b800d Binary files /dev/null and b/files/a578544ca5f28ed3ac6960fcd3f7295b.jpg differ diff --git a/files/a5c47a1151094d88c218ce61575a276e.png b/files/a5c47a1151094d88c218ce61575a276e.png new file mode 100644 index 0000000..ce0702b Binary files /dev/null and b/files/a5c47a1151094d88c218ce61575a276e.png differ diff --git a/files/a6754f6d2106fad9c2279076cfb1a036.png b/files/a6754f6d2106fad9c2279076cfb1a036.png new file mode 100644 index 0000000..b9bc636 Binary files /dev/null and b/files/a6754f6d2106fad9c2279076cfb1a036.png differ diff --git a/files/a90fd721ff4a062f60b79e42e7ec2111.png b/files/a90fd721ff4a062f60b79e42e7ec2111.png new file mode 100644 index 0000000..da7f6e7 Binary files /dev/null and b/files/a90fd721ff4a062f60b79e42e7ec2111.png differ diff --git a/files/a9c0597c90b87be91ec9dec0f008bb31.jpg b/files/a9c0597c90b87be91ec9dec0f008bb31.jpg new file mode 100644 index 0000000..f372058 Binary files /dev/null and b/files/a9c0597c90b87be91ec9dec0f008bb31.jpg differ diff --git a/files/aaddc4d0d5aa02b6cff5371c76a13e63.jpg b/files/aaddc4d0d5aa02b6cff5371c76a13e63.jpg new file mode 100644 index 0000000..da9dd84 Binary files /dev/null and b/files/aaddc4d0d5aa02b6cff5371c76a13e63.jpg differ diff --git a/files/ae4c1f64c73a9e3da308bb4fde9eadfd.jpg b/files/ae4c1f64c73a9e3da308bb4fde9eadfd.jpg new file mode 100644 index 0000000..afa5ecb Binary files /dev/null and b/files/ae4c1f64c73a9e3da308bb4fde9eadfd.jpg differ diff --git a/files/b1771da2202f7fc83325520be61d961a.png b/files/b1771da2202f7fc83325520be61d961a.png new file mode 100644 index 0000000..75f6e81 Binary files /dev/null and b/files/b1771da2202f7fc83325520be61d961a.png differ diff --git a/files/b22097e031cbe7a4b48c8121fb08b74d.jpg b/files/b22097e031cbe7a4b48c8121fb08b74d.jpg new file mode 100644 index 0000000..687ffdf Binary files /dev/null and b/files/b22097e031cbe7a4b48c8121fb08b74d.jpg differ diff --git a/files/b2a917ad673d654323f746e4ebdddb67.png b/files/b2a917ad673d654323f746e4ebdddb67.png new file mode 100644 index 0000000..3fa8842 Binary files /dev/null and b/files/b2a917ad673d654323f746e4ebdddb67.png differ diff --git a/files/b6ae6c041f40cdd469e90e75ff9fb777.png b/files/b6ae6c041f40cdd469e90e75ff9fb777.png new file mode 100644 index 0000000..1eacd5b Binary files /dev/null and b/files/b6ae6c041f40cdd469e90e75ff9fb777.png differ diff --git a/files/b6e1fe7b54c60db4b2a36380948e932a.jpg b/files/b6e1fe7b54c60db4b2a36380948e932a.jpg new file mode 100644 index 0000000..de57b67 Binary files /dev/null and b/files/b6e1fe7b54c60db4b2a36380948e932a.jpg differ diff --git a/files/b7cc30d080b2d6aa9d78644201414939.jpg b/files/b7cc30d080b2d6aa9d78644201414939.jpg new file mode 100644 index 0000000..283cece Binary files /dev/null and b/files/b7cc30d080b2d6aa9d78644201414939.jpg differ diff --git a/files/bc244a52bf32de88b728162f75351772.jpg b/files/bc244a52bf32de88b728162f75351772.jpg new file mode 100644 index 0000000..02835f3 Binary files /dev/null and b/files/bc244a52bf32de88b728162f75351772.jpg differ diff --git a/files/be540c349db8b1f2c5bc75f09050a949.jpg b/files/be540c349db8b1f2c5bc75f09050a949.jpg new file mode 100644 index 0000000..31bc668 Binary files /dev/null and b/files/be540c349db8b1f2c5bc75f09050a949.jpg differ diff --git a/files/bec240fc0e96c9db35105b70f23a2378.jpg b/files/bec240fc0e96c9db35105b70f23a2378.jpg new file mode 100644 index 0000000..261a7fc Binary files /dev/null and b/files/bec240fc0e96c9db35105b70f23a2378.jpg differ diff --git a/files/c3f5a93e9aaaeb877a1d171a3be22444.jpg b/files/c3f5a93e9aaaeb877a1d171a3be22444.jpg new file mode 100644 index 0000000..b9c3db1 Binary files /dev/null and b/files/c3f5a93e9aaaeb877a1d171a3be22444.jpg differ diff --git a/files/c4e5977a8b1d9f4bc0ab532ce1d94975.png b/files/c4e5977a8b1d9f4bc0ab532ce1d94975.png new file mode 100644 index 0000000..12cc33f Binary files /dev/null and b/files/c4e5977a8b1d9f4bc0ab532ce1d94975.png differ diff --git a/files/c6326e6cf1b2ad7a6d36276d156906ca.png b/files/c6326e6cf1b2ad7a6d36276d156906ca.png new file mode 100644 index 0000000..6deff62 Binary files /dev/null and b/files/c6326e6cf1b2ad7a6d36276d156906ca.png differ diff --git a/files/c90c521b144d97f76530ae2a46a3727d.png b/files/c90c521b144d97f76530ae2a46a3727d.png new file mode 100644 index 0000000..5469cbb Binary files /dev/null and b/files/c90c521b144d97f76530ae2a46a3727d.png differ diff --git a/files/c9992880ac3286d662d86b7a0b84d4d3.png b/files/c9992880ac3286d662d86b7a0b84d4d3.png new file mode 100644 index 0000000..5732fee Binary files /dev/null and b/files/c9992880ac3286d662d86b7a0b84d4d3.png differ diff --git a/files/ccb39ba79d79b17629654d7d03edffd6.png b/files/ccb39ba79d79b17629654d7d03edffd6.png new file mode 100644 index 0000000..43add91 Binary files /dev/null and b/files/ccb39ba79d79b17629654d7d03edffd6.png differ diff --git a/files/d1baac2ce0b7ea8f6ea7f7e8ac179de3.png b/files/d1baac2ce0b7ea8f6ea7f7e8ac179de3.png new file mode 100644 index 0000000..f8757d0 Binary files /dev/null and b/files/d1baac2ce0b7ea8f6ea7f7e8ac179de3.png differ diff --git a/files/d2b55fd66051e1b4cd7c063e460e91f3.jpg b/files/d2b55fd66051e1b4cd7c063e460e91f3.jpg new file mode 100644 index 0000000..93dcfce Binary files /dev/null and b/files/d2b55fd66051e1b4cd7c063e460e91f3.jpg differ diff --git a/files/d348d7cbdf91a6043f50911f1916ef71.png b/files/d348d7cbdf91a6043f50911f1916ef71.png new file mode 100644 index 0000000..5b8ad02 Binary files /dev/null and b/files/d348d7cbdf91a6043f50911f1916ef71.png differ diff --git a/files/d3e5596ca9e83dd313d9988a9fa3a7ca.png b/files/d3e5596ca9e83dd313d9988a9fa3a7ca.png new file mode 100644 index 0000000..ba351c3 Binary files /dev/null and b/files/d3e5596ca9e83dd313d9988a9fa3a7ca.png differ diff --git a/files/d8fac8e00efc9cda0f285e74cbdc10b2.png b/files/d8fac8e00efc9cda0f285e74cbdc10b2.png new file mode 100644 index 0000000..f6c7204 Binary files /dev/null and b/files/d8fac8e00efc9cda0f285e74cbdc10b2.png differ diff --git a/files/d904d757da59e2d514d9b12604b9c8b6.png b/files/d904d757da59e2d514d9b12604b9c8b6.png new file mode 100644 index 0000000..0c75284 Binary files /dev/null and b/files/d904d757da59e2d514d9b12604b9c8b6.png differ diff --git a/files/d90f6dbbce56e48d8c9e4b1d653d09f3.jpg b/files/d90f6dbbce56e48d8c9e4b1d653d09f3.jpg new file mode 100644 index 0000000..9075ab7 Binary files /dev/null and b/files/d90f6dbbce56e48d8c9e4b1d653d09f3.jpg differ diff --git a/files/e193be96e5b9ab84e91e3aa73029ec8d.jpg b/files/e193be96e5b9ab84e91e3aa73029ec8d.jpg new file mode 100644 index 0000000..031283f Binary files /dev/null and b/files/e193be96e5b9ab84e91e3aa73029ec8d.jpg differ diff --git a/files/e29d39bb598a44d036ec27c1859284ef.jpg b/files/e29d39bb598a44d036ec27c1859284ef.jpg new file mode 100644 index 0000000..031283f Binary files /dev/null and b/files/e29d39bb598a44d036ec27c1859284ef.jpg differ diff --git a/files/e3a6adf5f8955452a2f9646b6371ba9e.jpg b/files/e3a6adf5f8955452a2f9646b6371ba9e.jpg new file mode 100644 index 0000000..83b800d Binary files /dev/null and b/files/e3a6adf5f8955452a2f9646b6371ba9e.jpg differ diff --git a/files/e7106b5759b3cdf64661d05729692170.jpg b/files/e7106b5759b3cdf64661d05729692170.jpg new file mode 100644 index 0000000..0817a4c Binary files /dev/null and b/files/e7106b5759b3cdf64661d05729692170.jpg differ diff --git a/files/edb4b8676ac0dd7d0f58c6a1aaf34867.png b/files/edb4b8676ac0dd7d0f58c6a1aaf34867.png new file mode 100644 index 0000000..8d3fc11 Binary files /dev/null and b/files/edb4b8676ac0dd7d0f58c6a1aaf34867.png differ diff --git a/files/edb7412cb4c03f8cc53421f622da0271.jpg b/files/edb7412cb4c03f8cc53421f622da0271.jpg new file mode 100644 index 0000000..4853d6d Binary files /dev/null and b/files/edb7412cb4c03f8cc53421f622da0271.jpg differ diff --git a/files/f1768caad31bd192bcbdd7016ce93cd3.png b/files/f1768caad31bd192bcbdd7016ce93cd3.png new file mode 100644 index 0000000..b233c35 Binary files /dev/null and b/files/f1768caad31bd192bcbdd7016ce93cd3.png differ diff --git a/files/f19d6c45cbfb3156a791c73d8e2041b8.png b/files/f19d6c45cbfb3156a791c73d8e2041b8.png new file mode 100644 index 0000000..1c90687 Binary files /dev/null and b/files/f19d6c45cbfb3156a791c73d8e2041b8.png differ diff --git a/files/f1ff36419e92826cfd7265f6af54adf0.png b/files/f1ff36419e92826cfd7265f6af54adf0.png new file mode 100644 index 0000000..5bdf37e Binary files /dev/null and b/files/f1ff36419e92826cfd7265f6af54adf0.png differ diff --git a/files/fbee51f02df362fc8cca5a2a177e1852.jpg b/files/fbee51f02df362fc8cca5a2a177e1852.jpg new file mode 100644 index 0000000..cf2468b Binary files /dev/null and b/files/fbee51f02df362fc8cca5a2a177e1852.jpg differ diff --git a/files/fbee51f02df362fc8cca5a2a177e1852_w200.jpg b/files/fbee51f02df362fc8cca5a2a177e1852_w200.jpg new file mode 100644 index 0000000..cf2468b Binary files /dev/null and b/files/fbee51f02df362fc8cca5a2a177e1852_w200.jpg differ diff --git a/index.php b/index.php new file mode 100644 index 0000000..e4245a1 --- /dev/null +++ b/index.php @@ -0,0 +1,316 @@ +=')) + { + error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED); + } + else + { + error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE); + } + break; + + default: + header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); + echo 'The application environment is not set correctly.'; + exit(1); // EXIT_ERROR +} + +/* + *--------------------------------------------------------------- + * SYSTEM DIRECTORY NAME + *--------------------------------------------------------------- + * + * This variable must contain the name of your "system" directory. + * Set the path if it is not in the same directory as this file. + */ + $system_path = 'system'; + +/* + *--------------------------------------------------------------- + * APPLICATION DIRECTORY NAME + *--------------------------------------------------------------- + * + * If you want this front controller to use a different "application" + * directory than the default one you can set its name here. The directory + * can also be renamed or relocated anywhere on your server. If you do, + * use an absolute (full) server path. + * For more info please see the user guide: + * + * https://codeigniter.com/user_guide/general/managing_apps.html + * + * NO TRAILING SLASH! + */ + $application_folder = 'application'; + +/* + *--------------------------------------------------------------- + * VIEW DIRECTORY NAME + *--------------------------------------------------------------- + * + * If you want to move the view directory out of the application + * directory, set the path to it here. The directory can be renamed + * and relocated anywhere on your server. If blank, it will default + * to the standard location inside your application directory. + * If you do move this, use an absolute (full) server path. + * + * NO TRAILING SLASH! + */ + $view_folder = ''; + + +/* + * -------------------------------------------------------------------- + * DEFAULT CONTROLLER + * -------------------------------------------------------------------- + * + * Normally you will set your default controller in the routes.php file. + * You can, however, force a custom routing by hard-coding a + * specific controller class/function here. For most applications, you + * WILL NOT set your routing here, but it's an option for those + * special instances where you might want to override the standard + * routing in a specific front controller that shares a common CI installation. + * + * IMPORTANT: If you set the routing here, NO OTHER controller will be + * callable. In essence, this preference limits your application to ONE + * specific controller. Leave the function name blank if you need + * to call functions dynamically via the URI. + * + * Un-comment the $routing array below to use this feature + */ + // The directory name, relative to the "controllers" directory. Leave blank + // if your controller is not in a sub-directory within the "controllers" one + // $routing['directory'] = ''; + + // The controller class file name. Example: mycontroller + // $routing['controller'] = ''; + + // The controller function you wish to be called. + // $routing['function'] = ''; + + +/* + * ------------------------------------------------------------------- + * CUSTOM CONFIG VALUES + * ------------------------------------------------------------------- + * + * The $assign_to_config array below will be passed dynamically to the + * config class when initialized. This allows you to set custom config + * items or override any default config values found in the config.php file. + * This can be handy as it permits you to share one application between + * multiple front controller files, with each file containing different + * config values. + * + * Un-comment the $assign_to_config array below to use this feature + */ + // $assign_to_config['name_of_config_item'] = 'value of config item'; + + + +// -------------------------------------------------------------------- +// END OF USER CONFIGURABLE SETTINGS. DO NOT EDIT BELOW THIS LINE +// -------------------------------------------------------------------- + +/* + * --------------------------------------------------------------- + * Resolve the system path for increased reliability + * --------------------------------------------------------------- + */ + + // Set the current directory correctly for CLI requests + if (defined('STDIN')) + { + chdir(dirname(__FILE__)); + } + + if (($_temp = realpath($system_path)) !== FALSE) + { + $system_path = $_temp.DIRECTORY_SEPARATOR; + } + else + { + // Ensure there's a trailing slash + $system_path = strtr( + rtrim($system_path, '/\\'), + '/\\', + DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR + ).DIRECTORY_SEPARATOR; + } + + // Is the system path correct? + if ( ! is_dir($system_path)) + { + header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); + echo 'Your system folder path does not appear to be set correctly. Please open the following file and correct this: '.pathinfo(__FILE__, PATHINFO_BASENAME); + exit(3); // EXIT_CONFIG + } + +/* + * ------------------------------------------------------------------- + * Now that we know the path, set the main path constants + * ------------------------------------------------------------------- + */ + // The name of THIS file + define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME)); + + // Path to the system directory + define('BASEPATH', $system_path); + + // Path to the front controller (this file) directory + define('FCPATH', dirname(__FILE__).DIRECTORY_SEPARATOR); + + // Name of the "system" directory + define('SYSDIR', basename(BASEPATH)); + + // The path to the "application" directory + if (is_dir($application_folder)) + { + if (($_temp = realpath($application_folder)) !== FALSE) + { + $application_folder = $_temp; + } + else + { + $application_folder = strtr( + rtrim($application_folder, '/\\'), + '/\\', + DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR + ); + } + } + elseif (is_dir(BASEPATH.$application_folder.DIRECTORY_SEPARATOR)) + { + $application_folder = BASEPATH.strtr( + trim($application_folder, '/\\'), + '/\\', + DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR + ); + } + else + { + header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); + echo 'Your application folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF; + exit(3); // EXIT_CONFIG + } + + define('APPPATH', $application_folder.DIRECTORY_SEPARATOR); + + // The path to the "views" directory + if ( ! isset($view_folder[0]) && is_dir(APPPATH.'views'.DIRECTORY_SEPARATOR)) + { + $view_folder = APPPATH.'views'; + } + elseif (is_dir($view_folder)) + { + if (($_temp = realpath($view_folder)) !== FALSE) + { + $view_folder = $_temp; + } + else + { + $view_folder = strtr( + rtrim($view_folder, '/\\'), + '/\\', + DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR + ); + } + } + elseif (is_dir(APPPATH.$view_folder.DIRECTORY_SEPARATOR)) + { + $view_folder = APPPATH.strtr( + trim($view_folder, '/\\'), + '/\\', + DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR + ); + } + else + { + header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); + echo 'Your view folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF; + exit(3); // EXIT_CONFIG + } + + define('VIEWPATH', $view_folder.DIRECTORY_SEPARATOR); + +/* + * -------------------------------------------------------------------- + * LOAD THE BOOTSTRAP FILE + * -------------------------------------------------------------------- + * + * And away we go... + */ +require_once BASEPATH.'core/CodeIgniter.php'; diff --git a/index.t b/index.t new file mode 100644 index 0000000..e583759 --- /dev/null +++ b/index.t @@ -0,0 +1 @@ +

                      Test

                      diff --git a/social_posts.py b/social_posts.py new file mode 100644 index 0000000..1b1f007 --- /dev/null +++ b/social_posts.py @@ -0,0 +1,63 @@ +import urllib.request, json, pymysql +from datetime import datetime +import twitter + +db = pymysql.connect('localhost', 'kingofdog', 'XrE#513*IOC&tA*B', 'kingofdog') +cur = db.cursor() + +def insertIntoDatabase(platform, title, url, author, authorUrl, published, image, originalID): + print(platform, title, url, author, authorUrl, published, image, originalID) + try: + print('all right') + cur.execute( + "INSERT INTO social_posts (post_plattform, post_content, post_url, post_author, post_author_url, post_date, post_img_source, post_original_id) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE post_content = %s, post_img_source = %s", + (platform, title, url, author, authorUrl, published, image, originalID, title, image)) + db.commit() + except: + print('didnt work out for us... sadly') + db.rollback() + + +def getYouTubeVideos(): + apiUrl = 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&maxResults=20&playlistId=UUEDHiXaIhm2VFu-hi6CcOWw&key=AIzaSyDAZ_TwVMZeiKDQxgWM2OYRq3YskEpY9yw' + with urllib.request.urlopen(apiUrl) as url: + data = json.loads(url.read().decode()) + for item in data['items']: + snippet = item['snippet'] + published = datetime.strptime(snippet['publishedAt'], '%Y-%m-%dT%H:%M:%S.000Z').timestamp() + author = snippet['channelTitle'] + authorUrl = 'https://youtube.com/channel/' + snippet['channelId'] + title = snippet['title'] + url = 'https://youtu.be/' + snippet['resourceId']['videoId'] + + if snippet['thumbnails']['maxres']['url']: + thumbnail = snippet['thumbnails']['maxres']['url'] + else: + thumbnail = snippet['thumbnails']['standard']['url'] + + insertIntoDatabase('YouTube', title, url, author, authorUrl, published, thumbnail, 0) + + +def getTwitterPosts(): + api = twitter.Api(consumer_key='TsUzd4stukv9Ix7TGG7RdYq4k', + consumer_secret='sTRq4WcELJZuciTrkNUttGgWhEiGaUkuqNhISgaG4uHRFgzm0B', + access_token_key='1880071790-Nij2RaBDVRGVWoWW2PSJUwAvuLAOaQFAAr5tAtC', + access_token_secret='ldhLg0SP3ycrrdIqhNcddj0042pdGY9vmZMKQJRClmDkD') + tweets = api.GetUserTimeline(screen_name='kingofdogtv') + + for tweet in tweets: + content = tweet.text + published = datetime.strptime(tweet.created_at, '%a %b %d %H:%M:%S %z %Y').timestamp() + author = tweet.user.name + authorUrl = 'https://twitter.com/' + tweet.user.screen_name + url = authorUrl + '/status/' + tweet.id_str + originalID = tweet.id + + image = '' + if tweet.media: + image = tweet.media[0].media_url + + insertIntoDatabase('Twitter', content, url, author, authorUrl, published, image, originalID) + +getTwitterPosts() +db.close() \ No newline at end of file diff --git a/system/.htaccess b/system/.htaccess new file mode 100644 index 0000000..97c65d2 --- /dev/null +++ b/system/.htaccess @@ -0,0 +1,6 @@ + + Require all denied + + + Deny from all + \ No newline at end of file diff --git a/system/core/Benchmark.php b/system/core/Benchmark.php new file mode 100644 index 0000000..b1d74f7 --- /dev/null +++ b/system/core/Benchmark.php @@ -0,0 +1,133 @@ +marker[$name] = microtime(TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Elapsed time + * + * Calculates the time difference between two marked points. + * + * If the first parameter is empty this function instead returns the + * {elapsed_time} pseudo-variable. This permits the full system + * execution time to be shown in a template. The output class will + * swap the real value for this variable. + * + * @param string $point1 A particular marked point + * @param string $point2 A particular marked point + * @param int $decimals Number of decimal places + * + * @return string Calculated elapsed time on success, + * an '{elapsed_string}' if $point1 is empty + * or an empty string if $point1 is not found. + */ + public function elapsed_time($point1 = '', $point2 = '', $decimals = 4) + { + if ($point1 === '') + { + return '{elapsed_time}'; + } + + if ( ! isset($this->marker[$point1])) + { + return ''; + } + + if ( ! isset($this->marker[$point2])) + { + $this->marker[$point2] = microtime(TRUE); + } + + return number_format($this->marker[$point2] - $this->marker[$point1], $decimals); + } + + // -------------------------------------------------------------------- + + /** + * Memory Usage + * + * Simply returns the {memory_usage} marker. + * + * This permits it to be put it anywhere in a template + * without the memory being calculated until the end. + * The output class will swap the real value for this variable. + * + * @return string '{memory_usage}' + */ + public function memory_usage() + { + return '{memory_usage}'; + } + +} diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php new file mode 100644 index 0000000..3eb3e05 --- /dev/null +++ b/system/core/CodeIgniter.php @@ -0,0 +1,541 @@ + '_ENV', 'G' => '_GET', 'P' => '_POST', 'C' => '_COOKIE', 'S' => '_SERVER') as $key => $superglobal) + { + if (strpos($_registered, $key) === FALSE) + { + continue; + } + + foreach (array_keys($$superglobal) as $var) + { + if (isset($GLOBALS[$var]) && ! in_array($var, $_protected, TRUE)) + { + $GLOBALS[$var] = NULL; + } + } + } + } +} + + +/* + * ------------------------------------------------------ + * Define a custom error handler so we can log PHP errors + * ------------------------------------------------------ + */ + set_error_handler('_error_handler'); + set_exception_handler('_exception_handler'); + register_shutdown_function('_shutdown_handler'); + +/* + * ------------------------------------------------------ + * Set the subclass_prefix + * ------------------------------------------------------ + * + * Normally the "subclass_prefix" is set in the config file. + * The subclass prefix allows CI to know if a core class is + * being extended via a library in the local application + * "libraries" folder. Since CI allows config items to be + * overridden via data set in the main index.php file, + * before proceeding we need to know if a subclass_prefix + * override exists. If so, we will set this value now, + * before any classes are loaded + * Note: Since the config file data is cached it doesn't + * hurt to load it here. + */ + if ( ! empty($assign_to_config['subclass_prefix'])) + { + get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix'])); + } + +/* + * ------------------------------------------------------ + * Should we use a Composer autoloader? + * ------------------------------------------------------ + */ + if ($composer_autoload = config_item('composer_autoload')) + { + if ($composer_autoload === TRUE) + { + file_exists(APPPATH.'vendor/autoload.php') + ? require_once(APPPATH.'vendor/autoload.php') + : log_message('error', '$config[\'composer_autoload\'] is set to TRUE but '.APPPATH.'vendor/autoload.php was not found.'); + } + elseif (file_exists($composer_autoload)) + { + require_once($composer_autoload); + } + else + { + log_message('error', 'Could not find the specified $config[\'composer_autoload\'] path: '.$composer_autoload); + } + } + +/* + * ------------------------------------------------------ + * Start the timer... tick tock tick tock... + * ------------------------------------------------------ + */ + $BM =& load_class('Benchmark', 'core'); + $BM->mark('total_execution_time_start'); + $BM->mark('loading_time:_base_classes_start'); + +/* + * ------------------------------------------------------ + * Instantiate the hooks class + * ------------------------------------------------------ + */ + $EXT =& load_class('Hooks', 'core'); + +/* + * ------------------------------------------------------ + * Is there a "pre_system" hook? + * ------------------------------------------------------ + */ + $EXT->call_hook('pre_system'); + +/* + * ------------------------------------------------------ + * Instantiate the config class + * ------------------------------------------------------ + * + * Note: It is important that Config is loaded first as + * most other classes depend on it either directly or by + * depending on another class that uses it. + * + */ + $CFG =& load_class('Config', 'core'); + + // Do we have any manually set config items in the index.php file? + if (isset($assign_to_config) && is_array($assign_to_config)) + { + foreach ($assign_to_config as $key => $value) + { + $CFG->set_item($key, $value); + } + } + +/* + * ------------------------------------------------------ + * Important charset-related stuff + * ------------------------------------------------------ + * + * Configure mbstring and/or iconv if they are enabled + * and set MB_ENABLED and ICONV_ENABLED constants, so + * that we don't repeatedly do extension_loaded() or + * function_exists() calls. + * + * Note: UTF-8 class depends on this. It used to be done + * in it's constructor, but it's _not_ class-specific. + * + */ + $charset = strtoupper(config_item('charset')); + ini_set('default_charset', $charset); + + if (extension_loaded('mbstring')) + { + define('MB_ENABLED', TRUE); + // mbstring.internal_encoding is deprecated starting with PHP 5.6 + // and it's usage triggers E_DEPRECATED messages. + @ini_set('mbstring.internal_encoding', $charset); + // This is required for mb_convert_encoding() to strip invalid characters. + // That's utilized by CI_Utf8, but it's also done for consistency with iconv. + mb_substitute_character('none'); + } + else + { + define('MB_ENABLED', FALSE); + } + + // There's an ICONV_IMPL constant, but the PHP manual says that using + // iconv's predefined constants is "strongly discouraged". + if (extension_loaded('iconv')) + { + define('ICONV_ENABLED', TRUE); + // iconv.internal_encoding is deprecated starting with PHP 5.6 + // and it's usage triggers E_DEPRECATED messages. + @ini_set('iconv.internal_encoding', $charset); + } + else + { + define('ICONV_ENABLED', FALSE); + } + + if (is_php('5.6')) + { + ini_set('php.internal_encoding', $charset); + } + +/* + * ------------------------------------------------------ + * Load compatibility features + * ------------------------------------------------------ + */ + + require_once(BASEPATH.'core/compat/mbstring.php'); + require_once(BASEPATH.'core/compat/hash.php'); + require_once(BASEPATH.'core/compat/password.php'); + require_once(BASEPATH.'core/compat/standard.php'); + +/* + * ------------------------------------------------------ + * Instantiate the UTF-8 class + * ------------------------------------------------------ + */ + $UNI =& load_class('Utf8', 'core'); + +/* + * ------------------------------------------------------ + * Instantiate the URI class + * ------------------------------------------------------ + */ + $URI =& load_class('URI', 'core'); + +/* + * ------------------------------------------------------ + * Instantiate the routing class and set the routing + * ------------------------------------------------------ + */ + $RTR =& load_class('Router', 'core', isset($routing) ? $routing : NULL); + +/* + * ------------------------------------------------------ + * Instantiate the output class + * ------------------------------------------------------ + */ + $OUT =& load_class('Output', 'core'); + +/* + * ------------------------------------------------------ + * Is there a valid cache file? If so, we're done... + * ------------------------------------------------------ + */ + if ($EXT->call_hook('cache_override') === FALSE && $OUT->_display_cache($CFG, $URI) === TRUE) + { + exit; + } + +/* + * ----------------------------------------------------- + * Load the security class for xss and csrf support + * ----------------------------------------------------- + */ + $SEC =& load_class('Security', 'core'); + +/* + * ------------------------------------------------------ + * Load the Input class and sanitize globals + * ------------------------------------------------------ + */ + $IN =& load_class('Input', 'core'); + +/* + * ------------------------------------------------------ + * Load the Language class + * ------------------------------------------------------ + */ + $LANG =& load_class('Lang', 'core'); + +/* + * ------------------------------------------------------ + * Load the app controller and local controller + * ------------------------------------------------------ + * + */ + // Load the base controller class + require_once BASEPATH.'core/Controller.php'; + + /** + * Reference to the CI_Controller method. + * + * Returns current CI instance object + * + * @return CI_Controller + */ + function &get_instance() + { + return CI_Controller::get_instance(); + } + + if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')) + { + require_once APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'; + } + + // Set a mark point for benchmarking + $BM->mark('loading_time:_base_classes_end'); + +/* + * ------------------------------------------------------ + * Sanity checks + * ------------------------------------------------------ + * + * The Router class has already validated the request, + * leaving us with 3 options here: + * + * 1) an empty class name, if we reached the default + * controller, but it didn't exist; + * 2) a query string which doesn't go through a + * file_exists() check + * 3) a regular request for a non-existing page + * + * We handle all of these as a 404 error. + * + * Furthermore, none of the methods in the app controller + * or the loader class can be called via the URI, nor can + * controller methods that begin with an underscore. + */ + + $e404 = FALSE; + $class = ucfirst($RTR->class); + $method = $RTR->method; + + if (empty($class) OR ! file_exists(APPPATH.'controllers/'.$RTR->directory.$class.'.php')) + { + $e404 = TRUE; + } + else + { + require_once(APPPATH.'controllers/'.$RTR->directory.$class.'.php'); + + if ( ! class_exists($class, FALSE) OR $method[0] === '_' OR method_exists('CI_Controller', $method)) + { + $e404 = TRUE; + } + elseif (method_exists($class, '_remap')) + { + $params = array($method, array_slice($URI->rsegments, 2)); + $method = '_remap'; + } + // WARNING: It appears that there are issues with is_callable() even in PHP 5.2! + // Furthermore, there are bug reports and feature/change requests related to it + // that make it unreliable to use in this context. Please, DO NOT change this + // work-around until a better alternative is available. + elseif ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($class)), TRUE)) + { + $e404 = TRUE; + } + } + + if ($e404) + { + if ( ! empty($RTR->routes['404_override'])) + { + if (sscanf($RTR->routes['404_override'], '%[^/]/%s', $error_class, $error_method) !== 2) + { + $error_method = 'index'; + } + + $error_class = ucfirst($error_class); + + if ( ! class_exists($error_class, FALSE)) + { + if (file_exists(APPPATH.'controllers/'.$RTR->directory.$error_class.'.php')) + { + require_once(APPPATH.'controllers/'.$RTR->directory.$error_class.'.php'); + $e404 = ! class_exists($error_class, FALSE); + } + // Were we in a directory? If so, check for a global override + elseif ( ! empty($RTR->directory) && file_exists(APPPATH.'controllers/'.$error_class.'.php')) + { + require_once(APPPATH.'controllers/'.$error_class.'.php'); + if (($e404 = ! class_exists($error_class, FALSE)) === FALSE) + { + $RTR->directory = ''; + } + } + } + else + { + $e404 = FALSE; + } + } + + // Did we reset the $e404 flag? If so, set the rsegments, starting from index 1 + if ( ! $e404) + { + $class = $error_class; + $method = $error_method; + + $URI->rsegments = array( + 1 => $class, + 2 => $method + ); + } + else + { + show_404($RTR->directory.$class.'/'.$method); + } + } + + if ($method !== '_remap') + { + $params = array_slice($URI->rsegments, 2); + } + +/* + * ------------------------------------------------------ + * Is there a "pre_controller" hook? + * ------------------------------------------------------ + */ + $EXT->call_hook('pre_controller'); + +/* + * ------------------------------------------------------ + * Instantiate the requested controller + * ------------------------------------------------------ + */ + // Mark a start point so we can benchmark the controller + $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start'); + + $CI = new $class(); + +/* + * ------------------------------------------------------ + * Is there a "post_controller_constructor" hook? + * ------------------------------------------------------ + */ + $EXT->call_hook('post_controller_constructor'); + +/* + * ------------------------------------------------------ + * Call the requested method + * ------------------------------------------------------ + */ + call_user_func_array(array(&$CI, $method), $params); + + // Mark a benchmark end point + $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end'); + +/* + * ------------------------------------------------------ + * Is there a "post_controller" hook? + * ------------------------------------------------------ + */ + $EXT->call_hook('post_controller'); + +/* + * ------------------------------------------------------ + * Send the final rendered output to the browser + * ------------------------------------------------------ + */ + if ($EXT->call_hook('display_override') === FALSE) + { + $OUT->_display(); + } + +/* + * ------------------------------------------------------ + * Is there a "post_system" hook? + * ------------------------------------------------------ + */ + $EXT->call_hook('post_system'); diff --git a/system/core/Common.php b/system/core/Common.php new file mode 100644 index 0000000..b87ce4d --- /dev/null +++ b/system/core/Common.php @@ -0,0 +1,851 @@ +='); + } + + return $_is_php[$version]; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('is_really_writable')) +{ + /** + * Tests for file writability + * + * is_writable() returns TRUE on Windows servers when you really can't write to + * the file, based on the read-only attribute. is_writable() is also unreliable + * on Unix servers if safe_mode is on. + * + * @link https://bugs.php.net/bug.php?id=54709 + * @param string + * @return bool + */ + function is_really_writable($file) + { + // If we're on a Unix server with safe_mode off we call is_writable + if (DIRECTORY_SEPARATOR === '/' && (is_php('5.4') OR ! ini_get('safe_mode'))) + { + return is_writable($file); + } + + /* For Windows servers and safe_mode "on" installations we'll actually + * write a file then read it. Bah... + */ + if (is_dir($file)) + { + $file = rtrim($file, '/').'/'.md5(mt_rand()); + if (($fp = @fopen($file, 'ab')) === FALSE) + { + return FALSE; + } + + fclose($fp); + @chmod($file, 0777); + @unlink($file); + return TRUE; + } + elseif ( ! is_file($file) OR ($fp = @fopen($file, 'ab')) === FALSE) + { + return FALSE; + } + + fclose($fp); + return TRUE; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('load_class')) +{ + /** + * Class registry + * + * This function acts as a singleton. If the requested class does not + * exist it is instantiated and set to a static variable. If it has + * previously been instantiated the variable is returned. + * + * @param string the class name being requested + * @param string the directory where the class should be found + * @param string an optional argument to pass to the class constructor + * @return object + */ + function &load_class($class, $directory = 'libraries', $param = NULL) + { + static $_classes = array(); + + // Does the class exist? If so, we're done... + if (isset($_classes[$class])) + { + return $_classes[$class]; + } + + $name = FALSE; + + // Look for the class first in the local application/libraries folder + // then in the native system/libraries folder + foreach (array(APPPATH, BASEPATH) as $path) + { + if (file_exists($path.$directory.'/'.$class.'.php')) + { + $name = 'CI_'.$class; + + if (class_exists($name, FALSE) === FALSE) + { + require_once($path.$directory.'/'.$class.'.php'); + } + + break; + } + } + + // Is the request a class extension? If so we load it too + if (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php')) + { + $name = config_item('subclass_prefix').$class; + + if (class_exists($name, FALSE) === FALSE) + { + require_once(APPPATH.$directory.'/'.$name.'.php'); + } + } + + // Did we find the class? + if ($name === FALSE) + { + // Note: We use exit() rather than show_error() in order to avoid a + // self-referencing loop with the Exceptions class + set_status_header(503); + echo 'Unable to locate the specified class: '.$class.'.php'; + exit(5); // EXIT_UNK_CLASS + } + + // Keep track of what we just loaded + is_loaded($class); + + $_classes[$class] = isset($param) + ? new $name($param) + : new $name(); + return $_classes[$class]; + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('is_loaded')) +{ + /** + * Keeps track of which libraries have been loaded. This function is + * called by the load_class() function above + * + * @param string + * @return array + */ + function &is_loaded($class = '') + { + static $_is_loaded = array(); + + if ($class !== '') + { + $_is_loaded[strtolower($class)] = $class; + } + + return $_is_loaded; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('get_config')) +{ + /** + * Loads the main config.php file + * + * This function lets us grab the config file even if the Config class + * hasn't been instantiated yet + * + * @param array + * @return array + */ + function &get_config(Array $replace = array()) + { + static $config; + + if (empty($config)) + { + $file_path = APPPATH.'config/config.php'; + $found = FALSE; + if (file_exists($file_path)) + { + $found = TRUE; + require($file_path); + } + + // Is the config file in the environment folder? + if (file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')) + { + require($file_path); + } + elseif ( ! $found) + { + set_status_header(503); + echo 'The configuration file does not exist.'; + exit(3); // EXIT_CONFIG + } + + // Does the $config array exist in the file? + if ( ! isset($config) OR ! is_array($config)) + { + set_status_header(503); + echo 'Your config file does not appear to be formatted correctly.'; + exit(3); // EXIT_CONFIG + } + } + + // Are any values being dynamically added or replaced? + foreach ($replace as $key => $val) + { + $config[$key] = $val; + } + + return $config; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('config_item')) +{ + /** + * Returns the specified config item + * + * @param string + * @return mixed + */ + function config_item($item) + { + static $_config; + + if (empty($_config)) + { + // references cannot be directly assigned to static variables, so we use an array + $_config[0] =& get_config(); + } + + return isset($_config[0][$item]) ? $_config[0][$item] : NULL; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('get_mimes')) +{ + /** + * Returns the MIME types array from config/mimes.php + * + * @return array + */ + function &get_mimes() + { + static $_mimes; + + if (empty($_mimes)) + { + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) + { + $_mimes = include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'); + } + elseif (file_exists(APPPATH.'config/mimes.php')) + { + $_mimes = include(APPPATH.'config/mimes.php'); + } + else + { + $_mimes = array(); + } + } + + return $_mimes; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('is_https')) +{ + /** + * Is HTTPS? + * + * Determines if the application is accessed via an encrypted + * (HTTPS) connection. + * + * @return bool + */ + function is_https() + { + if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') + { + return TRUE; + } + elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') + { + return TRUE; + } + elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') + { + return TRUE; + } + + return FALSE; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('is_cli')) +{ + + /** + * Is CLI? + * + * Test to see if a request was made from the command line. + * + * @return bool + */ + function is_cli() + { + return (PHP_SAPI === 'cli' OR defined('STDIN')); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('show_error')) +{ + /** + * Error Handler + * + * This function lets us invoke the exception class and + * display errors using the standard error template located + * in application/views/errors/error_general.php + * This function will send the error page directly to the + * browser and exit. + * + * @param string + * @param int + * @param string + * @return void + */ + function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') + { + $status_code = abs($status_code); + if ($status_code < 100) + { + $exit_status = $status_code + 9; // 9 is EXIT__AUTO_MIN + if ($exit_status > 125) // 125 is EXIT__AUTO_MAX + { + $exit_status = 1; // EXIT_ERROR + } + + $status_code = 500; + } + else + { + $exit_status = 1; // EXIT_ERROR + } + + $_error =& load_class('Exceptions', 'core'); + echo $_error->show_error($heading, $message, 'error_general', $status_code); + exit($exit_status); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('show_404')) +{ + /** + * 404 Page Handler + * + * This function is similar to the show_error() function above + * However, instead of the standard error template it displays + * 404 errors. + * + * @param string + * @param bool + * @return void + */ + function show_404($page = '', $log_error = TRUE) + { + $_error =& load_class('Exceptions', 'core'); + $_error->show_404($page, $log_error); + exit(4); // EXIT_UNKNOWN_FILE + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('log_message')) +{ + /** + * Error Logging Interface + * + * We use this as a simple mechanism to access the logging + * class and send messages to be logged. + * + * @param string the error level: 'error', 'debug' or 'info' + * @param string the error message + * @return void + */ + function log_message($level, $message) + { + static $_log; + + if ($_log === NULL) + { + // references cannot be directly assigned to static variables, so we use an array + $_log[0] =& load_class('Log', 'core'); + } + + $_log[0]->write_log($level, $message); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('set_status_header')) +{ + /** + * Set HTTP Status Header + * + * @param int the status code + * @param string + * @return void + */ + function set_status_header($code = 200, $text = '') + { + if (is_cli()) + { + return; + } + + if (empty($code) OR ! is_numeric($code)) + { + show_error('Status codes must be numeric', 500); + } + + if (empty($text)) + { + is_int($code) OR $code = (int) $code; + $stati = array( + 100 => 'Continue', + 101 => 'Switching Protocols', + + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 307 => 'Temporary 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', + 422 => 'Unprocessable Entity', + + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported' + ); + + if (isset($stati[$code])) + { + $text = $stati[$code]; + } + else + { + show_error('No status text available. Please check your status code number or supply your own message text.', 500); + } + } + + if (strpos(PHP_SAPI, 'cgi') === 0) + { + header('Status: '.$code.' '.$text, TRUE); + } + else + { + $server_protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'; + header($server_protocol.' '.$code.' '.$text, TRUE, $code); + } + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('_error_handler')) +{ + /** + * Error Handler + * + * This is the custom error handler that is declared at the (relative) + * top of CodeIgniter.php. The main reason we use this is to permit + * PHP errors to be logged in our own log files since the user may + * not have access to server logs. Since this function effectively + * intercepts PHP errors, however, we also need to display errors + * based on the current error_reporting level. + * We do that with the use of a PHP error template. + * + * @param int $severity + * @param string $message + * @param string $filepath + * @param int $line + * @return void + */ + function _error_handler($severity, $message, $filepath, $line) + { + $is_error = (((E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity); + + // When an error occurred, set the status header to '500 Internal Server Error' + // to indicate to the client something went wrong. + // This can't be done within the $_error->show_php_error method because + // it is only called when the display_errors flag is set (which isn't usually + // the case in a production environment) or when errors are ignored because + // they are above the error_reporting threshold. + if ($is_error) + { + set_status_header(500); + } + + // Should we ignore the error? We'll get the current error_reporting + // level and add its bits with the severity bits to find out. + if (($severity & error_reporting()) !== $severity) + { + return; + } + + $_error =& load_class('Exceptions', 'core'); + $_error->log_exception($severity, $message, $filepath, $line); + + // Should we display the error? + if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))) + { + $_error->show_php_error($severity, $message, $filepath, $line); + } + + // If the error is fatal, the execution of the script should be stopped because + // errors can't be recovered from. Halting the script conforms with PHP's + // default error handling. See http://www.php.net/manual/en/errorfunc.constants.php + if ($is_error) + { + exit(1); // EXIT_ERROR + } + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('_exception_handler')) +{ + /** + * Exception Handler + * + * Sends uncaught exceptions to the logger and displays them + * only if display_errors is On so that they don't show up in + * production environments. + * + * @param Exception $exception + * @return void + */ + function _exception_handler($exception) + { + $_error =& load_class('Exceptions', 'core'); + $_error->log_exception('error', 'Exception: '.$exception->getMessage(), $exception->getFile(), $exception->getLine()); + + // Should we display the error? + if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))) + { + $_error->show_exception($exception); + } + + exit(1); // EXIT_ERROR + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('_shutdown_handler')) +{ + /** + * Shutdown Handler + * + * This is the shutdown handler that is declared at the top + * of CodeIgniter.php. The main reason we use this is to simulate + * a complete custom exception handler. + * + * E_STRICT is purposively neglected because such events may have + * been caught. Duplication or none? None is preferred for now. + * + * @link http://insomanic.me.uk/post/229851073/php-trick-catching-fatal-errors-e-error-with-a + * @return void + */ + function _shutdown_handler() + { + $last_error = error_get_last(); + if (isset($last_error) && + ($last_error['type'] & (E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING))) + { + _error_handler($last_error['type'], $last_error['message'], $last_error['file'], $last_error['line']); + } + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('remove_invisible_characters')) +{ + /** + * Remove Invisible Characters + * + * This prevents sandwiching null characters + * between ascii characters, like Java\0script. + * + * @param string + * @param bool + * @return string + */ + function remove_invisible_characters($str, $url_encoded = TRUE) + { + $non_displayables = array(); + + // every control character except newline (dec 10), + // carriage return (dec 13) and horizontal tab (dec 09) + if ($url_encoded) + { + $non_displayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15 + $non_displayables[] = '/%1[0-9a-f]/'; // url encoded 16-31 + } + + $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 + + do + { + $str = preg_replace($non_displayables, '', $str, -1, $count); + } + while ($count); + + return $str; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('html_escape')) +{ + /** + * Returns HTML escaped variable. + * + * @param mixed $var The input string or array of strings to be escaped. + * @param bool $double_encode $double_encode set to FALSE prevents escaping twice. + * @return mixed The escaped string or array of strings as a result. + */ + function html_escape($var, $double_encode = TRUE) + { + if (empty($var)) + { + return $var; + } + + if (is_array($var)) + { + foreach (array_keys($var) as $key) + { + $var[$key] = html_escape($var[$key], $double_encode); + } + + return $var; + } + + return htmlspecialchars($var, ENT_QUOTES, config_item('charset'), $double_encode); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('_stringify_attributes')) +{ + /** + * Stringify attributes for use in HTML tags. + * + * Helper function used to convert a string, array, or object + * of attributes to a string. + * + * @param mixed string, array, object + * @param bool + * @return string + */ + function _stringify_attributes($attributes, $js = FALSE) + { + $atts = NULL; + + if (empty($attributes)) + { + return $atts; + } + + if (is_string($attributes)) + { + return ' '.$attributes; + } + + $attributes = (array) $attributes; + + foreach ($attributes as $key => $val) + { + $atts .= ($js) ? $key.'='.$val.',' : ' '.$key.'="'.$val.'"'; + } + + return rtrim($atts, ','); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('function_usable')) +{ + /** + * Function usable + * + * Executes a function_exists() check, and if the Suhosin PHP + * extension is loaded - checks whether the function that is + * checked might be disabled in there as well. + * + * This is useful as function_exists() will return FALSE for + * functions disabled via the *disable_functions* php.ini + * setting, but not for *suhosin.executor.func.blacklist* and + * *suhosin.executor.disable_eval*. These settings will just + * terminate script execution if a disabled function is executed. + * + * The above described behavior turned out to be a bug in Suhosin, + * but even though a fix was commited for 0.9.34 on 2012-02-12, + * that version is yet to be released. This function will therefore + * be just temporary, but would probably be kept for a few years. + * + * @link http://www.hardened-php.net/suhosin/ + * @param string $function_name Function to check for + * @return bool TRUE if the function exists and is safe to call, + * FALSE otherwise. + */ + function function_usable($function_name) + { + static $_suhosin_func_blacklist; + + if (function_exists($function_name)) + { + if ( ! isset($_suhosin_func_blacklist)) + { + $_suhosin_func_blacklist = extension_loaded('suhosin') + ? explode(',', trim(ini_get('suhosin.executor.func.blacklist'))) + : array(); + } + + return ! in_array($function_name, $_suhosin_func_blacklist, TRUE); + } + + return FALSE; + } +} diff --git a/system/core/Config.php b/system/core/Config.php new file mode 100644 index 0000000..ca6fb37 --- /dev/null +++ b/system/core/Config.php @@ -0,0 +1,382 @@ +config =& get_config(); + + // Set the base_url automatically if none was provided + if (empty($this->config['base_url'])) + { + if (isset($_SERVER['SERVER_ADDR'])) + { + if (strpos($_SERVER['SERVER_ADDR'], ':') !== FALSE) + { + $server_addr = '['.$_SERVER['SERVER_ADDR'].']'; + } + else + { + $server_addr = $_SERVER['SERVER_ADDR']; + } + + $base_url = (is_https() ? 'https' : 'http').'://'.$server_addr + .substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME']))); + } + else + { + $base_url = 'http://localhost/'; + } + + $this->set_item('base_url', $base_url); + } + + log_message('info', 'Config Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Load Config File + * + * @param string $file Configuration file name + * @param bool $use_sections Whether configuration values should be loaded into their own section + * @param bool $fail_gracefully Whether to just return FALSE or display an error message + * @return bool TRUE if the file was loaded correctly or FALSE on failure + */ + public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE) + { + $file = ($file === '') ? 'config' : str_replace('.php', '', $file); + $loaded = FALSE; + + foreach ($this->_config_paths as $path) + { + foreach (array($file, ENVIRONMENT.DIRECTORY_SEPARATOR.$file) as $location) + { + $file_path = $path.'config/'.$location.'.php'; + if (in_array($file_path, $this->is_loaded, TRUE)) + { + return TRUE; + } + + if ( ! file_exists($file_path)) + { + continue; + } + + include($file_path); + + if ( ! isset($config) OR ! is_array($config)) + { + if ($fail_gracefully === TRUE) + { + return FALSE; + } + + show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.'); + } + + if ($use_sections === TRUE) + { + $this->config[$file] = isset($this->config[$file]) + ? array_merge($this->config[$file], $config) + : $config; + } + else + { + $this->config = array_merge($this->config, $config); + } + + $this->is_loaded[] = $file_path; + $config = NULL; + $loaded = TRUE; + log_message('debug', 'Config file loaded: '.$file_path); + } + } + + if ($loaded === TRUE) + { + return TRUE; + } + elseif ($fail_gracefully === TRUE) + { + return FALSE; + } + + show_error('The configuration file '.$file.'.php does not exist.'); + } + + // -------------------------------------------------------------------- + + /** + * Fetch a config file item + * + * @param string $item Config item name + * @param string $index Index name + * @return string|null The configuration item or NULL if the item doesn't exist + */ + public function item($item, $index = '') + { + if ($index == '') + { + return isset($this->config[$item]) ? $this->config[$item] : NULL; + } + + return isset($this->config[$index], $this->config[$index][$item]) ? $this->config[$index][$item] : NULL; + } + + // -------------------------------------------------------------------- + + /** + * Fetch a config file item with slash appended (if not empty) + * + * @param string $item Config item name + * @return string|null The configuration item or NULL if the item doesn't exist + */ + public function slash_item($item) + { + if ( ! isset($this->config[$item])) + { + return NULL; + } + elseif (trim($this->config[$item]) === '') + { + return ''; + } + + return rtrim($this->config[$item], '/').'/'; + } + + // -------------------------------------------------------------------- + + /** + * Site URL + * + * Returns base_url . index_page [. uri_string] + * + * @uses CI_Config::_uri_string() + * + * @param string|string[] $uri URI string or an array of segments + * @param string $protocol + * @return string + */ + public function site_url($uri = '', $protocol = NULL) + { + $base_url = $this->slash_item('base_url'); + + if (isset($protocol)) + { + // For protocol-relative links + if ($protocol === '') + { + $base_url = substr($base_url, strpos($base_url, '//')); + } + else + { + $base_url = $protocol.substr($base_url, strpos($base_url, '://')); + } + } + + if (empty($uri)) + { + return $base_url.$this->item('index_page'); + } + + $uri = $this->_uri_string($uri); + + if ($this->item('enable_query_strings') === FALSE) + { + $suffix = isset($this->config['url_suffix']) ? $this->config['url_suffix'] : ''; + + if ($suffix !== '') + { + if (($offset = strpos($uri, '?')) !== FALSE) + { + $uri = substr($uri, 0, $offset).$suffix.substr($uri, $offset); + } + else + { + $uri .= $suffix; + } + } + + return $base_url.$this->slash_item('index_page').$uri; + } + elseif (strpos($uri, '?') === FALSE) + { + $uri = '?'.$uri; + } + + return $base_url.$this->item('index_page').$uri; + } + + // ------------------------------------------------------------- + + /** + * Base URL + * + * Returns base_url [. uri_string] + * + * @uses CI_Config::_uri_string() + * + * @param string|string[] $uri URI string or an array of segments + * @param string $protocol + * @return string + */ + public function base_url($uri = '', $protocol = NULL) + { + $base_url = $this->slash_item('base_url'); + + if (isset($protocol)) + { + // For protocol-relative links + if ($protocol === '') + { + $base_url = substr($base_url, strpos($base_url, '//')); + } + else + { + $base_url = $protocol.substr($base_url, strpos($base_url, '://')); + } + } + + return $base_url.ltrim($this->_uri_string($uri), '/'); + } + + // ------------------------------------------------------------- + + /** + * Build URI string + * + * @used-by CI_Config::site_url() + * @used-by CI_Config::base_url() + * + * @param string|string[] $uri URI string or an array of segments + * @return string + */ + protected function _uri_string($uri) + { + if ($this->item('enable_query_strings') === FALSE) + { + if (is_array($uri)) + { + $uri = implode('/', $uri); + } + return trim($uri, '/'); + } + elseif (is_array($uri)) + { + return http_build_query($uri); + } + + return $uri; + } + + // -------------------------------------------------------------------- + + /** + * System URL + * + * @deprecated 3.0.0 Encourages insecure practices + * @return string + */ + public function system_url() + { + $x = explode('/', preg_replace('|/*(.+?)/*$|', '\\1', BASEPATH)); + return $this->slash_item('base_url').end($x).'/'; + } + + // -------------------------------------------------------------------- + + /** + * Set a config file item + * + * @param string $item Config item key + * @param string $value Config item value + * @return void + */ + public function set_item($item, $value) + { + $this->config[$item] = $value; + } + +} diff --git a/system/core/Controller.php b/system/core/Controller.php new file mode 100644 index 0000000..83b3df2 --- /dev/null +++ b/system/core/Controller.php @@ -0,0 +1,96 @@ + $class) + { + $this->$var =& load_class($class); + } + + $this->load =& load_class('Loader', 'core'); + $this->load->initialize(); + log_message('info', 'Controller Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Get the CI singleton + * + * @static + * @return object + */ + public static function &get_instance() + { + return self::$instance; + } + +} diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php new file mode 100644 index 0000000..a1c6a19 --- /dev/null +++ b/system/core/Exceptions.php @@ -0,0 +1,275 @@ + 'Error', + E_WARNING => 'Warning', + E_PARSE => 'Parsing Error', + E_NOTICE => 'Notice', + E_CORE_ERROR => 'Core Error', + E_CORE_WARNING => 'Core Warning', + E_COMPILE_ERROR => 'Compile Error', + E_COMPILE_WARNING => 'Compile Warning', + E_USER_ERROR => 'User Error', + E_USER_WARNING => 'User Warning', + E_USER_NOTICE => 'User Notice', + E_STRICT => 'Runtime Notice' + ); + + /** + * Class constructor + * + * @return void + */ + public function __construct() + { + $this->ob_level = ob_get_level(); + // Note: Do not log messages from this constructor. + } + + // -------------------------------------------------------------------- + + /** + * Exception Logger + * + * Logs PHP generated error messages + * + * @param int $severity Log level + * @param string $message Error message + * @param string $filepath File path + * @param int $line Line number + * @return void + */ + public function log_exception($severity, $message, $filepath, $line) + { + $severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity; + log_message('error', 'Severity: '.$severity.' --> '.$message.' '.$filepath.' '.$line); + } + + // -------------------------------------------------------------------- + + /** + * 404 Error Handler + * + * @uses CI_Exceptions::show_error() + * + * @param string $page Page URI + * @param bool $log_error Whether to log the error + * @return void + */ + public function show_404($page = '', $log_error = TRUE) + { + if (is_cli()) + { + $heading = 'Not Found'; + $message = 'The controller/method pair you requested was not found.'; + } + else + { + $heading = '404 Page Not Found'; + $message = 'The page you requested was not found.'; + } + + // By default we log this, but allow a dev to skip it + if ($log_error) + { + log_message('error', $heading.': '.$page); + } + + echo $this->show_error($heading, $message, 'error_404', 404); + exit(4); // EXIT_UNKNOWN_FILE + } + + // -------------------------------------------------------------------- + + /** + * General Error Page + * + * Takes an error message as input (either as a string or an array) + * and displays it using the specified template. + * + * @param string $heading Page heading + * @param string|string[] $message Error message + * @param string $template Template name + * @param int $status_code (default: 500) + * + * @return string Error page output + */ + public function show_error($heading, $message, $template = 'error_general', $status_code = 500) + { + $templates_path = config_item('error_views_path'); + if (empty($templates_path)) + { + $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR; + } + + if (is_cli()) + { + $message = "\t".(is_array($message) ? implode("\n\t", $message) : $message); + $template = 'cli'.DIRECTORY_SEPARATOR.$template; + } + else + { + set_status_header($status_code); + $message = '

                      '.(is_array($message) ? implode('

                      ', $message) : $message).'

                      '; + $template = 'html'.DIRECTORY_SEPARATOR.$template; + } + + if (ob_get_level() > $this->ob_level + 1) + { + ob_end_flush(); + } + ob_start(); + include($templates_path.$template.'.php'); + $buffer = ob_get_contents(); + ob_end_clean(); + return $buffer; + } + + // -------------------------------------------------------------------- + + public function show_exception($exception) + { + $templates_path = config_item('error_views_path'); + if (empty($templates_path)) + { + $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR; + } + + $message = $exception->getMessage(); + if (empty($message)) + { + $message = '(null)'; + } + + if (is_cli()) + { + $templates_path .= 'cli'.DIRECTORY_SEPARATOR; + } + else + { + set_status_header(500); + $templates_path .= 'html'.DIRECTORY_SEPARATOR; + } + + if (ob_get_level() > $this->ob_level + 1) + { + ob_end_flush(); + } + + ob_start(); + include($templates_path.'error_exception.php'); + $buffer = ob_get_contents(); + ob_end_clean(); + echo $buffer; + } + + // -------------------------------------------------------------------- + + /** + * Native PHP error handler + * + * @param int $severity Error level + * @param string $message Error message + * @param string $filepath File path + * @param int $line Line number + * @return string Error page output + */ + public function show_php_error($severity, $message, $filepath, $line) + { + $templates_path = config_item('error_views_path'); + if (empty($templates_path)) + { + $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR; + } + + $severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity; + + // For safety reasons we don't show the full file path in non-CLI requests + if ( ! is_cli()) + { + $filepath = str_replace('\\', '/', $filepath); + if (FALSE !== strpos($filepath, '/')) + { + $x = explode('/', $filepath); + $filepath = $x[count($x)-2].'/'.end($x); + } + + $template = 'html'.DIRECTORY_SEPARATOR.'error_php'; + } + else + { + $template = 'cli'.DIRECTORY_SEPARATOR.'error_php'; + } + + if (ob_get_level() > $this->ob_level + 1) + { + ob_end_flush(); + } + ob_start(); + include($templates_path.$template.'.php'); + $buffer = ob_get_contents(); + ob_end_clean(); + echo $buffer; + } + +} diff --git a/system/core/Hooks.php b/system/core/Hooks.php new file mode 100644 index 0000000..856795c --- /dev/null +++ b/system/core/Hooks.php @@ -0,0 +1,266 @@ +item('enable_hooks') === FALSE) + { + return; + } + + // Grab the "hooks" definition file. + if (file_exists(APPPATH.'config/hooks.php')) + { + include(APPPATH.'config/hooks.php'); + } + + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/hooks.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'); + } + + // If there are no hooks, we're done. + if ( ! isset($hook) OR ! is_array($hook)) + { + return; + } + + $this->hooks =& $hook; + $this->enabled = TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Call Hook + * + * Calls a particular hook. Called by CodeIgniter.php. + * + * @uses CI_Hooks::_run_hook() + * + * @param string $which Hook name + * @return bool TRUE on success or FALSE on failure + */ + public function call_hook($which = '') + { + if ( ! $this->enabled OR ! isset($this->hooks[$which])) + { + return FALSE; + } + + if (is_array($this->hooks[$which]) && ! isset($this->hooks[$which]['function'])) + { + foreach ($this->hooks[$which] as $val) + { + $this->_run_hook($val); + } + } + else + { + $this->_run_hook($this->hooks[$which]); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Run Hook + * + * Runs a particular hook + * + * @param array $data Hook details + * @return bool TRUE on success or FALSE on failure + */ + protected function _run_hook($data) + { + // Closures/lambda functions and array($object, 'method') callables + if (is_callable($data)) + { + is_array($data) + ? $data[0]->{$data[1]}() + : $data(); + + return TRUE; + } + elseif ( ! is_array($data)) + { + return FALSE; + } + + // ----------------------------------- + // Safety - Prevents run-away loops + // ----------------------------------- + + // If the script being called happens to have the same + // hook call within it a loop can happen + if ($this->_in_progress === TRUE) + { + return; + } + + // ----------------------------------- + // Set file path + // ----------------------------------- + + if ( ! isset($data['filepath'], $data['filename'])) + { + return FALSE; + } + + $filepath = APPPATH.$data['filepath'].'/'.$data['filename']; + + if ( ! file_exists($filepath)) + { + return FALSE; + } + + // Determine and class and/or function names + $class = empty($data['class']) ? FALSE : $data['class']; + $function = empty($data['function']) ? FALSE : $data['function']; + $params = isset($data['params']) ? $data['params'] : ''; + + if (empty($function)) + { + return FALSE; + } + + // Set the _in_progress flag + $this->_in_progress = TRUE; + + // Call the requested class and/or function + if ($class !== FALSE) + { + // The object is stored? + if (isset($this->_objects[$class])) + { + if (method_exists($this->_objects[$class], $function)) + { + $this->_objects[$class]->$function($params); + } + else + { + return $this->_in_progress = FALSE; + } + } + else + { + class_exists($class, FALSE) OR require_once($filepath); + + if ( ! class_exists($class, FALSE) OR ! method_exists($class, $function)) + { + return $this->_in_progress = FALSE; + } + + // Store the object and execute the method + $this->_objects[$class] = new $class(); + $this->_objects[$class]->$function($params); + } + } + else + { + function_exists($function) OR require_once($filepath); + + if ( ! function_exists($function)) + { + return $this->_in_progress = FALSE; + } + + $function($params); + } + + $this->_in_progress = FALSE; + return TRUE; + } + +} diff --git a/system/core/Input.php b/system/core/Input.php new file mode 100644 index 0000000..a7c9ecd --- /dev/null +++ b/system/core/Input.php @@ -0,0 +1,895 @@ +_allow_get_array = (config_item('allow_get_array') === TRUE); + $this->_enable_xss = (config_item('global_xss_filtering') === TRUE); + $this->_enable_csrf = (config_item('csrf_protection') === TRUE); + $this->_standardize_newlines = (bool) config_item('standardize_newlines'); + + $this->security =& load_class('Security', 'core'); + + // Do we need the UTF-8 class? + if (UTF8_ENABLED === TRUE) + { + $this->uni =& load_class('Utf8', 'core'); + } + + // Sanitize global arrays + $this->_sanitize_globals(); + + // CSRF Protection check + if ($this->_enable_csrf === TRUE && ! is_cli()) + { + $this->security->csrf_verify(); + } + + log_message('info', 'Input Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Fetch from array + * + * Internal method used to retrieve values from global arrays. + * + * @param array &$array $_GET, $_POST, $_COOKIE, $_SERVER, etc. + * @param mixed $index Index for item to be fetched from $array + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + protected function _fetch_from_array(&$array, $index = NULL, $xss_clean = NULL) + { + is_bool($xss_clean) OR $xss_clean = $this->_enable_xss; + + // If $index is NULL, it means that the whole $array is requested + isset($index) OR $index = array_keys($array); + + // allow fetching multiple keys at once + if (is_array($index)) + { + $output = array(); + foreach ($index as $key) + { + $output[$key] = $this->_fetch_from_array($array, $key, $xss_clean); + } + + return $output; + } + + if (isset($array[$index])) + { + $value = $array[$index]; + } + elseif (($count = preg_match_all('/(?:^[^\[]+)|\[[^]]*\]/', $index, $matches)) > 1) // Does the index contain array notation + { + $value = $array; + for ($i = 0; $i < $count; $i++) + { + $key = trim($matches[0][$i], '[]'); + if ($key === '') // Empty notation will return the value as array + { + break; + } + + if (isset($value[$key])) + { + $value = $value[$key]; + } + else + { + return NULL; + } + } + } + else + { + return NULL; + } + + return ($xss_clean === TRUE) + ? $this->security->xss_clean($value) + : $value; + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from the GET array + * + * @param mixed $index Index for item to be fetched from $_GET + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + public function get($index = NULL, $xss_clean = NULL) + { + return $this->_fetch_from_array($_GET, $index, $xss_clean); + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from the POST array + * + * @param mixed $index Index for item to be fetched from $_POST + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + public function post($index = NULL, $xss_clean = NULL) + { + return $this->_fetch_from_array($_POST, $index, $xss_clean); + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from POST data with fallback to GET + * + * @param string $index Index for item to be fetched from $_POST or $_GET + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + public function post_get($index, $xss_clean = NULL) + { + return isset($_POST[$index]) + ? $this->post($index, $xss_clean) + : $this->get($index, $xss_clean); + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from GET data with fallback to POST + * + * @param string $index Index for item to be fetched from $_GET or $_POST + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + public function get_post($index, $xss_clean = NULL) + { + return isset($_GET[$index]) + ? $this->get($index, $xss_clean) + : $this->post($index, $xss_clean); + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from the COOKIE array + * + * @param mixed $index Index for item to be fetched from $_COOKIE + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + public function cookie($index = NULL, $xss_clean = NULL) + { + return $this->_fetch_from_array($_COOKIE, $index, $xss_clean); + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from the SERVER array + * + * @param mixed $index Index for item to be fetched from $_SERVER + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + public function server($index, $xss_clean = NULL) + { + return $this->_fetch_from_array($_SERVER, $index, $xss_clean); + } + + // ------------------------------------------------------------------------ + + /** + * Fetch an item from the php://input stream + * + * Useful when you need to access PUT, DELETE or PATCH request data. + * + * @param string $index Index for item to be fetched + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + public function input_stream($index = NULL, $xss_clean = NULL) + { + // Prior to PHP 5.6, the input stream can only be read once, + // so we'll need to check if we have already done that first. + if ( ! is_array($this->_input_stream)) + { + // $this->raw_input_stream will trigger __get(). + parse_str($this->raw_input_stream, $this->_input_stream); + is_array($this->_input_stream) OR $this->_input_stream = array(); + } + + return $this->_fetch_from_array($this->_input_stream, $index, $xss_clean); + } + + // ------------------------------------------------------------------------ + + /** + * Set cookie + * + * Accepts an arbitrary number of parameters (up to 7) or an associative + * array in the first parameter containing all the values. + * + * @param string|mixed[] $name Cookie name or an array containing parameters + * @param string $value Cookie value + * @param int $expire Cookie expiration time in seconds + * @param string $domain Cookie domain (e.g.: '.yourdomain.com') + * @param string $path Cookie path (default: '/') + * @param string $prefix Cookie name prefix + * @param bool $secure Whether to only transfer cookies via SSL + * @param bool $httponly Whether to only makes the cookie accessible via HTTP (no javascript) + * @return void + */ + public function set_cookie($name, $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = FALSE, $httponly = FALSE) + { + if (is_array($name)) + { + // always leave 'name' in last place, as the loop will break otherwise, due to $$item + foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'httponly', 'name') as $item) + { + if (isset($name[$item])) + { + $$item = $name[$item]; + } + } + } + + if ($prefix === '' && config_item('cookie_prefix') !== '') + { + $prefix = config_item('cookie_prefix'); + } + + if ($domain == '' && config_item('cookie_domain') != '') + { + $domain = config_item('cookie_domain'); + } + + if ($path === '/' && config_item('cookie_path') !== '/') + { + $path = config_item('cookie_path'); + } + + if ($secure === FALSE && config_item('cookie_secure') === TRUE) + { + $secure = config_item('cookie_secure'); + } + + if ($httponly === FALSE && config_item('cookie_httponly') !== FALSE) + { + $httponly = config_item('cookie_httponly'); + } + + if ( ! is_numeric($expire)) + { + $expire = time() - 86500; + } + else + { + $expire = ($expire > 0) ? time() + $expire : 0; + } + + setcookie($prefix.$name, $value, $expire, $path, $domain, $secure, $httponly); + } + + // -------------------------------------------------------------------- + + /** + * Fetch the IP Address + * + * Determines and validates the visitor's IP address. + * + * @return string IP address + */ + public function ip_address() + { + if ($this->ip_address !== FALSE) + { + return $this->ip_address; + } + + $proxy_ips = config_item('proxy_ips'); + if ( ! empty($proxy_ips) && ! is_array($proxy_ips)) + { + $proxy_ips = explode(',', str_replace(' ', '', $proxy_ips)); + } + + $this->ip_address = $this->server('REMOTE_ADDR'); + + if ($proxy_ips) + { + foreach (array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'HTTP_X_CLIENT_IP', 'HTTP_X_CLUSTER_CLIENT_IP') as $header) + { + if (($spoof = $this->server($header)) !== NULL) + { + // Some proxies typically list the whole chain of IP + // addresses through which the client has reached us. + // e.g. client_ip, proxy_ip1, proxy_ip2, etc. + sscanf($spoof, '%[^,]', $spoof); + + if ( ! $this->valid_ip($spoof)) + { + $spoof = NULL; + } + else + { + break; + } + } + } + + if ($spoof) + { + for ($i = 0, $c = count($proxy_ips); $i < $c; $i++) + { + // Check if we have an IP address or a subnet + if (strpos($proxy_ips[$i], '/') === FALSE) + { + // An IP address (and not a subnet) is specified. + // We can compare right away. + if ($proxy_ips[$i] === $this->ip_address) + { + $this->ip_address = $spoof; + break; + } + + continue; + } + + // We have a subnet ... now the heavy lifting begins + isset($separator) OR $separator = $this->valid_ip($this->ip_address, 'ipv6') ? ':' : '.'; + + // If the proxy entry doesn't match the IP protocol - skip it + if (strpos($proxy_ips[$i], $separator) === FALSE) + { + continue; + } + + // Convert the REMOTE_ADDR IP address to binary, if needed + if ( ! isset($ip, $sprintf)) + { + if ($separator === ':') + { + // Make sure we're have the "full" IPv6 format + $ip = explode(':', + str_replace('::', + str_repeat(':', 9 - substr_count($this->ip_address, ':')), + $this->ip_address + ) + ); + + for ($j = 0; $j < 8; $j++) + { + $ip[$j] = intval($ip[$j], 16); + } + + $sprintf = '%016b%016b%016b%016b%016b%016b%016b%016b'; + } + else + { + $ip = explode('.', $this->ip_address); + $sprintf = '%08b%08b%08b%08b'; + } + + $ip = vsprintf($sprintf, $ip); + } + + // Split the netmask length off the network address + sscanf($proxy_ips[$i], '%[^/]/%d', $netaddr, $masklen); + + // Again, an IPv6 address is most likely in a compressed form + if ($separator === ':') + { + $netaddr = explode(':', str_replace('::', str_repeat(':', 9 - substr_count($netaddr, ':')), $netaddr)); + for ($i = 0; $i < 8; $i++) + { + $netaddr[$i] = intval($netaddr[$i], 16); + } + } + else + { + $netaddr = explode('.', $netaddr); + } + + // Convert to binary and finally compare + if (strncmp($ip, vsprintf($sprintf, $netaddr), $masklen) === 0) + { + $this->ip_address = $spoof; + break; + } + } + } + } + + if ( ! $this->valid_ip($this->ip_address)) + { + return $this->ip_address = '0.0.0.0'; + } + + return $this->ip_address; + } + + // -------------------------------------------------------------------- + + /** + * Validate IP Address + * + * @param string $ip IP address + * @param string $which IP protocol: 'ipv4' or 'ipv6' + * @return bool + */ + public function valid_ip($ip, $which = '') + { + switch (strtolower($which)) + { + case 'ipv4': + $which = FILTER_FLAG_IPV4; + break; + case 'ipv6': + $which = FILTER_FLAG_IPV6; + break; + default: + $which = NULL; + break; + } + + return (bool) filter_var($ip, FILTER_VALIDATE_IP, $which); + } + + // -------------------------------------------------------------------- + + /** + * Fetch User Agent string + * + * @return string|null User Agent string or NULL if it doesn't exist + */ + public function user_agent($xss_clean = NULL) + { + return $this->_fetch_from_array($_SERVER, 'HTTP_USER_AGENT', $xss_clean); + } + + // -------------------------------------------------------------------- + + /** + * Sanitize Globals + * + * Internal method serving for the following purposes: + * + * - Unsets $_GET data, if query strings are not enabled + * - Cleans POST, COOKIE and SERVER data + * - Standardizes newline characters to PHP_EOL + * + * @return void + */ + protected function _sanitize_globals() + { + // Is $_GET data allowed? If not we'll set the $_GET to an empty array + if ($this->_allow_get_array === FALSE) + { + $_GET = array(); + } + elseif (is_array($_GET)) + { + foreach ($_GET as $key => $val) + { + $_GET[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); + } + } + + // Clean $_POST Data + if (is_array($_POST)) + { + foreach ($_POST as $key => $val) + { + $_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); + } + } + + // Clean $_COOKIE Data + if (is_array($_COOKIE)) + { + // Also get rid of specially treated cookies that might be set by a server + // or silly application, that are of no use to a CI application anyway + // but that when present will trip our 'Disallowed Key Characters' alarm + // http://www.ietf.org/rfc/rfc2109.txt + // note that the key names below are single quoted strings, and are not PHP variables + unset( + $_COOKIE['$Version'], + $_COOKIE['$Path'], + $_COOKIE['$Domain'] + ); + + foreach ($_COOKIE as $key => $val) + { + if (($cookie_key = $this->_clean_input_keys($key)) !== FALSE) + { + $_COOKIE[$cookie_key] = $this->_clean_input_data($val); + } + else + { + unset($_COOKIE[$key]); + } + } + } + + // Sanitize PHP_SELF + $_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']); + + log_message('debug', 'Global POST, GET and COOKIE data sanitized'); + } + + // -------------------------------------------------------------------- + + /** + * Clean Input Data + * + * Internal method that aids in escaping data and + * standardizing newline characters to PHP_EOL. + * + * @param string|string[] $str Input string(s) + * @return string + */ + protected function _clean_input_data($str) + { + if (is_array($str)) + { + $new_array = array(); + foreach (array_keys($str) as $key) + { + $new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($str[$key]); + } + return $new_array; + } + + /* We strip slashes if magic quotes is on to keep things consistent + + NOTE: In PHP 5.4 get_magic_quotes_gpc() will always return 0 and + it will probably not exist in future versions at all. + */ + if ( ! is_php('5.4') && get_magic_quotes_gpc()) + { + $str = stripslashes($str); + } + + // Clean UTF-8 if supported + if (UTF8_ENABLED === TRUE) + { + $str = $this->uni->clean_string($str); + } + + // Remove control characters + $str = remove_invisible_characters($str, FALSE); + + // Standardize newlines if needed + if ($this->_standardize_newlines === TRUE) + { + return preg_replace('/(?:\r\n|[\r\n])/', PHP_EOL, $str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Clean Keys + * + * Internal method that helps to prevent malicious users + * from trying to exploit keys we make sure that keys are + * only named with alpha-numeric text and a few other items. + * + * @param string $str Input string + * @param bool $fatal Whether to terminate script exection + * or to return FALSE if an invalid + * key is encountered + * @return string|bool + */ + protected function _clean_input_keys($str, $fatal = TRUE) + { + if ( ! preg_match('/^[a-z0-9:_\/|-]+$/i', $str)) + { + if ($fatal === TRUE) + { + return FALSE; + } + else + { + set_status_header(503); + echo 'Disallowed Key Characters.'; + exit(7); // EXIT_USER_INPUT + } + } + + // Clean UTF-8 if supported + if (UTF8_ENABLED === TRUE) + { + return $this->uni->clean_string($str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Request Headers + * + * @param bool $xss_clean Whether to apply XSS filtering + * @return array + */ + public function request_headers($xss_clean = FALSE) + { + // If header is already defined, return it immediately + if ( ! empty($this->headers)) + { + return $this->headers; + } + + // In Apache, you can simply call apache_request_headers() + if (function_exists('apache_request_headers')) + { + return $this->headers = apache_request_headers(); + } + + $this->headers['Content-Type'] = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE'); + + foreach ($_SERVER as $key => $val) + { + if (sscanf($key, 'HTTP_%s', $header) === 1) + { + // take SOME_HEADER and turn it into Some-Header + $header = str_replace('_', ' ', strtolower($header)); + $header = str_replace(' ', '-', ucwords($header)); + + $this->headers[$header] = $this->_fetch_from_array($_SERVER, $key, $xss_clean); + } + } + + return $this->headers; + } + + // -------------------------------------------------------------------- + + /** + * Get Request Header + * + * Returns the value of a single member of the headers class member + * + * @param string $index Header name + * @param bool $xss_clean Whether to apply XSS filtering + * @return string|null The requested header on success or NULL on failure + */ + public function get_request_header($index, $xss_clean = FALSE) + { + static $headers; + + if ( ! isset($headers)) + { + empty($this->headers) && $this->request_headers(); + foreach ($this->headers as $key => $value) + { + $headers[strtolower($key)] = $value; + } + } + + $index = strtolower($index); + + if ( ! isset($headers[$index])) + { + return NULL; + } + + return ($xss_clean === TRUE) + ? $this->security->xss_clean($headers[$index]) + : $headers[$index]; + } + + // -------------------------------------------------------------------- + + /** + * Is AJAX request? + * + * Test to see if a request contains the HTTP_X_REQUESTED_WITH header. + * + * @return bool + */ + public function is_ajax_request() + { + return ( ! empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'); + } + + // -------------------------------------------------------------------- + + /** + * Is CLI request? + * + * Test to see if a request was made from the command line. + * + * @deprecated 3.0.0 Use is_cli() instead + * @return bool + */ + public function is_cli_request() + { + return is_cli(); + } + + // -------------------------------------------------------------------- + + /** + * Get Request Method + * + * Return the request method + * + * @param bool $upper Whether to return in upper or lower case + * (default: FALSE) + * @return string + */ + public function method($upper = FALSE) + { + return ($upper) + ? strtoupper($this->server('REQUEST_METHOD')) + : strtolower($this->server('REQUEST_METHOD')); + } + + // ------------------------------------------------------------------------ + + /** + * Magic __get() + * + * Allows read access to protected properties + * + * @param string $name + * @return mixed + */ + public function __get($name) + { + if ($name === 'raw_input_stream') + { + isset($this->_raw_input_stream) OR $this->_raw_input_stream = file_get_contents('php://input'); + return $this->_raw_input_stream; + } + elseif ($name === 'ip_address') + { + return $this->ip_address; + } + } + +} diff --git a/system/core/Lang.php b/system/core/Lang.php new file mode 100644 index 0000000..ca7825c --- /dev/null +++ b/system/core/Lang.php @@ -0,0 +1,203 @@ +load($value, $idiom, $return, $add_suffix, $alt_path); + } + + return; + } + + $langfile = str_replace('.php', '', $langfile); + + if ($add_suffix === TRUE) + { + $langfile = preg_replace('/_lang$/', '', $langfile).'_lang'; + } + + $langfile .= '.php'; + + if (empty($idiom) OR ! preg_match('/^[a-z_-]+$/i', $idiom)) + { + $config =& get_config(); + $idiom = empty($config['language']) ? 'en' : $config['language']; + } + + if ($return === FALSE && isset($this->is_loaded[$langfile]) && $this->is_loaded[$langfile] === $idiom) + { + return; + } + + // Load the base file, so any others found can override it + $basepath = BASEPATH.'language/'.$idiom.'/'.$langfile; + if (($found = file_exists($basepath)) === TRUE) + { + include($basepath); + } + + // Do we have an alternative path to look in? + if ($alt_path !== '') + { + $alt_path .= 'language/'.$idiom.'/'.$langfile; + if (file_exists($alt_path)) + { + include($alt_path); + $found = TRUE; + } + } + else + { + foreach (get_instance()->load->get_package_paths(TRUE) as $package_path) + { + $package_path .= 'language/'.$idiom.'/'.$langfile; + if ($basepath !== $package_path && file_exists($package_path)) + { + include($package_path); + $found = TRUE; + break; + } + } + } + + if ($found !== TRUE) + { + show_error('Unable to load the requested language file: language/'.$idiom.'/'.$langfile); + } + + if ( ! isset($lang) OR ! is_array($lang)) + { + log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile); + + if ($return === TRUE) + { + return array(); + } + return; + } + + if ($return === TRUE) + { + return $lang; + } + + $this->is_loaded[$langfile] = $idiom; + $this->language = array_merge($this->language, $lang); + + log_message('info', 'Language file loaded: language/'.$idiom.'/'.$langfile); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Language line + * + * Fetches a single line of text from the language array + * + * @param string $line Language line key + * @param bool $log_errors Whether to log an error message if the line is not found + * @return string Translation + */ + public function line($line, $log_errors = TRUE) + { + $value = isset($this->language[$line]) ? $this->language[$line] : FALSE; + + // Because killer robots like unicorns! + if ($value === FALSE && $log_errors === TRUE) + { + log_message('error', 'Could not find the language line "'.$line.'"'); + } + + return $value; + } + +} diff --git a/system/core/Loader.php b/system/core/Loader.php new file mode 100644 index 0000000..c742ae7 --- /dev/null +++ b/system/core/Loader.php @@ -0,0 +1,1437 @@ + TRUE); + + /** + * List of paths to load libraries from + * + * @var array + */ + protected $_ci_library_paths = array(APPPATH, BASEPATH); + + /** + * List of paths to load models from + * + * @var array + */ + protected $_ci_model_paths = array(APPPATH); + + /** + * List of paths to load helpers from + * + * @var array + */ + protected $_ci_helper_paths = array(APPPATH, BASEPATH); + + /** + * List of cached variables + * + * @var array + */ + protected $_ci_cached_vars = array(); + + /** + * List of loaded classes + * + * @var array + */ + protected $_ci_classes = array(); + + /** + * List of loaded models + * + * @var array + */ + protected $_ci_models = array(); + + /** + * List of loaded helpers + * + * @var array + */ + protected $_ci_helpers = array(); + + /** + * List of class name mappings + * + * @var array + */ + protected $_ci_varmap = array( + 'unit_test' => 'unit', + 'user_agent' => 'agent' + ); + + // -------------------------------------------------------------------- + + /** + * Class constructor + * + * Sets component load paths, gets the initial output buffering level. + * + * @return void + */ + public function __construct() + { + $this->_ci_ob_level = ob_get_level(); + $this->_ci_classes =& is_loaded(); + + log_message('info', 'Loader Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Initializer + * + * @todo Figure out a way to move this to the constructor + * without breaking *package_path*() methods. + * @uses CI_Loader::_ci_autoloader() + * @used-by CI_Controller::__construct() + * @return void + */ + public function initialize() + { + $this->_ci_autoloader(); + } + + // -------------------------------------------------------------------- + + /** + * Is Loaded + * + * A utility method to test if a class is in the self::$_ci_classes array. + * + * @used-by Mainly used by Form Helper function _get_validation_object(). + * + * @param string $class Class name to check for + * @return string|bool Class object name if loaded or FALSE + */ + public function is_loaded($class) + { + return array_search(ucfirst($class), $this->_ci_classes, TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Library Loader + * + * Loads and instantiates libraries. + * Designed to be called from application controllers. + * + * @param string $library Library name + * @param array $params Optional parameters to pass to the library class constructor + * @param string $object_name An optional object name to assign to + * @return object + */ + public function library($library, $params = NULL, $object_name = NULL) + { + if (empty($library)) + { + return $this; + } + elseif (is_array($library)) + { + foreach ($library as $key => $value) + { + if (is_int($key)) + { + $this->library($value, $params); + } + else + { + $this->library($key, $params, $value); + } + } + + return $this; + } + + if ($params !== NULL && ! is_array($params)) + { + $params = NULL; + } + + $this->_ci_load_library($library, $params, $object_name); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Model Loader + * + * Loads and instantiates models. + * + * @param string $model Model name + * @param string $name An optional object name to assign to + * @param bool $db_conn An optional database connection configuration to initialize + * @return object + */ + public function model($model, $name = '', $db_conn = FALSE) + { + if (empty($model)) + { + return $this; + } + elseif (is_array($model)) + { + foreach ($model as $key => $value) + { + is_int($key) ? $this->model($value, '', $db_conn) : $this->model($key, $value, $db_conn); + } + + return $this; + } + + $path = ''; + + // Is the model in a sub-folder? If so, parse out the filename and path. + if (($last_slash = strrpos($model, '/')) !== FALSE) + { + // The path is in front of the last slash + $path = substr($model, 0, ++$last_slash); + + // And the model name behind it + $model = substr($model, $last_slash); + } + + if (empty($name)) + { + $name = $model; + } + + if (in_array($name, $this->_ci_models, TRUE)) + { + return $this; + } + + $CI =& get_instance(); + if (isset($CI->$name)) + { + throw new RuntimeException('The model name you are loading is the name of a resource that is already being used: '.$name); + } + + if ($db_conn !== FALSE && ! class_exists('CI_DB', FALSE)) + { + if ($db_conn === TRUE) + { + $db_conn = ''; + } + + $this->database($db_conn, FALSE, TRUE); + } + + // Note: All of the code under this condition used to be just: + // + // load_class('Model', 'core'); + // + // However, load_class() instantiates classes + // to cache them for later use and that prevents + // MY_Model from being an abstract class and is + // sub-optimal otherwise anyway. + if ( ! class_exists('CI_Model', FALSE)) + { + $app_path = APPPATH.'core'.DIRECTORY_SEPARATOR; + if (file_exists($app_path.'Model.php')) + { + require_once($app_path.'Model.php'); + if ( ! class_exists('CI_Model', FALSE)) + { + throw new RuntimeException($app_path."Model.php exists, but doesn't declare class CI_Model"); + } + } + elseif ( ! class_exists('CI_Model', FALSE)) + { + require_once(BASEPATH.'core'.DIRECTORY_SEPARATOR.'Model.php'); + } + + $class = config_item('subclass_prefix').'Model'; + if (file_exists($app_path.$class.'.php')) + { + require_once($app_path.$class.'.php'); + if ( ! class_exists($class, FALSE)) + { + throw new RuntimeException($app_path.$class.".php exists, but doesn't declare class ".$class); + } + } + } + + $model = ucfirst($model); + if ( ! class_exists($model, FALSE)) + { + foreach ($this->_ci_model_paths as $mod_path) + { + if ( ! file_exists($mod_path.'models/'.$path.$model.'.php')) + { + continue; + } + + require_once($mod_path.'models/'.$path.$model.'.php'); + if ( ! class_exists($model, FALSE)) + { + throw new RuntimeException($mod_path."models/".$path.$model.".php exists, but doesn't declare class ".$model); + } + + break; + } + + if ( ! class_exists($model, FALSE)) + { + throw new RuntimeException('Unable to locate the model you have specified: '.$model); + } + } + elseif ( ! is_subclass_of($model, 'CI_Model')) + { + throw new RuntimeException("Class ".$model." already exists and doesn't extend CI_Model"); + } + + $this->_ci_models[] = $name; + $CI->$name = new $model(); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Database Loader + * + * @param mixed $params Database configuration options + * @param bool $return Whether to return the database object + * @param bool $query_builder Whether to enable Query Builder + * (overrides the configuration setting) + * + * @return object|bool Database object if $return is set to TRUE, + * FALSE on failure, CI_Loader instance in any other case + */ + public function database($params = '', $return = FALSE, $query_builder = NULL) + { + // Grab the super object + $CI =& get_instance(); + + // Do we even need to load the database class? + if ($return === FALSE && $query_builder === NULL && isset($CI->db) && is_object($CI->db) && ! empty($CI->db->conn_id)) + { + return FALSE; + } + + require_once(BASEPATH.'database/DB.php'); + + if ($return === TRUE) + { + return DB($params, $query_builder); + } + + // Initialize the db variable. Needed to prevent + // reference errors with some configurations + $CI->db = ''; + + // Load the DB class + $CI->db =& DB($params, $query_builder); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Load the Database Utilities Class + * + * @param object $db Database object + * @param bool $return Whether to return the DB Utilities class object or not + * @return object + */ + public function dbutil($db = NULL, $return = FALSE) + { + $CI =& get_instance(); + + if ( ! is_object($db) OR ! ($db instanceof CI_DB)) + { + class_exists('CI_DB', FALSE) OR $this->database(); + $db =& $CI->db; + } + + require_once(BASEPATH.'database/DB_utility.php'); + require_once(BASEPATH.'database/drivers/'.$db->dbdriver.'/'.$db->dbdriver.'_utility.php'); + $class = 'CI_DB_'.$db->dbdriver.'_utility'; + + if ($return === TRUE) + { + return new $class($db); + } + + $CI->dbutil = new $class($db); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Load the Database Forge Class + * + * @param object $db Database object + * @param bool $return Whether to return the DB Forge class object or not + * @return object + */ + public function dbforge($db = NULL, $return = FALSE) + { + $CI =& get_instance(); + if ( ! is_object($db) OR ! ($db instanceof CI_DB)) + { + class_exists('CI_DB', FALSE) OR $this->database(); + $db =& $CI->db; + } + + require_once(BASEPATH.'database/DB_forge.php'); + require_once(BASEPATH.'database/drivers/'.$db->dbdriver.'/'.$db->dbdriver.'_forge.php'); + + if ( ! empty($db->subdriver)) + { + $driver_path = BASEPATH.'database/drivers/'.$db->dbdriver.'/subdrivers/'.$db->dbdriver.'_'.$db->subdriver.'_forge.php'; + if (file_exists($driver_path)) + { + require_once($driver_path); + $class = 'CI_DB_'.$db->dbdriver.'_'.$db->subdriver.'_forge'; + } + } + else + { + $class = 'CI_DB_'.$db->dbdriver.'_forge'; + } + + if ($return === TRUE) + { + return new $class($db); + } + + $CI->dbforge = new $class($db); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * View Loader + * + * Loads "view" files. + * + * @param string $view View name + * @param array $vars An associative array of data + * to be extracted for use in the view + * @param bool $return Whether to return the view output + * or leave it to the Output class + * @return object|string + */ + public function view($view, $vars = array(), $return = FALSE) + { + return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return)); + } + + // -------------------------------------------------------------------- + + /** + * Generic File Loader + * + * @param string $path File path + * @param bool $return Whether to return the file output + * @return object|string + */ + public function file($path, $return = FALSE) + { + return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return)); + } + + // -------------------------------------------------------------------- + + /** + * Set Variables + * + * Once variables are set they become available within + * the controller class and its "view" files. + * + * @param array|object|string $vars + * An associative array or object containing values + * to be set, or a value's name if string + * @param string $val Value to set, only used if $vars is a string + * @return object + */ + public function vars($vars, $val = '') + { + if (is_string($vars)) + { + $vars = array($vars => $val); + } + + $vars = $this->_ci_object_to_array($vars); + + if (is_array($vars) && count($vars) > 0) + { + foreach ($vars as $key => $val) + { + $this->_ci_cached_vars[$key] = $val; + } + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Clear Cached Variables + * + * Clears the cached variables. + * + * @return CI_Loader + */ + public function clear_vars() + { + $this->_ci_cached_vars = array(); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Get Variable + * + * Check if a variable is set and retrieve it. + * + * @param string $key Variable name + * @return mixed The variable or NULL if not found + */ + public function get_var($key) + { + return isset($this->_ci_cached_vars[$key]) ? $this->_ci_cached_vars[$key] : NULL; + } + + // -------------------------------------------------------------------- + + /** + * Get Variables + * + * Retrieves all loaded variables. + * + * @return array + */ + public function get_vars() + { + return $this->_ci_cached_vars; + } + + // -------------------------------------------------------------------- + + /** + * Helper Loader + * + * @param string|string[] $helpers Helper name(s) + * @return object + */ + public function helper($helpers = array()) + { + foreach ($this->_ci_prep_filename($helpers, '_helper') as $helper) + { + if (isset($this->_ci_helpers[$helper])) + { + continue; + } + + // Is this a helper extension request? + $ext_helper = config_item('subclass_prefix').$helper; + $ext_loaded = FALSE; + foreach ($this->_ci_helper_paths as $path) + { + if (file_exists($path.'helpers/'.$ext_helper.'.php')) + { + include_once($path.'helpers/'.$ext_helper.'.php'); + $ext_loaded = TRUE; + } + } + + // If we have loaded extensions - check if the base one is here + if ($ext_loaded === TRUE) + { + $base_helper = BASEPATH.'helpers/'.$helper.'.php'; + if ( ! file_exists($base_helper)) + { + show_error('Unable to load the requested file: helpers/'.$helper.'.php'); + } + + include_once($base_helper); + $this->_ci_helpers[$helper] = TRUE; + log_message('info', 'Helper loaded: '.$helper); + continue; + } + + // No extensions found ... try loading regular helpers and/or overrides + foreach ($this->_ci_helper_paths as $path) + { + if (file_exists($path.'helpers/'.$helper.'.php')) + { + include_once($path.'helpers/'.$helper.'.php'); + + $this->_ci_helpers[$helper] = TRUE; + log_message('info', 'Helper loaded: '.$helper); + break; + } + } + + // unable to load the helper + if ( ! isset($this->_ci_helpers[$helper])) + { + show_error('Unable to load the requested file: helpers/'.$helper.'.php'); + } + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Load Helpers + * + * An alias for the helper() method in case the developer has + * written the plural form of it. + * + * @uses CI_Loader::helper() + * @param string|string[] $helpers Helper name(s) + * @return object + */ + public function helpers($helpers = array()) + { + return $this->helper($helpers); + } + + // -------------------------------------------------------------------- + + /** + * Language Loader + * + * Loads language files. + * + * @param string|string[] $files List of language file names to load + * @param string Language name + * @return object + */ + public function language($files, $lang = '') + { + get_instance()->lang->load($files, $lang); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Config Loader + * + * Loads a config file (an alias for CI_Config::load()). + * + * @uses CI_Config::load() + * @param string $file Configuration file name + * @param bool $use_sections Whether configuration values should be loaded into their own section + * @param bool $fail_gracefully Whether to just return FALSE or display an error message + * @return bool TRUE if the file was loaded correctly or FALSE on failure + */ + public function config($file, $use_sections = FALSE, $fail_gracefully = FALSE) + { + return get_instance()->config->load($file, $use_sections, $fail_gracefully); + } + + // -------------------------------------------------------------------- + + /** + * Driver Loader + * + * Loads a driver library. + * + * @param string|string[] $library Driver name(s) + * @param array $params Optional parameters to pass to the driver + * @param string $object_name An optional object name to assign to + * + * @return object|bool Object or FALSE on failure if $library is a string + * and $object_name is set. CI_Loader instance otherwise. + */ + public function driver($library, $params = NULL, $object_name = NULL) + { + if (is_array($library)) + { + foreach ($library as $key => $value) + { + if (is_int($key)) + { + $this->driver($value, $params); + } + else + { + $this->driver($key, $params, $value); + } + } + + return $this; + } + elseif (empty($library)) + { + return FALSE; + } + + if ( ! class_exists('CI_Driver_Library', FALSE)) + { + // We aren't instantiating an object here, just making the base class available + require BASEPATH.'libraries/Driver.php'; + } + + // We can save the loader some time since Drivers will *always* be in a subfolder, + // and typically identically named to the library + if ( ! strpos($library, '/')) + { + $library = ucfirst($library).'/'.$library; + } + + return $this->library($library, $params, $object_name); + } + + // -------------------------------------------------------------------- + + /** + * Add Package Path + * + * Prepends a parent path to the library, model, helper and config + * path arrays. + * + * @see CI_Loader::$_ci_library_paths + * @see CI_Loader::$_ci_model_paths + * @see CI_Loader::$_ci_helper_paths + * @see CI_Config::$_config_paths + * + * @param string $path Path to add + * @param bool $view_cascade (default: TRUE) + * @return object + */ + public function add_package_path($path, $view_cascade = TRUE) + { + $path = rtrim($path, '/').'/'; + + array_unshift($this->_ci_library_paths, $path); + array_unshift($this->_ci_model_paths, $path); + array_unshift($this->_ci_helper_paths, $path); + + $this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths; + + // Add config file path + $config =& $this->_ci_get_component('config'); + $config->_config_paths[] = $path; + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Get Package Paths + * + * Return a list of all package paths. + * + * @param bool $include_base Whether to include BASEPATH (default: FALSE) + * @return array + */ + public function get_package_paths($include_base = FALSE) + { + return ($include_base === TRUE) ? $this->_ci_library_paths : $this->_ci_model_paths; + } + + // -------------------------------------------------------------------- + + /** + * Remove Package Path + * + * Remove a path from the library, model, helper and/or config + * path arrays if it exists. If no path is provided, the most recently + * added path will be removed removed. + * + * @param string $path Path to remove + * @return object + */ + public function remove_package_path($path = '') + { + $config =& $this->_ci_get_component('config'); + + if ($path === '') + { + array_shift($this->_ci_library_paths); + array_shift($this->_ci_model_paths); + array_shift($this->_ci_helper_paths); + array_shift($this->_ci_view_paths); + array_pop($config->_config_paths); + } + else + { + $path = rtrim($path, '/').'/'; + foreach (array('_ci_library_paths', '_ci_model_paths', '_ci_helper_paths') as $var) + { + if (($key = array_search($path, $this->{$var})) !== FALSE) + { + unset($this->{$var}[$key]); + } + } + + if (isset($this->_ci_view_paths[$path.'views/'])) + { + unset($this->_ci_view_paths[$path.'views/']); + } + + if (($key = array_search($path, $config->_config_paths)) !== FALSE) + { + unset($config->_config_paths[$key]); + } + } + + // make sure the application default paths are still in the array + $this->_ci_library_paths = array_unique(array_merge($this->_ci_library_paths, array(APPPATH, BASEPATH))); + $this->_ci_helper_paths = array_unique(array_merge($this->_ci_helper_paths, array(APPPATH, BASEPATH))); + $this->_ci_model_paths = array_unique(array_merge($this->_ci_model_paths, array(APPPATH))); + $this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH.'views/' => TRUE)); + $config->_config_paths = array_unique(array_merge($config->_config_paths, array(APPPATH))); + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Internal CI Data Loader + * + * Used to load views and files. + * + * Variables are prefixed with _ci_ to avoid symbol collision with + * variables made available to view files. + * + * @used-by CI_Loader::view() + * @used-by CI_Loader::file() + * @param array $_ci_data Data to load + * @return object + */ + protected function _ci_load($_ci_data) + { + // Set the default data variables + foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val) + { + $$_ci_val = isset($_ci_data[$_ci_val]) ? $_ci_data[$_ci_val] : FALSE; + } + + $file_exists = FALSE; + + // Set the path to the requested file + if (is_string($_ci_path) && $_ci_path !== '') + { + $_ci_x = explode('/', $_ci_path); + $_ci_file = end($_ci_x); + } + else + { + $_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION); + $_ci_file = ($_ci_ext === '') ? $_ci_view.'.php' : $_ci_view; + + foreach ($this->_ci_view_paths as $_ci_view_file => $cascade) + { + if (file_exists($_ci_view_file.$_ci_file)) + { + $_ci_path = $_ci_view_file.$_ci_file; + $file_exists = TRUE; + break; + } + + if ( ! $cascade) + { + break; + } + } + } + + if ( ! $file_exists && ! file_exists($_ci_path)) + { + show_error('Unable to load the requested file: '.$_ci_file); + } + + // This allows anything loaded using $this->load (views, files, etc.) + // to become accessible from within the Controller and Model functions. + $_ci_CI =& get_instance(); + foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var) + { + if ( ! isset($this->$_ci_key)) + { + $this->$_ci_key =& $_ci_CI->$_ci_key; + } + } + + /* + * Extract and cache variables + * + * You can either set variables using the dedicated $this->load->vars() + * function or via the second parameter of this function. We'll merge + * the two types and cache them so that views that are embedded within + * other views can have access to these variables. + */ + if (is_array($_ci_vars)) + { + foreach (array_keys($_ci_vars) as $key) + { + if (strncmp($key, '_ci_', 4) === 0) + { + unset($_ci_vars[$key]); + } + } + + $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars); + } + extract($this->_ci_cached_vars); + + /* + * Buffer the output + * + * We buffer the output for two reasons: + * 1. Speed. You get a significant speed boost. + * 2. So that the final rendered template can be post-processed by + * the output class. Why do we need post processing? For one thing, + * in order to show the elapsed page load time. Unless we can + * intercept the content right before it's sent to the browser and + * then stop the timer it won't be accurate. + */ + ob_start(); + + // If the PHP installation does not support short tags we'll + // do a little string replacement, changing the short tags + // to standard PHP echo statements. + if ( ! is_php('5.4') && ! ini_get('short_open_tag') && config_item('rewrite_short_tags') === TRUE) + { + echo eval('?>'.preg_replace('/;*\s*\?>/', '; ?>', str_replace(' $this->_ci_ob_level + 1) + { + ob_end_flush(); + } + else + { + $_ci_CI->output->append_output(ob_get_contents()); + @ob_end_clean(); + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Internal CI Library Loader + * + * @used-by CI_Loader::library() + * @uses CI_Loader::_ci_init_library() + * + * @param string $class Class name to load + * @param mixed $params Optional parameters to pass to the class constructor + * @param string $object_name Optional object name to assign to + * @return void + */ + protected function _ci_load_library($class, $params = NULL, $object_name = NULL) + { + // Get the class name, and while we're at it trim any slashes. + // The directory path can be included as part of the class name, + // but we don't want a leading slash + $class = str_replace('.php', '', trim($class, '/')); + + // Was the path included with the class name? + // We look for a slash to determine this + if (($last_slash = strrpos($class, '/')) !== FALSE) + { + // Extract the path + $subdir = substr($class, 0, ++$last_slash); + + // Get the filename from the path + $class = substr($class, $last_slash); + } + else + { + $subdir = ''; + } + + $class = ucfirst($class); + + // Is this a stock library? There are a few special conditions if so ... + if (file_exists(BASEPATH.'libraries/'.$subdir.$class.'.php')) + { + return $this->_ci_load_stock_library($class, $subdir, $params, $object_name); + } + + // Let's search for the requested library file and load it. + foreach ($this->_ci_library_paths as $path) + { + // BASEPATH has already been checked for + if ($path === BASEPATH) + { + continue; + } + + $filepath = $path.'libraries/'.$subdir.$class.'.php'; + + // Safety: Was the class already loaded by a previous call? + if (class_exists($class, FALSE)) + { + // Before we deem this to be a duplicate request, let's see + // if a custom object name is being supplied. If so, we'll + // return a new instance of the object + if ($object_name !== NULL) + { + $CI =& get_instance(); + if ( ! isset($CI->$object_name)) + { + return $this->_ci_init_library($class, '', $params, $object_name); + } + } + + log_message('debug', $class.' class already loaded. Second attempt ignored.'); + return; + } + // Does the file exist? No? Bummer... + elseif ( ! file_exists($filepath)) + { + continue; + } + + include_once($filepath); + return $this->_ci_init_library($class, '', $params, $object_name); + } + + // One last attempt. Maybe the library is in a subdirectory, but it wasn't specified? + if ($subdir === '') + { + return $this->_ci_load_library($class.'/'.$class, $params, $object_name); + } + + // If we got this far we were unable to find the requested class. + log_message('error', 'Unable to load the requested class: '.$class); + show_error('Unable to load the requested class: '.$class); + } + + // -------------------------------------------------------------------- + + /** + * Internal CI Stock Library Loader + * + * @used-by CI_Loader::_ci_load_library() + * @uses CI_Loader::_ci_init_library() + * + * @param string $library Library name to load + * @param string $file_path Path to the library filename, relative to libraries/ + * @param mixed $params Optional parameters to pass to the class constructor + * @param string $object_name Optional object name to assign to + * @return void + */ + protected function _ci_load_stock_library($library_name, $file_path, $params, $object_name) + { + $prefix = 'CI_'; + + if (class_exists($prefix.$library_name, FALSE)) + { + if (class_exists(config_item('subclass_prefix').$library_name, FALSE)) + { + $prefix = config_item('subclass_prefix'); + } + + // Before we deem this to be a duplicate request, let's see + // if a custom object name is being supplied. If so, we'll + // return a new instance of the object + if ($object_name !== NULL) + { + $CI =& get_instance(); + if ( ! isset($CI->$object_name)) + { + return $this->_ci_init_library($library_name, $prefix, $params, $object_name); + } + } + + log_message('debug', $library_name.' class already loaded. Second attempt ignored.'); + return; + } + + $paths = $this->_ci_library_paths; + array_pop($paths); // BASEPATH + array_pop($paths); // APPPATH (needs to be the first path checked) + array_unshift($paths, APPPATH); + + foreach ($paths as $path) + { + if (file_exists($path = $path.'libraries/'.$file_path.$library_name.'.php')) + { + // Override + include_once($path); + if (class_exists($prefix.$library_name, FALSE)) + { + return $this->_ci_init_library($library_name, $prefix, $params, $object_name); + } + else + { + log_message('debug', $path.' exists, but does not declare '.$prefix.$library_name); + } + } + } + + include_once(BASEPATH.'libraries/'.$file_path.$library_name.'.php'); + + // Check for extensions + $subclass = config_item('subclass_prefix').$library_name; + foreach ($paths as $path) + { + if (file_exists($path = $path.'libraries/'.$file_path.$subclass.'.php')) + { + include_once($path); + if (class_exists($subclass, FALSE)) + { + $prefix = config_item('subclass_prefix'); + break; + } + else + { + log_message('debug', $path.' exists, but does not declare '.$subclass); + } + } + } + + return $this->_ci_init_library($library_name, $prefix, $params, $object_name); + } + + // -------------------------------------------------------------------- + + /** + * Internal CI Library Instantiator + * + * @used-by CI_Loader::_ci_load_stock_library() + * @used-by CI_Loader::_ci_load_library() + * + * @param string $class Class name + * @param string $prefix Class name prefix + * @param array|null|bool $config Optional configuration to pass to the class constructor: + * FALSE to skip; + * NULL to search in config paths; + * array containing configuration data + * @param string $object_name Optional object name to assign to + * @return void + */ + protected function _ci_init_library($class, $prefix, $config = FALSE, $object_name = NULL) + { + // Is there an associated config file for this class? Note: these should always be lowercase + if ($config === NULL) + { + // Fetch the config paths containing any package paths + $config_component = $this->_ci_get_component('config'); + + if (is_array($config_component->_config_paths)) + { + $found = FALSE; + foreach ($config_component->_config_paths as $path) + { + // We test for both uppercase and lowercase, for servers that + // are case-sensitive with regard to file names. Load global first, + // override with environment next + if (file_exists($path.'config/'.strtolower($class).'.php')) + { + include($path.'config/'.strtolower($class).'.php'); + $found = TRUE; + } + elseif (file_exists($path.'config/'.ucfirst(strtolower($class)).'.php')) + { + include($path.'config/'.ucfirst(strtolower($class)).'.php'); + $found = TRUE; + } + + if (file_exists($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php')) + { + include($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php'); + $found = TRUE; + } + elseif (file_exists($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php')) + { + include($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php'); + $found = TRUE; + } + + // Break on the first found configuration, thus package + // files are not overridden by default paths + if ($found === TRUE) + { + break; + } + } + } + } + + $class_name = $prefix.$class; + + // Is the class name valid? + if ( ! class_exists($class_name, FALSE)) + { + log_message('error', 'Non-existent class: '.$class_name); + show_error('Non-existent class: '.$class_name); + } + + // Set the variable name we will assign the class to + // Was a custom class name supplied? If so we'll use it + if (empty($object_name)) + { + $object_name = strtolower($class); + if (isset($this->_ci_varmap[$object_name])) + { + $object_name = $this->_ci_varmap[$object_name]; + } + } + + // Don't overwrite existing properties + $CI =& get_instance(); + if (isset($CI->$object_name)) + { + if ($CI->$object_name instanceof $class_name) + { + log_message('debug', $class_name." has already been instantiated as '".$object_name."'. Second attempt aborted."); + return; + } + + show_error("Resource '".$object_name."' already exists and is not a ".$class_name." instance."); + } + + // Save the class name and object name + $this->_ci_classes[$object_name] = $class; + + // Instantiate the class + $CI->$object_name = isset($config) + ? new $class_name($config) + : new $class_name(); + } + + // -------------------------------------------------------------------- + + /** + * CI Autoloader + * + * Loads component listed in the config/autoload.php file. + * + * @used-by CI_Loader::initialize() + * @return void + */ + protected function _ci_autoloader() + { + if (file_exists(APPPATH.'config/autoload.php')) + { + include(APPPATH.'config/autoload.php'); + } + + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'); + } + + if ( ! isset($autoload)) + { + return; + } + + // Autoload packages + if (isset($autoload['packages'])) + { + foreach ($autoload['packages'] as $package_path) + { + $this->add_package_path($package_path); + } + } + + // Load any custom config file + if (count($autoload['config']) > 0) + { + foreach ($autoload['config'] as $val) + { + $this->config($val); + } + } + + // Autoload helpers and languages + foreach (array('helper', 'language') as $type) + { + if (isset($autoload[$type]) && count($autoload[$type]) > 0) + { + $this->$type($autoload[$type]); + } + } + + // Autoload drivers + if (isset($autoload['drivers'])) + { + $this->driver($autoload['drivers']); + } + + // Load libraries + if (isset($autoload['libraries']) && count($autoload['libraries']) > 0) + { + // Load the database driver. + if (in_array('database', $autoload['libraries'])) + { + $this->database(); + $autoload['libraries'] = array_diff($autoload['libraries'], array('database')); + } + + // Load all other libraries + $this->library($autoload['libraries']); + } + + // Autoload models + if (isset($autoload['model'])) + { + $this->model($autoload['model']); + } + } + + // -------------------------------------------------------------------- + + /** + * CI Object to Array translator + * + * Takes an object as input and converts the class variables to + * an associative array with key/value pairs. + * + * @param object $object Object data to translate + * @return array + */ + protected function _ci_object_to_array($object) + { + return is_object($object) ? get_object_vars($object) : $object; + } + + // -------------------------------------------------------------------- + + /** + * CI Component getter + * + * Get a reference to a specific library or model. + * + * @param string $component Component name + * @return bool + */ + protected function &_ci_get_component($component) + { + $CI =& get_instance(); + return $CI->$component; + } + + // -------------------------------------------------------------------- + + /** + * Prep filename + * + * This function prepares filenames of various items to + * make their loading more reliable. + * + * @param string|string[] $filename Filename(s) + * @param string $extension Filename extension + * @return array + */ + protected function _ci_prep_filename($filename, $extension) + { + if ( ! is_array($filename)) + { + return array(strtolower(str_replace(array($extension, '.php'), '', $filename).$extension)); + } + else + { + foreach ($filename as $key => $val) + { + $filename[$key] = strtolower(str_replace(array($extension, '.php'), '', $val).$extension); + } + + return $filename; + } + } + +} diff --git a/system/core/Log.php b/system/core/Log.php new file mode 100644 index 0000000..1abdaa0 --- /dev/null +++ b/system/core/Log.php @@ -0,0 +1,247 @@ + 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4); + + // -------------------------------------------------------------------- + + /** + * Class constructor + * + * @return void + */ + public function __construct() + { + $config =& get_config(); + + $this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/'; + $this->_file_ext = (isset($config['log_file_extension']) && $config['log_file_extension'] !== '') + ? ltrim($config['log_file_extension'], '.') : 'php'; + + file_exists($this->_log_path) OR mkdir($this->_log_path, 0755, TRUE); + + if ( ! is_dir($this->_log_path) OR ! is_really_writable($this->_log_path)) + { + $this->_enabled = FALSE; + } + + if (is_numeric($config['log_threshold'])) + { + $this->_threshold = (int) $config['log_threshold']; + } + elseif (is_array($config['log_threshold'])) + { + $this->_threshold = 0; + $this->_threshold_array = array_flip($config['log_threshold']); + } + + if ( ! empty($config['log_date_format'])) + { + $this->_date_fmt = $config['log_date_format']; + } + + if ( ! empty($config['log_file_permissions']) && is_int($config['log_file_permissions'])) + { + $this->_file_permissions = $config['log_file_permissions']; + } + } + + // -------------------------------------------------------------------- + + /** + * Write Log File + * + * Generally this function will be called using the global log_message() function + * + * @param string $level The error level: 'error', 'debug' or 'info' + * @param string $msg The error message + * @return bool + */ + public function write_log($level, $msg) + { + if ($this->_enabled === FALSE) + { + return FALSE; + } + + $level = strtoupper($level); + + if (( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold)) + && ! isset($this->_threshold_array[$this->_levels[$level]])) + { + return FALSE; + } + + $filepath = $this->_log_path.'log-'.date('Y-m-d').'.'.$this->_file_ext; + $message = ''; + + if ( ! file_exists($filepath)) + { + $newfile = TRUE; + // Only add protection to php files + if ($this->_file_ext === 'php') + { + $message .= "\n\n"; + } + } + + if ( ! $fp = @fopen($filepath, 'ab')) + { + return FALSE; + } + + flock($fp, LOCK_EX); + + // Instantiating DateTime with microseconds appended to initial date is needed for proper support of this format + if (strpos($this->_date_fmt, 'u') !== FALSE) + { + $microtime_full = microtime(TRUE); + $microtime_short = sprintf("%06d", ($microtime_full - floor($microtime_full)) * 1000000); + $date = new DateTime(date('Y-m-d H:i:s.'.$microtime_short, $microtime_full)); + $date = $date->format($this->_date_fmt); + } + else + { + $date = date($this->_date_fmt); + } + + $message .= $this->_format_line($level, $date, $msg); + + for ($written = 0, $length = strlen($message); $written < $length; $written += $result) + { + if (($result = fwrite($fp, substr($message, $written))) === FALSE) + { + break; + } + } + + flock($fp, LOCK_UN); + fclose($fp); + + if (isset($newfile) && $newfile === TRUE) + { + chmod($filepath, $this->_file_permissions); + } + + return is_int($result); + } + + // -------------------------------------------------------------------- + + /** + * Format the log line. + * + * This is for extensibility of log formatting + * If you want to change the log format, extend the CI_Log class and override this method + * + * @param string $level The error level + * @param string $date Formatted date string + * @param string $msg The log message + * @return string Formatted log line with a new line character '\n' at the end + */ + protected function _format_line($level, $date, $message) + { + return $level.' - '.$date.' --> '.$message."\n"; + } +} diff --git a/system/core/Model.php b/system/core/Model.php new file mode 100644 index 0000000..941881a --- /dev/null +++ b/system/core/Model.php @@ -0,0 +1,80 @@ +$key; + } + +} diff --git a/system/core/Output.php b/system/core/Output.php new file mode 100644 index 0000000..ec9c21b --- /dev/null +++ b/system/core/Output.php @@ -0,0 +1,800 @@ +_zlib_oc = (bool) ini_get('zlib.output_compression'); + $this->_compress_output = ( + $this->_zlib_oc === FALSE + && config_item('compress_output') === TRUE + && extension_loaded('zlib') + ); + + // Get mime types for later + $this->mimes =& get_mimes(); + + log_message('info', 'Output Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Get Output + * + * Returns the current output string. + * + * @return string + */ + public function get_output() + { + return $this->final_output; + } + + // -------------------------------------------------------------------- + + /** + * Set Output + * + * Sets the output string. + * + * @param string $output Output data + * @return CI_Output + */ + public function set_output($output) + { + $this->final_output = $output; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Append Output + * + * Appends data onto the output string. + * + * @param string $output Data to append + * @return CI_Output + */ + public function append_output($output) + { + $this->final_output .= $output; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Header + * + * Lets you set a server header which will be sent with the final output. + * + * Note: If a file is cached, headers will not be sent. + * @todo We need to figure out how to permit headers to be cached. + * + * @param string $header Header + * @param bool $replace Whether to replace the old header value, if already set + * @return CI_Output + */ + public function set_header($header, $replace = TRUE) + { + // If zlib.output_compression is enabled it will compress the output, + // but it will not modify the content-length header to compensate for + // the reduction, causing the browser to hang waiting for more data. + // We'll just skip content-length in those cases. + if ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) === 0) + { + return $this; + } + + $this->headers[] = array($header, $replace); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Content-Type Header + * + * @param string $mime_type Extension of the file we're outputting + * @param string $charset Character set (default: NULL) + * @return CI_Output + */ + public function set_content_type($mime_type, $charset = NULL) + { + if (strpos($mime_type, '/') === FALSE) + { + $extension = ltrim($mime_type, '.'); + + // Is this extension supported? + if (isset($this->mimes[$extension])) + { + $mime_type =& $this->mimes[$extension]; + + if (is_array($mime_type)) + { + $mime_type = current($mime_type); + } + } + } + + $this->mime_type = $mime_type; + + if (empty($charset)) + { + $charset = config_item('charset'); + } + + $header = 'Content-Type: '.$mime_type + .(empty($charset) ? '' : '; charset='.$charset); + + $this->headers[] = array($header, TRUE); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Get Current Content-Type Header + * + * @return string 'text/html', if not already set + */ + public function get_content_type() + { + for ($i = 0, $c = count($this->headers); $i < $c; $i++) + { + if (sscanf($this->headers[$i][0], 'Content-Type: %[^;]', $content_type) === 1) + { + return $content_type; + } + } + + return 'text/html'; + } + + // -------------------------------------------------------------------- + + /** + * Get Header + * + * @param string $header_name + * @return string + */ + public function get_header($header) + { + // Combine headers already sent with our batched headers + $headers = array_merge( + // We only need [x][0] from our multi-dimensional array + array_map('array_shift', $this->headers), + headers_list() + ); + + if (empty($headers) OR empty($header)) + { + return NULL; + } + + for ($i = 0, $c = count($headers); $i < $c; $i++) + { + if (strncasecmp($header, $headers[$i], $l = strlen($header)) === 0) + { + return trim(substr($headers[$i], $l+1)); + } + } + + return NULL; + } + + // -------------------------------------------------------------------- + + /** + * Set HTTP Status Header + * + * As of version 1.7.2, this is an alias for common function + * set_status_header(). + * + * @param int $code Status code (default: 200) + * @param string $text Optional message + * @return CI_Output + */ + public function set_status_header($code = 200, $text = '') + { + set_status_header($code, $text); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Enable/disable Profiler + * + * @param bool $val TRUE to enable or FALSE to disable + * @return CI_Output + */ + public function enable_profiler($val = TRUE) + { + $this->enable_profiler = is_bool($val) ? $val : TRUE; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Profiler Sections + * + * Allows override of default/config settings for + * Profiler section display. + * + * @param array $sections Profiler sections + * @return CI_Output + */ + public function set_profiler_sections($sections) + { + if (isset($sections['query_toggle_count'])) + { + $this->_profiler_sections['query_toggle_count'] = (int) $sections['query_toggle_count']; + unset($sections['query_toggle_count']); + } + + foreach ($sections as $section => $enable) + { + $this->_profiler_sections[$section] = ($enable !== FALSE); + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Cache + * + * @param int $time Cache expiration time in minutes + * @return CI_Output + */ + public function cache($time) + { + $this->cache_expiration = is_numeric($time) ? $time : 0; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Display Output + * + * Processes and sends finalized output data to the browser along + * with any server headers and profile data. It also stops benchmark + * timers so the page rendering speed and memory usage can be shown. + * + * Note: All "view" data is automatically put into $this->final_output + * by controller class. + * + * @uses CI_Output::$final_output + * @param string $output Output data override + * @return void + */ + public function _display($output = '') + { + // Note: We use load_class() because we can't use $CI =& get_instance() + // since this function is sometimes called by the caching mechanism, + // which happens before the CI super object is available. + $BM =& load_class('Benchmark', 'core'); + $CFG =& load_class('Config', 'core'); + + // Grab the super object if we can. + if (class_exists('CI_Controller', FALSE)) + { + $CI =& get_instance(); + } + + // -------------------------------------------------------------------- + + // Set the output data + if ($output === '') + { + $output =& $this->final_output; + } + + // -------------------------------------------------------------------- + + // Do we need to write a cache file? Only if the controller does not have its + // own _output() method and we are not dealing with a cache file, which we + // can determine by the existence of the $CI object above + if ($this->cache_expiration > 0 && isset($CI) && ! method_exists($CI, '_output')) + { + $this->_write_cache($output); + } + + // -------------------------------------------------------------------- + + // Parse out the elapsed time and memory usage, + // then swap the pseudo-variables with the data + + $elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end'); + + if ($this->parse_exec_vars === TRUE) + { + $memory = round(memory_get_usage() / 1024 / 1024, 2).'MB'; + $output = str_replace(array('{elapsed_time}', '{memory_usage}'), array($elapsed, $memory), $output); + } + + // -------------------------------------------------------------------- + + // Is compression requested? + if (isset($CI) // This means that we're not serving a cache file, if we were, it would already be compressed + && $this->_compress_output === TRUE + && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) + { + ob_start('ob_gzhandler'); + } + + // -------------------------------------------------------------------- + + // Are there any server headers to send? + if (count($this->headers) > 0) + { + foreach ($this->headers as $header) + { + @header($header[0], $header[1]); + } + } + + // -------------------------------------------------------------------- + + // Does the $CI object exist? + // If not we know we are dealing with a cache file so we'll + // simply echo out the data and exit. + if ( ! isset($CI)) + { + if ($this->_compress_output === TRUE) + { + if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) + { + header('Content-Encoding: gzip'); + header('Content-Length: '.strlen($output)); + } + else + { + // User agent doesn't support gzip compression, + // so we'll have to decompress our cache + $output = gzinflate(substr($output, 10, -8)); + } + } + + echo $output; + log_message('info', 'Final output sent to browser'); + log_message('debug', 'Total execution time: '.$elapsed); + return; + } + + // -------------------------------------------------------------------- + + // Do we need to generate profile data? + // If so, load the Profile class and run it. + if ($this->enable_profiler === TRUE) + { + $CI->load->library('profiler'); + if ( ! empty($this->_profiler_sections)) + { + $CI->profiler->set_sections($this->_profiler_sections); + } + + // If the output data contains closing and tags + // we will remove them and add them back after we insert the profile data + $output = preg_replace('|.*?|is', '', $output, -1, $count).$CI->profiler->run(); + if ($count > 0) + { + $output .= ''; + } + } + + // Does the controller contain a function named _output()? + // If so send the output there. Otherwise, echo it. + if (method_exists($CI, '_output')) + { + $CI->_output($output); + } + else + { + echo $output; // Send it to the browser! + } + + log_message('info', 'Final output sent to browser'); + log_message('debug', 'Total execution time: '.$elapsed); + } + + // -------------------------------------------------------------------- + + /** + * Write Cache + * + * @param string $output Output data to cache + * @return void + */ + public function _write_cache($output) + { + $CI =& get_instance(); + $path = $CI->config->item('cache_path'); + $cache_path = ($path === '') ? APPPATH.'cache/' : $path; + + if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path)) + { + log_message('error', 'Unable to write cache file: '.$cache_path); + return; + } + + $uri = $CI->config->item('base_url') + .$CI->config->item('index_page') + .$CI->uri->uri_string(); + + if (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])) + { + if (is_array($cache_query_string)) + { + $uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string))); + } + else + { + $uri .= '?'.$_SERVER['QUERY_STRING']; + } + } + + $cache_path .= md5($uri); + + if ( ! $fp = @fopen($cache_path, 'w+b')) + { + log_message('error', 'Unable to write cache file: '.$cache_path); + return; + } + + if (flock($fp, LOCK_EX)) + { + // If output compression is enabled, compress the cache + // itself, so that we don't have to do that each time + // we're serving it + if ($this->_compress_output === TRUE) + { + $output = gzencode($output); + + if ($this->get_header('content-type') === NULL) + { + $this->set_content_type($this->mime_type); + } + } + + $expire = time() + ($this->cache_expiration * 60); + + // Put together our serialized info. + $cache_info = serialize(array( + 'expire' => $expire, + 'headers' => $this->headers + )); + + $output = $cache_info.'ENDCI--->'.$output; + + for ($written = 0, $length = strlen($output); $written < $length; $written += $result) + { + if (($result = fwrite($fp, substr($output, $written))) === FALSE) + { + break; + } + } + + flock($fp, LOCK_UN); + } + else + { + log_message('error', 'Unable to secure a file lock for file at: '.$cache_path); + return; + } + + fclose($fp); + + if (is_int($result)) + { + chmod($cache_path, 0640); + log_message('debug', 'Cache file written: '.$cache_path); + + // Send HTTP cache-control headers to browser to match file cache settings. + $this->set_cache_header($_SERVER['REQUEST_TIME'], $expire); + } + else + { + @unlink($cache_path); + log_message('error', 'Unable to write the complete cache content at: '.$cache_path); + } + } + + // -------------------------------------------------------------------- + + /** + * Update/serve cached output + * + * @uses CI_Config + * @uses CI_URI + * + * @param object &$CFG CI_Config class instance + * @param object &$URI CI_URI class instance + * @return bool TRUE on success or FALSE on failure + */ + public function _display_cache(&$CFG, &$URI) + { + $cache_path = ($CFG->item('cache_path') === '') ? APPPATH.'cache/' : $CFG->item('cache_path'); + + // Build the file path. The file name is an MD5 hash of the full URI + $uri = $CFG->item('base_url').$CFG->item('index_page').$URI->uri_string; + + if (($cache_query_string = $CFG->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])) + { + if (is_array($cache_query_string)) + { + $uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string))); + } + else + { + $uri .= '?'.$_SERVER['QUERY_STRING']; + } + } + + $filepath = $cache_path.md5($uri); + + if ( ! file_exists($filepath) OR ! $fp = @fopen($filepath, 'rb')) + { + return FALSE; + } + + flock($fp, LOCK_SH); + + $cache = (filesize($filepath) > 0) ? fread($fp, filesize($filepath)) : ''; + + flock($fp, LOCK_UN); + fclose($fp); + + // Look for embedded serialized file info. + if ( ! preg_match('/^(.*)ENDCI--->/', $cache, $match)) + { + return FALSE; + } + + $cache_info = unserialize($match[1]); + $expire = $cache_info['expire']; + + $last_modified = filemtime($filepath); + + // Has the file expired? + if ($_SERVER['REQUEST_TIME'] >= $expire && is_really_writable($cache_path)) + { + // If so we'll delete it. + @unlink($filepath); + log_message('debug', 'Cache file has expired. File deleted.'); + return FALSE; + } + else + { + // Or else send the HTTP cache control headers. + $this->set_cache_header($last_modified, $expire); + } + + // Add headers from cache file. + foreach ($cache_info['headers'] as $header) + { + $this->set_header($header[0], $header[1]); + } + + // Display the cache + $this->_display(substr($cache, strlen($match[0]))); + log_message('debug', 'Cache file is current. Sending it to browser.'); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Delete cache + * + * @param string $uri URI string + * @return bool + */ + public function delete_cache($uri = '') + { + $CI =& get_instance(); + $cache_path = $CI->config->item('cache_path'); + if ($cache_path === '') + { + $cache_path = APPPATH.'cache/'; + } + + if ( ! is_dir($cache_path)) + { + log_message('error', 'Unable to find cache path: '.$cache_path); + return FALSE; + } + + if (empty($uri)) + { + $uri = $CI->uri->uri_string(); + + if (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])) + { + if (is_array($cache_query_string)) + { + $uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string))); + } + else + { + $uri .= '?'.$_SERVER['QUERY_STRING']; + } + } + } + + $cache_path .= md5($CI->config->item('base_url').$CI->config->item('index_page').ltrim($uri, '/')); + + if ( ! @unlink($cache_path)) + { + log_message('error', 'Unable to delete cache file for '.$uri); + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Set Cache Header + * + * Set the HTTP headers to match the server-side file cache settings + * in order to reduce bandwidth. + * + * @param int $last_modified Timestamp of when the page was last modified + * @param int $expiration Timestamp of when should the requested page expire from cache + * @return void + */ + public function set_cache_header($last_modified, $expiration) + { + $max_age = $expiration - $_SERVER['REQUEST_TIME']; + + if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) + { + $this->set_status_header(304); + exit; + } + else + { + header('Pragma: public'); + header('Cache-Control: max-age='.$max_age.', public'); + header('Expires: '.gmdate('D, d M Y H:i:s', $expiration).' GMT'); + header('Last-modified: '.gmdate('D, d M Y H:i:s', $last_modified).' GMT'); + } + } + +} diff --git a/system/core/Router.php b/system/core/Router.php new file mode 100644 index 0000000..045d366 --- /dev/null +++ b/system/core/Router.php @@ -0,0 +1,515 @@ +config =& load_class('Config', 'core'); + $this->uri =& load_class('URI', 'core'); + + $this->enable_query_strings = ( ! is_cli() && $this->config->item('enable_query_strings') === TRUE); + + // If a directory override is configured, it has to be set before any dynamic routing logic + is_array($routing) && isset($routing['directory']) && $this->set_directory($routing['directory']); + $this->_set_routing(); + + // Set any routing overrides that may exist in the main index file + if (is_array($routing)) + { + empty($routing['controller']) OR $this->set_class($routing['controller']); + empty($routing['function']) OR $this->set_method($routing['function']); + } + + log_message('info', 'Router Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Set route mapping + * + * Determines what should be served based on the URI request, + * as well as any "routes" that have been set in the routing config file. + * + * @return void + */ + protected function _set_routing() + { + // Load the routes.php file. It would be great if we could + // skip this for enable_query_strings = TRUE, but then + // default_controller would be empty ... + if (file_exists(APPPATH.'config/routes.php')) + { + include(APPPATH.'config/routes.php'); + } + + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/routes.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/routes.php'); + } + + // Validate & get reserved routes + if (isset($route) && is_array($route)) + { + isset($route['default_controller']) && $this->default_controller = $route['default_controller']; + isset($route['translate_uri_dashes']) && $this->translate_uri_dashes = $route['translate_uri_dashes']; + unset($route['default_controller'], $route['translate_uri_dashes']); + $this->routes = $route; + } + + // Are query strings enabled in the config file? Normally CI doesn't utilize query strings + // since URI segments are more search-engine friendly, but they can optionally be used. + // If this feature is enabled, we will gather the directory/class/method a little differently + if ($this->enable_query_strings) + { + // If the directory is set at this time, it means an override exists, so skip the checks + if ( ! isset($this->directory)) + { + $_d = $this->config->item('directory_trigger'); + $_d = isset($_GET[$_d]) ? trim($_GET[$_d], " \t\n\r\0\x0B/") : ''; + + if ($_d !== '') + { + $this->uri->filter_uri($_d); + $this->set_directory($_d); + } + } + + $_c = trim($this->config->item('controller_trigger')); + if ( ! empty($_GET[$_c])) + { + $this->uri->filter_uri($_GET[$_c]); + $this->set_class($_GET[$_c]); + + $_f = trim($this->config->item('function_trigger')); + if ( ! empty($_GET[$_f])) + { + $this->uri->filter_uri($_GET[$_f]); + $this->set_method($_GET[$_f]); + } + + $this->uri->rsegments = array( + 1 => $this->class, + 2 => $this->method + ); + } + else + { + $this->_set_default_controller(); + } + + // Routing rules don't apply to query strings and we don't need to detect + // directories, so we're done here + return; + } + + // Is there anything to parse? + if ($this->uri->uri_string !== '') + { + $this->_parse_routes(); + } + else + { + $this->_set_default_controller(); + } + } + + // -------------------------------------------------------------------- + + /** + * Set request route + * + * Takes an array of URI segments as input and sets the class/method + * to be called. + * + * @used-by CI_Router::_parse_routes() + * @param array $segments URI segments + * @return void + */ + protected function _set_request($segments = array()) + { + $segments = $this->_validate_request($segments); + // If we don't have any segments left - try the default controller; + // WARNING: Directories get shifted out of the segments array! + if (empty($segments)) + { + $this->_set_default_controller(); + return; + } + + if ($this->translate_uri_dashes === TRUE) + { + $segments[0] = str_replace('-', '_', $segments[0]); + if (isset($segments[1])) + { + $segments[1] = str_replace('-', '_', $segments[1]); + } + } + + $this->set_class($segments[0]); + if (isset($segments[1])) + { + $this->set_method($segments[1]); + } + else + { + $segments[1] = 'index'; + } + + array_unshift($segments, NULL); + unset($segments[0]); + $this->uri->rsegments = $segments; + } + + // -------------------------------------------------------------------- + + /** + * Set default controller + * + * @return void + */ + protected function _set_default_controller() + { + if (empty($this->default_controller)) + { + show_error('Unable to determine what should be displayed. A default route has not been specified in the routing file.'); + } + + // Is the method being specified? + if (sscanf($this->default_controller, '%[^/]/%s', $class, $method) !== 2) + { + $method = 'index'; + } + + if ( ! file_exists(APPPATH.'controllers/'.$this->directory.ucfirst($class).'.php')) + { + // This will trigger 404 later + return; + } + + $this->set_class($class); + $this->set_method($method); + + // Assign routed segments, index starting from 1 + $this->uri->rsegments = array( + 1 => $class, + 2 => $method + ); + + log_message('debug', 'No URI present. Default controller set.'); + } + + // -------------------------------------------------------------------- + + /** + * Validate request + * + * Attempts validate the URI request and determine the controller path. + * + * @used-by CI_Router::_set_request() + * @param array $segments URI segments + * @return mixed URI segments + */ + protected function _validate_request($segments) + { + $c = count($segments); + $directory_override = isset($this->directory); + + // Loop through our segments and return as soon as a controller + // is found or when such a directory doesn't exist + while ($c-- > 0) + { + $test = $this->directory + .ucfirst($this->translate_uri_dashes === TRUE ? str_replace('-', '_', $segments[0]) : $segments[0]); + + if ( ! file_exists(APPPATH.'controllers/'.$test.'.php') + && $directory_override === FALSE + && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]) + ) + { + $this->set_directory(array_shift($segments), TRUE); + continue; + } + + return $segments; + } + + // This means that all segments were actually directories + return $segments; + } + + // -------------------------------------------------------------------- + + /** + * Parse Routes + * + * Matches any routes that may exist in the config/routes.php file + * against the URI to determine if the class/method need to be remapped. + * + * @return void + */ + protected function _parse_routes() + { + // Turn the segment array into a URI string + $uri = implode('/', $this->uri->segments); + + // Get HTTP verb + $http_verb = isset($_SERVER['REQUEST_METHOD']) ? strtolower($_SERVER['REQUEST_METHOD']) : 'cli'; + + // Loop through the route array looking for wildcards + foreach ($this->routes as $key => $val) + { + // Check if route format is using HTTP verbs + if (is_array($val)) + { + $val = array_change_key_case($val, CASE_LOWER); + if (isset($val[$http_verb])) + { + $val = $val[$http_verb]; + } + else + { + continue; + } + } + + // Convert wildcards to RegEx + $key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key); + + // Does the RegEx match? + if (preg_match('#^'.$key.'$#', $uri, $matches)) + { + // Are we using callbacks to process back-references? + if ( ! is_string($val) && is_callable($val)) + { + // Remove the original string from the matches array. + array_shift($matches); + + // Execute the callback using the values in matches as its parameters. + $val = call_user_func_array($val, $matches); + } + // Are we using the default routing method for back-references? + elseif (strpos($val, '$') !== FALSE && strpos($key, '(') !== FALSE) + { + $val = preg_replace('#^'.$key.'$#', $val, $uri); + } + + $this->_set_request(explode('/', $val)); + return; + } + } + + // If we got this far it means we didn't encounter a + // matching route so we'll set the site default route + $this->_set_request(array_values($this->uri->segments)); + } + + // -------------------------------------------------------------------- + + /** + * Set class name + * + * @param string $class Class name + * @return void + */ + public function set_class($class) + { + $this->class = str_replace(array('/', '.'), '', $class); + } + + // -------------------------------------------------------------------- + + /** + * Fetch the current class + * + * @deprecated 3.0.0 Read the 'class' property instead + * @return string + */ + public function fetch_class() + { + return $this->class; + } + + // -------------------------------------------------------------------- + + /** + * Set method name + * + * @param string $method Method name + * @return void + */ + public function set_method($method) + { + $this->method = $method; + } + + // -------------------------------------------------------------------- + + /** + * Fetch the current method + * + * @deprecated 3.0.0 Read the 'method' property instead + * @return string + */ + public function fetch_method() + { + return $this->method; + } + + // -------------------------------------------------------------------- + + /** + * Set directory name + * + * @param string $dir Directory name + * @param bool $append Whether we're appending rather than setting the full value + * @return void + */ + public function set_directory($dir, $append = FALSE) + { + if ($append !== TRUE OR empty($this->directory)) + { + $this->directory = str_replace('.', '', trim($dir, '/')).'/'; + } + else + { + $this->directory .= str_replace('.', '', trim($dir, '/')).'/'; + } + } + + // -------------------------------------------------------------------- + + /** + * Fetch directory + * + * Feches the sub-directory (if any) that contains the requested + * controller class. + * + * @deprecated 3.0.0 Read the 'directory' property instead + * @return string + */ + public function fetch_directory() + { + return $this->directory; + } + +} diff --git a/system/core/Security.php b/system/core/Security.php new file mode 100644 index 0000000..d5305d1 --- /dev/null +++ b/system/core/Security.php @@ -0,0 +1,1053 @@ +', '<', '>', + "'", '"', '&', '$', '#', + '{', '}', '[', ']', '=', + ';', '?', '%20', '%22', + '%3c', // < + '%253c', // < + '%3e', // > + '%0e', // > + '%28', // ( + '%29', // ) + '%2528', // ( + '%26', // & + '%24', // $ + '%3f', // ? + '%3b', // ; + '%3d' // = + ); + + /** + * Character set + * + * Will be overridden by the constructor. + * + * @var string + */ + public $charset = 'UTF-8'; + + /** + * XSS Hash + * + * Random Hash for protecting URLs. + * + * @var string + */ + protected $_xss_hash; + + /** + * CSRF Hash + * + * Random hash for Cross Site Request Forgery protection cookie + * + * @var string + */ + protected $_csrf_hash; + + /** + * CSRF Expire time + * + * Expiration time for Cross Site Request Forgery protection cookie. + * Defaults to two hours (in seconds). + * + * @var int + */ + protected $_csrf_expire = 7200; + + /** + * CSRF Token name + * + * Token name for Cross Site Request Forgery protection cookie. + * + * @var string + */ + protected $_csrf_token_name = 'ci_csrf_token'; + + /** + * CSRF Cookie name + * + * Cookie name for Cross Site Request Forgery protection cookie. + * + * @var string + */ + protected $_csrf_cookie_name = 'ci_csrf_token'; + + /** + * List of never allowed strings + * + * @var array + */ + protected $_never_allowed_str = array( + 'document.cookie' => '[removed]', + 'document.write' => '[removed]', + '.parentNode' => '[removed]', + '.innerHTML' => '[removed]', + '-moz-binding' => '[removed]', + '' => '-->', + ' '<![CDATA[', + '' => '<comment>' + ); + + /** + * List of never allowed regex replacements + * + * @var array + */ + protected $_never_allowed_regex = array( + 'javascript\s*:', + '(document|(document\.)?window)\.(location|on\w*)', + 'expression\s*(\(|&\#40;)', // CSS and IE + 'vbscript\s*:', // IE, surprise! + 'wscript\s*:', // IE + 'jscript\s*:', // IE + 'vbs\s*:', // IE + 'Redirect\s+30\d', + "([\"'])?data\s*:[^\\1]*?base64[^\\1]*?,[^\\1]*?\\1?" + ); + + /** + * Class constructor + * + * @return void + */ + public function __construct() + { + // Is CSRF protection enabled? + if (config_item('csrf_protection')) + { + // CSRF config + foreach (array('csrf_expire', 'csrf_token_name', 'csrf_cookie_name') as $key) + { + if (NULL !== ($val = config_item($key))) + { + $this->{'_'.$key} = $val; + } + } + + // Append application specific cookie prefix + if ($cookie_prefix = config_item('cookie_prefix')) + { + $this->_csrf_cookie_name = $cookie_prefix.$this->_csrf_cookie_name; + } + + // Set the CSRF hash + $this->_csrf_set_hash(); + } + + $this->charset = strtoupper(config_item('charset')); + + log_message('info', 'Security Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * CSRF Verify + * + * @return CI_Security + */ + public function csrf_verify() + { + // If it's not a POST request we will set the CSRF cookie + if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'POST') + { + return $this->csrf_set_cookie(); + } + + // Check if URI has been whitelisted from CSRF checks + if ($exclude_uris = config_item('csrf_exclude_uris')) + { + $uri = load_class('URI', 'core'); + foreach ($exclude_uris as $excluded) + { + if (preg_match('#^'.$excluded.'$#i'.(UTF8_ENABLED ? 'u' : ''), $uri->uri_string())) + { + return $this; + } + } + } + + // Do the tokens exist in both the _POST and _COOKIE arrays? + if ( ! isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]) + OR $_POST[$this->_csrf_token_name] !== $_COOKIE[$this->_csrf_cookie_name]) // Do the tokens match? + { + $this->csrf_show_error(); + } + + // We kill this since we're done and we don't want to polute the _POST array + unset($_POST[$this->_csrf_token_name]); + + // Regenerate on every submission? + if (config_item('csrf_regenerate')) + { + // Nothing should last forever + unset($_COOKIE[$this->_csrf_cookie_name]); + $this->_csrf_hash = NULL; + } + + $this->_csrf_set_hash(); + $this->csrf_set_cookie(); + + log_message('info', 'CSRF token verified'); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * CSRF Set Cookie + * + * @codeCoverageIgnore + * @return CI_Security + */ + public function csrf_set_cookie() + { + $expire = time() + $this->_csrf_expire; + $secure_cookie = (bool) config_item('cookie_secure'); + + if ($secure_cookie && ! is_https()) + { + return FALSE; + } + + setcookie( + $this->_csrf_cookie_name, + $this->_csrf_hash, + $expire, + config_item('cookie_path'), + config_item('cookie_domain'), + $secure_cookie, + config_item('cookie_httponly') + ); + log_message('info', 'CSRF cookie sent'); + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Show CSRF Error + * + * @return void + */ + public function csrf_show_error() + { + show_error('The action you have requested is not allowed.', 403); + } + + // -------------------------------------------------------------------- + + /** + * Get CSRF Hash + * + * @see CI_Security::$_csrf_hash + * @return string CSRF hash + */ + public function get_csrf_hash() + { + return $this->_csrf_hash; + } + + // -------------------------------------------------------------------- + + /** + * Get CSRF Token Name + * + * @see CI_Security::$_csrf_token_name + * @return string CSRF token name + */ + public function get_csrf_token_name() + { + return $this->_csrf_token_name; + } + + // -------------------------------------------------------------------- + + /** + * XSS Clean + * + * Sanitizes data so that Cross Site Scripting Hacks can be + * prevented. This method does a fair amount of work but + * it is extremely thorough, designed to prevent even the + * most obscure XSS attempts. Nothing is ever 100% foolproof, + * of course, but I haven't been able to get anything passed + * the filter. + * + * Note: Should only be used to deal with data upon submission. + * It's not something that should be used for general + * runtime processing. + * + * @link http://channel.bitflux.ch/wiki/XSS_Prevention + * Based in part on some code and ideas from Bitflux. + * + * @link http://ha.ckers.org/xss.html + * To help develop this script I used this great list of + * vulnerabilities along with a few other hacks I've + * harvested from examining vulnerabilities in other programs. + * + * @param string|string[] $str Input data + * @param bool $is_image Whether the input is an image + * @return string + */ + public function xss_clean($str, $is_image = FALSE) + { + // Is the string an array? + if (is_array($str)) + { + while (list($key) = each($str)) + { + $str[$key] = $this->xss_clean($str[$key]); + } + + return $str; + } + + // Remove Invisible Characters + $str = remove_invisible_characters($str); + + /* + * URL Decode + * + * Just in case stuff like this is submitted: + * + * Google + * + * Note: Use rawurldecode() so it does not remove plus signs + */ + do + { + $str = rawurldecode($str); + } + while (preg_match('/%[0-9a-f]{2,}/i', $str)); + + /* + * Convert character entities to ASCII + * + * This permits our tests below to work reliably. + * We only convert entities that are within tags since + * these are the ones that will pose security problems. + */ + $str = preg_replace_callback("/[^a-z0-9>]+[a-z0-9]+=([\'\"]).*?\\1/si", array($this, '_convert_attribute'), $str); + $str = preg_replace_callback('/<\w+.*/si', array($this, '_decode_entity'), $str); + + // Remove Invisible Characters Again! + $str = remove_invisible_characters($str); + + /* + * Convert all tabs to spaces + * + * This prevents strings like this: ja vascript + * NOTE: we deal with spaces between characters later. + * NOTE: preg_replace was found to be amazingly slow here on + * large blocks of data, so we use str_replace. + */ + $str = str_replace("\t", ' ', $str); + + // Capture converted string for later comparison + $converted_string = $str; + + // Remove Strings that are never allowed + $str = $this->_do_never_allowed($str); + + /* + * Makes PHP tags safe + * + * Note: XML tags are inadvertently replaced too: + * + * '), array('<?', '?>'), $str); + } + + /* + * Compact any exploded words + * + * This corrects words like: j a v a s c r i p t + * These words are compacted back to their correct state. + */ + $words = array( + 'javascript', 'expression', 'vbscript', 'jscript', 'wscript', + 'vbs', 'script', 'base64', 'applet', 'alert', 'document', + 'write', 'cookie', 'window', 'confirm', 'prompt', 'eval' + ); + + foreach ($words as $word) + { + $word = implode('\s*', str_split($word)).'\s*'; + + // We only want to do this when it is followed by a non-word character + // That way valid stuff like "dealer to" does not become "dealerto" + $str = preg_replace_callback('#('.substr($word, 0, -3).')(\W)#is', array($this, '_compact_exploded_words'), $str); + } + + /* + * Remove disallowed Javascript in links or img tags + * We used to do some version comparisons and use of stripos(), + * but it is dog slow compared to these simplified non-capturing + * preg_match(), especially if the pattern exists in the string + * + * Note: It was reported that not only space characters, but all in + * the following pattern can be parsed as separators between a tag name + * and its attributes: [\d\s"\'`;,\/\=\(\x00\x0B\x09\x0C] + * ... however, remove_invisible_characters() above already strips the + * hex-encoded ones, so we'll skip them below. + */ + do + { + $original = $str; + + if (preg_match('/]+([^>]*?)(?:>|$)#si', array($this, '_js_link_removal'), $str); + } + + if (preg_match('/]*?)(?:\s?/?>|$)#si', array($this, '_js_img_removal'), $str); + } + + if (preg_match('/script|xss/i', $str)) + { + $str = preg_replace('##si', '[removed]', $str); + } + } + while ($original !== $str); + unset($original); + + /* + * Sanitize naughty HTML elements + * + * If a tag containing any of the words in the list + * below is found, the tag gets converted to entities. + * + * So this: + * Becomes: <blink> + */ + $pattern = '#' + .'<((?/*\s*)(?[a-z0-9]+)(?=[^a-z0-9]|$)' // tag start and name, followed by a non-tag character + .'[^\s\042\047a-z0-9>/=]*' // a valid attribute character immediately after the tag would count as a separator + // optional attributes + .'(?(?:[\s\042\047/=]*' // non-attribute characters, excluding > (tag close) for obvious reasons + .'[^\s\042\047>/=]+' // attribute characters + // optional attribute-value + .'(?:\s*=' // attribute-value separator + .'(?:[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*))' // single, double or non-quoted value + .')?' // end optional attribute-value group + .')*)' // end optional attributes group + .'[^>]*)(?\>)?#isS'; + + // Note: It would be nice to optimize this for speed, BUT + // only matching the naughty elements here results in + // false positives and in turn - vulnerabilities! + do + { + $old_str = $str; + $str = preg_replace_callback($pattern, array($this, '_sanitize_naughty_html'), $str); + } + while ($old_str !== $str); + unset($old_str); + + /* + * Sanitize naughty scripting elements + * + * Similar to above, only instead of looking for + * tags it looks for PHP and JavaScript commands + * that are disallowed. Rather than removing the + * code, it simply converts the parenthesis to entities + * rendering the code un-executable. + * + * For example: eval('some code') + * Becomes: eval('some code') + */ + $str = preg_replace( + '#(alert|prompt|confirm|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', + '\\1\\2(\\3)', + $str + ); + + // Final clean up + // This adds a bit of extra precaution in case + // something got through the above filters + $str = $this->_do_never_allowed($str); + + /* + * Images are Handled in a Special Way + * - Essentially, we want to know that after all of the character + * conversion is done whether any unwanted, likely XSS, code was found. + * If not, we return TRUE, as the image is clean. + * However, if the string post-conversion does not matched the + * string post-removal of XSS, then it fails, as there was unwanted XSS + * code found and removed/changed during processing. + */ + if ($is_image === TRUE) + { + return ($str === $converted_string); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * XSS Hash + * + * Generates the XSS hash if needed and returns it. + * + * @see CI_Security::$_xss_hash + * @return string XSS hash + */ + public function xss_hash() + { + if ($this->_xss_hash === NULL) + { + $rand = $this->get_random_bytes(16); + $this->_xss_hash = ($rand === FALSE) + ? md5(uniqid(mt_rand(), TRUE)) + : bin2hex($rand); + } + + return $this->_xss_hash; + } + + // -------------------------------------------------------------------- + + /** + * Get random bytes + * + * @param int $length Output length + * @return string + */ + public function get_random_bytes($length) + { + if (empty($length) OR ! ctype_digit((string) $length)) + { + return FALSE; + } + + if (function_exists('random_bytes')) + { + try + { + // The cast is required to avoid TypeError + return random_bytes((int) $length); + } + catch (Exception $e) + { + // If random_bytes() can't do the job, we can't either ... + // There's no point in using fallbacks. + log_message('error', $e->getMessage()); + return FALSE; + } + } + + // Unfortunately, none of the following PRNGs is guaranteed to exist ... + if (defined('MCRYPT_DEV_URANDOM') && ($output = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM)) !== FALSE) + { + return $output; + } + + + if (is_readable('/dev/urandom') && ($fp = fopen('/dev/urandom', 'rb')) !== FALSE) + { + // Try not to waste entropy ... + is_php('5.4') && stream_set_chunk_size($fp, $length); + $output = fread($fp, $length); + fclose($fp); + if ($output !== FALSE) + { + return $output; + } + } + + if (function_exists('openssl_random_pseudo_bytes')) + { + return openssl_random_pseudo_bytes($length); + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * HTML Entities Decode + * + * A replacement for html_entity_decode() + * + * The reason we are not using html_entity_decode() by itself is because + * while it is not technically correct to leave out the semicolon + * at the end of an entity most browsers will still interpret the entity + * correctly. html_entity_decode() does not convert entities without + * semicolons, so we are left with our own little solution here. Bummer. + * + * @link http://php.net/html-entity-decode + * + * @param string $str Input + * @param string $charset Character set + * @return string + */ + public function entity_decode($str, $charset = NULL) + { + if (strpos($str, '&') === FALSE) + { + return $str; + } + + static $_entities; + + isset($charset) OR $charset = $this->charset; + $flag = is_php('5.4') + ? ENT_COMPAT | ENT_HTML5 + : ENT_COMPAT; + + do + { + $str_compare = $str; + + // Decode standard entities, avoiding false positives + if (preg_match_all('/&[a-z]{2,}(?![a-z;])/i', $str, $matches)) + { + if ( ! isset($_entities)) + { + $_entities = array_map( + 'strtolower', + is_php('5.3.4') + ? get_html_translation_table(HTML_ENTITIES, $flag, $charset) + : get_html_translation_table(HTML_ENTITIES, $flag) + ); + + // If we're not on PHP 5.4+, add the possibly dangerous HTML 5 + // entities to the array manually + if ($flag === ENT_COMPAT) + { + $_entities[':'] = ':'; + $_entities['('] = '('; + $_entities[')'] = ')'; + $_entities["\n"] = '&newline;'; + $_entities["\t"] = '&tab;'; + } + } + + $replace = array(); + $matches = array_unique(array_map('strtolower', $matches[0])); + foreach ($matches as &$match) + { + if (($char = array_search($match.';', $_entities, TRUE)) !== FALSE) + { + $replace[$match] = $char; + } + } + + $str = str_ireplace(array_keys($replace), array_values($replace), $str); + } + + // Decode numeric & UTF16 two byte entities + $str = html_entity_decode( + preg_replace('/(&#(?:x0*[0-9a-f]{2,5}(?![0-9a-f;])|(?:0*\d{2,4}(?![0-9;]))))/iS', '$1;', $str), + $flag, + $charset + ); + } + while ($str_compare !== $str); + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Sanitize Filename + * + * @param string $str Input file name + * @param bool $relative_path Whether to preserve paths + * @return string + */ + public function sanitize_filename($str, $relative_path = FALSE) + { + $bad = $this->filename_bad_chars; + + if ( ! $relative_path) + { + $bad[] = './'; + $bad[] = '/'; + } + + $str = remove_invisible_characters($str, FALSE); + + do + { + $old = $str; + $str = str_replace($bad, '', $str); + } + while ($old !== $str); + + return stripslashes($str); + } + + // ---------------------------------------------------------------- + + /** + * Strip Image Tags + * + * @param string $str + * @return string + */ + public function strip_image_tags($str) + { + return preg_replace( + array( + '##i', + '#`]+)).*?\>#i' + ), + '\\2', + $str + ); + } + + // ---------------------------------------------------------------- + + /** + * Compact Exploded Words + * + * Callback method for xss_clean() to remove whitespace from + * things like 'j a v a s c r i p t'. + * + * @used-by CI_Security::xss_clean() + * @param array $matches + * @return string + */ + protected function _compact_exploded_words($matches) + { + return preg_replace('/\s+/s', '', $matches[1]).$matches[2]; + } + + // -------------------------------------------------------------------- + + /** + * Sanitize Naughty HTML + * + * Callback method for xss_clean() to remove naughty HTML elements. + * + * @used-by CI_Security::xss_clean() + * @param array $matches + * @return string + */ + protected function _sanitize_naughty_html($matches) + { + static $naughty_tags = array( + 'alert', 'prompt', 'confirm', 'applet', 'audio', 'basefont', 'base', 'behavior', 'bgsound', + 'blink', 'body', 'embed', 'expression', 'form', 'frameset', 'frame', 'head', 'html', 'ilayer', + 'iframe', 'input', 'button', 'select', 'isindex', 'layer', 'link', 'meta', 'keygen', 'object', + 'plaintext', 'style', 'script', 'textarea', 'title', 'math', 'video', 'svg', 'xml', 'xss' + ); + + static $evil_attributes = array( + 'on\w+', 'style', 'xmlns', 'formaction', 'form', 'xlink:href', 'FSCommand', 'seekSegmentTime' + ); + + // First, escape unclosed tags + if (empty($matches['closeTag'])) + { + return '<'.$matches[1]; + } + // Is the element that we caught naughty? If so, escape it + elseif (in_array(strtolower($matches['tagName']), $naughty_tags, TRUE)) + { + return '<'.$matches[1].'>'; + } + // For other tags, see if their attributes are "evil" and strip those + elseif (isset($matches['attributes'])) + { + // We'll store the already fitlered attributes here + $attributes = array(); + + // Attribute-catching pattern + $attributes_pattern = '#' + .'(?[^\s\042\047>/=]+)' // attribute characters + // optional attribute-value + .'(?:\s*=(?[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*)))' // attribute-value separator + .'#i'; + + // Blacklist pattern for evil attribute names + $is_evil_pattern = '#^('.implode('|', $evil_attributes).')$#i'; + + // Each iteration filters a single attribute + do + { + // Strip any non-alpha characters that may preceed an attribute. + // Browsers often parse these incorrectly and that has been a + // of numerous XSS issues we've had. + $matches['attributes'] = preg_replace('#^[^a-z]+#i', '', $matches['attributes']); + + if ( ! preg_match($attributes_pattern, $matches['attributes'], $attribute, PREG_OFFSET_CAPTURE)) + { + // No (valid) attribute found? Discard everything else inside the tag + break; + } + + if ( + // Is it indeed an "evil" attribute? + preg_match($is_evil_pattern, $attribute['name'][0]) + // Or does it have an equals sign, but no value and not quoted? Strip that too! + OR (trim($attribute['value'][0]) === '') + ) + { + $attributes[] = 'xss=removed'; + } + else + { + $attributes[] = $attribute[0][0]; + } + + $matches['attributes'] = substr($matches['attributes'], $attribute[0][1] + strlen($attribute[0][0])); + } + while ($matches['attributes'] !== ''); + + $attributes = empty($attributes) + ? '' + : ' '.implode(' ', $attributes); + return '<'.$matches['slash'].$matches['tagName'].$attributes.'>'; + } + + return $matches[0]; + } + + // -------------------------------------------------------------------- + + /** + * JS Link Removal + * + * Callback method for xss_clean() to sanitize links. + * + * This limits the PCRE backtracks, making it more performance friendly + * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in + * PHP 5.2+ on link-heavy strings. + * + * @used-by CI_Security::xss_clean() + * @param array $match + * @return string + */ + protected function _js_link_removal($match) + { + return str_replace( + $match[1], + preg_replace( + '#href=.*?(?:(?:alert|prompt|confirm)(?:\(|&\#40;)|javascript:|livescript:|mocha:|charset=|window\.|document\.|\.cookie|_filter_attributes($match[1]) + ), + $match[0] + ); + } + + // -------------------------------------------------------------------- + + /** + * JS Image Removal + * + * Callback method for xss_clean() to sanitize image tags. + * + * This limits the PCRE backtracks, making it more performance friendly + * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in + * PHP 5.2+ on image tag heavy strings. + * + * @used-by CI_Security::xss_clean() + * @param array $match + * @return string + */ + protected function _js_img_removal($match) + { + return str_replace( + $match[1], + preg_replace( + '#src=.*?(?:(?:alert|prompt|confirm|eval)(?:\(|&\#40;)|javascript:|livescript:|mocha:|charset=|window\.|document\.|\.cookie|_filter_attributes($match[1]) + ), + $match[0] + ); + } + + // -------------------------------------------------------------------- + + /** + * Attribute Conversion + * + * @used-by CI_Security::xss_clean() + * @param array $match + * @return string + */ + protected function _convert_attribute($match) + { + return str_replace(array('>', '<', '\\'), array('>', '<', '\\\\'), $match[0]); + } + + // -------------------------------------------------------------------- + + /** + * Filter Attributes + * + * Filters tag attributes for consistency and safety. + * + * @used-by CI_Security::_js_img_removal() + * @used-by CI_Security::_js_link_removal() + * @param string $str + * @return string + */ + protected function _filter_attributes($str) + { + $out = ''; + if (preg_match_all('#\s*[a-z\-]+\s*=\s*(\042|\047)([^\\1]*?)\\1#is', $str, $matches)) + { + foreach ($matches[0] as $match) + { + $out .= preg_replace('#/\*.*?\*/#s', '', $match); + } + } + + return $out; + } + + // -------------------------------------------------------------------- + + /** + * HTML Entity Decode Callback + * + * @used-by CI_Security::xss_clean() + * @param array $match + * @return string + */ + protected function _decode_entity($match) + { + // Protect GET variables in URLs + // 901119URL5918AMP18930PROTECT8198 + $match = preg_replace('|\&([a-z\_0-9\-]+)\=([a-z\_0-9\-/]+)|i', $this->xss_hash().'\\1=\\2', $match[0]); + + // Decode, then un-protect URL GET vars + return str_replace( + $this->xss_hash(), + '&', + $this->entity_decode($match, $this->charset) + ); + } + + // -------------------------------------------------------------------- + + /** + * Do Never Allowed + * + * @used-by CI_Security::xss_clean() + * @param string + * @return string + */ + protected function _do_never_allowed($str) + { + $str = str_replace(array_keys($this->_never_allowed_str), $this->_never_allowed_str, $str); + + foreach ($this->_never_allowed_regex as $regex) + { + $str = preg_replace('#'.$regex.'#is', '[removed]', $str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Set CSRF Hash and Cookie + * + * @return string + */ + protected function _csrf_set_hash() + { + if ($this->_csrf_hash === NULL) + { + // If the cookie exists we will use its value. + // We don't necessarily want to regenerate it with + // each page load since a page could contain embedded + // sub-pages causing this feature to fail + if (isset($_COOKIE[$this->_csrf_cookie_name]) && is_string($_COOKIE[$this->_csrf_cookie_name]) + && preg_match('#^[0-9a-f]{32}$#iS', $_COOKIE[$this->_csrf_cookie_name]) === 1) + { + return $this->_csrf_hash = $_COOKIE[$this->_csrf_cookie_name]; + } + + $rand = $this->get_random_bytes(16); + $this->_csrf_hash = ($rand === FALSE) + ? md5(uniqid(mt_rand(), TRUE)) + : bin2hex($rand); + } + + return $this->_csrf_hash; + } + +} diff --git a/system/core/URI.php b/system/core/URI.php new file mode 100644 index 0000000..544f6c8 --- /dev/null +++ b/system/core/URI.php @@ -0,0 +1,643 @@ +config =& load_class('Config', 'core'); + + // If query strings are enabled, we don't need to parse any segments. + // However, they don't make sense under CLI. + if (is_cli() OR $this->config->item('enable_query_strings') !== TRUE) + { + $this->_permitted_uri_chars = $this->config->item('permitted_uri_chars'); + + // If it's a CLI request, ignore the configuration + if (is_cli()) + { + $uri = $this->_parse_argv(); + } + else + { + $protocol = $this->config->item('uri_protocol'); + empty($protocol) && $protocol = 'REQUEST_URI'; + + switch ($protocol) + { + case 'AUTO': // For BC purposes only + case 'REQUEST_URI': + $uri = $this->_parse_request_uri(); + break; + case 'QUERY_STRING': + $uri = $this->_parse_query_string(); + break; + case 'PATH_INFO': + default: + $uri = isset($_SERVER[$protocol]) + ? $_SERVER[$protocol] + : $this->_parse_request_uri(); + break; + } + } + + $this->_set_uri_string($uri); + } + + log_message('info', 'URI Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Set URI String + * + * @param string $str + * @return void + */ + protected function _set_uri_string($str) + { + // Filter out control characters and trim slashes + $this->uri_string = trim(remove_invisible_characters($str, FALSE), '/'); + + if ($this->uri_string !== '') + { + // Remove the URL suffix, if present + if (($suffix = (string) $this->config->item('url_suffix')) !== '') + { + $slen = strlen($suffix); + + if (substr($this->uri_string, -$slen) === $suffix) + { + $this->uri_string = substr($this->uri_string, 0, -$slen); + } + } + + $this->segments[0] = NULL; + // Populate the segments array + foreach (explode('/', trim($this->uri_string, '/')) as $val) + { + $val = trim($val); + // Filter segments for security + $this->filter_uri($val); + + if ($val !== '') + { + $this->segments[] = $val; + } + } + + unset($this->segments[0]); + } + } + + // -------------------------------------------------------------------- + + /** + * Parse REQUEST_URI + * + * Will parse REQUEST_URI and automatically detect the URI from it, + * while fixing the query string if necessary. + * + * @return string + */ + protected function _parse_request_uri() + { + if ( ! isset($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME'])) + { + return ''; + } + + // parse_url() returns false if no host is present, but the path or query string + // contains a colon followed by a number + $uri = parse_url('http://dummy'.$_SERVER['REQUEST_URI']); + $query = isset($uri['query']) ? $uri['query'] : ''; + $uri = isset($uri['path']) ? $uri['path'] : ''; + + if (isset($_SERVER['SCRIPT_NAME'][0])) + { + if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) + { + $uri = (string) substr($uri, strlen($_SERVER['SCRIPT_NAME'])); + } + elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) + { + $uri = (string) substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); + } + } + + // This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct + // URI is found, and also fixes the QUERY_STRING server var and $_GET array. + if (trim($uri, '/') === '' && strncmp($query, '/', 1) === 0) + { + $query = explode('?', $query, 2); + $uri = $query[0]; + $_SERVER['QUERY_STRING'] = isset($query[1]) ? $query[1] : ''; + } + else + { + $_SERVER['QUERY_STRING'] = $query; + } + + parse_str($_SERVER['QUERY_STRING'], $_GET); + + if ($uri === '/' OR $uri === '') + { + return '/'; + } + + // Do some final cleaning of the URI and return it + return $this->_remove_relative_directory($uri); + } + + // -------------------------------------------------------------------- + + /** + * Parse QUERY_STRING + * + * Will parse QUERY_STRING and automatically detect the URI from it. + * + * @return string + */ + protected function _parse_query_string() + { + $uri = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING'); + + if (trim($uri, '/') === '') + { + return ''; + } + elseif (strncmp($uri, '/', 1) === 0) + { + $uri = explode('?', $uri, 2); + $_SERVER['QUERY_STRING'] = isset($uri[1]) ? $uri[1] : ''; + $uri = $uri[0]; + } + + parse_str($_SERVER['QUERY_STRING'], $_GET); + + return $this->_remove_relative_directory($uri); + } + + // -------------------------------------------------------------------- + + /** + * Parse CLI arguments + * + * Take each command line argument and assume it is a URI segment. + * + * @return string + */ + protected function _parse_argv() + { + $args = array_slice($_SERVER['argv'], 1); + return $args ? implode('/', $args) : ''; + } + + // -------------------------------------------------------------------- + + /** + * Remove relative directory (../) and multi slashes (///) + * + * Do some final cleaning of the URI and return it, currently only used in self::_parse_request_uri() + * + * @param string $uri + * @return string + */ + protected function _remove_relative_directory($uri) + { + $uris = array(); + $tok = strtok($uri, '/'); + while ($tok !== FALSE) + { + if (( ! empty($tok) OR $tok === '0') && $tok !== '..') + { + $uris[] = $tok; + } + $tok = strtok('/'); + } + + return implode('/', $uris); + } + + // -------------------------------------------------------------------- + + /** + * Filter URI + * + * Filters segments for malicious characters. + * + * @param string $str + * @return void + */ + public function filter_uri(&$str) + { + if ( ! empty($str) && ! empty($this->_permitted_uri_chars) && ! preg_match('/^['.$this->_permitted_uri_chars.']+$/i'.(UTF8_ENABLED ? 'u' : ''), $str)) + { + show_error('The URI you submitted has disallowed characters.', 400); + } + } + + // -------------------------------------------------------------------- + + /** + * Fetch URI Segment + * + * @see CI_URI::$segments + * @param int $n Index + * @param mixed $no_result What to return if the segment index is not found + * @return mixed + */ + public function segment($n, $no_result = NULL) + { + return isset($this->segments[$n]) ? $this->segments[$n] : $no_result; + } + + // -------------------------------------------------------------------- + + /** + * Fetch URI "routed" Segment + * + * Returns the re-routed URI segment (assuming routing rules are used) + * based on the index provided. If there is no routing, will return + * the same result as CI_URI::segment(). + * + * @see CI_URI::$rsegments + * @see CI_URI::segment() + * @param int $n Index + * @param mixed $no_result What to return if the segment index is not found + * @return mixed + */ + public function rsegment($n, $no_result = NULL) + { + return isset($this->rsegments[$n]) ? $this->rsegments[$n] : $no_result; + } + + // -------------------------------------------------------------------- + + /** + * URI to assoc + * + * Generates an associative array of URI data starting at the supplied + * segment index. For example, if this is your URI: + * + * example.com/user/search/name/joe/location/UK/gender/male + * + * You can use this method to generate an array with this prototype: + * + * array ( + * name => joe + * location => UK + * gender => male + * ) + * + * @param int $n Index (default: 3) + * @param array $default Default values + * @return array + */ + public function uri_to_assoc($n = 3, $default = array()) + { + return $this->_uri_to_assoc($n, $default, 'segment'); + } + + // -------------------------------------------------------------------- + + /** + * Routed URI to assoc + * + * Identical to CI_URI::uri_to_assoc(), only it uses the re-routed + * segment array. + * + * @see CI_URI::uri_to_assoc() + * @param int $n Index (default: 3) + * @param array $default Default values + * @return array + */ + public function ruri_to_assoc($n = 3, $default = array()) + { + return $this->_uri_to_assoc($n, $default, 'rsegment'); + } + + // -------------------------------------------------------------------- + + /** + * Internal URI-to-assoc + * + * Generates a key/value pair from the URI string or re-routed URI string. + * + * @used-by CI_URI::uri_to_assoc() + * @used-by CI_URI::ruri_to_assoc() + * @param int $n Index (default: 3) + * @param array $default Default values + * @param string $which Array name ('segment' or 'rsegment') + * @return array + */ + protected function _uri_to_assoc($n = 3, $default = array(), $which = 'segment') + { + if ( ! is_numeric($n)) + { + return $default; + } + + if (isset($this->keyval[$which], $this->keyval[$which][$n])) + { + return $this->keyval[$which][$n]; + } + + $total_segments = "total_{$which}s"; + $segment_array = "{$which}_array"; + + if ($this->$total_segments() < $n) + { + return (count($default) === 0) + ? array() + : array_fill_keys($default, NULL); + } + + $segments = array_slice($this->$segment_array(), ($n - 1)); + $i = 0; + $lastval = ''; + $retval = array(); + foreach ($segments as $seg) + { + if ($i % 2) + { + $retval[$lastval] = $seg; + } + else + { + $retval[$seg] = NULL; + $lastval = $seg; + } + + $i++; + } + + if (count($default) > 0) + { + foreach ($default as $val) + { + if ( ! array_key_exists($val, $retval)) + { + $retval[$val] = NULL; + } + } + } + + // Cache the array for reuse + isset($this->keyval[$which]) OR $this->keyval[$which] = array(); + $this->keyval[$which][$n] = $retval; + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Assoc to URI + * + * Generates a URI string from an associative array. + * + * @param array $array Input array of key/value pairs + * @return string URI string + */ + public function assoc_to_uri($array) + { + $temp = array(); + foreach ((array) $array as $key => $val) + { + $temp[] = $key; + $temp[] = $val; + } + + return implode('/', $temp); + } + + // -------------------------------------------------------------------- + + /** + * Slash segment + * + * Fetches an URI segment with a slash. + * + * @param int $n Index + * @param string $where Where to add the slash ('trailing' or 'leading') + * @return string + */ + public function slash_segment($n, $where = 'trailing') + { + return $this->_slash_segment($n, $where, 'segment'); + } + + // -------------------------------------------------------------------- + + /** + * Slash routed segment + * + * Fetches an URI routed segment with a slash. + * + * @param int $n Index + * @param string $where Where to add the slash ('trailing' or 'leading') + * @return string + */ + public function slash_rsegment($n, $where = 'trailing') + { + return $this->_slash_segment($n, $where, 'rsegment'); + } + + // -------------------------------------------------------------------- + + /** + * Internal Slash segment + * + * Fetches an URI Segment and adds a slash to it. + * + * @used-by CI_URI::slash_segment() + * @used-by CI_URI::slash_rsegment() + * + * @param int $n Index + * @param string $where Where to add the slash ('trailing' or 'leading') + * @param string $which Array name ('segment' or 'rsegment') + * @return string + */ + protected function _slash_segment($n, $where = 'trailing', $which = 'segment') + { + $leading = $trailing = '/'; + + if ($where === 'trailing') + { + $leading = ''; + } + elseif ($where === 'leading') + { + $trailing = ''; + } + + return $leading.$this->$which($n).$trailing; + } + + // -------------------------------------------------------------------- + + /** + * Segment Array + * + * @return array CI_URI::$segments + */ + public function segment_array() + { + return $this->segments; + } + + // -------------------------------------------------------------------- + + /** + * Routed Segment Array + * + * @return array CI_URI::$rsegments + */ + public function rsegment_array() + { + return $this->rsegments; + } + + // -------------------------------------------------------------------- + + /** + * Total number of segments + * + * @return int + */ + public function total_segments() + { + return count($this->segments); + } + + // -------------------------------------------------------------------- + + /** + * Total number of routed segments + * + * @return int + */ + public function total_rsegments() + { + return count($this->rsegments); + } + + // -------------------------------------------------------------------- + + /** + * Fetch URI string + * + * @return string CI_URI::$uri_string + */ + public function uri_string() + { + return $this->uri_string; + } + + // -------------------------------------------------------------------- + + /** + * Fetch Re-routed URI string + * + * @return string + */ + public function ruri_string() + { + return ltrim(load_class('Router', 'core')->directory, '/').implode('/', $this->rsegments); + } + +} diff --git a/system/core/Utf8.php b/system/core/Utf8.php new file mode 100644 index 0000000..f2f42e6 --- /dev/null +++ b/system/core/Utf8.php @@ -0,0 +1,164 @@ +is_ascii($str) === FALSE) + { + if (MB_ENABLED) + { + $str = mb_convert_encoding($str, 'UTF-8', 'UTF-8'); + } + elseif (ICONV_ENABLED) + { + $str = @iconv('UTF-8', 'UTF-8//IGNORE', $str); + } + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Remove ASCII control characters + * + * Removes all ASCII control characters except horizontal tabs, + * line feeds, and carriage returns, as all others can cause + * problems in XML. + * + * @param string $str String to clean + * @return string + */ + public function safe_ascii_for_xml($str) + { + return remove_invisible_characters($str, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Convert to UTF-8 + * + * Attempts to convert a string to UTF-8. + * + * @param string $str Input string + * @param string $encoding Input encoding + * @return string $str encoded in UTF-8 or FALSE on failure + */ + public function convert_to_utf8($str, $encoding) + { + if (MB_ENABLED) + { + return mb_convert_encoding($str, 'UTF-8', $encoding); + } + elseif (ICONV_ENABLED) + { + return @iconv($encoding, 'UTF-8', $str); + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Is ASCII? + * + * Tests if a string is standard 7-bit ASCII or not. + * + * @param string $str String to check + * @return bool + */ + public function is_ascii($str) + { + return (preg_match('/[^\x00-\x7F]/S', $str) === 0); + } + +} diff --git a/system/core/compat/hash.php b/system/core/compat/hash.php new file mode 100644 index 0000000..6854e4c --- /dev/null +++ b/system/core/compat/hash.php @@ -0,0 +1,245 @@ + 32, + 'haval128,3' => 128, + 'haval160,3' => 128, + 'haval192,3' => 128, + 'haval224,3' => 128, + 'haval256,3' => 128, + 'haval128,4' => 128, + 'haval160,4' => 128, + 'haval192,4' => 128, + 'haval224,4' => 128, + 'haval256,4' => 128, + 'haval128,5' => 128, + 'haval160,5' => 128, + 'haval192,5' => 128, + 'haval224,5' => 128, + 'haval256,5' => 128, + 'md2' => 16, + 'md4' => 64, + 'md5' => 64, + 'ripemd128' => 64, + 'ripemd160' => 64, + 'ripemd256' => 64, + 'ripemd320' => 64, + 'salsa10' => 64, + 'salsa20' => 64, + 'sha1' => 64, + 'sha224' => 64, + 'sha256' => 64, + 'sha384' => 128, + 'sha512' => 128, + 'snefru' => 32, + 'snefru256' => 32, + 'tiger128,3' => 64, + 'tiger160,3' => 64, + 'tiger192,3' => 64, + 'tiger128,4' => 64, + 'tiger160,4' => 64, + 'tiger192,4' => 64, + 'whirlpool' => 64 + ); + + if (isset($block_sizes[$algo]) && strlen($password) > $block_sizes[$algo]) + { + $password = hash($algo, $password, TRUE); + } + + $hash = ''; + // Note: Blocks are NOT 0-indexed + for ($bc = ceil($length / $hash_length), $bi = 1; $bi <= $bc; $bi++) + { + $key = $derived_key = hash_hmac($algo, $salt.pack('N', $bi), $password, TRUE); + for ($i = 1; $i < $iterations; $i++) + { + $derived_key ^= $key = hash_hmac($algo, $key, $password, TRUE); + } + + $hash .= $derived_key; + } + + // This is not RFC-compatible, but we're aiming for natural PHP compatibility + return substr($raw_output ? $hash : bin2hex($hash), 0, $length); + } +} diff --git a/system/core/compat/index.html b/system/core/compat/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/core/compat/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/core/compat/mbstring.php b/system/core/compat/mbstring.php new file mode 100644 index 0000000..554d100 --- /dev/null +++ b/system/core/compat/mbstring.php @@ -0,0 +1,149 @@ + 0, 'algoName' => 'unknown', 'options' => array()) + : array('algo' => 1, 'algoName' => 'bcrypt', 'options' => array('cost' => $hash)); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('password_hash')) +{ + /** + * password_hash() + * + * @link http://php.net/password_hash + * @param string $password + * @param int $algo + * @param array $options + * @return mixed + */ + function password_hash($password, $algo, array $options = array()) + { + static $func_override; + isset($func_override) OR $func_override = (extension_loaded('mbstring') && ini_get('mbstring.func_override')); + + if ($algo !== 1) + { + trigger_error('password_hash(): Unknown hashing algorithm: '.(int) $algo, E_USER_WARNING); + return NULL; + } + + if (isset($options['cost']) && ($options['cost'] < 4 OR $options['cost'] > 31)) + { + trigger_error('password_hash(): Invalid bcrypt cost parameter specified: '.(int) $options['cost'], E_USER_WARNING); + return NULL; + } + + if (isset($options['salt']) && ($saltlen = ($func_override ? mb_strlen($options['salt'], '8bit') : strlen($options['salt']))) < 22) + { + trigger_error('password_hash(): Provided salt is too short: '.$saltlen.' expecting 22', E_USER_WARNING); + return NULL; + } + elseif ( ! isset($options['salt'])) + { + if (defined('MCRYPT_DEV_URANDOM')) + { + $options['salt'] = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); + } + elseif (function_exists('openssl_random_pseudo_bytes')) + { + $options['salt'] = openssl_random_pseudo_bytes(16); + } + elseif (DIRECTORY_SEPARATOR === '/' && (is_readable($dev = '/dev/arandom') OR is_readable($dev = '/dev/urandom'))) + { + if (($fp = fopen($dev, 'rb')) === FALSE) + { + log_message('error', 'compat/password: Unable to open '.$dev.' for reading.'); + return FALSE; + } + + // Try not to waste entropy ... + is_php('5.4') && stream_set_chunk_size($fp, 16); + + $options['salt'] = ''; + for ($read = 0; $read < 16; $read = ($func_override) ? mb_strlen($options['salt'], '8bit') : strlen($options['salt'])) + { + if (($read = fread($fp, 16 - $read)) === FALSE) + { + log_message('error', 'compat/password: Error while reading from '.$dev.'.'); + return FALSE; + } + $options['salt'] .= $read; + } + + fclose($fp); + } + else + { + log_message('error', 'compat/password: No CSPRNG available.'); + return FALSE; + } + + $options['salt'] = str_replace('+', '.', rtrim(base64_encode($options['salt']), '=')); + } + elseif ( ! preg_match('#^[a-zA-Z0-9./]+$#D', $options['salt'])) + { + $options['salt'] = str_replace('+', '.', rtrim(base64_encode($options['salt']), '=')); + } + + isset($options['cost']) OR $options['cost'] = 10; + + return (strlen($password = crypt($password, sprintf('$2y$%02d$%s', $options['cost'], $options['salt']))) === 60) + ? $password + : FALSE; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('password_needs_rehash')) +{ + /** + * password_needs_rehash() + * + * @link http://php.net/password_needs_rehash + * @param string $hash + * @param int $algo + * @param array $options + * @return bool + */ + function password_needs_rehash($hash, $algo, array $options = array()) + { + $info = password_get_info($hash); + + if ($algo !== $info['algo']) + { + return TRUE; + } + elseif ($algo === 1) + { + $options['cost'] = isset($options['cost']) ? (int) $options['cost'] : 10; + return ($info['options']['cost'] !== $options['cost']); + } + + // Odd at first glance, but according to a comment in PHP's own unit tests, + // because it is an unknown algorithm - it's valid and therefore doesn't + // need rehashing. + return FALSE; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('password_verify')) +{ + /** + * password_verify() + * + * @link http://php.net/password_verify + * @param string $password + * @param string $hash + * @return bool + */ + function password_verify($password, $hash) + { + if (strlen($hash) !== 60 OR strlen($password = crypt($password, $hash)) !== 60) + { + return FALSE; + } + + $compare = 0; + for ($i = 0; $i < 60; $i++) + { + $compare |= (ord($password[$i]) ^ ord($hash[$i])); + } + + return ($compare === 0); + } +} diff --git a/system/core/compat/standard.php b/system/core/compat/standard.php new file mode 100644 index 0000000..47d47ae --- /dev/null +++ b/system/core/compat/standard.php @@ -0,0 +1,389 @@ + 0) + { + $output .= "\015".$str[$i++]; + $length--; + $lp = 0; + continue; + } + + if ( + ctype_cntrl($c) + OR (ord($c) === 0x7f) + OR (ord($c) & 0x80) + OR ($c === '=') + OR ($c === ' ' && isset($str[$i]) && $str[$i] === "\015") + ) + { + if ( + (($lp += 3) > 75 && ord($c) <= 0x7f) + OR (ord($c) > 0x7f && ord($c) <= 0xdf && ($lp + 3) > 75) + OR (ord($c) > 0xdf && ord($c) <= 0xef && ($lp + 6) > 75) + OR (ord($c) > 0xef && ord($c) <= 0xf4 && ($lp + 9) > 75) + ) + { + $output .= "=\015\012"; + $lp = 3; + } + + $output .= '='.$hex[ord($c) >> 4].$hex[ord($c) & 0xf]; + continue; + } + + if ((++$lp) > 75) + { + $output .= "=\015\012"; + $lp = 1; + } + + $output .= $c; + } + + return $output; + } +} diff --git a/system/core/index.html b/system/core/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/core/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/database/DB.php b/system/database/DB.php new file mode 100644 index 0000000..b4b7767 --- /dev/null +++ b/system/database/DB.php @@ -0,0 +1,218 @@ +load->get_package_paths() as $path) + { + if ($path !== APPPATH) + { + if (file_exists($file_path = $path.'config/'.ENVIRONMENT.'/database.php')) + { + include($file_path); + } + elseif (file_exists($file_path = $path.'config/database.php')) + { + include($file_path); + } + } + } + } + + if ( ! isset($db) OR count($db) === 0) + { + show_error('No database connection settings were found in the database config file.'); + } + + if ($params !== '') + { + $active_group = $params; + } + + if ( ! isset($active_group)) + { + show_error('You have not specified a database connection group via $active_group in your config/database.php file.'); + } + elseif ( ! isset($db[$active_group])) + { + show_error('You have specified an invalid database connection group ('.$active_group.') in your config/database.php file.'); + } + + $params = $db[$active_group]; + } + elseif (is_string($params)) + { + /** + * Parse the URL from the DSN string + * Database settings can be passed as discreet + * parameters or as a data source name in the first + * parameter. DSNs must have this prototype: + * $dsn = 'driver://username:password@hostname/database'; + */ + if (($dsn = @parse_url($params)) === FALSE) + { + show_error('Invalid DB Connection String'); + } + + $params = array( + 'dbdriver' => $dsn['scheme'], + 'hostname' => isset($dsn['host']) ? rawurldecode($dsn['host']) : '', + 'port' => isset($dsn['port']) ? rawurldecode($dsn['port']) : '', + 'username' => isset($dsn['user']) ? rawurldecode($dsn['user']) : '', + 'password' => isset($dsn['pass']) ? rawurldecode($dsn['pass']) : '', + 'database' => isset($dsn['path']) ? rawurldecode(substr($dsn['path'], 1)) : '' + ); + + // Were additional config items set? + if (isset($dsn['query'])) + { + parse_str($dsn['query'], $extra); + + foreach ($extra as $key => $val) + { + if (is_string($val) && in_array(strtoupper($val), array('TRUE', 'FALSE', 'NULL'))) + { + $val = var_export($val, TRUE); + } + + $params[$key] = $val; + } + } + } + + // No DB specified yet? Beat them senseless... + if (empty($params['dbdriver'])) + { + show_error('You have not selected a database type to connect to.'); + } + + // Load the DB classes. Note: Since the query builder class is optional + // we need to dynamically create a class that extends proper parent class + // based on whether we're using the query builder class or not. + if ($query_builder_override !== NULL) + { + $query_builder = $query_builder_override; + } + // Backwards compatibility work-around for keeping the + // $active_record config variable working. Should be + // removed in v3.1 + elseif ( ! isset($query_builder) && isset($active_record)) + { + $query_builder = $active_record; + } + + require_once(BASEPATH.'database/DB_driver.php'); + + if ( ! isset($query_builder) OR $query_builder === TRUE) + { + require_once(BASEPATH.'database/DB_query_builder.php'); + if ( ! class_exists('CI_DB', FALSE)) + { + /** + * CI_DB + * + * Acts as an alias for both CI_DB_driver and CI_DB_query_builder. + * + * @see CI_DB_query_builder + * @see CI_DB_driver + */ + class CI_DB extends CI_DB_query_builder { } + } + } + elseif ( ! class_exists('CI_DB', FALSE)) + { + /** + * @ignore + */ + class CI_DB extends CI_DB_driver { } + } + + // Load the DB driver + $driver_file = BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php'; + + file_exists($driver_file) OR show_error('Invalid DB driver'); + require_once($driver_file); + + // Instantiate the DB adapter + $driver = 'CI_DB_'.$params['dbdriver'].'_driver'; + $DB = new $driver($params); + + // Check for a subdriver + if ( ! empty($DB->subdriver)) + { + $driver_file = BASEPATH.'database/drivers/'.$DB->dbdriver.'/subdrivers/'.$DB->dbdriver.'_'.$DB->subdriver.'_driver.php'; + + if (file_exists($driver_file)) + { + require_once($driver_file); + $driver = 'CI_DB_'.$DB->dbdriver.'_'.$DB->subdriver.'_driver'; + $DB = new $driver($params); + } + } + + $DB->initialize(); + return $DB; +} diff --git a/system/database/DB_cache.php b/system/database/DB_cache.php new file mode 100644 index 0000000..8855cc1 --- /dev/null +++ b/system/database/DB_cache.php @@ -0,0 +1,221 @@ +CI and load the file helper since we use it a lot + $this->CI =& get_instance(); + $this->db =& $db; + $this->CI->load->helper('file'); + + $this->check_path(); + } + + // -------------------------------------------------------------------- + + /** + * Set Cache Directory Path + * + * @param string $path Path to the cache directory + * @return bool + */ + public function check_path($path = '') + { + if ($path === '') + { + if ($this->db->cachedir === '') + { + return $this->db->cache_off(); + } + + $path = $this->db->cachedir; + } + + // Add a trailing slash to the path if needed + $path = realpath($path) + ? rtrim(realpath($path), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR + : rtrim($path, '/').'/'; + + if ( ! is_dir($path)) + { + log_message('debug', 'DB cache path error: '.$path); + + // If the path is wrong we'll turn off caching + return $this->db->cache_off(); + } + + if ( ! is_really_writable($path)) + { + log_message('debug', 'DB cache dir not writable: '.$path); + + // If the path is not really writable we'll turn off caching + return $this->db->cache_off(); + } + + $this->db->cachedir = $path; + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Retrieve a cached query + * + * The URI being requested will become the name of the cache sub-folder. + * An MD5 hash of the SQL statement will become the cache file name. + * + * @param string $sql + * @return string + */ + public function read($sql) + { + $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); + $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); + $filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql); + + if (FALSE === ($cachedata = @file_get_contents($filepath))) + { + return FALSE; + } + + return unserialize($cachedata); + } + + // -------------------------------------------------------------------- + + /** + * Write a query to a cache file + * + * @param string $sql + * @param object $object + * @return bool + */ + public function write($sql, $object) + { + $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); + $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); + $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; + $filename = md5($sql); + + if ( ! is_dir($dir_path) && ! @mkdir($dir_path, 0750)) + { + return FALSE; + } + + if (write_file($dir_path.$filename, serialize($object)) === FALSE) + { + return FALSE; + } + + chmod($dir_path.$filename, 0640); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Delete cache files within a particular directory + * + * @param string $segment_one + * @param string $segment_two + * @return void + */ + public function delete($segment_one = '', $segment_two = '') + { + if ($segment_one === '') + { + $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); + } + + if ($segment_two === '') + { + $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); + } + + $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; + delete_files($dir_path, TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Delete all existing cache files + * + * @return void + */ + public function delete_all() + { + delete_files($this->db->cachedir, TRUE, TRUE); + } + +} diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php new file mode 100644 index 0000000..848516a --- /dev/null +++ b/system/database/DB_driver.php @@ -0,0 +1,1986 @@ + $val) + { + $this->$key = $val; + } + } + + log_message('info', 'Database Driver Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Initialize Database Settings + * + * @return bool + */ + public function initialize() + { + /* If an established connection is available, then there's + * no need to connect and select the database. + * + * Depending on the database driver, conn_id can be either + * boolean TRUE, a resource or an object. + */ + if ($this->conn_id) + { + return TRUE; + } + + // ---------------------------------------------------------------- + + // Connect to the database and set the connection ID + $this->conn_id = $this->db_connect($this->pconnect); + + // No connection resource? Check if there is a failover else throw an error + if ( ! $this->conn_id) + { + // Check if there is a failover set + if ( ! empty($this->failover) && is_array($this->failover)) + { + // Go over all the failovers + foreach ($this->failover as $failover) + { + // Replace the current settings with those of the failover + foreach ($failover as $key => $val) + { + $this->$key = $val; + } + + // Try to connect + $this->conn_id = $this->db_connect($this->pconnect); + + // If a connection is made break the foreach loop + if ($this->conn_id) + { + break; + } + } + } + + // We still don't have a connection? + if ( ! $this->conn_id) + { + log_message('error', 'Unable to connect to the database'); + + if ($this->db_debug) + { + $this->display_error('db_unable_to_connect'); + } + + return FALSE; + } + } + + // Now we set the character set and that's all + return $this->db_set_charset($this->char_set); + } + + // -------------------------------------------------------------------- + + /** + * DB connect + * + * This is just a dummy method that all drivers will override. + * + * @return mixed + */ + public function db_connect() + { + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Persistent database connection + * + * @return mixed + */ + public function db_pconnect() + { + return $this->db_connect(TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout. + * + * This is just a dummy method to allow drivers without such + * functionality to not declare it, while others will override it. + * + * @return void + */ + public function reconnect() + { + } + + // -------------------------------------------------------------------- + + /** + * Select database + * + * This is just a dummy method to allow drivers without such + * functionality to not declare it, while others will override it. + * + * @return bool + */ + public function db_select() + { + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Last error + * + * @return array + */ + public function error() + { + return array('code' => NULL, 'message' => NULL); + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @param string + * @return bool + */ + public function db_set_charset($charset) + { + if (method_exists($this, '_db_set_charset') && ! $this->_db_set_charset($charset)) + { + log_message('error', 'Unable to set database connection charset: '.$charset); + + if ($this->db_debug) + { + $this->display_error('db_unable_to_set_charset', $charset); + } + + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * The name of the platform in use (mysql, mssql, etc...) + * + * @return string + */ + public function platform() + { + return $this->dbdriver; + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * Returns a string containing the version of the database being used. + * Most drivers will override this method. + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + if (FALSE === ($sql = $this->_version())) + { + return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; + } + + $query = $this->query($sql)->row(); + return $this->data_cache['version'] = $query->ver; + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @return string + */ + protected function _version() + { + return 'SELECT VERSION() AS ver'; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * Accepts an SQL string as input and returns a result object upon + * successful execution of a "read" type query. Returns boolean TRUE + * upon successful execution of a "write" type query. Returns boolean + * FALSE upon failure, and if the $db_debug variable is set to TRUE + * will raise an error. + * + * @param string $sql + * @param array $binds = FALSE An array of binding data + * @param bool $return_object = NULL + * @return mixed + */ + public function query($sql, $binds = FALSE, $return_object = NULL) + { + if ($sql === '') + { + log_message('error', 'Invalid query: '.$sql); + return ($this->db_debug) ? $this->display_error('db_invalid_query') : FALSE; + } + elseif ( ! is_bool($return_object)) + { + $return_object = ! $this->is_write_type($sql); + } + + // Verify table prefix and replace if necessary + if ($this->dbprefix !== '' && $this->swap_pre !== '' && $this->dbprefix !== $this->swap_pre) + { + $sql = preg_replace('/(\W)'.$this->swap_pre.'(\S+?)/', '\\1'.$this->dbprefix.'\\2', $sql); + } + + // Compile binds if needed + if ($binds !== FALSE) + { + $sql = $this->compile_binds($sql, $binds); + } + + // Is query caching enabled? If the query is a "read type" + // we will load the caching class and return the previously + // cached query if it exists + if ($this->cache_on === TRUE && $return_object === TRUE && $this->_cache_init()) + { + $this->load_rdriver(); + if (FALSE !== ($cache = $this->CACHE->read($sql))) + { + return $cache; + } + } + + // Save the query for debugging + if ($this->save_queries === TRUE) + { + $this->queries[] = $sql; + } + + // Start the Query Timer + $time_start = microtime(TRUE); + + // Run the Query + if (FALSE === ($this->result_id = $this->simple_query($sql))) + { + if ($this->save_queries === TRUE) + { + $this->query_times[] = 0; + } + + // This will trigger a rollback if transactions are being used + if ($this->_trans_depth !== 0) + { + $this->_trans_status = FALSE; + } + + // Grab the error now, as we might run some additional queries before displaying the error + $error = $this->error(); + + // Log errors + log_message('error', 'Query error: '.$error['message'].' - Invalid query: '.$sql); + + if ($this->db_debug) + { + // We call this function in order to roll-back queries + // if transactions are enabled. If we don't call this here + // the error message will trigger an exit, causing the + // transactions to remain in limbo. + while ($this->_trans_depth !== 0) + { + $trans_depth = $this->_trans_depth; + $this->trans_complete(); + if ($trans_depth === $this->_trans_depth) + { + log_message('error', 'Database: Failure during an automated transaction commit/rollback!'); + break; + } + } + + // Display errors + return $this->display_error(array('Error Number: '.$error['code'], $error['message'], $sql)); + } + + return FALSE; + } + + // Stop and aggregate the query time results + $time_end = microtime(TRUE); + $this->benchmark += $time_end - $time_start; + + if ($this->save_queries === TRUE) + { + $this->query_times[] = $time_end - $time_start; + } + + // Increment the query counter + $this->query_count++; + + // Will we have a result object instantiated? If not - we'll simply return TRUE + if ($return_object !== TRUE) + { + // If caching is enabled we'll auto-cleanup any existing files related to this particular URI + if ($this->cache_on === TRUE && $this->cache_autodel === TRUE && $this->_cache_init()) + { + $this->CACHE->delete(); + } + + return TRUE; + } + + // Load and instantiate the result driver + $driver = $this->load_rdriver(); + $RES = new $driver($this); + + // Is query caching enabled? If so, we'll serialize the + // result object and save it to a cache file. + if ($this->cache_on === TRUE && $this->_cache_init()) + { + // We'll create a new instance of the result object + // only without the platform specific driver since + // we can't use it with cached data (the query result + // resource ID won't be any good once we've cached the + // result object, so we'll have to compile the data + // and save it) + $CR = new CI_DB_result($this); + $CR->result_object = $RES->result_object(); + $CR->result_array = $RES->result_array(); + $CR->num_rows = $RES->num_rows(); + + // Reset these since cached objects can not utilize resource IDs. + $CR->conn_id = NULL; + $CR->result_id = NULL; + + $this->CACHE->write($sql, $CR); + } + + return $RES; + } + + // -------------------------------------------------------------------- + + /** + * Load the result drivers + * + * @return string the name of the result class + */ + public function load_rdriver() + { + $driver = 'CI_DB_'.$this->dbdriver.'_result'; + + if ( ! class_exists($driver, FALSE)) + { + require_once(BASEPATH.'database/DB_result.php'); + require_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result.php'); + } + + return $driver; + } + + // -------------------------------------------------------------------- + + /** + * Simple Query + * This is a simplified version of the query() function. Internally + * we only use it when running transaction commands since they do + * not require all the features of the main query() function. + * + * @param string the sql query + * @return mixed + */ + public function simple_query($sql) + { + if ( ! $this->conn_id) + { + if ( ! $this->initialize()) + { + return FALSE; + } + } + + return $this->_execute($sql); + } + + // -------------------------------------------------------------------- + + /** + * Disable Transactions + * This permits transactions to be disabled at run-time. + * + * @return void + */ + public function trans_off() + { + $this->trans_enabled = FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Enable/disable Transaction Strict Mode + * + * When strict mode is enabled, if you are running multiple groups of + * transactions, if one group fails all subsequent groups will be + * rolled back. + * + * If strict mode is disabled, each group is treated autonomously, + * meaning a failure of one group will not affect any others + * + * @param bool $mode = TRUE + * @return void + */ + public function trans_strict($mode = TRUE) + { + $this->trans_strict = is_bool($mode) ? $mode : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Start Transaction + * + * @param bool $test_mode = FALSE + * @return bool + */ + public function trans_start($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return FALSE; + } + + return $this->trans_begin($test_mode); + } + + // -------------------------------------------------------------------- + + /** + * Complete Transaction + * + * @return bool + */ + public function trans_complete() + { + if ( ! $this->trans_enabled) + { + return FALSE; + } + + // The query() function will set this flag to FALSE in the event that a query failed + if ($this->_trans_status === FALSE OR $this->_trans_failure === TRUE) + { + $this->trans_rollback(); + + // If we are NOT running in strict mode, we will reset + // the _trans_status flag so that subsequent groups of + // transactions will be permitted. + if ($this->trans_strict === FALSE) + { + $this->_trans_status = TRUE; + } + + log_message('debug', 'DB Transaction Failure'); + return FALSE; + } + + return $this->trans_commit(); + } + + // -------------------------------------------------------------------- + + /** + * Lets you retrieve the transaction flag to determine if it has failed + * + * @return bool + */ + public function trans_status() + { + return $this->_trans_status; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @param bool $test_mode + * @return bool + */ + public function trans_begin($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return FALSE; + } + // When transactions are nested we only begin/commit/rollback the outermost ones + elseif ($this->_trans_depth > 0) + { + $this->_trans_depth++; + return TRUE; + } + + // Reset the transaction failure flag. + // If the $test_mode flag is set to TRUE transactions will be rolled back + // even if the queries produce a successful result. + $this->_trans_failure = ($test_mode === TRUE); + + if ($this->_trans_begin()) + { + $this->_trans_depth++; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + public function trans_commit() + { + if ( ! $this->trans_enabled OR $this->_trans_depth === 0) + { + return FALSE; + } + // When transactions are nested we only begin/commit/rollback the outermost ones + elseif ($this->_trans_depth > 1 OR $this->_trans_commit()) + { + $this->_trans_depth--; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + public function trans_rollback() + { + if ( ! $this->trans_enabled OR $this->_trans_depth === 0) + { + return FALSE; + } + // When transactions are nested we only begin/commit/rollback the outermost ones + elseif ($this->_trans_depth > 1 OR $this->_trans_rollback()) + { + $this->_trans_depth--; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Compile Bindings + * + * @param string the sql statement + * @param array an array of bind data + * @return string + */ + public function compile_binds($sql, $binds) + { + if (empty($binds) OR empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE) + { + return $sql; + } + elseif ( ! is_array($binds)) + { + $binds = array($binds); + $bind_count = 1; + } + else + { + // Make sure we're using numeric keys + $binds = array_values($binds); + $bind_count = count($binds); + } + + // We'll need the marker length later + $ml = strlen($this->bind_marker); + + // Make sure not to replace a chunk inside a string that happens to match the bind marker + if ($c = preg_match_all("/'[^']*'/i", $sql, $matches)) + { + $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', + str_replace($matches[0], + str_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]), + $sql, $c), + $matches, PREG_OFFSET_CAPTURE); + + // Bind values' count must match the count of markers in the query + if ($bind_count !== $c) + { + return $sql; + } + } + elseif (($c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bind_count) + { + return $sql; + } + + do + { + $c--; + $escaped_value = $this->escape($binds[$c]); + if (is_array($escaped_value)) + { + $escaped_value = '('.implode(',', $escaped_value).')'; + } + $sql = substr_replace($sql, $escaped_value, $matches[0][$c][1], $ml); + } + while ($c !== 0); + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Determines if a query is a "write" type. + * + * @param string An SQL query string + * @return bool + */ + public function is_write_type($sql) + { + return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s/i', $sql); + } + + // -------------------------------------------------------------------- + + /** + * Calculate the aggregate query elapsed time + * + * @param int The number of decimal places + * @return string + */ + public function elapsed_time($decimals = 6) + { + return number_format($this->benchmark, $decimals); + } + + // -------------------------------------------------------------------- + + /** + * Returns the total number of queries + * + * @return int + */ + public function total_queries() + { + return $this->query_count; + } + + // -------------------------------------------------------------------- + + /** + * Returns the last query that was executed + * + * @return string + */ + public function last_query() + { + return end($this->queries); + } + + // -------------------------------------------------------------------- + + /** + * "Smart" Escape String + * + * Escapes data based on type + * Sets boolean and null types + * + * @param string + * @return mixed + */ + public function escape($str) + { + if (is_array($str)) + { + $str = array_map(array(&$this, 'escape'), $str); + return $str; + } + elseif (is_string($str) OR (is_object($str) && method_exists($str, '__toString'))) + { + return "'".$this->escape_str($str)."'"; + } + elseif (is_bool($str)) + { + return ($str === FALSE) ? 0 : 1; + } + elseif ($str === NULL) + { + return 'NULL'; + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Escape String + * + * @param string|string[] $str Input string + * @param bool $like Whether or not the string will be used in a LIKE condition + * @return string + */ + public function escape_str($str, $like = FALSE) + { + if (is_array($str)) + { + foreach ($str as $key => $val) + { + $str[$key] = $this->escape_str($val, $like); + } + + return $str; + } + + $str = $this->_escape_str($str); + + // escape LIKE condition wildcards + if ($like === TRUE) + { + return str_replace( + array($this->_like_escape_chr, '%', '_'), + array($this->_like_escape_chr.$this->_like_escape_chr, $this->_like_escape_chr.'%', $this->_like_escape_chr.'_'), + $str + ); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Escape LIKE String + * + * Calls the individual driver for platform + * specific escaping for LIKE conditions + * + * @param string|string[] + * @return mixed + */ + public function escape_like_str($str) + { + return $this->escape_str($str, TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependant string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return str_replace("'", "''", remove_invisible_characters($str)); + } + + // -------------------------------------------------------------------- + + /** + * Primary + * + * Retrieves the primary key. It assumes that the row in the first + * position is the primary key + * + * @param string $table Table name + * @return string + */ + public function primary($table) + { + $fields = $this->list_fields($table); + return is_array($fields) ? current($fields) : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * "Count All" query + * + * Generates a platform-specific query string that counts all records in + * the specified database + * + * @param string + * @return int + */ + public function count_all($table = '') + { + if ($table === '') + { + return 0; + } + + $query = $this->query($this->_count_string.$this->escape_identifiers('numrows').' FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE)); + if ($query->num_rows() === 0) + { + return 0; + } + + $query = $query->row(); + $this->_reset_select(); + return (int) $query->numrows; + } + + // -------------------------------------------------------------------- + + /** + * Returns an array of table names + * + * @param string $constrain_by_prefix = FALSE + * @return array + */ + public function list_tables($constrain_by_prefix = FALSE) + { + // Is there a cached result? + if (isset($this->data_cache['table_names'])) + { + return $this->data_cache['table_names']; + } + + if (FALSE === ($sql = $this->_list_tables($constrain_by_prefix))) + { + return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; + } + + $this->data_cache['table_names'] = array(); + $query = $this->query($sql); + + foreach ($query->result_array() as $row) + { + // Do we know from which column to get the table name? + if ( ! isset($key)) + { + if (isset($row['table_name'])) + { + $key = 'table_name'; + } + elseif (isset($row['TABLE_NAME'])) + { + $key = 'TABLE_NAME'; + } + else + { + /* We have no other choice but to just get the first element's key. + * Due to array_shift() accepting its argument by reference, if + * E_STRICT is on, this would trigger a warning. So we'll have to + * assign it first. + */ + $key = array_keys($row); + $key = array_shift($key); + } + } + + $this->data_cache['table_names'][] = $row[$key]; + } + + return $this->data_cache['table_names']; + } + + // -------------------------------------------------------------------- + + /** + * Determine if a particular table exists + * + * @param string $table_name + * @return bool + */ + public function table_exists($table_name) + { + return in_array($this->protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables()); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * @param string $table Table name + * @return array + */ + public function list_fields($table) + { + // Is there a cached result? + if (isset($this->data_cache['field_names'][$table])) + { + return $this->data_cache['field_names'][$table]; + } + + if (FALSE === ($sql = $this->_list_columns($table))) + { + return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; + } + + $query = $this->query($sql); + $this->data_cache['field_names'][$table] = array(); + + foreach ($query->result_array() as $row) + { + // Do we know from where to get the column's name? + if ( ! isset($key)) + { + if (isset($row['column_name'])) + { + $key = 'column_name'; + } + elseif (isset($row['COLUMN_NAME'])) + { + $key = 'COLUMN_NAME'; + } + else + { + // We have no other choice but to just get the first element's key. + $key = key($row); + } + } + + $this->data_cache['field_names'][$table][] = $row[$key]; + } + + return $this->data_cache['field_names'][$table]; + } + + // -------------------------------------------------------------------- + + /** + * Determine if a particular field exists + * + * @param string + * @param string + * @return bool + */ + public function field_exists($field_name, $table_name) + { + return in_array($field_name, $this->list_fields($table_name)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table the table name + * @return array + */ + public function field_data($table) + { + $query = $this->query($this->_field_data($this->protect_identifiers($table, TRUE, NULL, FALSE))); + return ($query) ? $query->field_data() : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Escape the SQL Identifiers + * + * This function escapes column and table names + * + * @param mixed + * @return mixed + */ + public function escape_identifiers($item) + { + if ($this->_escape_char === '' OR empty($item) OR in_array($item, $this->_reserved_identifiers)) + { + return $item; + } + elseif (is_array($item)) + { + foreach ($item as $key => $value) + { + $item[$key] = $this->escape_identifiers($value); + } + + return $item; + } + // Avoid breaking functions and literal values inside queries + elseif (ctype_digit($item) OR $item[0] === "'" OR ($this->_escape_char !== '"' && $item[0] === '"') OR strpos($item, '(') !== FALSE) + { + return $item; + } + + static $preg_ec = array(); + + if (empty($preg_ec)) + { + if (is_array($this->_escape_char)) + { + $preg_ec = array( + preg_quote($this->_escape_char[0], '/'), + preg_quote($this->_escape_char[1], '/'), + $this->_escape_char[0], + $this->_escape_char[1] + ); + } + else + { + $preg_ec[0] = $preg_ec[1] = preg_quote($this->_escape_char, '/'); + $preg_ec[2] = $preg_ec[3] = $this->_escape_char; + } + } + + foreach ($this->_reserved_identifiers as $id) + { + if (strpos($item, '.'.$id) !== FALSE) + { + return preg_replace('/'.$preg_ec[0].'?([^'.$preg_ec[1].'\.]+)'.$preg_ec[1].'?\./i', $preg_ec[2].'$1'.$preg_ec[3].'.', $item); + } + } + + return preg_replace('/'.$preg_ec[0].'?([^'.$preg_ec[1].'\.]+)'.$preg_ec[1].'?(\.)?/i', $preg_ec[2].'$1'.$preg_ec[3].'$2', $item); + } + + // -------------------------------------------------------------------- + + /** + * Generate an insert string + * + * @param string the table upon which the query will be performed + * @param array an associative array data of key/values + * @return string + */ + public function insert_string($table, $data) + { + $fields = $values = array(); + + foreach ($data as $key => $val) + { + $fields[] = $this->escape_identifiers($key); + $values[] = $this->escape($val); + } + + return $this->_insert($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values); + } + + // -------------------------------------------------------------------- + + /** + * Insert statement + * + * Generates a platform-specific insert string from the supplied data + * + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + protected function _insert($table, $keys, $values) + { + return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')'; + } + + // -------------------------------------------------------------------- + + /** + * Generate an update string + * + * @param string the table upon which the query will be performed + * @param array an associative array data of key/values + * @param mixed the "where" statement + * @return string + */ + public function update_string($table, $data, $where) + { + if (empty($where)) + { + return FALSE; + } + + $this->where($where); + + $fields = array(); + foreach ($data as $key => $val) + { + $fields[$this->protect_identifiers($key)] = $this->escape($val); + } + + $sql = $this->_update($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields); + $this->_reset_write(); + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string the table name + * @param array the update data + * @return string + */ + protected function _update($table, $values) + { + foreach ($values as $key => $val) + { + $valstr[] = $key.' = '.$val; + } + + return 'UPDATE '.$table.' SET '.implode(', ', $valstr) + .$this->_compile_wh('qb_where') + .$this->_compile_order_by() + .($this->qb_limit ? ' LIMIT '.$this->qb_limit : ''); + } + + // -------------------------------------------------------------------- + + /** + * Tests whether the string has an SQL operator + * + * @param string + * @return bool + */ + protected function _has_operator($str) + { + return (bool) preg_match('/(<|>|!|=|\sIS NULL|\sIS NOT NULL|\sEXISTS|\sBETWEEN|\sLIKE|\sIN\s*\(|\s)/i', trim($str)); + } + + // -------------------------------------------------------------------- + + /** + * Returns the SQL string operator + * + * @param string + * @return string + */ + protected function _get_operator($str) + { + static $_operators; + + if (empty($_operators)) + { + $_les = ($this->_like_escape_str !== '') + ? '\s+'.preg_quote(trim(sprintf($this->_like_escape_str, $this->_like_escape_chr)), '/') + : ''; + $_operators = array( + '\s*(?:<|>|!)?=\s*', // =, <=, >=, != + '\s*<>?\s*', // <, <> + '\s*>\s*', // > + '\s+IS NULL', // IS NULL + '\s+IS NOT NULL', // IS NOT NULL + '\s+EXISTS\s*\(.*\)', // EXISTS(sql) + '\s+NOT EXISTS\s*\(.*\)', // NOT EXISTS(sql) + '\s+BETWEEN\s+', // BETWEEN value AND value + '\s+IN\s*\(.*\)', // IN(list) + '\s+NOT IN\s*\(.*\)', // NOT IN (list) + '\s+LIKE\s+\S.*('.$_les.')?', // LIKE 'expr'[ ESCAPE '%s'] + '\s+NOT LIKE\s+\S.*('.$_les.')?' // NOT LIKE 'expr'[ ESCAPE '%s'] + ); + + } + + return preg_match('/'.implode('|', $_operators).'/i', $str, $match) + ? $match[0] : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Enables a native PHP function to be run, using a platform agnostic wrapper. + * + * @param string $function Function name + * @return mixed + */ + public function call_function($function) + { + $driver = ($this->dbdriver === 'postgre') ? 'pg_' : $this->dbdriver.'_'; + + if (FALSE === strpos($driver, $function)) + { + $function = $driver.$function; + } + + if ( ! function_exists($function)) + { + return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; + } + + return (func_num_args() > 1) + ? call_user_func_array($function, array_slice(func_get_args(), 1)) + : call_user_func($function); + } + + // -------------------------------------------------------------------- + + /** + * Set Cache Directory Path + * + * @param string the path to the cache directory + * @return void + */ + public function cache_set_path($path = '') + { + $this->cachedir = $path; + } + + // -------------------------------------------------------------------- + + /** + * Enable Query Caching + * + * @return bool cache_on value + */ + public function cache_on() + { + return $this->cache_on = TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Disable Query Caching + * + * @return bool cache_on value + */ + public function cache_off() + { + return $this->cache_on = FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Delete the cache files associated with a particular URI + * + * @param string $segment_one = '' + * @param string $segment_two = '' + * @return bool + */ + public function cache_delete($segment_one = '', $segment_two = '') + { + return $this->_cache_init() + ? $this->CACHE->delete($segment_one, $segment_two) + : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Delete All cache files + * + * @return bool + */ + public function cache_delete_all() + { + return $this->_cache_init() + ? $this->CACHE->delete_all() + : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Initialize the Cache Class + * + * @return bool + */ + protected function _cache_init() + { + if ( ! class_exists('CI_DB_Cache', FALSE)) + { + require_once(BASEPATH.'database/DB_cache.php'); + } + elseif (is_object($this->CACHE)) + { + return TRUE; + } + + $this->CACHE = new CI_DB_Cache($this); // pass db object to support multiple db connections and returned db objects + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + public function close() + { + if ($this->conn_id) + { + $this->_close(); + $this->conn_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * This method would be overridden by most of the drivers. + * + * @return void + */ + protected function _close() + { + $this->conn_id = FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Display an error message + * + * @param string the error message + * @param string any "swap" values + * @param bool whether to localize the message + * @return string sends the application/views/errors/error_db.php template + */ + public function display_error($error = '', $swap = '', $native = FALSE) + { + $LANG =& load_class('Lang', 'core'); + $LANG->load('db'); + + $heading = $LANG->line('db_error_heading'); + + if ($native === TRUE) + { + $message = (array) $error; + } + else + { + $message = is_array($error) ? $error : array(str_replace('%s', $swap, $LANG->line($error))); + } + + // Find the most likely culprit of the error by going through + // the backtrace until the source file is no longer in the + // database folder. + $trace = debug_backtrace(); + foreach ($trace as $call) + { + if (isset($call['file'], $call['class'])) + { + // We'll need this on Windows, as APPPATH and BASEPATH will always use forward slashes + if (DIRECTORY_SEPARATOR !== '/') + { + $call['file'] = str_replace('\\', '/', $call['file']); + } + + if (strpos($call['file'], BASEPATH.'database') === FALSE && strpos($call['class'], 'Loader') === FALSE) + { + // Found it - use a relative path for safety + $message[] = 'Filename: '.str_replace(array(APPPATH, BASEPATH), '', $call['file']); + $message[] = 'Line Number: '.$call['line']; + break; + } + } + } + + $error =& load_class('Exceptions', 'core'); + echo $error->show_error($heading, $message, 'error_db'); + exit(8); // EXIT_DATABASE + } + + // -------------------------------------------------------------------- + + /** + * Protect Identifiers + * + * This function is used extensively by the Query Builder class, and by + * a couple functions in this class. + * It takes a column or table name (optionally with an alias) and inserts + * the table prefix onto it. Some logic is necessary in order to deal with + * column names that include the path. Consider a query like this: + * + * SELECT hostname.database.table.column AS c FROM hostname.database.table + * + * Or a query with aliasing: + * + * SELECT m.member_id, m.member_name FROM members AS m + * + * Since the column name can include up to four segments (host, DB, table, column) + * or also have an alias prefix, we need to do a bit of work to figure this out and + * insert the table prefix (if it exists) in the proper position, and escape only + * the correct identifiers. + * + * @param string + * @param bool + * @param mixed + * @param bool + * @return string + */ + public function protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE) + { + if ( ! is_bool($protect_identifiers)) + { + $protect_identifiers = $this->_protect_identifiers; + } + + if (is_array($item)) + { + $escaped_array = array(); + foreach ($item as $k => $v) + { + $escaped_array[$this->protect_identifiers($k)] = $this->protect_identifiers($v, $prefix_single, $protect_identifiers, $field_exists); + } + + return $escaped_array; + } + + // This is basically a bug fix for queries that use MAX, MIN, etc. + // If a parenthesis is found we know that we do not need to + // escape the data or add a prefix. There's probably a more graceful + // way to deal with this, but I'm not thinking of it -- Rick + // + // Added exception for single quotes as well, we don't want to alter + // literal strings. -- Narf + if (strcspn($item, "()'") !== strlen($item)) + { + return $item; + } + + // Convert tabs or multiple spaces into single spaces + $item = preg_replace('/\s+/', ' ', trim($item)); + + // If the item has an alias declaration we remove it and set it aside. + // Note: strripos() is used in order to support spaces in table names + if ($offset = strripos($item, ' AS ')) + { + $alias = ($protect_identifiers) + ? substr($item, $offset, 4).$this->escape_identifiers(substr($item, $offset + 4)) + : substr($item, $offset); + $item = substr($item, 0, $offset); + } + elseif ($offset = strrpos($item, ' ')) + { + $alias = ($protect_identifiers) + ? ' '.$this->escape_identifiers(substr($item, $offset + 1)) + : substr($item, $offset); + $item = substr($item, 0, $offset); + } + else + { + $alias = ''; + } + + // Break the string apart if it contains periods, then insert the table prefix + // in the correct location, assuming the period doesn't indicate that we're dealing + // with an alias. While we're at it, we will escape the components + if (strpos($item, '.') !== FALSE) + { + $parts = explode('.', $item); + + // Does the first segment of the exploded item match + // one of the aliases previously identified? If so, + // we have nothing more to do other than escape the item + // + // NOTE: The ! empty() condition prevents this method + // from breaking when QB isn't enabled. + if ( ! empty($this->qb_aliased_tables) && in_array($parts[0], $this->qb_aliased_tables)) + { + if ($protect_identifiers === TRUE) + { + foreach ($parts as $key => $val) + { + if ( ! in_array($val, $this->_reserved_identifiers)) + { + $parts[$key] = $this->escape_identifiers($val); + } + } + + $item = implode('.', $parts); + } + + return $item.$alias; + } + + // Is there a table prefix defined in the config file? If not, no need to do anything + if ($this->dbprefix !== '') + { + // We now add the table prefix based on some logic. + // Do we have 4 segments (hostname.database.table.column)? + // If so, we add the table prefix to the column name in the 3rd segment. + if (isset($parts[3])) + { + $i = 2; + } + // Do we have 3 segments (database.table.column)? + // If so, we add the table prefix to the column name in 2nd position + elseif (isset($parts[2])) + { + $i = 1; + } + // Do we have 2 segments (table.column)? + // If so, we add the table prefix to the column name in 1st segment + else + { + $i = 0; + } + + // This flag is set when the supplied $item does not contain a field name. + // This can happen when this function is being called from a JOIN. + if ($field_exists === FALSE) + { + $i++; + } + + // Verify table prefix and replace if necessary + if ($this->swap_pre !== '' && strpos($parts[$i], $this->swap_pre) === 0) + { + $parts[$i] = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $parts[$i]); + } + // We only add the table prefix if it does not already exist + elseif (strpos($parts[$i], $this->dbprefix) !== 0) + { + $parts[$i] = $this->dbprefix.$parts[$i]; + } + + // Put the parts back together + $item = implode('.', $parts); + } + + if ($protect_identifiers === TRUE) + { + $item = $this->escape_identifiers($item); + } + + return $item.$alias; + } + + // Is there a table prefix? If not, no need to insert it + if ($this->dbprefix !== '') + { + // Verify table prefix and replace if necessary + if ($this->swap_pre !== '' && strpos($item, $this->swap_pre) === 0) + { + $item = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $item); + } + // Do we prefix an item with no segments? + elseif ($prefix_single === TRUE && strpos($item, $this->dbprefix) !== 0) + { + $item = $this->dbprefix.$item; + } + } + + if ($protect_identifiers === TRUE && ! in_array($item, $this->_reserved_identifiers)) + { + $item = $this->escape_identifiers($item); + } + + return $item.$alias; + } + + // -------------------------------------------------------------------- + + /** + * Dummy method that allows Query Builder class to be disabled + * and keep count_all() working. + * + * @return void + */ + protected function _reset_select() + { + } + +} diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php new file mode 100644 index 0000000..826aa1e --- /dev/null +++ b/system/database/DB_forge.php @@ -0,0 +1,1032 @@ +db =& $db; + log_message('info', 'Database Forge Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Create database + * + * @param string $db_name + * @return bool + */ + public function create_database($db_name) + { + if ($this->_create_database === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + elseif ( ! $this->db->query(sprintf($this->_create_database, $db_name, $this->db->char_set, $this->db->dbcollat))) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + + if ( ! empty($this->db->data_cache['db_names'])) + { + $this->db->data_cache['db_names'][] = $db_name; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @param string $db_name + * @return bool + */ + public function drop_database($db_name) + { + if ($this->_drop_database === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + elseif ( ! $this->db->query(sprintf($this->_drop_database, $db_name))) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + + if ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($db_name), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Add Key + * + * @param string $key + * @param bool $primary + * @return CI_DB_forge + */ + public function add_key($key, $primary = FALSE) + { + // DO NOT change this! This condition is only applicable + // for PRIMARY keys because you can only have one such, + // and therefore all fields you add to it will be included + // in the same, composite PRIMARY KEY. + // + // It's not the same for regular indexes. + if ($primary === TRUE && is_array($key)) + { + foreach ($key as $one) + { + $this->add_key($one, $primary); + } + + return $this; + } + + if ($primary === TRUE) + { + $this->primary_keys[] = $key; + } + else + { + $this->keys[] = $key; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Add Field + * + * @param array $field + * @return CI_DB_forge + */ + public function add_field($field) + { + if (is_string($field)) + { + if ($field === 'id') + { + $this->add_field(array( + 'id' => array( + 'type' => 'INT', + 'constraint' => 9, + 'auto_increment' => TRUE + ) + )); + $this->add_key('id', TRUE); + } + else + { + if (strpos($field, ' ') === FALSE) + { + show_error('Field information is required for that operation.'); + } + + $this->fields[] = $field; + } + } + + if (is_array($field)) + { + $this->fields = array_merge($this->fields, $field); + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @param string $table Table name + * @param bool $if_not_exists Whether to add IF NOT EXISTS condition + * @param array $attributes Associative array of table attributes + * @return bool + */ + public function create_table($table, $if_not_exists = FALSE, array $attributes = array()) + { + if ($table === '') + { + show_error('A table name is required for that operation.'); + } + else + { + $table = $this->db->dbprefix.$table; + } + + if (count($this->fields) === 0) + { + show_error('Field information is required.'); + } + + $sql = $this->_create_table($table, $if_not_exists, $attributes); + + if (is_bool($sql)) + { + $this->_reset(); + if ($sql === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + } + + if (($result = $this->db->query($sql)) !== FALSE) + { + empty($this->db->data_cache['table_names']) OR $this->db->data_cache['table_names'][] = $table; + + // Most databases don't support creating indexes from within the CREATE TABLE statement + if ( ! empty($this->keys)) + { + for ($i = 0, $sqls = $this->_process_indexes($table), $c = count($sqls); $i < $c; $i++) + { + $this->db->query($sqls[$i]); + } + } + } + + $this->_reset(); + return $result; + } + + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @param string $table Table name + * @param bool $if_not_exists Whether to add 'IF NOT EXISTS' condition + * @param array $attributes Associative array of table attributes + * @return mixed + */ + protected function _create_table($table, $if_not_exists, $attributes) + { + if ($if_not_exists === TRUE && $this->_create_table_if === FALSE) + { + if ($this->db->table_exists($table)) + { + return TRUE; + } + else + { + $if_not_exists = FALSE; + } + } + + $sql = ($if_not_exists) + ? sprintf($this->_create_table_if, $this->db->escape_identifiers($table)) + : 'CREATE TABLE'; + + $columns = $this->_process_fields(TRUE); + for ($i = 0, $c = count($columns); $i < $c; $i++) + { + $columns[$i] = ($columns[$i]['_literal'] !== FALSE) + ? "\n\t".$columns[$i]['_literal'] + : "\n\t".$this->_process_column($columns[$i]); + } + + $columns = implode(',', $columns) + .$this->_process_primary_keys($table); + + // Are indexes created from within the CREATE TABLE statement? (e.g. in MySQL) + if ($this->_create_table_keys === TRUE) + { + $columns .= $this->_process_indexes($table); + } + + // _create_table will usually have the following format: "%s %s (%s\n)" + $sql = sprintf($this->_create_table.'%s', + $sql, + $this->db->escape_identifiers($table), + $columns, + $this->_create_table_attr($attributes) + ); + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * CREATE TABLE attributes + * + * @param array $attributes Associative array of table attributes + * @return string + */ + protected function _create_table_attr($attributes) + { + $sql = ''; + + foreach (array_keys($attributes) as $key) + { + if (is_string($key)) + { + $sql .= ' '.strtoupper($key).' '.$attributes[$key]; + } + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * @param string $table_name Table name + * @param bool $if_exists Whether to add an IF EXISTS condition + * @return bool + */ + public function drop_table($table_name, $if_exists = FALSE) + { + if ($table_name === '') + { + return ($this->db->db_debug) ? $this->db->display_error('db_table_name_required') : FALSE; + } + + if (($query = $this->_drop_table($this->db->dbprefix.$table_name, $if_exists)) === TRUE) + { + return TRUE; + } + + $query = $this->db->query($query); + + // Update table list cache + if ($query && ! empty($this->db->data_cache['table_names'])) + { + $key = array_search(strtolower($this->db->dbprefix.$table_name), array_map('strtolower', $this->db->data_cache['table_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['table_names'][$key]); + } + } + + return $query; + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * Generates a platform-specific DROP TABLE string + * + * @param string $table Table name + * @param bool $if_exists Whether to add an IF EXISTS condition + * @return string + */ + protected function _drop_table($table, $if_exists) + { + $sql = 'DROP TABLE'; + + if ($if_exists) + { + if ($this->_drop_table_if === FALSE) + { + if ( ! $this->db->table_exists($table)) + { + return TRUE; + } + } + else + { + $sql = sprintf($this->_drop_table_if, $this->db->escape_identifiers($table)); + } + } + + return $sql.' '.$this->db->escape_identifiers($table); + } + + // -------------------------------------------------------------------- + + /** + * Rename Table + * + * @param string $table_name Old table name + * @param string $new_table_name New table name + * @return bool + */ + public function rename_table($table_name, $new_table_name) + { + if ($table_name === '' OR $new_table_name === '') + { + show_error('A table name is required for that operation.'); + return FALSE; + } + elseif ($this->_rename_table === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + $result = $this->db->query(sprintf($this->_rename_table, + $this->db->escape_identifiers($this->db->dbprefix.$table_name), + $this->db->escape_identifiers($this->db->dbprefix.$new_table_name)) + ); + + if ($result && ! empty($this->db->data_cache['table_names'])) + { + $key = array_search(strtolower($this->db->dbprefix.$table_name), array_map('strtolower', $this->db->data_cache['table_names']), TRUE); + if ($key !== FALSE) + { + $this->db->data_cache['table_names'][$key] = $this->db->dbprefix.$new_table_name; + } + } + + return $result; + } + + // -------------------------------------------------------------------- + + /** + * Column Add + * + * @todo Remove deprecated $_after option in 3.1+ + * @param string $table Table name + * @param array $field Column definition + * @param string $_after Column for AFTER clause (deprecated) + * @return bool + */ + public function add_column($table, $field, $_after = NULL) + { + // Work-around for literal column definitions + is_array($field) OR $field = array($field); + + foreach (array_keys($field) as $k) + { + // Backwards-compatibility work-around for MySQL/CUBRID AFTER clause (remove in 3.1+) + if ($_after !== NULL && is_array($field[$k]) && ! isset($field[$k]['after'])) + { + $field[$k]['after'] = $_after; + } + + $this->add_field(array($k => $field[$k])); + } + + $sqls = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->_process_fields()); + $this->_reset(); + if ($sqls === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + for ($i = 0, $c = count($sqls); $i < $c; $i++) + { + if ($this->db->query($sqls[$i]) === FALSE) + { + return FALSE; + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Column Drop + * + * @param string $table Table name + * @param string $column_name Column name + * @return bool + */ + public function drop_column($table, $column_name) + { + $sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name); + if ($sql === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + return $this->db->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Column Modify + * + * @param string $table Table name + * @param string $field Column definition + * @return bool + */ + public function modify_column($table, $field) + { + // Work-around for literal column definitions + is_array($field) OR $field = array($field); + + foreach (array_keys($field) as $k) + { + $this->add_field(array($k => $field[$k])); + } + + if (count($this->fields) === 0) + { + show_error('Field information is required.'); + } + + $sqls = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->_process_fields()); + $this->_reset(); + if ($sqls === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + for ($i = 0, $c = count($sqls); $i < $c; $i++) + { + if ($this->db->query($sqls[$i]) === FALSE) + { + return FALSE; + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' '; + + // DROP has everything it needs now. + if ($alter_type === 'DROP') + { + return $sql.'DROP COLUMN '.$this->db->escape_identifiers($field); + } + + $sql .= ($alter_type === 'ADD') + ? 'ADD ' + : $alter_type.' COLUMN '; + + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + $sqls[] = $sql + .($field[$i]['_literal'] !== FALSE ? $field[$i]['_literal'] : $this->_process_column($field[$i])); + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Process fields + * + * @param bool $create_table + * @return array + */ + protected function _process_fields($create_table = FALSE) + { + $fields = array(); + + foreach ($this->fields as $key => $attributes) + { + if (is_int($key) && ! is_array($attributes)) + { + $fields[] = array('_literal' => $attributes); + continue; + } + + $attributes = array_change_key_case($attributes, CASE_UPPER); + + if ($create_table === TRUE && empty($attributes['TYPE'])) + { + continue; + } + + isset($attributes['TYPE']) && $this->_attr_type($attributes); + + $field = array( + 'name' => $key, + 'new_name' => isset($attributes['NAME']) ? $attributes['NAME'] : NULL, + 'type' => isset($attributes['TYPE']) ? $attributes['TYPE'] : NULL, + 'length' => '', + 'unsigned' => '', + 'null' => '', + 'unique' => '', + 'default' => '', + 'auto_increment' => '', + '_literal' => FALSE + ); + + isset($attributes['TYPE']) && $this->_attr_unsigned($attributes, $field); + + if ($create_table === FALSE) + { + if (isset($attributes['AFTER'])) + { + $field['after'] = $attributes['AFTER']; + } + elseif (isset($attributes['FIRST'])) + { + $field['first'] = (bool) $attributes['FIRST']; + } + } + + $this->_attr_default($attributes, $field); + + if (isset($attributes['NULL'])) + { + if ($attributes['NULL'] === TRUE) + { + $field['null'] = empty($this->_null) ? '' : ' '.$this->_null; + } + else + { + $field['null'] = ' NOT NULL'; + } + } + elseif ($create_table === TRUE) + { + $field['null'] = ' NOT NULL'; + } + + $this->_attr_auto_increment($attributes, $field); + $this->_attr_unique($attributes, $field); + + if (isset($attributes['COMMENT'])) + { + $field['comment'] = $this->db->escape($attributes['COMMENT']); + } + + if (isset($attributes['TYPE']) && ! empty($attributes['CONSTRAINT'])) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'ENUM': + case 'SET': + $attributes['CONSTRAINT'] = $this->db->escape($attributes['CONSTRAINT']); + default: + $field['length'] = is_array($attributes['CONSTRAINT']) + ? '('.implode(',', $attributes['CONSTRAINT']).')' + : '('.$attributes['CONSTRAINT'].')'; + break; + } + } + + $fields[] = $field; + } + + return $fields; + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + return $this->db->escape_identifiers($field['name']) + .' '.$field['type'].$field['length'] + .$field['unsigned'] + .$field['default'] + .$field['null'] + .$field['auto_increment'] + .$field['unique']; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + // Usually overridden by drivers + } + + // -------------------------------------------------------------------- + + /** + * Field attribute UNSIGNED + * + * Depending on the _unsigned property value: + * + * - TRUE will always set $field['unsigned'] to 'UNSIGNED' + * - FALSE will always set $field['unsigned'] to '' + * - array(TYPE) will set $field['unsigned'] to 'UNSIGNED', + * if $attributes['TYPE'] is found in the array + * - array(TYPE => UTYPE) will change $field['type'], + * from TYPE to UTYPE in case of a match + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_unsigned(&$attributes, &$field) + { + if (empty($attributes['UNSIGNED']) OR $attributes['UNSIGNED'] !== TRUE) + { + return; + } + + // Reset the attribute in order to avoid issues if we do type conversion + $attributes['UNSIGNED'] = FALSE; + + if (is_array($this->_unsigned)) + { + foreach (array_keys($this->_unsigned) as $key) + { + if (is_int($key) && strcasecmp($attributes['TYPE'], $this->_unsigned[$key]) === 0) + { + $field['unsigned'] = ' UNSIGNED'; + return; + } + elseif (is_string($key) && strcasecmp($attributes['TYPE'], $key) === 0) + { + $field['type'] = $key; + return; + } + } + + return; + } + + $field['unsigned'] = ($this->_unsigned === TRUE) ? ' UNSIGNED' : ''; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute DEFAULT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_default(&$attributes, &$field) + { + if ($this->_default === FALSE) + { + return; + } + + if (array_key_exists('DEFAULT', $attributes)) + { + if ($attributes['DEFAULT'] === NULL) + { + $field['default'] = empty($this->_null) ? '' : $this->_default.$this->_null; + + // Override the NULL attribute if that's our default + $attributes['NULL'] = TRUE; + $field['null'] = empty($this->_null) ? '' : ' '.$this->_null; + } + else + { + $field['default'] = $this->_default.$this->db->escape($attributes['DEFAULT']); + } + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute UNIQUE + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_unique(&$attributes, &$field) + { + if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) + { + $field['unique'] = ' UNIQUE'; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['auto_increment'] = ' AUTO_INCREMENT'; + } + } + + // -------------------------------------------------------------------- + + /** + * Process primary keys + * + * @param string $table Table name + * @return string + */ + protected function _process_primary_keys($table) + { + $sql = ''; + + for ($i = 0, $c = count($this->primary_keys); $i < $c; $i++) + { + if ( ! isset($this->fields[$this->primary_keys[$i]])) + { + unset($this->primary_keys[$i]); + } + } + + if (count($this->primary_keys) > 0) + { + $sql .= ",\n\tCONSTRAINT ".$this->db->escape_identifiers('pk_'.$table) + .' PRIMARY KEY('.implode(', ', $this->db->escape_identifiers($this->primary_keys)).')'; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Process indexes + * + * @param string $table + * @return string + */ + protected function _process_indexes($table) + { + $sqls = array(); + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) + { + if (is_array($this->keys[$i])) + { + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) + { + if ( ! isset($this->fields[$this->keys[$i][$i2]])) + { + unset($this->keys[$i][$i2]); + continue; + } + } + } + elseif ( ! isset($this->fields[$this->keys[$i]])) + { + unset($this->keys[$i]); + continue; + } + + is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); + + $sqls[] = 'CREATE INDEX '.$this->db->escape_identifiers($table.'_'.implode('_', $this->keys[$i])) + .' ON '.$this->db->escape_identifiers($table) + .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).');'; + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Reset + * + * Resets table creation vars + * + * @return void + */ + protected function _reset() + { + $this->fields = $this->keys = $this->primary_keys = array(); + } + +} diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php new file mode 100644 index 0000000..c862d93 --- /dev/null +++ b/system/database/DB_query_builder.php @@ -0,0 +1,2782 @@ +_protect_identifiers; + + foreach ($select as $val) + { + $val = trim($val); + + if ($val !== '') + { + $this->qb_select[] = $val; + $this->qb_no_escape[] = $escape; + + if ($this->qb_caching === TRUE) + { + $this->qb_cache_select[] = $val; + $this->qb_cache_exists[] = 'select'; + $this->qb_cache_no_escape[] = $escape; + } + } + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Select Max + * + * Generates a SELECT MAX(field) portion of a query + * + * @param string the field + * @param string an alias + * @return CI_DB_query_builder + */ + public function select_max($select = '', $alias = '') + { + return $this->_max_min_avg_sum($select, $alias, 'MAX'); + } + + // -------------------------------------------------------------------- + + /** + * Select Min + * + * Generates a SELECT MIN(field) portion of a query + * + * @param string the field + * @param string an alias + * @return CI_DB_query_builder + */ + public function select_min($select = '', $alias = '') + { + return $this->_max_min_avg_sum($select, $alias, 'MIN'); + } + + // -------------------------------------------------------------------- + + /** + * Select Average + * + * Generates a SELECT AVG(field) portion of a query + * + * @param string the field + * @param string an alias + * @return CI_DB_query_builder + */ + public function select_avg($select = '', $alias = '') + { + return $this->_max_min_avg_sum($select, $alias, 'AVG'); + } + + // -------------------------------------------------------------------- + + /** + * Select Sum + * + * Generates a SELECT SUM(field) portion of a query + * + * @param string the field + * @param string an alias + * @return CI_DB_query_builder + */ + public function select_sum($select = '', $alias = '') + { + return $this->_max_min_avg_sum($select, $alias, 'SUM'); + } + + // -------------------------------------------------------------------- + + /** + * SELECT [MAX|MIN|AVG|SUM]() + * + * @used-by select_max() + * @used-by select_min() + * @used-by select_avg() + * @used-by select_sum() + * + * @param string $select Field name + * @param string $alias + * @param string $type + * @return CI_DB_query_builder + */ + protected function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX') + { + if ( ! is_string($select) OR $select === '') + { + $this->display_error('db_invalid_query'); + } + + $type = strtoupper($type); + + if ( ! in_array($type, array('MAX', 'MIN', 'AVG', 'SUM'))) + { + show_error('Invalid function type: '.$type); + } + + if ($alias === '') + { + $alias = $this->_create_alias_from_table(trim($select)); + } + + $sql = $type.'('.$this->protect_identifiers(trim($select)).') AS '.$this->escape_identifiers(trim($alias)); + + $this->qb_select[] = $sql; + $this->qb_no_escape[] = NULL; + + if ($this->qb_caching === TRUE) + { + $this->qb_cache_select[] = $sql; + $this->qb_cache_exists[] = 'select'; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Determines the alias name based on the table + * + * @param string $item + * @return string + */ + protected function _create_alias_from_table($item) + { + if (strpos($item, '.') !== FALSE) + { + $item = explode('.', $item); + return end($item); + } + + return $item; + } + + // -------------------------------------------------------------------- + + /** + * DISTINCT + * + * Sets a flag which tells the query string compiler to add DISTINCT + * + * @param bool $val + * @return CI_DB_query_builder + */ + public function distinct($val = TRUE) + { + $this->qb_distinct = is_bool($val) ? $val : TRUE; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * From + * + * Generates the FROM portion of the query + * + * @param mixed $from can be a string or array + * @return CI_DB_query_builder + */ + public function from($from) + { + foreach ((array) $from as $val) + { + if (strpos($val, ',') !== FALSE) + { + foreach (explode(',', $val) as $v) + { + $v = trim($v); + $this->_track_aliases($v); + + $this->qb_from[] = $v = $this->protect_identifiers($v, TRUE, NULL, FALSE); + + if ($this->qb_caching === TRUE) + { + $this->qb_cache_from[] = $v; + $this->qb_cache_exists[] = 'from'; + } + } + } + else + { + $val = trim($val); + + // Extract any aliases that might exist. We use this information + // in the protect_identifiers to know whether to add a table prefix + $this->_track_aliases($val); + + $this->qb_from[] = $val = $this->protect_identifiers($val, TRUE, NULL, FALSE); + + if ($this->qb_caching === TRUE) + { + $this->qb_cache_from[] = $val; + $this->qb_cache_exists[] = 'from'; + } + } + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * JOIN + * + * Generates the JOIN portion of the query + * + * @param string + * @param string the join condition + * @param string the type of join + * @param string whether not to try to escape identifiers + * @return CI_DB_query_builder + */ + public function join($table, $cond, $type = '', $escape = NULL) + { + if ($type !== '') + { + $type = strtoupper(trim($type)); + + if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER'), TRUE)) + { + $type = ''; + } + else + { + $type .= ' '; + } + } + + // Extract any aliases that might exist. We use this information + // in the protect_identifiers to know whether to add a table prefix + $this->_track_aliases($table); + + is_bool($escape) OR $escape = $this->_protect_identifiers; + + if ( ! $this->_has_operator($cond)) + { + $cond = ' USING ('.($escape ? $this->escape_identifiers($cond) : $cond).')'; + } + elseif ($escape === FALSE) + { + $cond = ' ON '.$cond; + } + else + { + // Split multiple conditions + if (preg_match_all('/\sAND\s|\sOR\s/i', $cond, $joints, PREG_OFFSET_CAPTURE)) + { + $conditions = array(); + $joints = $joints[0]; + array_unshift($joints, array('', 0)); + + for ($i = count($joints) - 1, $pos = strlen($cond); $i >= 0; $i--) + { + $joints[$i][1] += strlen($joints[$i][0]); // offset + $conditions[$i] = substr($cond, $joints[$i][1], $pos - $joints[$i][1]); + $pos = $joints[$i][1] - strlen($joints[$i][0]); + $joints[$i] = $joints[$i][0]; + } + } + else + { + $conditions = array($cond); + $joints = array(''); + } + + $cond = ' ON '; + for ($i = 0, $c = count($conditions); $i < $c; $i++) + { + $operator = $this->_get_operator($conditions[$i]); + $cond .= $joints[$i]; + $cond .= preg_match("/(\(*)?([\[\]\w\.'-]+)".preg_quote($operator)."(.*)/i", $conditions[$i], $match) + ? $match[1].$this->protect_identifiers($match[2]).$operator.$this->protect_identifiers($match[3]) + : $conditions[$i]; + } + } + + // Do we want to escape the table name? + if ($escape === TRUE) + { + $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + // Assemble the JOIN statement + $this->qb_join[] = $join = $type.'JOIN '.$table.$cond; + + if ($this->qb_caching === TRUE) + { + $this->qb_cache_join[] = $join; + $this->qb_cache_exists[] = 'join'; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * WHERE + * + * Generates the WHERE portion of the query. + * Separates multiple calls with 'AND'. + * + * @param mixed + * @param mixed + * @param bool + * @return CI_DB_query_builder + */ + public function where($key, $value = NULL, $escape = NULL) + { + return $this->_wh('qb_where', $key, $value, 'AND ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * OR WHERE + * + * Generates the WHERE portion of the query. + * Separates multiple calls with 'OR'. + * + * @param mixed + * @param mixed + * @param bool + * @return CI_DB_query_builder + */ + public function or_where($key, $value = NULL, $escape = NULL) + { + return $this->_wh('qb_where', $key, $value, 'OR ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * WHERE, HAVING + * + * @used-by where() + * @used-by or_where() + * @used-by having() + * @used-by or_having() + * + * @param string $qb_key 'qb_where' or 'qb_having' + * @param mixed $key + * @param mixed $value + * @param string $type + * @param bool $escape + * @return CI_DB_query_builder + */ + protected function _wh($qb_key, $key, $value = NULL, $type = 'AND ', $escape = NULL) + { + $qb_cache_key = ($qb_key === 'qb_having') ? 'qb_cache_having' : 'qb_cache_where'; + + if ( ! is_array($key)) + { + $key = array($key => $value); + } + + // If the escape value was not set will base it on the global setting + is_bool($escape) OR $escape = $this->_protect_identifiers; + + foreach ($key as $k => $v) + { + $prefix = (count($this->$qb_key) === 0 && count($this->$qb_cache_key) === 0) + ? $this->_group_get_type('') + : $this->_group_get_type($type); + + if ($v !== NULL) + { + if ($escape === TRUE) + { + $v = ' '.$this->escape($v); + } + + if ( ! $this->_has_operator($k)) + { + $k .= ' = '; + } + } + elseif ( ! $this->_has_operator($k)) + { + // value appears not to have been set, assign the test to IS NULL + $k .= ' IS NULL'; + } + elseif (preg_match('/\s*(!?=|<>|IS(?:\s+NOT)?)\s*$/i', $k, $match, PREG_OFFSET_CAPTURE)) + { + $k = substr($k, 0, $match[0][1]).($match[1][0] === '=' ? ' IS NULL' : ' IS NOT NULL'); + } + + $this->{$qb_key}[] = array('condition' => $prefix.$k.$v, 'escape' => $escape); + if ($this->qb_caching === TRUE) + { + $this->{$qb_cache_key}[] = array('condition' => $prefix.$k.$v, 'escape' => $escape); + $this->qb_cache_exists[] = substr($qb_key, 3); + } + + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * WHERE IN + * + * Generates a WHERE field IN('item', 'item') SQL query, + * joined with 'AND' if appropriate. + * + * @param string $key The field to search + * @param array $values The values searched on + * @param bool $escape + * @return CI_DB_query_builder + */ + public function where_in($key = NULL, $values = NULL, $escape = NULL) + { + return $this->_where_in($key, $values, FALSE, 'AND ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * OR WHERE IN + * + * Generates a WHERE field IN('item', 'item') SQL query, + * joined with 'OR' if appropriate. + * + * @param string $key The field to search + * @param array $values The values searched on + * @param bool $escape + * @return CI_DB_query_builder + */ + public function or_where_in($key = NULL, $values = NULL, $escape = NULL) + { + return $this->_where_in($key, $values, FALSE, 'OR ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * WHERE NOT IN + * + * Generates a WHERE field NOT IN('item', 'item') SQL query, + * joined with 'AND' if appropriate. + * + * @param string $key The field to search + * @param array $values The values searched on + * @param bool $escape + * @return CI_DB_query_builder + */ + public function where_not_in($key = NULL, $values = NULL, $escape = NULL) + { + return $this->_where_in($key, $values, TRUE, 'AND ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * OR WHERE NOT IN + * + * Generates a WHERE field NOT IN('item', 'item') SQL query, + * joined with 'OR' if appropriate. + * + * @param string $key The field to search + * @param array $values The values searched on + * @param bool $escape + * @return CI_DB_query_builder + */ + public function or_where_not_in($key = NULL, $values = NULL, $escape = NULL) + { + return $this->_where_in($key, $values, TRUE, 'OR ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * Internal WHERE IN + * + * @used-by where_in() + * @used-by or_where_in() + * @used-by where_not_in() + * @used-by or_where_not_in() + * + * @param string $key The field to search + * @param array $values The values searched on + * @param bool $not If the statement would be IN or NOT IN + * @param string $type + * @param bool $escape + * @return CI_DB_query_builder + */ + protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = 'AND ', $escape = NULL) + { + if ($key === NULL OR $values === NULL) + { + return $this; + } + + if ( ! is_array($values)) + { + $values = array($values); + } + + is_bool($escape) OR $escape = $this->_protect_identifiers; + + $not = ($not) ? ' NOT' : ''; + + if ($escape === TRUE) + { + $where_in = array(); + foreach ($values as $value) + { + $where_in[] = $this->escape($value); + } + } + else + { + $where_in = array_values($values); + } + + $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) + ? $this->_group_get_type('') + : $this->_group_get_type($type); + + $where_in = array( + 'condition' => $prefix.$key.$not.' IN('.implode(', ', $where_in).')', + 'escape' => $escape + ); + + $this->qb_where[] = $where_in; + if ($this->qb_caching === TRUE) + { + $this->qb_cache_where[] = $where_in; + $this->qb_cache_exists[] = 'where'; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * LIKE + * + * Generates a %LIKE% portion of the query. + * Separates multiple calls with 'AND'. + * + * @param mixed $field + * @param string $match + * @param string $side + * @param bool $escape + * @return CI_DB_query_builder + */ + public function like($field, $match = '', $side = 'both', $escape = NULL) + { + return $this->_like($field, $match, 'AND ', $side, '', $escape); + } + + // -------------------------------------------------------------------- + + /** + * NOT LIKE + * + * Generates a NOT LIKE portion of the query. + * Separates multiple calls with 'AND'. + * + * @param mixed $field + * @param string $match + * @param string $side + * @param bool $escape + * @return CI_DB_query_builder + */ + public function not_like($field, $match = '', $side = 'both', $escape = NULL) + { + return $this->_like($field, $match, 'AND ', $side, 'NOT', $escape); + } + + // -------------------------------------------------------------------- + + /** + * OR LIKE + * + * Generates a %LIKE% portion of the query. + * Separates multiple calls with 'OR'. + * + * @param mixed $field + * @param string $match + * @param string $side + * @param bool $escape + * @return CI_DB_query_builder + */ + public function or_like($field, $match = '', $side = 'both', $escape = NULL) + { + return $this->_like($field, $match, 'OR ', $side, '', $escape); + } + + // -------------------------------------------------------------------- + + /** + * OR NOT LIKE + * + * Generates a NOT LIKE portion of the query. + * Separates multiple calls with 'OR'. + * + * @param mixed $field + * @param string $match + * @param string $side + * @param bool $escape + * @return CI_DB_query_builder + */ + public function or_not_like($field, $match = '', $side = 'both', $escape = NULL) + { + return $this->_like($field, $match, 'OR ', $side, 'NOT', $escape); + } + + // -------------------------------------------------------------------- + + /** + * Internal LIKE + * + * @used-by like() + * @used-by or_like() + * @used-by not_like() + * @used-by or_not_like() + * + * @param mixed $field + * @param string $match + * @param string $type + * @param string $side + * @param string $not + * @param bool $escape + * @return CI_DB_query_builder + */ + protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $not = '', $escape = NULL) + { + if ( ! is_array($field)) + { + $field = array($field => $match); + } + + is_bool($escape) OR $escape = $this->_protect_identifiers; + // lowercase $side in case somebody writes e.g. 'BEFORE' instead of 'before' (doh) + $side = strtolower($side); + + foreach ($field as $k => $v) + { + $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) + ? $this->_group_get_type('') : $this->_group_get_type($type); + + if ($escape === TRUE) + { + $v = $this->escape_like_str($v); + } + + if ($side === 'none') + { + $like_statement = "{$prefix} {$k} {$not} LIKE '{$v}'"; + } + elseif ($side === 'before') + { + $like_statement = "{$prefix} {$k} {$not} LIKE '%{$v}'"; + } + elseif ($side === 'after') + { + $like_statement = "{$prefix} {$k} {$not} LIKE '{$v}%'"; + } + else + { + $like_statement = "{$prefix} {$k} {$not} LIKE '%{$v}%'"; + } + + // some platforms require an escape sequence definition for LIKE wildcards + if ($escape === TRUE && $this->_like_escape_str !== '') + { + $like_statement .= sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + $this->qb_where[] = array('condition' => $like_statement, 'escape' => $escape); + if ($this->qb_caching === TRUE) + { + $this->qb_cache_where[] = array('condition' => $like_statement, 'escape' => $escape); + $this->qb_cache_exists[] = 'where'; + } + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Starts a query group. + * + * @param string $not (Internal use only) + * @param string $type (Internal use only) + * @return CI_DB_query_builder + */ + public function group_start($not = '', $type = 'AND ') + { + $type = $this->_group_get_type($type); + + $this->qb_where_group_started = TRUE; + $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? '' : $type; + $where = array( + 'condition' => $prefix.$not.str_repeat(' ', ++$this->qb_where_group_count).' (', + 'escape' => FALSE + ); + + $this->qb_where[] = $where; + if ($this->qb_caching) + { + $this->qb_cache_where[] = $where; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Starts a query group, but ORs the group + * + * @return CI_DB_query_builder + */ + public function or_group_start() + { + return $this->group_start('', 'OR '); + } + + // -------------------------------------------------------------------- + + /** + * Starts a query group, but NOTs the group + * + * @return CI_DB_query_builder + */ + public function not_group_start() + { + return $this->group_start('NOT ', 'AND '); + } + + // -------------------------------------------------------------------- + + /** + * Starts a query group, but OR NOTs the group + * + * @return CI_DB_query_builder + */ + public function or_not_group_start() + { + return $this->group_start('NOT ', 'OR '); + } + + // -------------------------------------------------------------------- + + /** + * Ends a query group + * + * @return CI_DB_query_builder + */ + public function group_end() + { + $this->qb_where_group_started = FALSE; + $where = array( + 'condition' => str_repeat(' ', $this->qb_where_group_count--).')', + 'escape' => FALSE + ); + + $this->qb_where[] = $where; + if ($this->qb_caching) + { + $this->qb_cache_where[] = $where; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Group_get_type + * + * @used-by group_start() + * @used-by _like() + * @used-by _wh() + * @used-by _where_in() + * + * @param string $type + * @return string + */ + protected function _group_get_type($type) + { + if ($this->qb_where_group_started) + { + $type = ''; + $this->qb_where_group_started = FALSE; + } + + return $type; + } + + // -------------------------------------------------------------------- + + /** + * GROUP BY + * + * @param string $by + * @param bool $escape + * @return CI_DB_query_builder + */ + public function group_by($by, $escape = NULL) + { + is_bool($escape) OR $escape = $this->_protect_identifiers; + + if (is_string($by)) + { + $by = ($escape === TRUE) + ? explode(',', $by) + : array($by); + } + + foreach ($by as $val) + { + $val = trim($val); + + if ($val !== '') + { + $val = array('field' => $val, 'escape' => $escape); + + $this->qb_groupby[] = $val; + if ($this->qb_caching === TRUE) + { + $this->qb_cache_groupby[] = $val; + $this->qb_cache_exists[] = 'groupby'; + } + } + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * HAVING + * + * Separates multiple calls with 'AND'. + * + * @param string $key + * @param string $value + * @param bool $escape + * @return CI_DB_query_builder + */ + public function having($key, $value = NULL, $escape = NULL) + { + return $this->_wh('qb_having', $key, $value, 'AND ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * OR HAVING + * + * Separates multiple calls with 'OR'. + * + * @param string $key + * @param string $value + * @param bool $escape + * @return CI_DB_query_builder + */ + public function or_having($key, $value = NULL, $escape = NULL) + { + return $this->_wh('qb_having', $key, $value, 'OR ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * ORDER BY + * + * @param string $orderby + * @param string $direction ASC, DESC or RANDOM + * @param bool $escape + * @return CI_DB_query_builder + */ + public function order_by($orderby, $direction = '', $escape = NULL) + { + $direction = strtoupper(trim($direction)); + + if ($direction === 'RANDOM') + { + $direction = ''; + + // Do we have a seed value? + $orderby = ctype_digit((string) $orderby) + ? sprintf($this->_random_keyword[1], $orderby) + : $this->_random_keyword[0]; + } + elseif (empty($orderby)) + { + return $this; + } + elseif ($direction !== '') + { + $direction = in_array($direction, array('ASC', 'DESC'), TRUE) ? ' '.$direction : ''; + } + + is_bool($escape) OR $escape = $this->_protect_identifiers; + + if ($escape === FALSE) + { + $qb_orderby[] = array('field' => $orderby, 'direction' => $direction, 'escape' => FALSE); + } + else + { + $qb_orderby = array(); + foreach (explode(',', $orderby) as $field) + { + $qb_orderby[] = ($direction === '' && preg_match('/\s+(ASC|DESC)$/i', rtrim($field), $match, PREG_OFFSET_CAPTURE)) + ? array('field' => ltrim(substr($field, 0, $match[0][1])), 'direction' => ' '.$match[1][0], 'escape' => TRUE) + : array('field' => trim($field), 'direction' => $direction, 'escape' => TRUE); + } + } + + $this->qb_orderby = array_merge($this->qb_orderby, $qb_orderby); + if ($this->qb_caching === TRUE) + { + $this->qb_cache_orderby = array_merge($this->qb_cache_orderby, $qb_orderby); + $this->qb_cache_exists[] = 'orderby'; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * @param int $value LIMIT value + * @param int $offset OFFSET value + * @return CI_DB_query_builder + */ + public function limit($value, $offset = 0) + { + is_null($value) OR $this->qb_limit = (int) $value; + empty($offset) OR $this->qb_offset = (int) $offset; + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Sets the OFFSET value + * + * @param int $offset OFFSET value + * @return CI_DB_query_builder + */ + public function offset($offset) + { + empty($offset) OR $this->qb_offset = (int) $offset; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * LIMIT string + * + * Generates a platform-specific LIMIT clause. + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + return $sql.' LIMIT '.($this->qb_offset ? $this->qb_offset.', ' : '').$this->qb_limit; + } + + // -------------------------------------------------------------------- + + /** + * The "set" function. + * + * Allows key/value pairs to be set for inserting or updating + * + * @param mixed + * @param string + * @param bool + * @return CI_DB_query_builder + */ + public function set($key, $value = '', $escape = NULL) + { + $key = $this->_object_to_array($key); + + if ( ! is_array($key)) + { + $key = array($key => $value); + } + + is_bool($escape) OR $escape = $this->_protect_identifiers; + + foreach ($key as $k => $v) + { + $this->qb_set[$this->protect_identifiers($k, FALSE, $escape)] = ($escape) + ? $this->escape($v) : $v; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Get SELECT query string + * + * Compiles a SELECT query string and returns the sql. + * + * @param string the table name to select from (optional) + * @param bool TRUE: resets QB values; FALSE: leave QB values alone + * @return string + */ + public function get_compiled_select($table = '', $reset = TRUE) + { + if ($table !== '') + { + $this->_track_aliases($table); + $this->from($table); + } + + $select = $this->_compile_select(); + + if ($reset === TRUE) + { + $this->_reset_select(); + } + + return $select; + } + + // -------------------------------------------------------------------- + + /** + * Get + * + * Compiles the select statement based on the other functions called + * and runs the query + * + * @param string the table + * @param string the limit clause + * @param string the offset clause + * @return CI_DB_result + */ + public function get($table = '', $limit = NULL, $offset = NULL) + { + if ($table !== '') + { + $this->_track_aliases($table); + $this->from($table); + } + + if ( ! empty($limit)) + { + $this->limit($limit, $offset); + } + + $result = $this->query($this->_compile_select()); + $this->_reset_select(); + return $result; + } + + // -------------------------------------------------------------------- + + /** + * "Count All Results" query + * + * Generates a platform-specific query string that counts all records + * returned by an Query Builder query. + * + * @param string + * @param bool the reset clause + * @return int + */ + public function count_all_results($table = '', $reset = TRUE) + { + if ($table !== '') + { + $this->_track_aliases($table); + $this->from($table); + } + + // ORDER BY usage is often problematic here (most notably + // on Microsoft SQL Server) and ultimately unnecessary + // for selecting COUNT(*) ... + if ( ! empty($this->qb_orderby)) + { + $orderby = $this->qb_orderby; + $this->qb_orderby = NULL; + } + + $result = ($this->qb_distinct === TRUE) + ? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results") + : $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows'))); + + if ($reset === TRUE) + { + $this->_reset_select(); + } + // If we've previously reset the qb_orderby values, get them back + elseif ( ! isset($this->qb_orderby)) + { + $this->qb_orderby = $orderby; + } + + if ($result->num_rows() === 0) + { + return 0; + } + + $row = $result->row(); + return (int) $row->numrows; + } + + // -------------------------------------------------------------------- + + /** + * Get_Where + * + * Allows the where clause, limit and offset to be added directly + * + * @param string $table + * @param string $where + * @param int $limit + * @param int $offset + * @return CI_DB_result + */ + public function get_where($table = '', $where = NULL, $limit = NULL, $offset = NULL) + { + if ($table !== '') + { + $this->from($table); + } + + if ($where !== NULL) + { + $this->where($where); + } + + if ( ! empty($limit)) + { + $this->limit($limit, $offset); + } + + $result = $this->query($this->_compile_select()); + $this->_reset_select(); + return $result; + } + + // -------------------------------------------------------------------- + + /** + * Insert_Batch + * + * Compiles batch insert strings and runs the queries + * + * @param string $table Table to insert into + * @param array $set An associative array of insert values + * @param bool $escape Whether to escape values and identifiers + * @return int Number of rows inserted or FALSE on failure + */ + public function insert_batch($table, $set = NULL, $escape = NULL, $batch_size = 100) + { + if ($set === NULL) + { + if (empty($this->qb_set)) + { + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; + } + } + else + { + if (empty($set)) + { + return ($this->db_debug) ? $this->display_error('insert_batch() called with no data') : FALSE; + } + + $this->set_insert_batch($set, '', $escape); + } + + if (strlen($table) === 0) + { + if ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + $table = $this->qb_from[0]; + } + + // Batch this baby + $affected_rows = 0; + for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size) + { + $this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, $batch_size))); + $affected_rows += $this->affected_rows(); + } + + $this->_reset_write(); + return $affected_rows; + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data. + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string + */ + protected function _insert_batch($table, $keys, $values) + { + return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES '.implode(', ', $values); + } + + // -------------------------------------------------------------------- + + /** + * The "set_insert_batch" function. Allows key/value pairs to be set for batch inserts + * + * @param mixed + * @param string + * @param bool + * @return CI_DB_query_builder + */ + public function set_insert_batch($key, $value = '', $escape = NULL) + { + $key = $this->_object_to_array_batch($key); + + if ( ! is_array($key)) + { + $key = array($key => $value); + } + + is_bool($escape) OR $escape = $this->_protect_identifiers; + + $keys = array_keys($this->_object_to_array(current($key))); + sort($keys); + + foreach ($key as $row) + { + $row = $this->_object_to_array($row); + if (count(array_diff($keys, array_keys($row))) > 0 OR count(array_diff(array_keys($row), $keys)) > 0) + { + // batch function above returns an error on an empty array + $this->qb_set[] = array(); + return; + } + + ksort($row); // puts $row in the same order as our keys + + if ($escape !== FALSE) + { + $clean = array(); + foreach ($row as $value) + { + $clean[] = $this->escape($value); + } + + $row = $clean; + } + + $this->qb_set[] = '('.implode(',', $row).')'; + } + + foreach ($keys as $k) + { + $this->qb_keys[] = $this->protect_identifiers($k, FALSE, $escape); + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Get INSERT query string + * + * Compiles an insert query and returns the sql + * + * @param string the table to insert into + * @param bool TRUE: reset QB values; FALSE: leave QB values alone + * @return string + */ + public function get_compiled_insert($table = '', $reset = TRUE) + { + if ($this->_validate_insert($table) === FALSE) + { + return FALSE; + } + + $sql = $this->_insert( + $this->protect_identifiers( + $this->qb_from[0], TRUE, NULL, FALSE + ), + array_keys($this->qb_set), + array_values($this->qb_set) + ); + + if ($reset === TRUE) + { + $this->_reset_write(); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Insert + * + * Compiles an insert string and runs the query + * + * @param string the table to insert data into + * @param array an associative array of insert values + * @param bool $escape Whether to escape values and identifiers + * @return bool TRUE on success, FALSE on failure + */ + public function insert($table = '', $set = NULL, $escape = NULL) + { + if ($set !== NULL) + { + $this->set($set, '', $escape); + } + + if ($this->_validate_insert($table) === FALSE) + { + return FALSE; + } + + $sql = $this->_insert( + $this->protect_identifiers( + $this->qb_from[0], TRUE, $escape, FALSE + ), + array_keys($this->qb_set), + array_values($this->qb_set) + ); + + $this->_reset_write(); + return $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Validate Insert + * + * This method is used by both insert() and get_compiled_insert() to + * validate that the there data is actually being set and that table + * has been chosen to be inserted into. + * + * @param string the table to insert data into + * @return string + */ + protected function _validate_insert($table = '') + { + if (count($this->qb_set) === 0) + { + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; + } + + if ($table !== '') + { + $this->qb_from[0] = $table; + } + elseif ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Replace + * + * Compiles an replace into string and runs the query + * + * @param string the table to replace data into + * @param array an associative array of insert values + * @return bool TRUE on success, FALSE on failure + */ + public function replace($table = '', $set = NULL) + { + if ($set !== NULL) + { + $this->set($set); + } + + if (count($this->qb_set) === 0) + { + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; + } + + if ($table === '') + { + if ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + $table = $this->qb_from[0]; + } + + $sql = $this->_replace($this->protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->qb_set), array_values($this->qb_set)); + + $this->_reset_write(); + return $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Replace statement + * + * Generates a platform-specific replace string from the supplied data + * + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + protected function _replace($table, $keys, $values) + { + return 'REPLACE INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')'; + } + + // -------------------------------------------------------------------- + + /** + * FROM tables + * + * Groups tables in FROM clauses if needed, so there is no confusion + * about operator precedence. + * + * Note: This is only used (and overridden) by MySQL and CUBRID. + * + * @return string + */ + protected function _from_tables() + { + return implode(', ', $this->qb_from); + } + + // -------------------------------------------------------------------- + + /** + * Get UPDATE query string + * + * Compiles an update query and returns the sql + * + * @param string the table to update + * @param bool TRUE: reset QB values; FALSE: leave QB values alone + * @return string + */ + public function get_compiled_update($table = '', $reset = TRUE) + { + // Combine any cached components with the current statements + $this->_merge_cache(); + + if ($this->_validate_update($table) === FALSE) + { + return FALSE; + } + + $sql = $this->_update($this->qb_from[0], $this->qb_set); + + if ($reset === TRUE) + { + $this->_reset_write(); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * UPDATE + * + * Compiles an update string and runs the query. + * + * @param string $table + * @param array $set An associative array of update values + * @param mixed $where + * @param int $limit + * @return bool TRUE on success, FALSE on failure + */ + public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) + { + // Combine any cached components with the current statements + $this->_merge_cache(); + + if ($set !== NULL) + { + $this->set($set); + } + + if ($this->_validate_update($table) === FALSE) + { + return FALSE; + } + + if ($where !== NULL) + { + $this->where($where); + } + + if ( ! empty($limit)) + { + $this->limit($limit); + } + + $sql = $this->_update($this->qb_from[0], $this->qb_set); + $this->_reset_write(); + return $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Validate Update + * + * This method is used by both update() and get_compiled_update() to + * validate that data is actually being set and that a table has been + * chosen to be update. + * + * @param string the table to update data on + * @return bool + */ + protected function _validate_update($table) + { + if (count($this->qb_set) === 0) + { + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; + } + + if ($table !== '') + { + $this->qb_from = array($this->protect_identifiers($table, TRUE, NULL, FALSE)); + } + elseif ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Update_Batch + * + * Compiles an update string and runs the query + * + * @param string the table to retrieve the results from + * @param array an associative array of update values + * @param string the where key + * @return int number of rows affected or FALSE on failure + */ + public function update_batch($table, $set = NULL, $index = NULL, $batch_size = 100) + { + // Combine any cached components with the current statements + $this->_merge_cache(); + + if ($index === NULL) + { + return ($this->db_debug) ? $this->display_error('db_must_use_index') : FALSE; + } + + if ($set === NULL) + { + if (empty($this->qb_set)) + { + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; + } + } + else + { + if (empty($set)) + { + return ($this->db_debug) ? $this->display_error('update_batch() called with no data') : FALSE; + } + + $this->set_update_batch($set, $index); + } + + if (strlen($table) === 0) + { + if ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + $table = $this->qb_from[0]; + } + + // Batch this baby + $affected_rows = 0; + for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size) + { + $this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set, $i, $batch_size), $this->protect_identifiers($index))); + $affected_rows += $this->affected_rows(); + $this->qb_where = array(); + } + + $this->_reset_write(); + return $affected_rows; + } + + // -------------------------------------------------------------------- + + /** + * Update_Batch statement + * + * Generates a platform-specific batch update string from the supplied data + * + * @param string $table Table name + * @param array $values Update data + * @param string $index WHERE key + * @return string + */ + protected function _update_batch($table, $values, $index) + { + $ids = array(); + foreach ($values as $key => $val) + { + $ids[] = $val[$index]; + + foreach (array_keys($val) as $field) + { + if ($field !== $index) + { + $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $cases = ''; + foreach ($final as $k => $v) + { + $cases .= $k." = CASE \n" + .implode("\n", $v)."\n" + .'ELSE '.$k.' END, '; + } + + $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); + + return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); + } + + // -------------------------------------------------------------------- + + /** + * The "set_update_batch" function. Allows key/value pairs to be set for batch updating + * + * @param array + * @param string + * @param bool + * @return CI_DB_query_builder + */ + public function set_update_batch($key, $index = '', $escape = NULL) + { + $key = $this->_object_to_array_batch($key); + + if ( ! is_array($key)) + { + // @todo error + } + + is_bool($escape) OR $escape = $this->_protect_identifiers; + + foreach ($key as $k => $v) + { + $index_set = FALSE; + $clean = array(); + foreach ($v as $k2 => $v2) + { + if ($k2 === $index) + { + $index_set = TRUE; + } + + $clean[$this->protect_identifiers($k2, FALSE, $escape)] = ($escape === FALSE) ? $v2 : $this->escape($v2); + } + + if ($index_set === FALSE) + { + return $this->display_error('db_batch_missing_index'); + } + + $this->qb_set[] = $clean; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Empty Table + * + * Compiles a delete string and runs "DELETE FROM table" + * + * @param string the table to empty + * @return bool TRUE on success, FALSE on failure + */ + public function empty_table($table = '') + { + if ($table === '') + { + if ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + $table = $this->qb_from[0]; + } + else + { + $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + $sql = $this->_delete($table); + $this->_reset_write(); + return $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Truncate + * + * Compiles a truncate string and runs the query + * If the database does not support the truncate() command + * This function maps to "DELETE FROM table" + * + * @param string the table to truncate + * @return bool TRUE on success, FALSE on failure + */ + public function truncate($table = '') + { + if ($table === '') + { + if ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + $table = $this->qb_from[0]; + } + else + { + $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + $sql = $this->_truncate($table); + $this->_reset_write(); + return $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the truncate() command, + * then this method maps to 'DELETE FROM table' + * + * @param string the table name + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Get DELETE query string + * + * Compiles a delete query string and returns the sql + * + * @param string the table to delete from + * @param bool TRUE: reset QB values; FALSE: leave QB values alone + * @return string + */ + public function get_compiled_delete($table = '', $reset = TRUE) + { + $this->return_delete_sql = TRUE; + $sql = $this->delete($table, '', NULL, $reset); + $this->return_delete_sql = FALSE; + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Delete + * + * Compiles a delete string and runs the query + * + * @param mixed the table(s) to delete from. String or array + * @param mixed the where clause + * @param mixed the limit clause + * @param bool + * @return mixed + */ + public function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE) + { + // Combine any cached components with the current statements + $this->_merge_cache(); + + if ($table === '') + { + if ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + $table = $this->qb_from[0]; + } + elseif (is_array($table)) + { + empty($where) && $reset_data = FALSE; + + foreach ($table as $single_table) + { + $this->delete($single_table, $where, $limit, $reset_data); + } + + return; + } + else + { + $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + if ($where !== '') + { + $this->where($where); + } + + if ( ! empty($limit)) + { + $this->limit($limit); + } + + if (count($this->qb_where) === 0) + { + return ($this->db_debug) ? $this->display_error('db_del_must_use_where') : FALSE; + } + + $sql = $this->_delete($table); + if ($reset_data) + { + $this->_reset_write(); + } + + return ($this->return_delete_sql === TRUE) ? $sql : $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string the table name + * @return string + */ + protected function _delete($table) + { + return 'DELETE FROM '.$table.$this->_compile_wh('qb_where') + .($this->qb_limit ? ' LIMIT '.$this->qb_limit : ''); + } + + // -------------------------------------------------------------------- + + /** + * DB Prefix + * + * Prepends a database prefix if one exists in configuration + * + * @param string the table + * @return string + */ + public function dbprefix($table = '') + { + if ($table === '') + { + $this->display_error('db_table_name_required'); + } + + return $this->dbprefix.$table; + } + + // -------------------------------------------------------------------- + + /** + * Set DB Prefix + * + * Set's the DB Prefix to something new without needing to reconnect + * + * @param string the prefix + * @return string + */ + public function set_dbprefix($prefix = '') + { + return $this->dbprefix = $prefix; + } + + // -------------------------------------------------------------------- + + /** + * Track Aliases + * + * Used to track SQL statements written with aliased tables. + * + * @param string The table to inspect + * @return string + */ + protected function _track_aliases($table) + { + if (is_array($table)) + { + foreach ($table as $t) + { + $this->_track_aliases($t); + } + return; + } + + // Does the string contain a comma? If so, we need to separate + // the string into discreet statements + if (strpos($table, ',') !== FALSE) + { + return $this->_track_aliases(explode(',', $table)); + } + + // if a table alias is used we can recognize it by a space + if (strpos($table, ' ') !== FALSE) + { + // if the alias is written with the AS keyword, remove it + $table = preg_replace('/\s+AS\s+/i', ' ', $table); + + // Grab the alias + $table = trim(strrchr($table, ' ')); + + // Store the alias, if it doesn't already exist + if ( ! in_array($table, $this->qb_aliased_tables)) + { + $this->qb_aliased_tables[] = $table; + } + } + } + + // -------------------------------------------------------------------- + + /** + * Compile the SELECT statement + * + * Generates a query string based on which functions were used. + * Should not be called directly. + * + * @param bool $select_override + * @return string + */ + protected function _compile_select($select_override = FALSE) + { + // Combine any cached components with the current statements + $this->_merge_cache(); + + // Write the "select" portion of the query + if ($select_override !== FALSE) + { + $sql = $select_override; + } + else + { + $sql = ( ! $this->qb_distinct) ? 'SELECT ' : 'SELECT DISTINCT '; + + if (count($this->qb_select) === 0) + { + $sql .= '*'; + } + else + { + // Cycle through the "select" portion of the query and prep each column name. + // The reason we protect identifiers here rather than in the select() function + // is because until the user calls the from() function we don't know if there are aliases + foreach ($this->qb_select as $key => $val) + { + $no_escape = isset($this->qb_no_escape[$key]) ? $this->qb_no_escape[$key] : NULL; + $this->qb_select[$key] = $this->protect_identifiers($val, FALSE, $no_escape); + } + + $sql .= implode(', ', $this->qb_select); + } + } + + // Write the "FROM" portion of the query + if (count($this->qb_from) > 0) + { + $sql .= "\nFROM ".$this->_from_tables(); + } + + // Write the "JOIN" portion of the query + if (count($this->qb_join) > 0) + { + $sql .= "\n".implode("\n", $this->qb_join); + } + + $sql .= $this->_compile_wh('qb_where') + .$this->_compile_group_by() + .$this->_compile_wh('qb_having') + .$this->_compile_order_by(); // ORDER BY + + // LIMIT + if ($this->qb_limit) + { + return $this->_limit($sql."\n"); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Compile WHERE, HAVING statements + * + * Escapes identifiers in WHERE and HAVING statements at execution time. + * + * Required so that aliases are tracked properly, regardless of whether + * where(), or_where(), having(), or_having are called prior to from(), + * join() and dbprefix is added only if needed. + * + * @param string $qb_key 'qb_where' or 'qb_having' + * @return string SQL statement + */ + protected function _compile_wh($qb_key) + { + if (count($this->$qb_key) > 0) + { + for ($i = 0, $c = count($this->$qb_key); $i < $c; $i++) + { + // Is this condition already compiled? + if (is_string($this->{$qb_key}[$i])) + { + continue; + } + elseif ($this->{$qb_key}[$i]['escape'] === FALSE) + { + $this->{$qb_key}[$i] = $this->{$qb_key}[$i]['condition']; + continue; + } + + // Split multiple conditions + $conditions = preg_split( + '/((?:^|\s+)AND\s+|(?:^|\s+)OR\s+)/i', + $this->{$qb_key}[$i]['condition'], + -1, + PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY + ); + + for ($ci = 0, $cc = count($conditions); $ci < $cc; $ci++) + { + if (($op = $this->_get_operator($conditions[$ci])) === FALSE + OR ! preg_match('/^(\(?)(.*)('.preg_quote($op, '/').')\s*(.*(? '(test <= foo)', /* the whole thing */ + // 1 => '(', /* optional */ + // 2 => 'test', /* the field name */ + // 3 => ' <= ', /* $op */ + // 4 => 'foo', /* optional, if $op is e.g. 'IS NULL' */ + // 5 => ')' /* optional */ + // ); + + if ( ! empty($matches[4])) + { + $this->_is_literal($matches[4]) OR $matches[4] = $this->protect_identifiers(trim($matches[4])); + $matches[4] = ' '.$matches[4]; + } + + $conditions[$ci] = $matches[1].$this->protect_identifiers(trim($matches[2])) + .' '.trim($matches[3]).$matches[4].$matches[5]; + } + + $this->{$qb_key}[$i] = implode('', $conditions); + } + + return ($qb_key === 'qb_having' ? "\nHAVING " : "\nWHERE ") + .implode("\n", $this->$qb_key); + } + + return ''; + } + + // -------------------------------------------------------------------- + + /** + * Compile GROUP BY + * + * Escapes identifiers in GROUP BY statements at execution time. + * + * Required so that aliases are tracked properly, regardless of wether + * group_by() is called prior to from(), join() and dbprefix is added + * only if needed. + * + * @return string SQL statement + */ + protected function _compile_group_by() + { + if (count($this->qb_groupby) > 0) + { + for ($i = 0, $c = count($this->qb_groupby); $i < $c; $i++) + { + // Is it already compiled? + if (is_string($this->qb_groupby[$i])) + { + continue; + } + + $this->qb_groupby[$i] = ($this->qb_groupby[$i]['escape'] === FALSE OR $this->_is_literal($this->qb_groupby[$i]['field'])) + ? $this->qb_groupby[$i]['field'] + : $this->protect_identifiers($this->qb_groupby[$i]['field']); + } + + return "\nGROUP BY ".implode(', ', $this->qb_groupby); + } + + return ''; + } + + // -------------------------------------------------------------------- + + /** + * Compile ORDER BY + * + * Escapes identifiers in ORDER BY statements at execution time. + * + * Required so that aliases are tracked properly, regardless of wether + * order_by() is called prior to from(), join() and dbprefix is added + * only if needed. + * + * @return string SQL statement + */ + protected function _compile_order_by() + { + if (is_array($this->qb_orderby) && count($this->qb_orderby) > 0) + { + for ($i = 0, $c = count($this->qb_orderby); $i < $c; $i++) + { + if ($this->qb_orderby[$i]['escape'] !== FALSE && ! $this->_is_literal($this->qb_orderby[$i]['field'])) + { + $this->qb_orderby[$i]['field'] = $this->protect_identifiers($this->qb_orderby[$i]['field']); + } + + $this->qb_orderby[$i] = $this->qb_orderby[$i]['field'].$this->qb_orderby[$i]['direction']; + } + + return $this->qb_orderby = "\nORDER BY ".implode(', ', $this->qb_orderby); + } + elseif (is_string($this->qb_orderby)) + { + return $this->qb_orderby; + } + + return ''; + } + + // -------------------------------------------------------------------- + + /** + * Object to Array + * + * Takes an object as input and converts the class variables to array key/vals + * + * @param object + * @return array + */ + protected function _object_to_array($object) + { + if ( ! is_object($object)) + { + return $object; + } + + $array = array(); + foreach (get_object_vars($object) as $key => $val) + { + // There are some built in keys we need to ignore for this conversion + if ( ! is_object($val) && ! is_array($val) && $key !== '_parent_name') + { + $array[$key] = $val; + } + } + + return $array; + } + + // -------------------------------------------------------------------- + + /** + * Object to Array + * + * Takes an object as input and converts the class variables to array key/vals + * + * @param object + * @return array + */ + protected function _object_to_array_batch($object) + { + if ( ! is_object($object)) + { + return $object; + } + + $array = array(); + $out = get_object_vars($object); + $fields = array_keys($out); + + foreach ($fields as $val) + { + // There are some built in keys we need to ignore for this conversion + if ($val !== '_parent_name') + { + $i = 0; + foreach ($out[$val] as $data) + { + $array[$i++][$val] = $data; + } + } + } + + return $array; + } + + // -------------------------------------------------------------------- + + /** + * Start Cache + * + * Starts QB caching + * + * @return CI_DB_query_builder + */ + public function start_cache() + { + $this->qb_caching = TRUE; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Stop Cache + * + * Stops QB caching + * + * @return CI_DB_query_builder + */ + public function stop_cache() + { + $this->qb_caching = FALSE; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Flush Cache + * + * Empties the QB cache + * + * @return CI_DB_query_builder + */ + public function flush_cache() + { + $this->_reset_run(array( + 'qb_cache_select' => array(), + 'qb_cache_from' => array(), + 'qb_cache_join' => array(), + 'qb_cache_where' => array(), + 'qb_cache_groupby' => array(), + 'qb_cache_having' => array(), + 'qb_cache_orderby' => array(), + 'qb_cache_set' => array(), + 'qb_cache_exists' => array(), + 'qb_cache_no_escape' => array() + )); + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Merge Cache + * + * When called, this function merges any cached QB arrays with + * locally called ones. + * + * @return void + */ + protected function _merge_cache() + { + if (count($this->qb_cache_exists) === 0) + { + return; + } + elseif (in_array('select', $this->qb_cache_exists, TRUE)) + { + $qb_no_escape = $this->qb_cache_no_escape; + } + + foreach (array_unique($this->qb_cache_exists) as $val) // select, from, etc. + { + $qb_variable = 'qb_'.$val; + $qb_cache_var = 'qb_cache_'.$val; + $qb_new = $this->$qb_cache_var; + + for ($i = 0, $c = count($this->$qb_variable); $i < $c; $i++) + { + if ( ! in_array($this->{$qb_variable}[$i], $qb_new, TRUE)) + { + $qb_new[] = $this->{$qb_variable}[$i]; + if ($val === 'select') + { + $qb_no_escape[] = $this->qb_no_escape[$i]; + } + } + } + + $this->$qb_variable = $qb_new; + if ($val === 'select') + { + $this->qb_no_escape = $qb_no_escape; + } + } + + // If we are "protecting identifiers" we need to examine the "from" + // portion of the query to determine if there are any aliases + if ($this->_protect_identifiers === TRUE && count($this->qb_cache_from) > 0) + { + $this->_track_aliases($this->qb_from); + } + } + + // -------------------------------------------------------------------- + + /** + * Is literal + * + * Determines if a string represents a literal value or a field name + * + * @param string $str + * @return bool + */ + protected function _is_literal($str) + { + $str = trim($str); + + if (empty($str) OR ctype_digit($str) OR (string) (float) $str === $str OR in_array(strtoupper($str), array('TRUE', 'FALSE'), TRUE)) + { + return TRUE; + } + + static $_str; + + if (empty($_str)) + { + $_str = ($this->_escape_char !== '"') + ? array('"', "'") : array("'"); + } + + return in_array($str[0], $_str, TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Reset Query Builder values. + * + * Publicly-visible method to reset the QB values. + * + * @return CI_DB_query_builder + */ + public function reset_query() + { + $this->_reset_select(); + $this->_reset_write(); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Resets the query builder values. Called by the get() function + * + * @param array An array of fields to reset + * @return void + */ + protected function _reset_run($qb_reset_items) + { + foreach ($qb_reset_items as $item => $default_value) + { + $this->$item = $default_value; + } + } + + // -------------------------------------------------------------------- + + /** + * Resets the query builder values. Called by the get() function + * + * @return void + */ + protected function _reset_select() + { + $this->_reset_run(array( + 'qb_select' => array(), + 'qb_from' => array(), + 'qb_join' => array(), + 'qb_where' => array(), + 'qb_groupby' => array(), + 'qb_having' => array(), + 'qb_orderby' => array(), + 'qb_aliased_tables' => array(), + 'qb_no_escape' => array(), + 'qb_distinct' => FALSE, + 'qb_limit' => FALSE, + 'qb_offset' => FALSE + )); + } + + // -------------------------------------------------------------------- + + /** + * Resets the query builder "write" values. + * + * Called by the insert() update() insert_batch() update_batch() and delete() functions + * + * @return void + */ + protected function _reset_write() + { + $this->_reset_run(array( + 'qb_set' => array(), + 'qb_from' => array(), + 'qb_join' => array(), + 'qb_where' => array(), + 'qb_orderby' => array(), + 'qb_keys' => array(), + 'qb_limit' => FALSE + )); + } + +} diff --git a/system/database/DB_result.php b/system/database/DB_result.php new file mode 100644 index 0000000..d9d1fcc --- /dev/null +++ b/system/database/DB_result.php @@ -0,0 +1,666 @@ +conn_id = $driver_object->conn_id; + $this->result_id = $driver_object->result_id; + } + + // -------------------------------------------------------------------- + + /** + * Number of rows in the result set + * + * @return int + */ + public function num_rows() + { + if (is_int($this->num_rows)) + { + return $this->num_rows; + } + elseif (count($this->result_array) > 0) + { + return $this->num_rows = count($this->result_array); + } + elseif (count($this->result_object) > 0) + { + return $this->num_rows = count($this->result_object); + } + + return $this->num_rows = count($this->result_array()); + } + + // -------------------------------------------------------------------- + + /** + * Query result. Acts as a wrapper function for the following functions. + * + * @param string $type 'object', 'array' or a custom class name + * @return array + */ + public function result($type = 'object') + { + if ($type === 'array') + { + return $this->result_array(); + } + elseif ($type === 'object') + { + return $this->result_object(); + } + else + { + return $this->custom_result_object($type); + } + } + + // -------------------------------------------------------------------- + + /** + * Custom query result. + * + * @param string $class_name + * @return array + */ + public function custom_result_object($class_name) + { + if (isset($this->custom_result_object[$class_name])) + { + return $this->custom_result_object[$class_name]; + } + elseif ( ! $this->result_id OR $this->num_rows === 0) + { + return array(); + } + + // Don't fetch the result set again if we already have it + $_data = NULL; + if (($c = count($this->result_array)) > 0) + { + $_data = 'result_array'; + } + elseif (($c = count($this->result_object)) > 0) + { + $_data = 'result_object'; + } + + if ($_data !== NULL) + { + for ($i = 0; $i < $c; $i++) + { + $this->custom_result_object[$class_name][$i] = new $class_name(); + + foreach ($this->{$_data}[$i] as $key => $value) + { + $this->custom_result_object[$class_name][$i]->$key = $value; + } + } + + return $this->custom_result_object[$class_name]; + } + + is_null($this->row_data) OR $this->data_seek(0); + $this->custom_result_object[$class_name] = array(); + + while ($row = $this->_fetch_object($class_name)) + { + $this->custom_result_object[$class_name][] = $row; + } + + return $this->custom_result_object[$class_name]; + } + + // -------------------------------------------------------------------- + + /** + * Query result. "object" version. + * + * @return array + */ + public function result_object() + { + if (count($this->result_object) > 0) + { + return $this->result_object; + } + + // In the event that query caching is on, the result_id variable + // will not be a valid resource so we'll simply return an empty + // array. + if ( ! $this->result_id OR $this->num_rows === 0) + { + return array(); + } + + if (($c = count($this->result_array)) > 0) + { + for ($i = 0; $i < $c; $i++) + { + $this->result_object[$i] = (object) $this->result_array[$i]; + } + + return $this->result_object; + } + + is_null($this->row_data) OR $this->data_seek(0); + while ($row = $this->_fetch_object()) + { + $this->result_object[] = $row; + } + + return $this->result_object; + } + + // -------------------------------------------------------------------- + + /** + * Query result. "array" version. + * + * @return array + */ + public function result_array() + { + if (count($this->result_array) > 0) + { + return $this->result_array; + } + + // In the event that query caching is on, the result_id variable + // will not be a valid resource so we'll simply return an empty + // array. + if ( ! $this->result_id OR $this->num_rows === 0) + { + return array(); + } + + if (($c = count($this->result_object)) > 0) + { + for ($i = 0; $i < $c; $i++) + { + $this->result_array[$i] = (array) $this->result_object[$i]; + } + + return $this->result_array; + } + + is_null($this->row_data) OR $this->data_seek(0); + while ($row = $this->_fetch_assoc()) + { + $this->result_array[] = $row; + } + + return $this->result_array; + } + + // -------------------------------------------------------------------- + + /** + * Row + * + * A wrapper method. + * + * @param mixed $n + * @param string $type 'object' or 'array' + * @return mixed + */ + public function row($n = 0, $type = 'object') + { + if ( ! is_numeric($n)) + { + // We cache the row data for subsequent uses + is_array($this->row_data) OR $this->row_data = $this->row_array(0); + + // array_key_exists() instead of isset() to allow for NULL values + if (empty($this->row_data) OR ! array_key_exists($n, $this->row_data)) + { + return NULL; + } + + return $this->row_data[$n]; + } + + if ($type === 'object') return $this->row_object($n); + elseif ($type === 'array') return $this->row_array($n); + else return $this->custom_row_object($n, $type); + } + + // -------------------------------------------------------------------- + + /** + * Assigns an item into a particular column slot + * + * @param mixed $key + * @param mixed $value + * @return void + */ + public function set_row($key, $value = NULL) + { + // We cache the row data for subsequent uses + if ( ! is_array($this->row_data)) + { + $this->row_data = $this->row_array(0); + } + + if (is_array($key)) + { + foreach ($key as $k => $v) + { + $this->row_data[$k] = $v; + } + return; + } + + if ($key !== '' && $value !== NULL) + { + $this->row_data[$key] = $value; + } + } + + // -------------------------------------------------------------------- + + /** + * Returns a single result row - custom object version + * + * @param int $n + * @param string $type + * @return object + */ + public function custom_row_object($n, $type) + { + isset($this->custom_result_object[$type]) OR $this->custom_result_object($type); + + if (count($this->custom_result_object[$type]) === 0) + { + return NULL; + } + + if ($n !== $this->current_row && isset($this->custom_result_object[$type][$n])) + { + $this->current_row = $n; + } + + return $this->custom_result_object[$type][$this->current_row]; + } + + // -------------------------------------------------------------------- + + /** + * Returns a single result row - object version + * + * @param int $n + * @return object + */ + public function row_object($n = 0) + { + $result = $this->result_object(); + if (count($result) === 0) + { + return NULL; + } + + if ($n !== $this->current_row && isset($result[$n])) + { + $this->current_row = $n; + } + + return $result[$this->current_row]; + } + + // -------------------------------------------------------------------- + + /** + * Returns a single result row - array version + * + * @param int $n + * @return array + */ + public function row_array($n = 0) + { + $result = $this->result_array(); + if (count($result) === 0) + { + return NULL; + } + + if ($n !== $this->current_row && isset($result[$n])) + { + $this->current_row = $n; + } + + return $result[$this->current_row]; + } + + // -------------------------------------------------------------------- + + /** + * Returns the "first" row + * + * @param string $type + * @return mixed + */ + public function first_row($type = 'object') + { + $result = $this->result($type); + return (count($result) === 0) ? NULL : $result[0]; + } + + // -------------------------------------------------------------------- + + /** + * Returns the "last" row + * + * @param string $type + * @return mixed + */ + public function last_row($type = 'object') + { + $result = $this->result($type); + return (count($result) === 0) ? NULL : $result[count($result) - 1]; + } + + // -------------------------------------------------------------------- + + /** + * Returns the "next" row + * + * @param string $type + * @return mixed + */ + public function next_row($type = 'object') + { + $result = $this->result($type); + if (count($result) === 0) + { + return NULL; + } + + return isset($result[$this->current_row + 1]) + ? $result[++$this->current_row] + : NULL; + } + + // -------------------------------------------------------------------- + + /** + * Returns the "previous" row + * + * @param string $type + * @return mixed + */ + public function previous_row($type = 'object') + { + $result = $this->result($type); + if (count($result) === 0) + { + return NULL; + } + + if (isset($result[$this->current_row - 1])) + { + --$this->current_row; + } + return $result[$this->current_row]; + } + + // -------------------------------------------------------------------- + + /** + * Returns an unbuffered row and move pointer to next row + * + * @param string $type 'array', 'object' or a custom class name + * @return mixed + */ + public function unbuffered_row($type = 'object') + { + if ($type === 'array') + { + return $this->_fetch_assoc(); + } + elseif ($type === 'object') + { + return $this->_fetch_object(); + } + + return $this->_fetch_object($type); + } + + // -------------------------------------------------------------------- + + /** + * The following methods are normally overloaded by the identically named + * methods in the platform-specific driver -- except when query caching + * is used. When caching is enabled we do not load the other driver. + * These functions are primarily here to prevent undefined function errors + * when a cached result object is in use. They are not otherwise fully + * operational due to the unavailability of the database resource IDs with + * cached results. + */ + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * Overridden by driver result classes. + * + * @return int + */ + public function num_fields() + { + return 0; + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names. + * + * Overridden by driver result classes. + * + * @return array + */ + public function list_fields() + { + return array(); + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data. + * + * Overridden by driver result classes. + * + * @return array + */ + public function field_data() + { + return array(); + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * Overridden by driver result classes. + * + * @return void + */ + public function free_result() + { + $this->result_id = FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * Overridden by driver result classes. + * + * @param int $n + * @return bool + */ + public function data_seek($n = 0) + { + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array. + * + * Overridden by driver result classes. + * + * @return array + */ + protected function _fetch_assoc() + { + return array(); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object. + * + * Overridden by driver result classes. + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return array(); + } + +} diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php new file mode 100644 index 0000000..7052828 --- /dev/null +++ b/system/database/DB_utility.php @@ -0,0 +1,424 @@ +db =& $db; + log_message('info', 'Database Utility Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * List databases + * + * @return array + */ + public function list_databases() + { + // Is there a cached result? + if (isset($this->db->data_cache['db_names'])) + { + return $this->db->data_cache['db_names']; + } + elseif ($this->_list_databases === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + $this->db->data_cache['db_names'] = array(); + + $query = $this->db->query($this->_list_databases); + if ($query === FALSE) + { + return $this->db->data_cache['db_names']; + } + + for ($i = 0, $query = $query->result_array(), $c = count($query); $i < $c; $i++) + { + $this->db->data_cache['db_names'][] = current($query[$i]); + } + + return $this->db->data_cache['db_names']; + } + + // -------------------------------------------------------------------- + + /** + * Determine if a particular database exists + * + * @param string $database_name + * @return bool + */ + public function database_exists($database_name) + { + return in_array($database_name, $this->list_databases()); + } + + // -------------------------------------------------------------------- + + /** + * Optimize Table + * + * @param string $table_name + * @return mixed + */ + public function optimize_table($table_name) + { + if ($this->_optimize_table === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + $query = $this->db->query(sprintf($this->_optimize_table, $this->db->escape_identifiers($table_name))); + if ($query !== FALSE) + { + $query = $query->result_array(); + return current($query); + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Optimize Database + * + * @return mixed + */ + public function optimize_database() + { + if ($this->_optimize_table === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + $result = array(); + foreach ($this->db->list_tables() as $table_name) + { + $res = $this->db->query(sprintf($this->_optimize_table, $this->db->escape_identifiers($table_name))); + if (is_bool($res)) + { + return $res; + } + + // Build the result array... + $res = $res->result_array(); + $res = current($res); + $key = str_replace($this->db->database.'.', '', current($res)); + $keys = array_keys($res); + unset($res[$keys[0]]); + + $result[$key] = $res; + } + + return $result; + } + + // -------------------------------------------------------------------- + + /** + * Repair Table + * + * @param string $table_name + * @return mixed + */ + public function repair_table($table_name) + { + if ($this->_repair_table === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + $query = $this->db->query(sprintf($this->_repair_table, $this->db->escape_identifiers($table_name))); + if (is_bool($query)) + { + return $query; + } + + $query = $query->result_array(); + return current($query); + } + + // -------------------------------------------------------------------- + + /** + * Generate CSV from a query result object + * + * @param object $query Query result object + * @param string $delim Delimiter (default: ,) + * @param string $newline Newline character (default: \n) + * @param string $enclosure Enclosure (default: ") + * @return string + */ + public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosure = '"') + { + if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) + { + show_error('You must submit a valid result object'); + } + + $out = ''; + // First generate the headings from the table column names + foreach ($query->list_fields() as $name) + { + $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim; + } + + $out = substr($out, 0, -strlen($delim)).$newline; + + // Next blast through the result array and build out the rows + while ($row = $query->unbuffered_row('array')) + { + $line = array(); + foreach ($row as $item) + { + $line[] = $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure; + } + $out .= implode($delim, $line).$newline; + } + + return $out; + } + + // -------------------------------------------------------------------- + + /** + * Generate XML data from a query result object + * + * @param object $query Query result object + * @param array $params Any preferences + * @return string + */ + public function xml_from_result($query, $params = array()) + { + if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) + { + show_error('You must submit a valid result object'); + } + + // Set our default values + foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val) + { + if ( ! isset($params[$key])) + { + $params[$key] = $val; + } + } + + // Create variables for convenience + extract($params); + + // Load the xml helper + get_instance()->load->helper('xml'); + + // Generate the result + $xml = '<'.$root.'>'.$newline; + while ($row = $query->unbuffered_row()) + { + $xml .= $tab.'<'.$element.'>'.$newline; + foreach ($row as $key => $val) + { + $xml .= $tab.$tab.'<'.$key.'>'.xml_convert($val).''.$newline; + } + $xml .= $tab.''.$newline; + } + + return $xml.''.$newline; + } + + // -------------------------------------------------------------------- + + /** + * Database Backup + * + * @param array $params + * @return string + */ + public function backup($params = array()) + { + // If the parameters have not been submitted as an + // array then we know that it is simply the table + // name, which is a valid short cut. + if (is_string($params)) + { + $params = array('tables' => $params); + } + + // Set up our default preferences + $prefs = array( + 'tables' => array(), + 'ignore' => array(), + 'filename' => '', + 'format' => 'gzip', // gzip, zip, txt + 'add_drop' => TRUE, + 'add_insert' => TRUE, + 'newline' => "\n", + 'foreign_key_checks' => TRUE + ); + + // Did the user submit any preferences? If so set them.... + if (count($params) > 0) + { + foreach ($prefs as $key => $val) + { + if (isset($params[$key])) + { + $prefs[$key] = $params[$key]; + } + } + } + + // Are we backing up a complete database or individual tables? + // If no table names were submitted we'll fetch the entire table list + if (count($prefs['tables']) === 0) + { + $prefs['tables'] = $this->db->list_tables(); + } + + // Validate the format + if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE)) + { + $prefs['format'] = 'txt'; + } + + // Is the encoder supported? If not, we'll either issue an + // error or use plain text depending on the debug settings + if (($prefs['format'] === 'gzip' && ! function_exists('gzencode')) + OR ($prefs['format'] === 'zip' && ! function_exists('gzcompress'))) + { + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsupported_compression'); + } + + $prefs['format'] = 'txt'; + } + + // Was a Zip file requested? + if ($prefs['format'] === 'zip') + { + // Set the filename if not provided (only needed with Zip files) + if ($prefs['filename'] === '') + { + $prefs['filename'] = (count($prefs['tables']) === 1 ? $prefs['tables'] : $this->db->database) + .date('Y-m-d_H-i', time()).'.sql'; + } + else + { + // If they included the .zip file extension we'll remove it + if (preg_match('|.+?\.zip$|', $prefs['filename'])) + { + $prefs['filename'] = str_replace('.zip', '', $prefs['filename']); + } + + // Tack on the ".sql" file extension if needed + if ( ! preg_match('|.+?\.sql$|', $prefs['filename'])) + { + $prefs['filename'] .= '.sql'; + } + } + + // Load the Zip class and output it + $CI =& get_instance(); + $CI->load->library('zip'); + $CI->zip->add_data($prefs['filename'], $this->_backup($prefs)); + return $CI->zip->get_zip(); + } + elseif ($prefs['format'] === 'txt') // Was a text file requested? + { + return $this->_backup($prefs); + } + elseif ($prefs['format'] === 'gzip') // Was a Gzip file requested? + { + return gzencode($this->_backup($prefs)); + } + + return; + } + +} diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php new file mode 100644 index 0000000..77f591c --- /dev/null +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -0,0 +1,405 @@ +dsn, $matches)) + { + if (stripos($matches[2], 'autocommit=off') !== FALSE) + { + $this->auto_commit = FALSE; + } + } + else + { + // If no port is defined by the user, use the default value + empty($this->port) OR $this->port = 33000; + } + } + + // -------------------------------------------------------------------- + + /** + * Non-persistent database connection + * + * @param bool $persistent + * @return resource + */ + public function db_connect($persistent = FALSE) + { + if (preg_match('/^CUBRID:[^:]+(:[0-9][1-9]{0,4})?:[^:]+:([^:]*):([^:]*):(\?.+)?$/', $this->dsn, $matches)) + { + $func = ($persistent !== TRUE) ? 'cubrid_connect_with_url' : 'cubrid_pconnect_with_url'; + return ($matches[2] === '' && $matches[3] === '' && $this->username !== '' && $this->password !== '') + ? $func($this->dsn, $this->username, $this->password) + : $func($this->dsn); + } + + $func = ($persistent !== TRUE) ? 'cubrid_connect' : 'cubrid_pconnect'; + return ($this->username !== '') + ? $func($this->hostname, $this->port, $this->database, $this->username, $this->password) + : $func($this->hostname, $this->port, $this->database); + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @return void + */ + public function reconnect() + { + if (cubrid_ping($this->conn_id) === FALSE) + { + $this->conn_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + return ( ! $this->conn_id OR ($version = cubrid_get_server_info($this->conn_id)) === FALSE) + ? FALSE + : $this->data_cache['version'] = $version; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return resource + */ + protected function _execute($sql) + { + return cubrid_query($sql, $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + if (($autocommit = cubrid_get_autocommit($this->conn_id)) === NULL) + { + return FALSE; + } + elseif ($autocommit === TRUE) + { + return cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + if ( ! cubrid_commit($this->conn_id)) + { + return FALSE; + } + + if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) + { + return cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + if ( ! cubrid_rollback($this->conn_id)) + { + return FALSE; + } + + if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) + { + cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependant string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return cubrid_real_escape_string($str, $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return cubrid_affected_rows(); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return int + */ + public function insert_id() + { + return cubrid_insert_id($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SHOW TABLES'; + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->Field; + + sscanf($query[$i]->Type, '%[a-z](%d)', + $retval[$i]->type, + $retval[$i]->max_length + ); + + $retval[$i]->default = $query[$i]->Default; + $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occured. + * + * @return array + */ + public function error() + { + return array('code' => cubrid_errno($this->conn_id), 'message' => cubrid_error($this->conn_id)); + } + + // -------------------------------------------------------------------- + + /** + * FROM tables + * + * Groups tables in FROM clauses if needed, so there is no confusion + * about operator precedence. + * + * @return string + */ + protected function _from_tables() + { + if ( ! empty($this->qb_join) && count($this->qb_from) > 1) + { + return '('.implode(', ', $this->qb_from).')'; + } + + return implode(', ', $this->qb_from); + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + cubrid_close($this->conn_id); + } + +} diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php new file mode 100644 index 0000000..8262beb --- /dev/null +++ b/system/database/drivers/cubrid/cubrid_forge.php @@ -0,0 +1,227 @@ + 'INTEGER', + 'SMALLINT' => 'INTEGER', + 'INT' => 'BIGINT', + 'INTEGER' => 'BIGINT', + 'BIGINT' => 'NUMERIC', + 'FLOAT' => 'DOUBLE', + 'REAL' => 'DOUBLE' + ); + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + $sqls[] = $sql.' CHANGE '.$field[$i]['_literal']; + } + else + { + $alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE '; + $sqls[] = $sql.$alter_type.$this->_process_column($field[$i]); + } + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + $extra_clause = isset($field['after']) + ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; + + if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) + { + $extra_clause = ' FIRST'; + } + + return $this->db->escape_identifiers($field['name']) + .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) + .' '.$field['type'].$field['length'] + .$field['unsigned'] + .$field['null'] + .$field['default'] + .$field['auto_increment'] + .$field['unique'] + .$extra_clause; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Process indexes + * + * @param string $table (ignored) + * @return string + */ + protected function _process_indexes($table) + { + $sql = ''; + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) + { + if (is_array($this->keys[$i])) + { + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) + { + if ( ! isset($this->fields[$this->keys[$i][$i2]])) + { + unset($this->keys[$i][$i2]); + continue; + } + } + } + elseif ( ! isset($this->fields[$this->keys[$i]])) + { + unset($this->keys[$i]); + continue; + } + + is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); + + $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) + .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; + } + + $this->keys = array(); + + return $sql; + } + +} diff --git a/system/database/drivers/cubrid/cubrid_result.php b/system/database/drivers/cubrid/cubrid_result.php new file mode 100644 index 0000000..9cccb25 --- /dev/null +++ b/system/database/drivers/cubrid/cubrid_result.php @@ -0,0 +1,177 @@ +num_rows) + ? $this->num_rows + : $this->num_rows = cubrid_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return cubrid_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + return cubrid_column_names($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = cubrid_field_name($this->result_id, $i); + $retval[$i]->type = cubrid_field_type($this->result_id, $i); + $retval[$i]->max_length = cubrid_field_len($this->result_id, $i); + $retval[$i]->primary_key = (int) (strpos(cubrid_field_flags($this->result_id, $i), 'primary_key') !== FALSE); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_resource($this->result_id) OR + (get_resource_type($this->result_id) === 'Unknown' && preg_match('/Resource id #/', strval($this->result_id)))) + { + cubrid_close_request($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * @param int $n + * @return bool + */ + public function data_seek($n = 0) + { + return cubrid_data_seek($this->result_id, $n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return cubrid_fetch_assoc($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return cubrid_fetch_object($this->result_id, $class_name); + } + +} diff --git a/system/database/drivers/cubrid/cubrid_utility.php b/system/database/drivers/cubrid/cubrid_utility.php new file mode 100644 index 0000000..942fa3b --- /dev/null +++ b/system/database/drivers/cubrid/cubrid_utility.php @@ -0,0 +1,79 @@ +db->data_cache['db_names'])) + { + return $this->db->data_cache['db_names']; + } + + return $this->db->data_cache['db_names'] = cubrid_list_dbs($this->db->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * CUBRID Export + * + * @param array Preferences + * @return mixed + */ + protected function _backup($params = array()) + { + // No SQL based support in CUBRID as of version 8.4.0. Database or + // table backup can be performed using CUBRID Manager + // database administration tool. + return $this->db->display_error('db_unsupported_feature'); + } +} diff --git a/system/database/drivers/cubrid/index.html b/system/database/drivers/cubrid/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/cubrid/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/database/drivers/ibase/ibase_driver.php b/system/database/drivers/ibase/ibase_driver.php new file mode 100644 index 0000000..c1055c1 --- /dev/null +++ b/system/database/drivers/ibase/ibase_driver.php @@ -0,0 +1,396 @@ +hostname.':'.$this->database, $this->username, $this->password, $this->char_set) + : ibase_connect($this->hostname.':'.$this->database, $this->username, $this->password, $this->char_set); + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + if (($service = ibase_service_attach($this->hostname, $this->username, $this->password))) + { + $this->data_cache['version'] = ibase_server_info($service, IBASE_SVC_SERVER_VERSION); + + // Don't keep the service open + ibase_service_detach($service); + return $this->data_cache['version']; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return resource + */ + protected function _execute($sql) + { + return ibase_query(isset($this->_ibase_trans) ? $this->_ibase_trans : $this->conn_id, $sql); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + if (($trans_handle = ibase_trans($this->conn_id)) === FALSE) + { + return FALSE; + } + + $this->_ibase_trans = $trans_handle; + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + if (ibase_commit($this->_ibase_trans)) + { + $this->_ibase_trans = NULL; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + if (ibase_rollback($this->_ibase_trans)) + { + $this->_ibase_trans = NULL; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return ibase_affected_rows($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @param string $generator_name + * @param int $inc_by + * @return int + */ + public function insert_id($generator_name, $inc_by = 0) + { + //If a generator hasn't been used before it will return 0 + return ibase_gen_id('"'.$generator_name.'"', $inc_by); + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT TRIM("RDB$RELATION_NAME") AS TABLE_NAME FROM "RDB$RELATIONS" WHERE "RDB$RELATION_NAME" NOT LIKE \'RDB$%\' AND "RDB$RELATION_NAME" NOT LIKE \'MON$%\''; + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql.' AND TRIM("RDB$RELATION_NAME") AS TABLE_NAME LIKE \''.$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT TRIM("RDB$FIELD_NAME") AS COLUMN_NAME FROM "RDB$RELATION_FIELDS" WHERE "RDB$RELATION_NAME" = '.$this->escape($table); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT "rfields"."RDB$FIELD_NAME" AS "name", + CASE "fields"."RDB$FIELD_TYPE" + WHEN 7 THEN \'SMALLINT\' + WHEN 8 THEN \'INTEGER\' + WHEN 9 THEN \'QUAD\' + WHEN 10 THEN \'FLOAT\' + WHEN 11 THEN \'DFLOAT\' + WHEN 12 THEN \'DATE\' + WHEN 13 THEN \'TIME\' + WHEN 14 THEN \'CHAR\' + WHEN 16 THEN \'INT64\' + WHEN 27 THEN \'DOUBLE\' + WHEN 35 THEN \'TIMESTAMP\' + WHEN 37 THEN \'VARCHAR\' + WHEN 40 THEN \'CSTRING\' + WHEN 261 THEN \'BLOB\' + ELSE NULL + END AS "type", + "fields"."RDB$FIELD_LENGTH" AS "max_length", + "rfields"."RDB$DEFAULT_VALUE" AS "default" + FROM "RDB$RELATION_FIELDS" "rfields" + JOIN "RDB$FIELDS" "fields" ON "rfields"."RDB$FIELD_SOURCE" = "fields"."RDB$FIELD_NAME" + WHERE "rfields"."RDB$RELATION_NAME" = '.$this->escape($table).' + ORDER BY "rfields"."RDB$FIELD_POSITION"'; + + return (($query = $this->query($sql)) !== FALSE) + ? $query->result_object() + : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occured. + * + * @return array + */ + public function error() + { + return array('code' => ibase_errcode(), 'message' => ibase_errmsg()); + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'DELETE FROM '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + // Limit clause depends on if Interbase or Firebird + if (stripos($this->version(), 'firebird') !== FALSE) + { + $select = 'FIRST '.$this->qb_limit + .($this->qb_offset ? ' SKIP '.$this->qb_offset : ''); + } + else + { + $select = 'ROWS ' + .($this->qb_offset ? $this->qb_offset.' TO '.($this->qb_limit + $this->qb_offset) : $this->qb_limit); + } + + return preg_replace('`SELECT`i', 'SELECT '.$select, $sql, 1); + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + ibase_close($this->conn_id); + } + +} diff --git a/system/database/drivers/ibase/ibase_forge.php b/system/database/drivers/ibase/ibase_forge.php new file mode 100644 index 0000000..9c358c3 --- /dev/null +++ b/system/database/drivers/ibase/ibase_forge.php @@ -0,0 +1,251 @@ + 'INTEGER', + 'INTEGER' => 'INT64', + 'FLOAT' => 'DOUBLE PRECISION' + ); + + /** + * NULL value representation in CREATE/ALTER TABLE statements + * + * @var string + */ + protected $_null = 'NULL'; + + // -------------------------------------------------------------------- + + /** + * Create database + * + * @param string $db_name + * @return string + */ + public function create_database($db_name) + { + // Firebird databases are flat files, so a path is required + + // Hostname is needed for remote access + empty($this->db->hostname) OR $db_name = $this->hostname.':'.$db_name; + + return parent::create_database('"'.$db_name.'"'); + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @param string $db_name (ignored) + * @return bool + */ + public function drop_database($db_name = '') + { + if ( ! ibase_drop_db($this->conn_id)) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + elseif ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + return FALSE; + } + + if (isset($field[$i]['type'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identififers($field[$i]['name']) + .' TYPE '.$field[$i]['type'].$field[$i]['length']; + } + + if ( ! empty($field[$i]['default'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' SET DEFAULT '.$field[$i]['default']; + } + + if (isset($field[$i]['null'])) + { + $sqls[] = 'UPDATE "RDB$RELATION_FIELDS" SET "RDB$NULL_FLAG" = ' + .($field[$i]['null'] === TRUE ? 'NULL' : '1') + .' WHERE "RDB$FIELD_NAME" = '.$this->db->escape($field[$i]['name']) + .' AND "RDB$RELATION_NAME" = '.$this->db->escape($table); + } + + if ( ! empty($field[$i]['new_name'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); + } + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + return $this->db->escape_identifiers($field['name']) + .' '.$field['type'].$field['length'] + .$field['null'] + .$field['unique'] + .$field['default']; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'INT': + $attributes['TYPE'] = 'INTEGER'; + return; + case 'BIGINT': + $attributes['TYPE'] = 'INT64'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + // Not supported + } + +} diff --git a/system/database/drivers/ibase/ibase_result.php b/system/database/drivers/ibase/ibase_result.php new file mode 100644 index 0000000..f3c21fc --- /dev/null +++ b/system/database/drivers/ibase/ibase_result.php @@ -0,0 +1,161 @@ +result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + for ($i = 0, $num_fields = $this->num_fields(); $i < $num_fields; $i++) + { + $info = ibase_field_info($this->result_id, $i); + $field_names[] = $info['name']; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $info = ibase_field_info($this->result_id, $i); + + $retval[$i] = new stdClass(); + $retval[$i]->name = $info['name']; + $retval[$i]->type = $info['type']; + $retval[$i]->max_length = $info['length']; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + ibase_free_result($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return ibase_fetch_assoc($this->result_id, IBASE_FETCH_BLOBS); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + $row = ibase_fetch_object($this->result_id, IBASE_FETCH_BLOBS); + + if ($class_name === 'stdClass' OR ! $row) + { + return $row; + } + + $class_name = new $class_name(); + foreach ($row as $key => $value) + { + $class_name->$key = $value; + } + + return $class_name; + } + +} diff --git a/system/database/drivers/ibase/ibase_utility.php b/system/database/drivers/ibase/ibase_utility.php new file mode 100644 index 0000000..619ebad --- /dev/null +++ b/system/database/drivers/ibase/ibase_utility.php @@ -0,0 +1,69 @@ +db->hostname, $this->db->username, $this->db->password)) + { + $res = ibase_backup($service, $this->db->database, $filename.'.fbk'); + + // Close the service connection + ibase_service_detach($service); + return $res; + } + + return FALSE; + } + +} diff --git a/system/database/drivers/ibase/index.html b/system/database/drivers/ibase/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/ibase/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/database/drivers/index.html b/system/database/drivers/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/database/drivers/mssql/index.html b/system/database/drivers/mssql/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/mssql/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php new file mode 100644 index 0000000..d40d67a --- /dev/null +++ b/system/database/drivers/mssql/mssql_driver.php @@ -0,0 +1,517 @@ +port)) + { + $this->hostname .= (DIRECTORY_SEPARATOR === '\\' ? ',' : ':').$this->port; + } + } + + // -------------------------------------------------------------------- + + /** + * Non-persistent database connection + * + * @param bool $persistent + * @return resource + */ + public function db_connect($persistent = FALSE) + { + $this->conn_id = ($persistent) + ? mssql_pconnect($this->hostname, $this->username, $this->password) + : mssql_connect($this->hostname, $this->username, $this->password); + + if ( ! $this->conn_id) + { + return FALSE; + } + + // ---------------------------------------------------------------- + + // Select the DB... assuming a database name is specified in the config file + if ($this->database !== '' && ! $this->db_select()) + { + log_message('error', 'Unable to select database: '.$this->database); + + return ($this->db_debug === TRUE) + ? $this->display_error('db_unable_to_select', $this->database) + : FALSE; + } + + // Determine how identifiers are escaped + $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); + $query = $query->row_array(); + $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; + $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); + + return $this->conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @param string $database + * @return bool + */ + public function db_select($database = '') + { + if ($database === '') + { + $database = $this->database; + } + + // Note: Escaping is required in the event that the DB name + // contains reserved characters. + if (mssql_select_db('['.$database.']', $this->conn_id)) + { + $this->database = $database; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return mixed resource if rows are returned, bool otherwise + */ + protected function _execute($sql) + { + return mssql_query($sql, $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + return $this->simple_query('BEGIN TRAN'); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + return $this->simple_query('COMMIT TRAN'); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + return $this->simple_query('ROLLBACK TRAN'); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return mssql_rows_affected($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * Returns the last id created in the Identity column. + * + * @return string + */ + public function insert_id() + { + $query = version_compare($this->version(), '8', '>=') + ? 'SELECT SCOPE_IDENTITY() AS last_id' + : 'SELECT @@IDENTITY AS last_id'; + + $query = $this->query($query); + $query = $query->row(); + return $query->last_id; + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @param string $charset + * @return bool + */ + protected function _db_set_charset($charset) + { + return (ini_set('mssql.charset', $charset) !== FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @return string + */ + protected function _version() + { + return "SELECT SERVERPROPERTY('ProductVersion') AS ver"; + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT '.$this->escape_identifiers('name') + .' FROM '.$this->escape_identifiers('sysobjects') + .' WHERE '.$this->escape_identifiers('type')." = 'U'"; + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql.' ORDER BY '.$this->escape_identifiers('name'); + } + + // -------------------------------------------------------------------- + + /** + * List column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT COLUMN_NAME + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->COLUMN_NAME; + $retval[$i]->type = $query[$i]->DATA_TYPE; + $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; + $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occured. + * + * @return array + */ + public function error() + { + // We need this because the error info is discarded by the + // server the first time you request it, and query() already + // calls error() once for logging purposes when a query fails. + static $error = array('code' => 0, 'message' => NULL); + + $message = mssql_get_last_message(); + if ( ! empty($message)) + { + $error['code'] = $this->query('SELECT @@ERROR AS code')->row()->code; + $error['message'] = $message; + } + + return $error; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE TABLE '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + if ($this->qb_limit) + { + return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; + } + + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + $limit = $this->qb_offset + $this->qb_limit; + + // As of SQL Server 2005 (9.0.*) ROW_NUMBER() is supported, + // however an ORDER BY clause is required for it to work + if (version_compare($this->version(), '9', '>=') && $this->qb_offset && ! empty($this->qb_orderby)) + { + $orderby = $this->_compile_order_by(); + + // We have to strip the ORDER BY clause + $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); + + // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results + if (count($this->qb_select) === 0) + { + $select = '*'; // Inevitable + } + else + { + // Use only field names and their aliases, everything else is out of our scope. + $select = array(); + $field_regexp = ($this->_quoted_identifier) + ? '("[^\"]+")' : '(\[[^\]]+\])'; + for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) + { + $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) + ? $m[1] : $this->qb_select[$i]; + } + $select = implode(', ', $select); + } + + return 'SELECT '.$select." FROM (\n\n" + .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) + ."\n\n) ".$this->escape_identifiers('CI_subquery') + ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; + } + + return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data. + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string|bool + */ + protected function _insert_batch($table, $keys, $values) + { + // Multiple-value inserts are only supported as of SQL Server 2008 + if (version_compare($this->version(), '10', '>=')) + { + return parent::_insert_batch($table, $keys, $values); + } + + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + mssql_close($this->conn_id); + } + +} diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php new file mode 100644 index 0000000..24d1fc2 --- /dev/null +++ b/system/database/drivers/mssql/mssql_forge.php @@ -0,0 +1,146 @@ + 'SMALLINT', + 'SMALLINT' => 'INT', + 'INT' => 'BIGINT', + 'REAL' => 'FLOAT' + ); + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + $sqls[] = $sql.$this->_process_column($field[$i]); + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'INTEGER': + $attributes['TYPE'] = 'INT'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['auto_increment'] = ' IDENTITY(1,1)'; + } + } + +} diff --git a/system/database/drivers/mssql/mssql_result.php b/system/database/drivers/mssql/mssql_result.php new file mode 100644 index 0000000..b62bf75 --- /dev/null +++ b/system/database/drivers/mssql/mssql_result.php @@ -0,0 +1,198 @@ +num_rows) + ? $this->num_rows + : $this->num_rows = mssql_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return mssql_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + mssql_field_seek($this->result_id, 0); + while ($field = mssql_fetch_field($this->result_id)) + { + $field_names[] = $field->name; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $field = mssql_fetch_field($this->result_id, $i); + + $retval[$i] = new stdClass(); + $retval[$i]->name = $field->name; + $retval[$i]->type = $field->type; + $retval[$i]->max_length = $field->max_length; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_resource($this->result_id)) + { + mssql_free_result($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * @param int $n + * @return bool + */ + public function data_seek($n = 0) + { + return mssql_data_seek($this->result_id, $n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return mssql_fetch_assoc($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + $row = mssql_fetch_object($this->result_id); + + if ($class_name === 'stdClass' OR ! $row) + { + return $row; + } + + $class_name = new $class_name(); + foreach ($row as $key => $value) + { + $class_name->$key = $value; + } + + return $class_name; + } + +} diff --git a/system/database/drivers/mssql/mssql_utility.php b/system/database/drivers/mssql/mssql_utility.php new file mode 100644 index 0000000..cd23be8 --- /dev/null +++ b/system/database/drivers/mssql/mssql_utility.php @@ -0,0 +1,77 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/system/database/drivers/mysql/index.html b/system/database/drivers/mysql/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/mysql/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php new file mode 100644 index 0000000..78b1d70 --- /dev/null +++ b/system/database/drivers/mysql/mysql_driver.php @@ -0,0 +1,493 @@ +port)) + { + $this->hostname .= ':'.$this->port; + } + } + + // -------------------------------------------------------------------- + + /** + * Non-persistent database connection + * + * @param bool $persistent + * @return resource + */ + public function db_connect($persistent = FALSE) + { + $client_flags = ($this->compress === FALSE) ? 0 : MYSQL_CLIENT_COMPRESS; + + if ($this->encrypt === TRUE) + { + $client_flags = $client_flags | MYSQL_CLIENT_SSL; + } + + // Error suppression is necessary mostly due to PHP 5.5+ issuing E_DEPRECATED messages + $this->conn_id = ($persistent === TRUE) + ? mysql_pconnect($this->hostname, $this->username, $this->password, $client_flags) + : mysql_connect($this->hostname, $this->username, $this->password, TRUE, $client_flags); + + // ---------------------------------------------------------------- + + // Select the DB... assuming a database name is specified in the config file + if ($this->database !== '' && ! $this->db_select()) + { + log_message('error', 'Unable to select database: '.$this->database); + + return ($this->db_debug === TRUE) + ? $this->display_error('db_unable_to_select', $this->database) + : FALSE; + } + + if (isset($this->stricton) && is_resource($this->conn_id)) + { + if ($this->stricton) + { + $this->simple_query('SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); + } + else + { + $this->simple_query( + 'SET SESSION sql_mode = + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( + @@sql_mode, + "STRICT_ALL_TABLES,", ""), + ",STRICT_ALL_TABLES", ""), + "STRICT_ALL_TABLES", ""), + "STRICT_TRANS_TABLES,", ""), + ",STRICT_TRANS_TABLES", ""), + "STRICT_TRANS_TABLES", "")' + ); + } + } + + return $this->conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @return void + */ + public function reconnect() + { + if (mysql_ping($this->conn_id) === FALSE) + { + $this->conn_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @param string $database + * @return bool + */ + public function db_select($database = '') + { + if ($database === '') + { + $database = $this->database; + } + + if (mysql_select_db($database, $this->conn_id)) + { + $this->database = $database; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @param string $charset + * @return bool + */ + protected function _db_set_charset($charset) + { + return mysql_set_charset($charset, $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + if ( ! $this->conn_id OR ($version = mysql_get_server_info($this->conn_id)) === FALSE) + { + return FALSE; + } + + return $this->data_cache['version'] = $version; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return mixed + */ + protected function _execute($sql) + { + return mysql_query($this->_prep_query($sql), $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Prep the query + * + * If needed, each database adapter can prep the query string + * + * @param string $sql an SQL query + * @return string + */ + protected function _prep_query($sql) + { + // mysql_affected_rows() returns 0 for "DELETE FROM TABLE" queries. This hack + // modifies the query so that it a proper number of affected rows is returned. + if ($this->delete_hack === TRUE && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) + { + return trim($sql).' WHERE 1=1'; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + $this->simple_query('SET AUTOCOMMIT=0'); + return $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + if ($this->simple_query('COMMIT')) + { + $this->simple_query('SET AUTOCOMMIT=1'); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + if ($this->simple_query('ROLLBACK')) + { + $this->simple_query('SET AUTOCOMMIT=1'); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependant string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return mysql_real_escape_string($str, $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return mysql_affected_rows($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return int + */ + public function insert_id() + { + return mysql_insert_id($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SHOW TABLES FROM '.$this->escape_identifiers($this->database); + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->Field; + + sscanf($query[$i]->Type, '%[a-z](%d)', + $retval[$i]->type, + $retval[$i]->max_length + ); + + $retval[$i]->default = $query[$i]->Default; + $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occured. + * + * @return array + */ + public function error() + { + return array('code' => mysql_errno($this->conn_id), 'message' => mysql_error($this->conn_id)); + } + + // -------------------------------------------------------------------- + + /** + * FROM tables + * + * Groups tables in FROM clauses if needed, so there is no confusion + * about operator precedence. + * + * @return string + */ + protected function _from_tables() + { + if ( ! empty($this->qb_join) && count($this->qb_from) > 1) + { + return '('.implode(', ', $this->qb_from).')'; + } + + return implode(', ', $this->qb_from); + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + // Error suppression to avoid annoying E_WARNINGs in cases + // where the connection has already been closed for some reason. + @mysql_close($this->conn_id); + } + +} diff --git a/system/database/drivers/mysql/mysql_forge.php b/system/database/drivers/mysql/mysql_forge.php new file mode 100644 index 0000000..fa84be3 --- /dev/null +++ b/system/database/drivers/mysql/mysql_forge.php @@ -0,0 +1,243 @@ +db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) + { + $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; + } + + if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) + { + $sql .= ' COLLATE = '.$this->db->dbcollat; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'DROP') + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + $field[$i] = ($alter_type === 'ADD') + ? "\n\tADD ".$field[$i]['_literal'] + : "\n\tMODIFY ".$field[$i]['_literal']; + } + else + { + if ($alter_type === 'ADD') + { + $field[$i]['_literal'] = "\n\tADD "; + } + else + { + $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; + } + + $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); + } + } + + return array($sql.implode(',', $field)); + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + $extra_clause = isset($field['after']) + ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; + + if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) + { + $extra_clause = ' FIRST'; + } + + + return $this->db->escape_identifiers($field['name']) + .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) + .' '.$field['type'].$field['length'] + .$field['unsigned'] + .$field['null'] + .$field['default'] + .$field['auto_increment'] + .$field['unique'] + .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) + .$extra_clause; + } + + // -------------------------------------------------------------------- + + /** + * Process indexes + * + * @param string $table (ignored) + * @return string + */ + protected function _process_indexes($table) + { + $sql = ''; + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) + { + if (is_array($this->keys[$i])) + { + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) + { + if ( ! isset($this->fields[$this->keys[$i][$i2]])) + { + unset($this->keys[$i][$i2]); + continue; + } + } + } + elseif ( ! isset($this->fields[$this->keys[$i]])) + { + unset($this->keys[$i]); + continue; + } + + is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); + + $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) + .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; + } + + $this->keys = array(); + + return $sql; + } + +} diff --git a/system/database/drivers/mysql/mysql_result.php b/system/database/drivers/mysql/mysql_result.php new file mode 100644 index 0000000..20cade2 --- /dev/null +++ b/system/database/drivers/mysql/mysql_result.php @@ -0,0 +1,199 @@ +num_rows = mysql_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of rows in the result set + * + * @return int + */ + public function num_rows() + { + return $this->num_rows; + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return mysql_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + mysql_field_seek($this->result_id, 0); + while ($field = mysql_fetch_field($this->result_id)) + { + $field_names[] = $field->name; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = mysql_field_name($this->result_id, $i); + $retval[$i]->type = mysql_field_type($this->result_id, $i); + $retval[$i]->max_length = mysql_field_len($this->result_id, $i); + $retval[$i]->primary_key = (int) (strpos(mysql_field_flags($this->result_id, $i), 'primary_key') !== FALSE); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_resource($this->result_id)) + { + mysql_free_result($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * @param int $n + * @return bool + */ + public function data_seek($n = 0) + { + return $this->num_rows + ? mysql_data_seek($this->result_id, $n) + : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return mysql_fetch_assoc($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return mysql_fetch_object($this->result_id, $class_name); + } + +} diff --git a/system/database/drivers/mysql/mysql_utility.php b/system/database/drivers/mysql/mysql_utility.php new file mode 100644 index 0000000..4c1f239 --- /dev/null +++ b/system/database/drivers/mysql/mysql_utility.php @@ -0,0 +1,211 @@ +db->query('SHOW CREATE TABLE '.$this->db->escape_identifiers($this->db->database.'.'.$table)); + + // No result means the table name was invalid + if ($query === FALSE) + { + continue; + } + + // Write out the table schema + $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline; + + if ($add_drop === TRUE) + { + $output .= 'DROP TABLE IF EXISTS '.$this->db->protect_identifiers($table).';'.$newline.$newline; + } + + $i = 0; + $result = $query->result_array(); + foreach ($result[0] as $val) + { + if ($i++ % 2) + { + $output .= $val.';'.$newline.$newline; + } + } + + // If inserts are not needed we're done... + if ($add_insert === FALSE) + { + continue; + } + + // Grab all the data from the current table + $query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table)); + + if ($query->num_rows() === 0) + { + continue; + } + + // Fetch the field names and determine if the field is an + // integer type. We use this info to decide whether to + // surround the data with quotes or not + + $i = 0; + $field_str = ''; + $is_int = array(); + while ($field = mysql_fetch_field($query->result_id)) + { + // Most versions of MySQL store timestamp as a string + $is_int[$i] = in_array(strtolower(mysql_field_type($query->result_id, $i)), + array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'), + TRUE); + + // Create a string of field names + $field_str .= $this->db->escape_identifiers($field->name).', '; + $i++; + } + + // Trim off the end comma + $field_str = preg_replace('/, $/' , '', $field_str); + + // Build the insert string + foreach ($query->result_array() as $row) + { + $val_str = ''; + + $i = 0; + foreach ($row as $v) + { + // Is the value NULL? + if ($v === NULL) + { + $val_str .= 'NULL'; + } + else + { + // Escape the data if it's not an integer + $val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $v; + } + + // Append a comma + $val_str .= ', '; + $i++; + } + + // Remove the comma at the end of the string + $val_str = preg_replace('/, $/' , '', $val_str); + + // Build the INSERT string + $output .= 'INSERT INTO '.$this->db->protect_identifiers($table).' ('.$field_str.') VALUES ('.$val_str.');'.$newline; + } + + $output .= $newline.$newline; + } + + // Do we need to include a statement to re-enable foreign key checks? + if ($foreign_key_checks === FALSE) + { + $output .= 'SET foreign_key_checks = 1;'.$newline; + } + + return $output; + } + +} diff --git a/system/database/drivers/mysqli/index.html b/system/database/drivers/mysqli/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/mysqli/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php new file mode 100644 index 0000000..06c3418 --- /dev/null +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -0,0 +1,544 @@ +hostname[0] === '/') + { + $hostname = NULL; + $port = NULL; + $socket = $this->hostname; + } + else + { + // Persistent connection support was added in PHP 5.3.0 + $hostname = ($persistent === TRUE && is_php('5.3')) + ? 'p:'.$this->hostname : $this->hostname; + $port = empty($this->port) ? NULL : $this->port; + $socket = NULL; + } + + $client_flags = ($this->compress === TRUE) ? MYSQLI_CLIENT_COMPRESS : 0; + $this->_mysqli = mysqli_init(); + + $this->_mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10); + + if (isset($this->stricton)) + { + if ($this->stricton) + { + $this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); + } + else + { + $this->_mysqli->options(MYSQLI_INIT_COMMAND, + 'SET SESSION sql_mode = + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( + @@sql_mode, + "STRICT_ALL_TABLES,", ""), + ",STRICT_ALL_TABLES", ""), + "STRICT_ALL_TABLES", ""), + "STRICT_TRANS_TABLES,", ""), + ",STRICT_TRANS_TABLES", ""), + "STRICT_TRANS_TABLES", "")' + ); + } + } + + if (is_array($this->encrypt)) + { + $ssl = array(); + empty($this->encrypt['ssl_key']) OR $ssl['key'] = $this->encrypt['ssl_key']; + empty($this->encrypt['ssl_cert']) OR $ssl['cert'] = $this->encrypt['ssl_cert']; + empty($this->encrypt['ssl_ca']) OR $ssl['ca'] = $this->encrypt['ssl_ca']; + empty($this->encrypt['ssl_capath']) OR $ssl['capath'] = $this->encrypt['ssl_capath']; + empty($this->encrypt['ssl_cipher']) OR $ssl['cipher'] = $this->encrypt['ssl_cipher']; + + if ( ! empty($ssl)) + { + if (isset($this->encrypt['ssl_verify'])) + { + if ($this->encrypt['ssl_verify']) + { + defined('MYSQLI_OPT_SSL_VERIFY_SERVER_CERT') && $this->_mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, TRUE); + } + // Apparently (when it exists), setting MYSQLI_OPT_SSL_VERIFY_SERVER_CERT + // to FALSE didn't do anything, so PHP 5.6.16 introduced yet another + // constant ... + // + // https://secure.php.net/ChangeLog-5.php#5.6.16 + // https://bugs.php.net/bug.php?id=68344 + elseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT')) + { + $this->_mysqli->options(MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT, TRUE); + } + } + + $client_flags |= MYSQLI_CLIENT_SSL; + $this->_mysqli->ssl_set( + isset($ssl['key']) ? $ssl['key'] : NULL, + isset($ssl['cert']) ? $ssl['cert'] : NULL, + isset($ssl['ca']) ? $ssl['ca'] : NULL, + isset($ssl['capath']) ? $ssl['capath'] : NULL, + isset($ssl['cipher']) ? $ssl['cipher'] : NULL + ); + } + } + + if ($this->_mysqli->real_connect($hostname, $this->username, $this->password, $this->database, $port, $socket, $client_flags)) + { + // Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails + if ( + ($client_flags & MYSQLI_CLIENT_SSL) + && version_compare($this->_mysqli->client_info, '5.7.3', '<=') + && empty($this->_mysqli->query("SHOW STATUS LIKE 'ssl_cipher'")->fetch_object()->Value) + ) + { + $this->_mysqli->close(); + $message = 'MySQLi was configured for an SSL connection, but got an unencrypted connection instead!'; + log_message('error', $message); + return ($this->db->db_debug) ? $this->db->display_error($message, '', TRUE) : FALSE; + } + + return $this->_mysqli; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @return void + */ + public function reconnect() + { + if ($this->conn_id !== FALSE && $this->conn_id->ping() === FALSE) + { + $this->conn_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @param string $database + * @return bool + */ + public function db_select($database = '') + { + if ($database === '') + { + $database = $this->database; + } + + if ($this->conn_id->select_db($database)) + { + $this->database = $database; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @param string $charset + * @return bool + */ + protected function _db_set_charset($charset) + { + return $this->conn_id->set_charset($charset); + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + return $this->data_cache['version'] = $this->conn_id->server_info; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return mixed + */ + protected function _execute($sql) + { + return $this->conn_id->query($this->_prep_query($sql)); + } + + // -------------------------------------------------------------------- + + /** + * Prep the query + * + * If needed, each database adapter can prep the query string + * + * @param string $sql an SQL query + * @return string + */ + protected function _prep_query($sql) + { + // mysqli_affected_rows() returns 0 for "DELETE FROM TABLE" queries. This hack + // modifies the query so that it a proper number of affected rows is returned. + if ($this->delete_hack === TRUE && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) + { + return trim($sql).' WHERE 1=1'; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + $this->conn_id->autocommit(FALSE); + return is_php('5.5') + ? $this->conn_id->begin_transaction() + : $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + if ($this->conn_id->commit()) + { + $this->conn_id->autocommit(TRUE); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + if ($this->conn_id->rollback()) + { + $this->conn_id->autocommit(TRUE); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependant string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return $this->conn_id->real_escape_string($str); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return $this->conn_id->affected_rows; + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return int + */ + public function insert_id() + { + return $this->conn_id->insert_id; + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SHOW TABLES FROM '.$this->escape_identifiers($this->database); + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->Field; + + sscanf($query[$i]->Type, '%[a-z](%d)', + $retval[$i]->type, + $retval[$i]->max_length + ); + + $retval[$i]->default = $query[$i]->Default; + $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occurred. + * + * @return array + */ + public function error() + { + if ( ! empty($this->_mysqli->connect_errno)) + { + return array( + 'code' => $this->_mysqli->connect_errno, + 'message' => is_php('5.2.9') ? $this->_mysqli->connect_error : mysqli_connect_error() + ); + } + + return array('code' => $this->conn_id->errno, 'message' => $this->conn_id->error); + } + + // -------------------------------------------------------------------- + + /** + * FROM tables + * + * Groups tables in FROM clauses if needed, so there is no confusion + * about operator precedence. + * + * @return string + */ + protected function _from_tables() + { + if ( ! empty($this->qb_join) && count($this->qb_from) > 1) + { + return '('.implode(', ', $this->qb_from).')'; + } + + return implode(', ', $this->qb_from); + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + $this->conn_id->close(); + } + +} diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php new file mode 100644 index 0000000..c17f729 --- /dev/null +++ b/system/database/drivers/mysqli/mysqli_forge.php @@ -0,0 +1,244 @@ +db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) + { + $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; + } + + if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) + { + $sql .= ' COLLATE = '.$this->db->dbcollat; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'DROP') + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + $field[$i] = ($alter_type === 'ADD') + ? "\n\tADD ".$field[$i]['_literal'] + : "\n\tMODIFY ".$field[$i]['_literal']; + } + else + { + if ($alter_type === 'ADD') + { + $field[$i]['_literal'] = "\n\tADD "; + } + else + { + $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; + } + + $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); + } + } + + return array($sql.implode(',', $field)); + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + $extra_clause = isset($field['after']) + ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; + + if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) + { + $extra_clause = ' FIRST'; + } + + return $this->db->escape_identifiers($field['name']) + .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) + .' '.$field['type'].$field['length'] + .$field['unsigned'] + .$field['null'] + .$field['default'] + .$field['auto_increment'] + .$field['unique'] + .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) + .$extra_clause; + } + + // -------------------------------------------------------------------- + + /** + * Process indexes + * + * @param string $table (ignored) + * @return string + */ + protected function _process_indexes($table) + { + $sql = ''; + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) + { + if (is_array($this->keys[$i])) + { + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) + { + if ( ! isset($this->fields[$this->keys[$i][$i2]])) + { + unset($this->keys[$i][$i2]); + continue; + } + } + } + elseif ( ! isset($this->fields[$this->keys[$i]])) + { + unset($this->keys[$i]); + continue; + } + + is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); + + $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) + .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; + } + + $this->keys = array(); + + return $sql; + } + +} diff --git a/system/database/drivers/mysqli/mysqli_result.php b/system/database/drivers/mysqli/mysqli_result.php new file mode 100644 index 0000000..0ce0741 --- /dev/null +++ b/system/database/drivers/mysqli/mysqli_result.php @@ -0,0 +1,186 @@ +num_rows) + ? $this->num_rows + : $this->num_rows = $this->result_id->num_rows; + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return $this->result_id->field_count; + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + $this->result_id->field_seek(0); + while ($field = $this->result_id->fetch_field()) + { + $field_names[] = $field->name; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + $field_data = $this->result_id->fetch_fields(); + for ($i = 0, $c = count($field_data); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $field_data[$i]->name; + $retval[$i]->type = $field_data[$i]->type; + $retval[$i]->max_length = $field_data[$i]->max_length; + $retval[$i]->primary_key = (int) ($field_data[$i]->flags & 2); + $retval[$i]->default = $field_data[$i]->def; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_object($this->result_id)) + { + $this->result_id->free(); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * @param int $n + * @return bool + */ + public function data_seek($n = 0) + { + return $this->result_id->data_seek($n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return $this->result_id->fetch_assoc(); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return $this->result_id->fetch_object($class_name); + } + +} diff --git a/system/database/drivers/mysqli/mysqli_utility.php b/system/database/drivers/mysqli/mysqli_utility.php new file mode 100644 index 0000000..79d9f36 --- /dev/null +++ b/system/database/drivers/mysqli/mysqli_utility.php @@ -0,0 +1,213 @@ +db->query('SHOW CREATE TABLE '.$this->db->escape_identifiers($this->db->database.'.'.$table)); + + // No result means the table name was invalid + if ($query === FALSE) + { + continue; + } + + // Write out the table schema + $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline; + + if ($add_drop === TRUE) + { + $output .= 'DROP TABLE IF EXISTS '.$this->db->protect_identifiers($table).';'.$newline.$newline; + } + + $i = 0; + $result = $query->result_array(); + foreach ($result[0] as $val) + { + if ($i++ % 2) + { + $output .= $val.';'.$newline.$newline; + } + } + + // If inserts are not needed we're done... + if ($add_insert === FALSE) + { + continue; + } + + // Grab all the data from the current table + $query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table)); + + if ($query->num_rows() === 0) + { + continue; + } + + // Fetch the field names and determine if the field is an + // integer type. We use this info to decide whether to + // surround the data with quotes or not + + $i = 0; + $field_str = ''; + $is_int = array(); + while ($field = $query->result_id->fetch_field()) + { + // Most versions of MySQL store timestamp as a string + $is_int[$i] = in_array(strtolower($field->type), + array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'), + TRUE); + + // Create a string of field names + $field_str .= $this->db->escape_identifiers($field->name).', '; + $i++; + } + + // Trim off the end comma + $field_str = preg_replace('/, $/' , '', $field_str); + + // Build the insert string + foreach ($query->result_array() as $row) + { + $val_str = ''; + + $i = 0; + foreach ($row as $v) + { + // Is the value NULL? + if ($v === NULL) + { + $val_str .= 'NULL'; + } + else + { + // Escape the data if it's not an integer + $val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $v; + } + + // Append a comma + $val_str .= ', '; + $i++; + } + + // Remove the comma at the end of the string + $val_str = preg_replace('/, $/' , '', $val_str); + + // Build the INSERT string + $output .= 'INSERT INTO '.$this->db->protect_identifiers($table).' ('.$field_str.') VALUES ('.$val_str.');'.$newline; + } + + $output .= $newline.$newline; + } + + // Do we need to include a statement to re-enable foreign key checks? + if ($foreign_key_checks === FALSE) + { + $output .= 'SET foreign_key_checks = 1;'.$newline; + } + + return $output; + } + +} diff --git a/system/database/drivers/oci8/index.html b/system/database/drivers/oci8/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/oci8/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php new file mode 100644 index 0000000..59f0e84 --- /dev/null +++ b/system/database/drivers/oci8/oci8_driver.php @@ -0,0 +1,682 @@ + '/^\(DESCRIPTION=(\(.+\)){2,}\)$/', // TNS + // Easy Connect string (Oracle 10g+) + 'ec' => '/^(\/\/)?[a-z0-9.:_-]+(:[1-9][0-9]{0,4})?(\/[a-z0-9$_]+)?(:[^\/])?(\/[a-z0-9$_]+)?$/i', + 'in' => '/^[a-z0-9$_]+$/i' // Instance name (defined in tnsnames.ora) + ); + + /* Space characters don't have any effect when actually + * connecting, but can be a hassle while validating the DSN. + */ + $this->dsn = str_replace(array("\n", "\r", "\t", ' '), '', $this->dsn); + + if ($this->dsn !== '') + { + foreach ($valid_dsns as $regexp) + { + if (preg_match($regexp, $this->dsn)) + { + return; + } + } + } + + // Legacy support for TNS in the hostname configuration field + $this->hostname = str_replace(array("\n", "\r", "\t", ' '), '', $this->hostname); + if (preg_match($valid_dsns['tns'], $this->hostname)) + { + $this->dsn = $this->hostname; + return; + } + elseif ($this->hostname !== '' && strpos($this->hostname, '/') === FALSE && strpos($this->hostname, ':') === FALSE + && (( ! empty($this->port) && ctype_digit($this->port)) OR $this->database !== '')) + { + /* If the hostname field isn't empty, doesn't contain + * ':' and/or '/' and if port and/or database aren't + * empty, then the hostname field is most likely indeed + * just a hostname. Therefore we'll try and build an + * Easy Connect string from these 3 settings, assuming + * that the database field is a service name. + */ + $this->dsn = $this->hostname + .(( ! empty($this->port) && ctype_digit($this->port)) ? ':'.$this->port : '') + .($this->database !== '' ? '/'.ltrim($this->database, '/') : ''); + + if (preg_match($valid_dsns['ec'], $this->dsn)) + { + return; + } + } + + /* At this point, we can only try and validate the hostname and + * database fields separately as DSNs. + */ + if (preg_match($valid_dsns['ec'], $this->hostname) OR preg_match($valid_dsns['in'], $this->hostname)) + { + $this->dsn = $this->hostname; + return; + } + + $this->database = str_replace(array("\n", "\r", "\t", ' '), '', $this->database); + foreach ($valid_dsns as $regexp) + { + if (preg_match($regexp, $this->database)) + { + return; + } + } + + /* Well - OK, an empty string should work as well. + * PHP will try to use environment variables to + * determine which Oracle instance to connect to. + */ + $this->dsn = ''; + } + + // -------------------------------------------------------------------- + + /** + * Non-persistent database connection + * + * @param bool $persistent + * @return resource + */ + public function db_connect($persistent = FALSE) + { + $func = ($persistent === TRUE) ? 'oci_pconnect' : 'oci_connect'; + return empty($this->char_set) + ? $func($this->username, $this->password, $this->dsn) + : $func($this->username, $this->password, $this->dsn, $this->char_set); + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + if ( ! $this->conn_id OR ($version_string = oci_server_version($this->conn_id)) === FALSE) + { + return FALSE; + } + elseif (preg_match('#Release\s(\d+(?:\.\d+)+)#', $version_string, $match)) + { + return $this->data_cache['version'] = $match[1]; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return resource + */ + protected function _execute($sql) + { + /* Oracle must parse the query before it is run. All of the actions with + * the query are based on the statement id returned by oci_parse(). + */ + if ($this->_reset_stmt_id === TRUE) + { + $this->stmt_id = oci_parse($this->conn_id, $sql); + } + + oci_set_prefetch($this->stmt_id, 1000); + return oci_execute($this->stmt_id, $this->commit_mode); + } + + // -------------------------------------------------------------------- + + /** + * Get cursor. Returns a cursor from the database + * + * @return resource + */ + public function get_cursor() + { + return $this->curs_id = oci_new_cursor($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Stored Procedure. Executes a stored procedure + * + * @param string package name in which the stored procedure is in + * @param string stored procedure name to execute + * @param array parameters + * @return mixed + * + * params array keys + * + * KEY OPTIONAL NOTES + * name no the name of the parameter should be in : format + * value no the value of the parameter. If this is an OUT or IN OUT parameter, + * this should be a reference to a variable + * type yes the type of the parameter + * length yes the max size of the parameter + */ + public function stored_procedure($package, $procedure, array $params) + { + if ($package === '' OR $procedure === '') + { + log_message('error', 'Invalid query: '.$package.'.'.$procedure); + return ($this->db_debug) ? $this->display_error('db_invalid_query') : FALSE; + } + + // Build the query string + $sql = 'BEGIN '.$package.'.'.$procedure.'('; + + $have_cursor = FALSE; + foreach ($params as $param) + { + $sql .= $param['name'].','; + + if (isset($param['type']) && $param['type'] === OCI_B_CURSOR) + { + $have_cursor = TRUE; + } + } + $sql = trim($sql, ',').'); END;'; + + $this->_reset_stmt_id = FALSE; + $this->stmt_id = oci_parse($this->conn_id, $sql); + $this->_bind_params($params); + $result = $this->query($sql, FALSE, $have_cursor); + $this->_reset_stmt_id = TRUE; + return $result; + } + + // -------------------------------------------------------------------- + + /** + * Bind parameters + * + * @param array $params + * @return void + */ + protected function _bind_params($params) + { + if ( ! is_array($params) OR ! is_resource($this->stmt_id)) + { + return; + } + + foreach ($params as $param) + { + foreach (array('name', 'value', 'type', 'length') as $val) + { + if ( ! isset($param[$val])) + { + $param[$val] = ''; + } + } + + oci_bind_by_name($this->stmt_id, $param['name'], $param['value'], $param['length'], $param['type']); + } + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + $this->commit_mode = is_php('5.3.2') ? OCI_NO_AUTO_COMMIT : OCI_DEFAULT; + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + $this->commit_mode = OCI_COMMIT_ON_SUCCESS; + + return oci_commit($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + $this->commit_mode = OCI_COMMIT_ON_SUCCESS; + return oci_rollback($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return oci_num_rows($this->stmt_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return int + */ + public function insert_id() + { + // not supported in oracle + return $this->display_error('db_unsupported_function'); + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "TABLE_NAME" FROM "ALL_TABLES"'; + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql.' WHERE "TABLE_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + if (strpos($table, '.') !== FALSE) + { + sscanf($table, '%[^.].%s', $owner, $table); + } + else + { + $owner = $this->username; + } + + return 'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS + WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' + AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (strpos($table, '.') !== FALSE) + { + sscanf($table, '%[^.].%s', $owner, $table); + } + else + { + $owner = $this->username; + } + + $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHAR_LENGTH, DATA_PRECISION, DATA_LENGTH, DATA_DEFAULT, NULLABLE + FROM ALL_TAB_COLUMNS + WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' + AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->COLUMN_NAME; + $retval[$i]->type = $query[$i]->DATA_TYPE; + + $length = ($query[$i]->CHAR_LENGTH > 0) + ? $query[$i]->CHAR_LENGTH : $query[$i]->DATA_PRECISION; + if ($length === NULL) + { + $length = $query[$i]->DATA_LENGTH; + } + $retval[$i]->max_length = $length; + + $default = $query[$i]->DATA_DEFAULT; + if ($default === NULL && $query[$i]->NULLABLE === 'N') + { + $default = ''; + } + $retval[$i]->default = $default; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occured. + * + * @return array + */ + public function error() + { + /* oci_error() returns an array that already contains the + * 'code' and 'message' keys, so we can just return it. + */ + if (is_resource($this->curs_id)) + { + return oci_error($this->curs_id); + } + elseif (is_resource($this->stmt_id)) + { + return oci_error($this->stmt_id); + } + elseif (is_resource($this->conn_id)) + { + return oci_error($this->conn_id); + } + + return oci_error(); + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string + */ + protected function _insert_batch($table, $keys, $values) + { + $keys = implode(', ', $keys); + $sql = "INSERT ALL\n"; + + for ($i = 0, $c = count($values); $i < $c; $i++) + { + $sql .= ' INTO '.$table.' ('.$keys.') VALUES '.$values[$i]."\n"; + } + + return $sql.'SELECT * FROM dual'; + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE TABLE '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + if ($this->qb_limit) + { + $this->where('rownum <= ',$this->qb_limit, FALSE); + $this->qb_limit = FALSE; + } + + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + if (version_compare($this->version(), '12.1', '>=')) + { + // OFFSET-FETCH can be used only with the ORDER BY clause + empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; + + return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; + } + + $this->limit_used = TRUE; + return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')' + .($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1) : ''); + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + oci_close($this->conn_id); + } + +} diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php new file mode 100644 index 0000000..1ca559a --- /dev/null +++ b/system/database/drivers/oci8/oci8_forge.php @@ -0,0 +1,149 @@ +db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + $field[$i] = "\n\t".$field[$i]['_literal']; + } + else + { + $field[$i]['_literal'] = "\n\t".$this->_process_column($field[$i]); + + if ( ! empty($field[$i]['comment'])) + { + $sqls[] = 'COMMENT ON COLUMN ' + .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) + .' IS '.$field[$i]['comment']; + } + + if ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name'])) + { + $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' '.$this->db->escape_identifiers($field[$i]['new_name']); + } + } + } + + $sql .= ' '.$alter_type.' '; + $sql .= (count($field) === 1) + ? $field[0] + : '('.implode(',', $field).')'; + + // RENAME COLUMN must be executed after MODIFY + array_unshift($sqls, $sql); + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + // Not supported - sequences and triggers must be used instead + } + +} diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php new file mode 100644 index 0000000..fc860ea --- /dev/null +++ b/system/database/drivers/oci8/oci8_result.php @@ -0,0 +1,229 @@ +stmt_id = $driver_object->stmt_id; + $this->curs_id = $driver_object->curs_id; + $this->limit_used = $driver_object->limit_used; + $this->commit_mode =& $driver_object->commit_mode; + $driver_object->stmt_id = FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + $count = oci_num_fields($this->stmt_id); + + // if we used a limit we subtract it + return ($this->limit_used) ? $count - 1 : $count; + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) + { + $field_names[] = oci_field_name($this->stmt_id, $c); + } + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) + { + $F = new stdClass(); + $F->name = oci_field_name($this->stmt_id, $c); + $F->type = oci_field_type($this->stmt_id, $c); + $F->max_length = oci_field_size($this->stmt_id, $c); + + $retval[] = $F; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_resource($this->result_id)) + { + oci_free_statement($this->result_id); + $this->result_id = FALSE; + } + + if (is_resource($this->stmt_id)) + { + oci_free_statement($this->stmt_id); + } + + if (is_resource($this->curs_id)) + { + oci_cancel($this->curs_id); + $this->curs_id = NULL; + } + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + $id = ($this->curs_id) ? $this->curs_id : $this->stmt_id; + return oci_fetch_assoc($id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + $row = ($this->curs_id) + ? oci_fetch_object($this->curs_id) + : oci_fetch_object($this->stmt_id); + + if ($class_name === 'stdClass' OR ! $row) + { + return $row; + } + + $class_name = new $class_name(); + foreach ($row as $key => $value) + { + $class_name->$key = $value; + } + + return $class_name; + } + +} diff --git a/system/database/drivers/oci8/oci8_utility.php b/system/database/drivers/oci8/oci8_utility.php new file mode 100644 index 0000000..ebe49c4 --- /dev/null +++ b/system/database/drivers/oci8/oci8_utility.php @@ -0,0 +1,68 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/system/database/drivers/odbc/index.html b/system/database/drivers/odbc/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/odbc/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php new file mode 100644 index 0000000..19b7b74 --- /dev/null +++ b/system/database/drivers/odbc/odbc_driver.php @@ -0,0 +1,376 @@ +dsn)) + { + $this->dsn = $this->hostname; + } + } + + // -------------------------------------------------------------------- + + /** + * Non-persistent database connection + * + * @param bool $persistent + * @return resource + */ + public function db_connect($persistent = FALSE) + { + return ($persistent === TRUE) + ? odbc_pconnect($this->dsn, $this->username, $this->password) + : odbc_connect($this->dsn, $this->username, $this->password); + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return resource + */ + protected function _execute($sql) + { + return odbc_exec($this->conn_id, $sql); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + return odbc_autocommit($this->conn_id, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + if (odbc_commit($this->conn_id)) + { + odbc_autocommit($this->conn_id, TRUE); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + if (odbc_rollback($this->conn_id)) + { + odbc_autocommit($this->conn_id, TRUE); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Determines if a query is a "write" type. + * + * @param string An SQL query string + * @return bool + */ + public function is_write_type($sql) + { + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#i', $sql)) + { + return FALSE; + } + + return parent::is_write_type($sql); + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependant string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return remove_invisible_characters($str); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return odbc_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return bool + */ + public function insert_id() + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '".$this->schema."'"; + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql." AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SHOW COLUMNS FROM '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @param string $table + * @return string + */ + protected function _field_data($table) + { + return 'SELECT TOP 1 FROM '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occured. + * + * @return array + */ + public function error() + { + return array('code' => odbc_error($this->conn_id), 'message' => odbc_errormsg($this->conn_id)); + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'DELETE FROM '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + odbc_close($this->conn_id); + } + +} diff --git a/system/database/drivers/odbc/odbc_forge.php b/system/database/drivers/odbc/odbc_forge.php new file mode 100644 index 0000000..bac30be --- /dev/null +++ b/system/database/drivers/odbc/odbc_forge.php @@ -0,0 +1,86 @@ +num_rows)) + { + return $this->num_rows; + } + elseif (($this->num_rows = odbc_num_rows($this->result_id)) !== -1) + { + return $this->num_rows; + } + + // Work-around for ODBC subdrivers that don't support num_rows() + if (count($this->result_array) > 0) + { + return $this->num_rows = count($this->result_array); + } + elseif (count($this->result_object) > 0) + { + return $this->num_rows = count($this->result_object); + } + + return $this->num_rows = count($this->result_array()); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return odbc_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + $num_fields = $this->num_fields(); + + if ($num_fields > 0) + { + for ($i = 1; $i <= $num_fields; $i++) + { + $field_names[] = odbc_field_name($this->result_id, $i); + } + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + for ($i = 0, $odbc_index = 1, $c = $this->num_fields(); $i < $c; $i++, $odbc_index++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = odbc_field_name($this->result_id, $odbc_index); + $retval[$i]->type = odbc_field_type($this->result_id, $odbc_index); + $retval[$i]->max_length = odbc_field_len($this->result_id, $odbc_index); + $retval[$i]->primary_key = 0; + $retval[$i]->default = ''; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_resource($this->result_id)) + { + odbc_free_result($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return odbc_fetch_array($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + $row = odbc_fetch_object($this->result_id); + + if ($class_name === 'stdClass' OR ! $row) + { + return $row; + } + + $class_name = new $class_name(); + foreach ($row as $key => $value) + { + $class_name->$key = $value; + } + + return $class_name; + } + +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('odbc_fetch_array')) +{ + /** + * ODBC Fetch array + * + * Emulates the native odbc_fetch_array() function when + * it is not available (odbc_fetch_array() requires unixODBC) + * + * @param resource &$result + * @param int $rownumber + * @return array + */ + function odbc_fetch_array(&$result, $rownumber = 1) + { + $rs = array(); + if ( ! odbc_fetch_into($result, $rs, $rownumber)) + { + return FALSE; + } + + $rs_assoc = array(); + foreach ($rs as $k => $v) + { + $field_name = odbc_field_name($result, $k+1); + $rs_assoc[$field_name] = $v; + } + + return $rs_assoc; + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('odbc_fetch_object')) +{ + /** + * ODBC Fetch object + * + * Emulates the native odbc_fetch_object() function when + * it is not available. + * + * @param resource &$result + * @param int $rownumber + * @return object + */ + function odbc_fetch_object(&$result, $rownumber = 1) + { + $rs = array(); + if ( ! odbc_fetch_into($result, $rs, $rownumber)) + { + return FALSE; + } + + $rs_object = new stdClass(); + foreach ($rs as $k => $v) + { + $field_name = odbc_field_name($result, $k+1); + $rs_object->$field_name = $v; + } + + return $rs_object; + } +} diff --git a/system/database/drivers/odbc/odbc_utility.php b/system/database/drivers/odbc/odbc_utility.php new file mode 100644 index 0000000..2e34496 --- /dev/null +++ b/system/database/drivers/odbc/odbc_utility.php @@ -0,0 +1,63 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/system/database/drivers/pdo/index.html b/system/database/drivers/pdo/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/pdo/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php new file mode 100644 index 0000000..c6f84e0 --- /dev/null +++ b/system/database/drivers/pdo/pdo_driver.php @@ -0,0 +1,372 @@ +dsn, $match) && count($match) === 2) + { + // If there is a minimum valid dsn string pattern found, we're done + // This is for general PDO users, who tend to have a full DSN string. + $this->subdriver = $match[1]; + return; + } + // Legacy support for DSN specified in the hostname field + elseif (preg_match('/([^:]+):/', $this->hostname, $match) && count($match) === 2) + { + $this->dsn = $this->hostname; + $this->hostname = NULL; + $this->subdriver = $match[1]; + return; + } + elseif (in_array($this->subdriver, array('mssql', 'sybase'), TRUE)) + { + $this->subdriver = 'dblib'; + } + elseif ($this->subdriver === '4D') + { + $this->subdriver = '4d'; + } + elseif ( ! in_array($this->subdriver, array('4d', 'cubrid', 'dblib', 'firebird', 'ibm', 'informix', 'mysql', 'oci', 'odbc', 'pgsql', 'sqlite', 'sqlsrv'), TRUE)) + { + log_message('error', 'PDO: Invalid or non-existent subdriver'); + + if ($this->db_debug) + { + show_error('Invalid or non-existent PDO subdriver'); + } + } + + $this->dsn = NULL; + } + + // -------------------------------------------------------------------- + + /** + * Database connection + * + * @param bool $persistent + * @return object + */ + public function db_connect($persistent = FALSE) + { + $this->options[PDO::ATTR_PERSISTENT] = $persistent; + + try + { + return new PDO($this->dsn, $this->username, $this->password, $this->options); + } + catch (PDOException $e) + { + if ($this->db_debug && empty($this->failover)) + { + $this->display_error($e->getMessage(), '', TRUE); + } + + return FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + // Not all subdrivers support the getAttribute() method + try + { + return $this->data_cache['version'] = $this->conn_id->getAttribute(PDO::ATTR_SERVER_VERSION); + } + catch (PDOException $e) + { + return parent::version(); + } + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql SQL query + * @return mixed + */ + protected function _execute($sql) + { + return $this->conn_id->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + return $this->conn_id->beginTransaction(); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + return $this->conn_id->commit(); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + return $this->conn_id->rollBack(); + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependant string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + // Escape the string + $str = $this->conn_id->quote($str); + + // If there are duplicated quotes, trim them away + return ($str[0] === "'") + ? substr($str, 1, -1) + : $str; + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return is_object($this->result_id) ? $this->result_id->rowCount() : 0; + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @param string $name + * @return int + */ + public function insert_id($name = NULL) + { + return $this->conn_id->lastInsertId($name); + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @param string $table + * @return string + */ + protected function _field_data($table) + { + return 'SELECT TOP 1 * FROM '.$this->protect_identifiers($table); + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occured. + * + * @return array + */ + public function error() + { + $error = array('code' => '00000', 'message' => ''); + $pdo_error = $this->conn_id->errorInfo(); + + if (empty($pdo_error[0])) + { + return $error; + } + + $error['code'] = isset($pdo_error[1]) ? $pdo_error[0].'/'.$pdo_error[1] : $pdo_error[0]; + if (isset($pdo_error[2])) + { + $error['message'] = $pdo_error[2]; + } + + return $error; + } + + // -------------------------------------------------------------------- + + /** + * Update_Batch statement + * + * Generates a platform-specific batch update string from the supplied data + * + * @param string $table Table name + * @param array $values Update data + * @param string $index WHERE key + * @return string + */ + protected function _update_batch($table, $values, $index) + { + $ids = array(); + foreach ($values as $key => $val) + { + $ids[] = $val[$index]; + + foreach (array_keys($val) as $field) + { + if ($field !== $index) + { + $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $cases = ''; + foreach ($final as $k => $v) + { + $cases .= $k.' = CASE '."\n"; + + foreach ($v as $row) + { + $cases .= $row."\n"; + } + + $cases .= 'ELSE '.$k.' END, '; + } + + $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); + + return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE TABLE '.$table; + } + +} diff --git a/system/database/drivers/pdo/pdo_forge.php b/system/database/drivers/pdo/pdo_forge.php new file mode 100644 index 0000000..2595f7b --- /dev/null +++ b/system/database/drivers/pdo/pdo_forge.php @@ -0,0 +1,65 @@ +num_rows)) + { + return $this->num_rows; + } + elseif (count($this->result_array) > 0) + { + return $this->num_rows = count($this->result_array); + } + elseif (count($this->result_object) > 0) + { + return $this->num_rows = count($this->result_object); + } + elseif (($num_rows = $this->result_id->rowCount()) > 0) + { + return $this->num_rows = $num_rows; + } + + return $this->num_rows = count($this->result_array()); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return $this->result_id->columnCount(); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return bool + */ + public function list_fields() + { + $field_names = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + // Might trigger an E_WARNING due to not all subdrivers + // supporting getColumnMeta() + $field_names[$i] = @$this->result_id->getColumnMeta($i); + $field_names[$i] = $field_names[$i]['name']; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + try + { + $retval = array(); + + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $field = $this->result_id->getColumnMeta($i); + + $retval[$i] = new stdClass(); + $retval[$i]->name = $field['name']; + $retval[$i]->type = $field['native_type']; + $retval[$i]->max_length = ($field['len'] > 0) ? $field['len'] : NULL; + $retval[$i]->primary_key = (int) ( ! empty($field['flags']) && in_array('primary_key', $field['flags'], TRUE)); + } + + return $retval; + } + catch (Exception $e) + { + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsupported_feature'); + } + + return FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_object($this->result_id)) + { + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return $this->result_id->fetch(PDO::FETCH_ASSOC); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return $this->result_id->fetchObject($class_name); + } + +} diff --git a/system/database/drivers/pdo/pdo_utility.php b/system/database/drivers/pdo/pdo_utility.php new file mode 100644 index 0000000..384661b --- /dev/null +++ b/system/database/drivers/pdo/pdo_utility.php @@ -0,0 +1,63 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/index.html b/system/database/drivers/pdo/subdrivers/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php new file mode 100644 index 0000000..3dedfd9 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php @@ -0,0 +1,200 @@ +dsn)) + { + $this->dsn = '4D:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); + + empty($this->port) OR $this->dsn .= ';port='.$this->port; + empty($this->database) OR $this->dsn .= ';dbname='.$this->database; + empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; + } + elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 3) === FALSE) + { + $this->dsn .= ';charset='.$this->char_set; + } + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT '.$this->escape_identifiers('TABLE_NAME').' FROM '.$this->escape_identifiers('_USER_TABLES'); + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + $sql .= ' WHERE '.$this->escape_identifiers('TABLE_NAME')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT '.$this->escape_identifiers('COLUMN_NAME').' FROM '.$this->escape_identifiers('_USER_COLUMNS') + .' WHERE '.$this->escape_identifiers('TABLE_NAME').' = '.$this->escape($table); + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @param string $table + * @return string + */ + protected function _field_data($table) + { + return 'SELECT * FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE).' LIMIT 1'; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php new file mode 100644 index 0000000..41994f9 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php @@ -0,0 +1,217 @@ + 'INT', + 'SMALLINT' => 'INT', + 'INT' => 'INT64', + 'INT32' => 'INT64' + ); + + /** + * DEFAULT value representation in CREATE/ALTER TABLE statements + * + * @var string + */ + protected $_default = FALSE; + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + // No method of modifying columns is supported + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + return $this->db->escape_identifiers($field['name']) + .' '.$field['type'].$field['length'] + .$field['null'] + .$field['unique'] + .$field['auto_increment']; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'INTEGER': + $attributes['TYPE'] = 'INT'; + return; + case 'BIGINT': + $attributes['TYPE'] = 'INT64'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute UNIQUE + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_unique(&$attributes, &$field) + { + if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) + { + $field['unique'] = ' UNIQUE'; + + // UNIQUE must be used with NOT NULL + $field['null'] = ' NOT NULL'; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) + { + if (stripos($field['type'], 'int') !== FALSE) + { + $field['auto_increment'] = ' AUTO_INCREMENT'; + } + elseif (strcasecmp($field['type'], 'UUID') === 0) + { + $field['auto_increment'] = ' AUTO_GENERATE'; + } + } + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php new file mode 100644 index 0000000..8377798 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php @@ -0,0 +1,250 @@ +dsn)) + { + $this->dsn = 'cubrid:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); + + empty($this->port) OR $this->dsn .= ';port='.$this->port; + empty($this->database) OR $this->dsn .= ';dbname='.$this->database; + empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; + } + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SHOW TABLES'; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->Field; + + sscanf($query[$i]->Type, '%[a-z](%d)', + $retval[$i]->type, + $retval[$i]->max_length + ); + + $retval[$i]->default = $query[$i]->Default; + $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Update_Batch statement + * + * Generates a platform-specific batch update string from the supplied data + * + * @param string $table Table name + * @param array $values Update data + * @param string $index WHERE key + * @return string + */ + protected function _update_batch($table, $values, $index) + { + $ids = array(); + foreach ($values as $key => $val) + { + $ids[] = $val[$index]; + + foreach (array_keys($val) as $field) + { + if ($field !== $index) + { + $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $cases = ''; + foreach ($final as $k => $v) + { + $cases .= $k." = CASE \n" + .implode("\n", $v)."\n" + .'ELSE '.$k.' END), '; + } + + $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); + + return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE '.$table; + } + + // -------------------------------------------------------------------- + + /** + * FROM tables + * + * Groups tables in FROM clauses if needed, so there is no confusion + * about operator precedence. + * + * @return string + */ + protected function _from_tables() + { + if ( ! empty($this->qb_join) && count($this->qb_from) > 1) + { + return '('.implode(', ', $this->qb_from).')'; + } + + return implode(', ', $this->qb_from); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php new file mode 100644 index 0000000..5f85406 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php @@ -0,0 +1,227 @@ + 'INTEGER', + 'SMALLINT' => 'INTEGER', + 'INT' => 'BIGINT', + 'INTEGER' => 'BIGINT', + 'BIGINT' => 'NUMERIC', + 'FLOAT' => 'DOUBLE', + 'REAL' => 'DOUBLE' + ); + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + $sqls[] = $sql.' CHANGE '.$field[$i]['_literal']; + } + else + { + $alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE '; + $sqls[] = $sql.$alter_type.$this->_process_column($field[$i]); + } + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + $extra_clause = isset($field['after']) + ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; + + if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) + { + $extra_clause = ' FIRST'; + } + + return $this->db->escape_identifiers($field['name']) + .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) + .' '.$field['type'].$field['length'] + .$field['unsigned'] + .$field['null'] + .$field['default'] + .$field['auto_increment'] + .$field['unique'] + .$extra_clause; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Process indexes + * + * @param string $table (ignored) + * @return string + */ + protected function _process_indexes($table) + { + $sql = ''; + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) + { + if (is_array($this->keys[$i])) + { + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) + { + if ( ! isset($this->fields[$this->keys[$i][$i2]])) + { + unset($this->keys[$i][$i2]); + continue; + } + } + } + elseif ( ! isset($this->fields[$this->keys[$i]])) + { + unset($this->keys[$i]); + continue; + } + + is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); + + $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) + .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; + } + + $this->keys = array(); + + return $sql; + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php new file mode 100644 index 0000000..84695ee --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php @@ -0,0 +1,332 @@ +dsn)) + { + $this->dsn = $params['subdriver'].':host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); + + if ( ! empty($this->port)) + { + $this->dsn .= (DIRECTORY_SEPARATOR === '\\' ? ',' : ':').$this->port; + } + + empty($this->database) OR $this->dsn .= ';dbname='.$this->database; + empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; + empty($this->appname) OR $this->dsn .= ';appname='.$this->appname; + } + else + { + if ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE) + { + $this->dsn .= ';charset='.$this->char_set; + } + + $this->subdriver = 'dblib'; + } + } + + // -------------------------------------------------------------------- + + /** + * Database connection + * + * @param bool $persistent + * @return object + */ + public function db_connect($persistent = FALSE) + { + $this->conn_id = parent::db_connect($persistent); + + if ( ! is_object($this->conn_id)) + { + return $this->conn_id; + } + + // Determine how identifiers are escaped + $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); + $query = $query->row_array(); + $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; + $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); + + return $this->conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT '.$this->escape_identifiers('name') + .' FROM '.$this->escape_identifiers('sysobjects') + .' WHERE '.$this->escape_identifiers('type')." = 'U'"; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql.' ORDER BY '.$this->escape_identifiers('name'); + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT COLUMN_NAME + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->COLUMN_NAME; + $retval[$i]->type = $query[$i]->DATA_TYPE; + $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; + $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + if ($this->qb_limit) + { + return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; + } + + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + $limit = $this->qb_offset + $this->qb_limit; + + // As of SQL Server 2005 (9.0.*) ROW_NUMBER() is supported, + // however an ORDER BY clause is required for it to work + if (version_compare($this->version(), '9', '>=') && $this->qb_offset && ! empty($this->qb_orderby)) + { + $orderby = $this->_compile_order_by(); + + // We have to strip the ORDER BY clause + $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); + + // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results + if (count($this->qb_select) === 0) + { + $select = '*'; // Inevitable + } + else + { + // Use only field names and their aliases, everything else is out of our scope. + $select = array(); + $field_regexp = ($this->_quoted_identifier) + ? '("[^\"]+")' : '(\[[^\]]+\])'; + for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) + { + $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) + ? $m[1] : $this->qb_select[$i]; + } + $select = implode(', ', $select); + } + + return 'SELECT '.$select." FROM (\n\n" + .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) + ."\n\n) ".$this->escape_identifiers('CI_subquery') + ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; + } + + return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data. + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string|bool + */ + protected function _insert_batch($table, $keys, $values) + { + // Multiple-value inserts are only supported as of SQL Server 2008 + if (version_compare($this->version(), '10', '>=')) + { + return parent::_insert_batch($table, $keys, $values); + } + + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php new file mode 100644 index 0000000..d5dd9aa --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php @@ -0,0 +1,144 @@ + 'SMALLINT', + 'SMALLINT' => 'INT', + 'INT' => 'BIGINT', + 'REAL' => 'FLOAT' + ); + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + $sqls[] = $sql.$this->_process_column($field[$i]); + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'INTEGER': + $attributes['TYPE'] = 'INT'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['auto_increment'] = ' IDENTITY(1,1)'; + } + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php new file mode 100644 index 0000000..96dcc5e --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php @@ -0,0 +1,263 @@ +dsn)) + { + $this->dsn = 'firebird:'; + + if ( ! empty($this->database)) + { + $this->dsn .= 'dbname='.$this->database; + } + elseif ( ! empty($this->hostname)) + { + $this->dsn .= 'dbname='.$this->hostname; + } + + empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; + empty($this->role) OR $this->dsn .= ';role='.$this->role; + } + elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 9) === FALSE) + { + $this->dsn .= ';charset='.$this->char_set; + } + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "RDB$RELATION_NAME" FROM "RDB$RELATIONS" WHERE "RDB$RELATION_NAME" NOT LIKE \'RDB$%\' AND "RDB$RELATION_NAME" NOT LIKE \'MON$%\''; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + return $sql.' AND "RDB$RELATION_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT "RDB$FIELD_NAME" FROM "RDB$RELATION_FIELDS" WHERE "RDB$RELATION_NAME" = '.$this->escape($table); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT "rfields"."RDB$FIELD_NAME" AS "name", + CASE "fields"."RDB$FIELD_TYPE" + WHEN 7 THEN \'SMALLINT\' + WHEN 8 THEN \'INTEGER\' + WHEN 9 THEN \'QUAD\' + WHEN 10 THEN \'FLOAT\' + WHEN 11 THEN \'DFLOAT\' + WHEN 12 THEN \'DATE\' + WHEN 13 THEN \'TIME\' + WHEN 14 THEN \'CHAR\' + WHEN 16 THEN \'INT64\' + WHEN 27 THEN \'DOUBLE\' + WHEN 35 THEN \'TIMESTAMP\' + WHEN 37 THEN \'VARCHAR\' + WHEN 40 THEN \'CSTRING\' + WHEN 261 THEN \'BLOB\' + ELSE NULL + END AS "type", + "fields"."RDB$FIELD_LENGTH" AS "max_length", + "rfields"."RDB$DEFAULT_VALUE" AS "default" + FROM "RDB$RELATION_FIELDS" "rfields" + JOIN "RDB$FIELDS" "fields" ON "rfields"."RDB$FIELD_SOURCE" = "fields"."RDB$FIELD_NAME" + WHERE "rfields"."RDB$RELATION_NAME" = '.$this->escape($table).' + ORDER BY "rfields"."RDB$FIELD_POSITION"'; + + return (($query = $this->query($sql)) !== FALSE) + ? $query->result_object() + : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'DELETE FROM '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + // Limit clause depends on if Interbase or Firebird + if (stripos($this->version(), 'firebird') !== FALSE) + { + $select = 'FIRST '.$this->qb_limit + .($this->qb_offset > 0 ? ' SKIP '.$this->qb_offset : ''); + } + else + { + $select = 'ROWS ' + .($this->qb_offset > 0 ? $this->qb_offset.' TO '.($this->qb_limit + $this->qb_offset) : $this->qb_limit); + } + + return preg_replace('`SELECT`i', 'SELECT '.$select, $sql); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php new file mode 100644 index 0000000..256fa14 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php @@ -0,0 +1,237 @@ + 'INTEGER', + 'INTEGER' => 'INT64', + 'FLOAT' => 'DOUBLE PRECISION' + ); + + /** + * NULL value representation in CREATE/ALTER TABLE statements + * + * @var string + */ + protected $_null = 'NULL'; + + // -------------------------------------------------------------------- + + /** + * Create database + * + * @param string $db_name + * @return string + */ + public function create_database($db_name) + { + // Firebird databases are flat files, so a path is required + + // Hostname is needed for remote access + empty($this->db->hostname) OR $db_name = $this->hostname.':'.$db_name; + + return parent::create_database('"'.$db_name.'"'); + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @param string $db_name (ignored) + * @return bool + */ + public function drop_database($db_name = '') + { + if ( ! ibase_drop_db($this->conn_id)) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + elseif ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + return FALSE; + } + + if (isset($field[$i]['type'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TYPE '.$field[$i]['type'].$field[$i]['length']; + } + + if ( ! empty($field[$i]['default'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' SET DEFAULT '.$field[$i]['default']; + } + + if (isset($field[$i]['null'])) + { + $sqls[] = 'UPDATE "RDB$RELATION_FIELDS" SET "RDB$NULL_FLAG" = ' + .($field[$i]['null'] === TRUE ? 'NULL' : '1') + .' WHERE "RDB$FIELD_NAME" = '.$this->db->escape($field[$i]['name']) + .' AND "RDB$RELATION_NAME" = '.$this->db->escape($table); + } + + if ( ! empty($field[$i]['new_name'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); + } + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + return $this->db->escape_identifiers($field['name']) + .' '.$field['type'].$field['length'] + .$field['null'] + .$field['unique'] + .$field['default']; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'INT': + $attributes['TYPE'] = 'INTEGER'; + return; + case 'BIGINT': + $attributes['TYPE'] = 'INT64'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + // Not supported + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php new file mode 100644 index 0000000..2366c40 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php @@ -0,0 +1,244 @@ +dsn)) + { + $this->dsn = 'ibm:'; + + // Pre-defined DSN + if (empty($this->hostname) && empty($this->HOSTNAME) && empty($this->port) && empty($this->PORT)) + { + if (isset($this->DSN)) + { + $this->dsn .= 'DSN='.$this->DSN; + } + elseif ( ! empty($this->database)) + { + $this->dsn .= 'DSN='.$this->database; + } + + return; + } + + $this->dsn .= 'DRIVER='.(isset($this->DRIVER) ? '{'.$this->DRIVER.'}' : '{IBM DB2 ODBC DRIVER}').';'; + + if (isset($this->DATABASE)) + { + $this->dsn .= 'DATABASE='.$this->DATABASE.';'; + } + elseif ( ! empty($this->database)) + { + $this->dsn .= 'DATABASE='.$this->database.';'; + } + + if (isset($this->HOSTNAME)) + { + $this->dsn .= 'HOSTNAME='.$this->HOSTNAME.';'; + } + else + { + $this->dsn .= 'HOSTNAME='.(empty($this->hostname) ? '127.0.0.1;' : $this->hostname.';'); + } + + if (isset($this->PORT)) + { + $this->dsn .= 'PORT='.$this->port.';'; + } + elseif ( ! empty($this->port)) + { + $this->dsn .= ';PORT='.$this->port.';'; + } + + $this->dsn .= 'PROTOCOL='.(isset($this->PROTOCOL) ? $this->PROTOCOL.';' : 'TCPIP;'); + } + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "tabname" FROM "syscat"."tables" + WHERE "type" = \'T\' AND LOWER("tabschema") = '.$this->escape(strtolower($this->database)); + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + $sql .= ' AND "tabname" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return array + */ + protected function _list_columns($table = '') + { + return 'SELECT "colname" FROM "syscat"."columns" + WHERE LOWER("tabschema") = '.$this->escape(strtolower($this->database)).' + AND LOWER("tabname") = '.$this->escape(strtolower($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT "colname" AS "name", "typename" AS "type", "default" AS "default", "length" AS "max_length", + CASE "keyseq" WHEN NULL THEN 0 ELSE 1 END AS "primary_key" + FROM "syscat"."columns" + WHERE LOWER("tabschema") = '.$this->escape(strtolower($this->database)).' + AND LOWER("tabname") = '.$this->escape(strtolower($table)).' + ORDER BY "colno"'; + + return (($query = $this->query($sql)) !== FALSE) + ? $query->result_object() + : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + $sql .= ' FETCH FIRST '.($this->qb_limit + $this->qb_offset).' ROWS ONLY'; + + return ($this->qb_offset) + ? 'SELECT * FROM ('.$sql.') WHERE rownum > '.$this->qb_offset + : $sql; + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php new file mode 100644 index 0000000..a2dbfc2 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php @@ -0,0 +1,154 @@ + 'INTEGER', + 'INT' => 'BIGINT', + 'INTEGER' => 'BIGINT' + ); + + /** + * DEFAULT value representation in CREATE/ALTER TABLE statements + * + * @var string + */ + protected $_default = FALSE; + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'CHANGE') + { + $alter_type = 'MODIFY'; + } + + return parent::_alter_table($alter_type, $table, $field); + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute UNIQUE + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_unique(&$attributes, &$field) + { + if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) + { + $field['unique'] = ' UNIQUE'; + + // UNIQUE must be used with NOT NULL + $field['null'] = ' NOT NULL'; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + // Not supported + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php new file mode 100644 index 0000000..d40d17a --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php @@ -0,0 +1,309 @@ +dsn)) + { + $this->dsn = 'informix:'; + + // Pre-defined DSN + if (empty($this->hostname) && empty($this->host) && empty($this->port) && empty($this->service)) + { + if (isset($this->DSN)) + { + $this->dsn .= 'DSN='.$this->DSN; + } + elseif ( ! empty($this->database)) + { + $this->dsn .= 'DSN='.$this->database; + } + + return; + } + + if (isset($this->host)) + { + $this->dsn .= 'host='.$this->host; + } + else + { + $this->dsn .= 'host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); + } + + if (isset($this->service)) + { + $this->dsn .= '; service='.$this->service; + } + elseif ( ! empty($this->port)) + { + $this->dsn .= '; service='.$this->port; + } + + empty($this->database) OR $this->dsn .= '; database='.$this->database; + empty($this->server) OR $this->dsn .= '; server='.$this->server; + + $this->dsn .= '; protocol='.(isset($this->protocol) ? $this->protocol : 'onsoctcp') + .'; EnableScrollableCursors=1'; + } + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "tabname" FROM "systables" + WHERE "tabid" > 99 AND "tabtype" = \'T\' AND LOWER("owner") = '.$this->escape(strtolower($this->username)); + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + $sql .= ' AND "tabname" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + if (strpos($table, '.') !== FALSE) + { + sscanf($table, '%[^.].%s', $owner, $table); + } + else + { + $owner = $this->username; + } + + return 'SELECT "colname" FROM "systables", "syscolumns" + WHERE "systables"."tabid" = "syscolumns"."tabid" + AND "systables"."tabtype" = \'T\' + AND LOWER("systables"."owner") = '.$this->escape(strtolower($owner)).' + AND LOWER("systables"."tabname") = '.$this->escape(strtolower($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT "syscolumns"."colname" AS "name", + CASE "syscolumns"."coltype" + WHEN 0 THEN \'CHAR\' + WHEN 1 THEN \'SMALLINT\' + WHEN 2 THEN \'INTEGER\' + WHEN 3 THEN \'FLOAT\' + WHEN 4 THEN \'SMALLFLOAT\' + WHEN 5 THEN \'DECIMAL\' + WHEN 6 THEN \'SERIAL\' + WHEN 7 THEN \'DATE\' + WHEN 8 THEN \'MONEY\' + WHEN 9 THEN \'NULL\' + WHEN 10 THEN \'DATETIME\' + WHEN 11 THEN \'BYTE\' + WHEN 12 THEN \'TEXT\' + WHEN 13 THEN \'VARCHAR\' + WHEN 14 THEN \'INTERVAL\' + WHEN 15 THEN \'NCHAR\' + WHEN 16 THEN \'NVARCHAR\' + WHEN 17 THEN \'INT8\' + WHEN 18 THEN \'SERIAL8\' + WHEN 19 THEN \'SET\' + WHEN 20 THEN \'MULTISET\' + WHEN 21 THEN \'LIST\' + WHEN 22 THEN \'Unnamed ROW\' + WHEN 40 THEN \'LVARCHAR\' + WHEN 41 THEN \'BLOB/CLOB/BOOLEAN\' + WHEN 4118 THEN \'Named ROW\' + ELSE "syscolumns"."coltype" + END AS "type", + "syscolumns"."collength" as "max_length", + CASE "sysdefaults"."type" + WHEN \'L\' THEN "sysdefaults"."default" + ELSE NULL + END AS "default" + FROM "syscolumns", "systables", "sysdefaults" + WHERE "syscolumns"."tabid" = "systables"."tabid" + AND "systables"."tabid" = "sysdefaults"."tabid" + AND "syscolumns"."colno" = "sysdefaults"."colno" + AND "systables"."tabtype" = \'T\' + AND LOWER("systables"."owner") = '.$this->escape(strtolower($this->username)).' + AND LOWER("systables"."tabname") = '.$this->escape(strtolower($table)).' + ORDER BY "syscolumns"."colno"'; + + return (($query = $this->query($sql)) !== FALSE) + ? $query->result_object() + : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE TABLE ONLY '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql $SQL Query + * @return string + */ + protected function _limit($sql) + { + $select = 'SELECT '.($this->qb_offset ? 'SKIP '.$this->qb_offset : '').'FIRST '.$this->qb_limit.' '; + return preg_replace('/^(SELECT\s)/i', $select, $sql, 1); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php new file mode 100644 index 0000000..5af39b1 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php @@ -0,0 +1,163 @@ + 'INTEGER', + 'INT' => 'BIGINT', + 'INTEGER' => 'BIGINT', + 'REAL' => 'DOUBLE PRECISION', + 'SMALLFLOAT' => 'DOUBLE PRECISION' + ); + + /** + * DEFAULT value representation in CREATE/ALTER TABLE statements + * + * @var string + */ + protected $_default = ', '; + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'CHANGE') + { + $alter_type = 'MODIFY'; + } + + return parent::_alter_table($alter_type, $table, $field); + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'BYTE': + case 'TEXT': + case 'BLOB': + case 'CLOB': + $attributes['UNIQUE'] = FALSE; + if (isset($attributes['DEFAULT'])) + { + unset($attributes['DEFAULT']); + } + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute UNIQUE + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_unique(&$attributes, &$field) + { + if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) + { + $field['unique'] = ' UNIQUE CONSTRAINT '.$this->db->escape_identifiers($field['name']); + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + // Not supported + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php new file mode 100644 index 0000000..70f2bfd --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php @@ -0,0 +1,336 @@ +dsn)) + { + $this->dsn = 'mysql:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); + + empty($this->port) OR $this->dsn .= ';port='.$this->port; + empty($this->database) OR $this->dsn .= ';dbname='.$this->database; + empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; + } + elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE && is_php('5.3.6')) + { + $this->dsn .= ';charset='.$this->char_set; + } + } + + // -------------------------------------------------------------------- + + /** + * Database connection + * + * @param bool $persistent + * @return object + */ + public function db_connect($persistent = FALSE) + { + /* Prior to PHP 5.3.6, even if the charset was supplied in the DSN + * on connect - it was ignored. This is a work-around for the issue. + * + * Reference: http://www.php.net/manual/en/ref.pdo-mysql.connection.php + */ + if ( ! is_php('5.3.6') && ! empty($this->char_set)) + { + $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES '.$this->char_set + .(empty($this->dbcollat) ? '' : ' COLLATE '.$this->dbcollat); + } + + if (isset($this->stricton)) + { + if ($this->stricton) + { + $sql = 'CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'; + } + else + { + $sql = 'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( + @@sql_mode, + "STRICT_ALL_TABLES,", ""), + ",STRICT_ALL_TABLES", ""), + "STRICT_ALL_TABLES", ""), + "STRICT_TRANS_TABLES,", ""), + ",STRICT_TRANS_TABLES", ""), + "STRICT_TRANS_TABLES", "")'; + } + + if ( ! empty($sql)) + { + if (empty($this->options[PDO::MYSQL_ATTR_INIT_COMMAND])) + { + $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET SESSION sql_mode = '.$sql; + } + else + { + $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] .= ', @@session.sql_mode = '.$sql; + } + } + } + + if ($this->compress === TRUE) + { + $this->options[PDO::MYSQL_ATTR_COMPRESS] = TRUE; + } + + // SSL support was added to PDO_MYSQL in PHP 5.3.7 + if (is_array($this->encrypt) && is_php('5.3.7')) + { + $ssl = array(); + empty($this->encrypt['ssl_key']) OR $ssl[PDO::MYSQL_ATTR_SSL_KEY] = $this->encrypt['ssl_key']; + empty($this->encrypt['ssl_cert']) OR $ssl[PDO::MYSQL_ATTR_SSL_CERT] = $this->encrypt['ssl_cert']; + empty($this->encrypt['ssl_ca']) OR $ssl[PDO::MYSQL_ATTR_SSL_CA] = $this->encrypt['ssl_ca']; + empty($this->encrypt['ssl_capath']) OR $ssl[PDO::MYSQL_ATTR_SSL_CAPATH] = $this->encrypt['ssl_capath']; + empty($this->encrypt['ssl_cipher']) OR $ssl[PDO::MYSQL_ATTR_SSL_CIPHER] = $this->encrypt['ssl_cipher']; + + // DO NOT use array_merge() here! + // It re-indexes numeric keys and the PDO_MYSQL_ATTR_SSL_* constants are integers. + empty($ssl) OR $this->options += $ssl; + } + + // Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails + if ( + ($pdo = parent::db_connect($persistent)) !== FALSE + && ! empty($ssl) + && version_compare($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), '5.7.3', '<=') + && empty($pdo->query("SHOW STATUS LIKE 'ssl_cipher'")->fetchObject()->Value) + ) + { + $message = 'PDO_MYSQL was configured for an SSL connection, but got an unencrypted connection instead!'; + log_message('error', $message); + return ($this->db->db_debug) ? $this->db->display_error($message, '', TRUE) : FALSE; + } + + return $pdo; + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @param string $database + * @return bool + */ + public function db_select($database = '') + { + if ($database === '') + { + $database = $this->database; + } + + if (FALSE !== $this->simple_query('USE '.$this->escape_identifiers($database))) + { + $this->database = $database; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SHOW TABLES'; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->Field; + + sscanf($query[$i]->Type, '%[a-z](%d)', + $retval[$i]->type, + $retval[$i]->max_length + ); + + $retval[$i]->default = $query[$i]->Default; + $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE '.$table; + } + + // -------------------------------------------------------------------- + + /** + * FROM tables + * + * Groups tables in FROM clauses if needed, so there is no confusion + * about operator precedence. + * + * @return string + */ + protected function _from_tables() + { + if ( ! empty($this->qb_join) && count($this->qb_from) > 1) + { + return '('.implode(', ', $this->qb_from).')'; + } + + return implode(', ', $this->qb_from); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php new file mode 100644 index 0000000..9d04a8a --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php @@ -0,0 +1,256 @@ +db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) + { + $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; + } + + if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) + { + $sql .= ' COLLATE = '.$this->db->dbcollat; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'DROP') + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + $field[$i] = ($alter_type === 'ADD') + ? "\n\tADD ".$field[$i]['_literal'] + : "\n\tMODIFY ".$field[$i]['_literal']; + } + else + { + if ($alter_type === 'ADD') + { + $field[$i]['_literal'] = "\n\tADD "; + } + else + { + $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; + } + + $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); + } + } + + return array($sql.implode(',', $field)); + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + $extra_clause = isset($field['after']) + ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; + + if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) + { + $extra_clause = ' FIRST'; + } + + return $this->db->escape_identifiers($field['name']) + .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) + .' '.$field['type'].$field['length'] + .$field['unsigned'] + .$field['null'] + .$field['default'] + .$field['auto_increment'] + .$field['unique'] + .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) + .$extra_clause; + } + + // -------------------------------------------------------------------- + + /** + * Process indexes + * + * @param string $table (ignored) + * @return string + */ + protected function _process_indexes($table) + { + $sql = ''; + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) + { + if (is_array($this->keys[$i])) + { + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) + { + if ( ! isset($this->fields[$this->keys[$i][$i2]])) + { + unset($this->keys[$i][$i2]); + continue; + } + } + } + elseif ( ! isset($this->fields[$this->keys[$i]])) + { + unset($this->keys[$i]); + continue; + } + + is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); + + $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) + .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; + } + + $this->keys = array(); + + return $sql; + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php new file mode 100644 index 0000000..dd1d31c --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php @@ -0,0 +1,326 @@ +dsn)) + { + $this->dsn = 'oci:dbname='; + + // Oracle has a slightly different PDO DSN format (Easy Connect), + // which also supports pre-defined DSNs. + if (empty($this->hostname) && empty($this->port)) + { + $this->dsn .= $this->database; + } + else + { + $this->dsn .= '//'.(empty($this->hostname) ? '127.0.0.1' : $this->hostname) + .(empty($this->port) ? '' : ':'.$this->port).'/'; + + empty($this->database) OR $this->dsn .= $this->database; + } + + empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; + } + elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 4) === FALSE) + { + $this->dsn .= ';charset='.$this->char_set; + } + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + $version_string = parent::version(); + if (preg_match('#Release\s(?\d+(?:\.\d+)+)#', $version_string, $match)) + { + return $this->data_cache['version'] = $match[1]; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "TABLE_NAME" FROM "ALL_TABLES"'; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + return $sql.' WHERE "TABLE_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + if (strpos($table, '.') !== FALSE) + { + sscanf($table, '%[^.].%s', $owner, $table); + } + else + { + $owner = $this->username; + } + + return 'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS + WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' + AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (strpos($table, '.') !== FALSE) + { + sscanf($table, '%[^.].%s', $owner, $table); + } + else + { + $owner = $this->username; + } + + $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHAR_LENGTH, DATA_PRECISION, DATA_LENGTH, DATA_DEFAULT, NULLABLE + FROM ALL_TAB_COLUMNS + WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' + AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->COLUMN_NAME; + $retval[$i]->type = $query[$i]->DATA_TYPE; + + $length = ($query[$i]->CHAR_LENGTH > 0) + ? $query[$i]->CHAR_LENGTH : $query[$i]->DATA_PRECISION; + if ($length === NULL) + { + $length = $query[$i]->DATA_LENGTH; + } + $retval[$i]->max_length = $length; + + $default = $query[$i]->DATA_DEFAULT; + if ($default === NULL && $query[$i]->NULLABLE === 'N') + { + $default = ''; + } + $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string + */ + protected function _insert_batch($table, $keys, $values) + { + $keys = implode(', ', $keys); + $sql = "INSERT ALL\n"; + + for ($i = 0, $c = count($values); $i < $c; $i++) + { + $sql .= ' INTO '.$table.' ('.$keys.') VALUES '.$values[$i]."\n"; + } + + return $sql.'SELECT * FROM dual'; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + if ($this->qb_limit) + { + $this->where('rownum <= ',$this->qb_limit, FALSE); + $this->qb_limit = FALSE; + } + + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + if (version_compare($this->version(), '12.1', '>=')) + { + // OFFSET-FETCH can be used only with the ORDER BY clause + empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; + + return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; + } + + return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')' + .($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1): ''); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php new file mode 100644 index 0000000..d0b7be8 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php @@ -0,0 +1,149 @@ +db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + $field[$i] = "\n\t".$field[$i]['_literal']; + } + else + { + $field[$i]['_literal'] = "\n\t".$this->_process_column($field[$i]); + + if ( ! empty($field[$i]['comment'])) + { + $sqls[] = 'COMMENT ON COLUMN ' + .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) + .' IS '.$field[$i]['comment']; + } + + if ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name'])) + { + $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' '.$this->db->escape_identifiers($field[$i]['new_name']); + } + } + } + + $sql .= ' '.$alter_type.' '; + $sql .= (count($field) === 1) + ? $field[0] + : '('.implode(',', $field).')'; + + // RENAME COLUMN must be executed after MODIFY + array_unshift($sqls, $sql); + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + // Not supported - sequences and triggers must be used instead + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php new file mode 100644 index 0000000..3334488 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php @@ -0,0 +1,284 @@ +dsn)) + { + $this->dsn = 'odbc:'; + + // Pre-defined DSN + if (empty($this->hostname) && empty($this->HOSTNAME) && empty($this->port) && empty($this->PORT)) + { + if (isset($this->DSN)) + { + $this->dsn .= 'DSN='.$this->DSN; + } + elseif ( ! empty($this->database)) + { + $this->dsn .= 'DSN='.$this->database; + } + + return; + } + + // If the DSN is not pre-configured - try to build an IBM DB2 connection string + $this->dsn .= 'DRIVER='.(isset($this->DRIVER) ? '{'.$this->DRIVER.'}' : '{IBM DB2 ODBC DRIVER}').';'; + + if (isset($this->DATABASE)) + { + $this->dsn .= 'DATABASE='.$this->DATABASE.';'; + } + elseif ( ! empty($this->database)) + { + $this->dsn .= 'DATABASE='.$this->database.';'; + } + + if (isset($this->HOSTNAME)) + { + $this->dsn .= 'HOSTNAME='.$this->HOSTNAME.';'; + } + else + { + $this->dsn .= 'HOSTNAME='.(empty($this->hostname) ? '127.0.0.1;' : $this->hostname.';'); + } + + if (isset($this->PORT)) + { + $this->dsn .= 'PORT='.$this->port.';'; + } + elseif ( ! empty($this->port)) + { + $this->dsn .= ';PORT='.$this->port.';'; + } + + $this->dsn .= 'PROTOCOL='.(isset($this->PROTOCOL) ? $this->PROTOCOL.';' : 'TCPIP;'); + } + } + + // -------------------------------------------------------------------- + + /** + * Determines if a query is a "write" type. + * + * @param string An SQL query string + * @return bool + */ + public function is_write_type($sql) + { + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#i', $sql)) + { + return FALSE; + } + + return parent::is_write_type($sql); + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '".$this->schema."'"; + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql." AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT column_name FROM information_schema.columns WHERE table_name = '.$this->escape($table); + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'DELETE FROM '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string the table name + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$this->qb_limit.' ', $sql); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php new file mode 100644 index 0000000..7c65daa --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php @@ -0,0 +1,70 @@ +dsn)) + { + $this->dsn = 'pgsql:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); + + empty($this->port) OR $this->dsn .= ';port='.$this->port; + empty($this->database) OR $this->dsn .= ';dbname='.$this->database; + + if ( ! empty($this->username)) + { + $this->dsn .= ';username='.$this->username; + empty($this->password) OR $this->dsn .= ';password='.$this->password; + } + } + } + + // -------------------------------------------------------------------- + + /** + * Database connection + * + * @param bool $persistent + * @return object + */ + public function db_connect($persistent = FALSE) + { + $this->conn_id = parent::db_connect($persistent); + + if (is_object($this->conn_id) && ! empty($this->schema)) + { + $this->simple_query('SET search_path TO '.$this->schema.',public'); + } + + return $this->conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @param string $name + * @return int + */ + public function insert_id($name = NULL) + { + if ($name === NULL && version_compare($this->version(), '8.1', '>=')) + { + $query = $this->query('SELECT LASTVAL() AS ins_id'); + $query = $query->row(); + return $query->ins_id; + } + + return $this->conn_id->lastInsertId($name); + } + + // -------------------------------------------------------------------- + + /** + * Determines if a query is a "write" type. + * + * @param string An SQL query string + * @return bool + */ + public function is_write_type($sql) + { + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#i', $sql)) + { + return FALSE; + } + + return parent::is_write_type($sql); + } + + // -------------------------------------------------------------------- + + /** + * "Smart" Escape String + * + * Escapes data based on type + * + * @param string $str + * @return mixed + */ + public function escape($str) + { + if (is_bool($str)) + { + return ($str) ? 'TRUE' : 'FALSE'; + } + + return parent::escape($str); + } + + // -------------------------------------------------------------------- + + /** + * ORDER BY + * + * @param string $orderby + * @param string $direction ASC, DESC or RANDOM + * @param bool $escape + * @return object + */ + public function order_by($orderby, $direction = '', $escape = NULL) + { + $direction = strtoupper(trim($direction)); + if ($direction === 'RANDOM') + { + if ( ! is_float($orderby) && ctype_digit((string) $orderby)) + { + $orderby = ($orderby > 1) + ? (float) '0.'.$orderby + : (float) $orderby; + } + + if (is_float($orderby)) + { + $this->simple_query('SET SEED '.$orderby); + } + + $orderby = $this->_random_keyword[0]; + $direction = ''; + $escape = FALSE; + } + + return parent::order_by($orderby, $direction, $escape); + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \''.$this->schema."'"; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + return $sql.' AND "table_name" LIKE \'' + .$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * List column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT "column_name" + FROM "information_schema"."columns" + WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT "column_name", "data_type", "character_maximum_length", "numeric_precision", "column_default" + FROM "information_schema"."columns" + WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->column_name; + $retval[$i]->type = $query[$i]->data_type; + $retval[$i]->max_length = ($query[$i]->character_maximum_length > 0) ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision; + $retval[$i]->default = $query[$i]->column_default; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Update_Batch statement + * + * Generates a platform-specific batch update string from the supplied data + * + * @param string $table Table name + * @param array $values Update data + * @param string $index WHERE key + * @return string + */ + protected function _update_batch($table, $values, $index) + { + $ids = array(); + foreach ($values as $key => $val) + { + $ids[] = $val[$index]; + + foreach (array_keys($val) as $field) + { + if ($field !== $index) + { + $final[$field][] = 'WHEN '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $cases = ''; + foreach ($final as $k => $v) + { + $cases .= $k.' = (CASE '.$index."\n" + .implode("\n", $v)."\n" + .'ELSE '.$k.' END), '; + } + + $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); + + return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php new file mode 100644 index 0000000..214b6f5 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php @@ -0,0 +1,210 @@ + 'INTEGER', + 'SMALLINT' => 'INTEGER', + 'INT' => 'BIGINT', + 'INT4' => 'BIGINT', + 'INTEGER' => 'BIGINT', + 'INT8' => 'NUMERIC', + 'BIGINT' => 'NUMERIC', + 'REAL' => 'DOUBLE PRECISION', + 'FLOAT' => 'DOUBLE PRECISION' + ); + + /** + * NULL value representation in CREATE/ALTER TABLE statements + * + * @var string + */ + protected $_null = 'NULL'; + + // -------------------------------------------------------------------- + + /** + * Class constructor + * + * @param object &$db Database object + * @return void + */ + public function __construct(&$db) + { + parent::__construct($db); + + if (version_compare($this->db->version(), '9.0', '>')) + { + $this->create_table_if = 'CREATE TABLE IF NOT EXISTS'; + } + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + return FALSE; + } + + if (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TYPE '.$field[$i]['type'].$field[$i]['length']; + } + + if ( ! empty($field[$i]['default'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' SET DEFAULT '.$field[$i]['default']; + } + + if (isset($field[$i]['null'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .($field[$i]['null'] === TRUE ? ' DROP NOT NULL' : ' SET NOT NULL'); + } + + if ( ! empty($field[$i]['new_name'])) + { + $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); + } + + if ( ! empty($field[$i]['comment'])) + { + $sqls[] = 'COMMENT ON COLUMN ' + .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) + .' IS '.$field[$i]['comment']; + } + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + // Reset field lenghts for data types that don't support it + if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE) + { + $attributes['CONSTRAINT'] = NULL; + } + + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) + { + $field['type'] = ($field['type'] === 'NUMERIC') + ? 'BIGSERIAL' + : 'SERIAL'; + } + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php new file mode 100644 index 0000000..6269013 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php @@ -0,0 +1,219 @@ +dsn)) + { + $this->dsn = 'sqlite:'; + + if (empty($this->database) && empty($this->hostname)) + { + $this->database = ':memory:'; + } + + $this->database = empty($this->database) ? $this->hostname : $this->database; + } + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\''; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + return $sql.' AND "NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * @param string $table Table name + * @return array + */ + public function list_fields($table) + { + // Is there a cached result? + if (isset($this->data_cache['field_names'][$table])) + { + return $this->data_cache['field_names'][$table]; + } + + if (($result = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) + { + return FALSE; + } + + $this->data_cache['field_names'][$table] = array(); + foreach ($result->result_array() as $row) + { + $this->data_cache['field_names'][$table][] = $row['name']; + } + + return $this->data_cache['field_names'][$table]; + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) + { + return FALSE; + } + + $query = $query->result_array(); + if (empty($query)) + { + return FALSE; + } + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]['name']; + $retval[$i]->type = $query[$i]['type']; + $retval[$i]->max_length = NULL; + $retval[$i]->default = $query[$i]['dflt_value']; + $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Replace statement + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string + */ + protected function _replace($table, $keys, $values) + { + return 'INSERT OR '.parent::_replace($table, $keys, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'DELETE FROM '.$table; + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php new file mode 100644 index 0000000..f6f9bb4 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php @@ -0,0 +1,238 @@ +db->version(), '3.3', '<')) + { + $this->_create_table_if = FALSE; + $this->_drop_table_if = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Create database + * + * @param string $db_name (ignored) + * @return bool + */ + public function create_database($db_name = '') + { + // In SQLite, a database is created when you connect to the database. + // We'll return TRUE so that an error isn't generated + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @param string $db_name (ignored) + * @return bool + */ + public function drop_database($db_name = '') + { + // In SQLite, a database is dropped when we delete a file + if (file_exists($this->db->database)) + { + // We need to close the pseudo-connection first + $this->db->close(); + if ( ! @unlink($this->db->database)) + { + return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + elseif ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } + + return TRUE; + } + + return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') + { + // drop_column(): + // BEGIN TRANSACTION; + // CREATE TEMPORARY TABLE t1_backup(a,b); + // INSERT INTO t1_backup SELECT a,b FROM t1; + // DROP TABLE t1; + // CREATE TABLE t1(a,b); + // INSERT INTO t1 SELECT a,b FROM t1_backup; + // DROP TABLE t1_backup; + // COMMIT; + + return FALSE; + } + + return parent::_alter_table($alter_type, $table, $field); + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + return $this->db->escape_identifiers($field['name']) + .' '.$field['type'] + .$field['auto_increment'] + .$field['null'] + .$field['unique'] + .$field['default']; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'ENUM': + case 'SET': + $attributes['TYPE'] = 'TEXT'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['type'] = 'INTEGER PRIMARY KEY'; + $field['default'] = ''; + $field['null'] = ''; + $field['unique'] = ''; + $field['auto_increment'] = ' AUTOINCREMENT'; + + $this->primary_keys = array(); + } + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php new file mode 100644 index 0000000..dfccb7d --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php @@ -0,0 +1,369 @@ +dsn)) + { + $this->dsn = 'sqlsrv:Server='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); + + empty($this->port) OR $this->dsn .= ','.$this->port; + empty($this->database) OR $this->dsn .= ';Database='.$this->database; + + // Some custom options + + if (isset($this->QuotedId)) + { + $this->dsn .= ';QuotedId='.$this->QuotedId; + $this->_quoted_identifier = (bool) $this->QuotedId; + } + + if (isset($this->ConnectionPooling)) + { + $this->dsn .= ';ConnectionPooling='.$this->ConnectionPooling; + } + + if ($this->encrypt === TRUE) + { + $this->dsn .= ';Encrypt=1'; + } + + if (isset($this->TraceOn)) + { + $this->dsn .= ';TraceOn='.$this->TraceOn; + } + + if (isset($this->TrustServerCertificate)) + { + $this->dsn .= ';TrustServerCertificate='.$this->TrustServerCertificate; + } + + empty($this->APP) OR $this->dsn .= ';APP='.$this->APP; + empty($this->Failover_Partner) OR $this->dsn .= ';Failover_Partner='.$this->Failover_Partner; + empty($this->LoginTimeout) OR $this->dsn .= ';LoginTimeout='.$this->LoginTimeout; + empty($this->MultipleActiveResultSets) OR $this->dsn .= ';MultipleActiveResultSets='.$this->MultipleActiveResultSets; + empty($this->TraceFile) OR $this->dsn .= ';TraceFile='.$this->TraceFile; + empty($this->WSID) OR $this->dsn .= ';WSID='.$this->WSID; + } + elseif (preg_match('/QuotedId=(0|1)/', $this->dsn, $match)) + { + $this->_quoted_identifier = (bool) $match[1]; + } + } + + // -------------------------------------------------------------------- + + /** + * Database connection + * + * @param bool $persistent + * @return object + */ + public function db_connect($persistent = FALSE) + { + if ( ! empty($this->char_set) && preg_match('/utf[^8]*8/i', $this->char_set)) + { + $this->options[PDO::SQLSRV_ENCODING_UTF8] = 1; + } + + $this->conn_id = parent::db_connect($persistent); + + if ( ! is_object($this->conn_id) OR is_bool($this->_quoted_identifier)) + { + return $this->conn_id; + } + + // Determine how identifiers are escaped + $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); + $query = $query->row_array(); + $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; + $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); + + return $this->conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT '.$this->escape_identifiers('name') + .' FROM '.$this->escape_identifiers('sysobjects') + .' WHERE '.$this->escape_identifiers('type')." = 'U'"; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql.' ORDER BY '.$this->escape_identifiers('name'); + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT COLUMN_NAME + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->COLUMN_NAME; + $retval[$i]->type = $query[$i]->DATA_TYPE; + $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; + $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + if ($this->qb_limit) + { + return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; + } + + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + // As of SQL Server 2012 (11.0.*) OFFSET is supported + if (version_compare($this->version(), '11', '>=')) + { + // SQL Server OFFSET-FETCH can be used only with the ORDER BY clause + empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; + + return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; + } + + $limit = $this->qb_offset + $this->qb_limit; + + // An ORDER BY clause is required for ROW_NUMBER() to work + if ($this->qb_offset && ! empty($this->qb_orderby)) + { + $orderby = $this->_compile_order_by(); + + // We have to strip the ORDER BY clause + $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); + + // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results + if (count($this->qb_select) === 0) + { + $select = '*'; // Inevitable + } + else + { + // Use only field names and their aliases, everything else is out of our scope. + $select = array(); + $field_regexp = ($this->_quoted_identifier) + ? '("[^\"]+")' : '(\[[^\]]+\])'; + for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) + { + $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) + ? $m[1] : $this->qb_select[$i]; + } + $select = implode(', ', $select); + } + + return 'SELECT '.$select." FROM (\n\n" + .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) + ."\n\n) ".$this->escape_identifiers('CI_subquery') + ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; + } + + return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data. + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string|bool + */ + protected function _insert_batch($table, $keys, $values) + { + // Multiple-value inserts are only supported as of SQL Server 2008 + if (version_compare($this->version(), '10', '>=')) + { + return parent::_insert_batch($table, $keys, $values); + } + + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php new file mode 100644 index 0000000..602f895 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php @@ -0,0 +1,144 @@ + 'SMALLINT', + 'SMALLINT' => 'INT', + 'INT' => 'BIGINT', + 'REAL' => 'FLOAT' + ); + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + $sqls[] = $sql.$this->_process_column($field[$i]); + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'INTEGER': + $attributes['TYPE'] = 'INT'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['auto_increment'] = ' IDENTITY(1,1)'; + } + } + +} diff --git a/system/database/drivers/postgre/index.html b/system/database/drivers/postgre/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/postgre/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php new file mode 100644 index 0000000..58d4451 --- /dev/null +++ b/system/database/drivers/postgre/postgre_driver.php @@ -0,0 +1,620 @@ +dsn)) + { + return; + } + + $this->dsn === '' OR $this->dsn = ''; + + if (strpos($this->hostname, '/') !== FALSE) + { + // If UNIX sockets are used, we shouldn't set a port + $this->port = ''; + } + + $this->hostname === '' OR $this->dsn = 'host='.$this->hostname.' '; + + if ( ! empty($this->port) && ctype_digit($this->port)) + { + $this->dsn .= 'port='.$this->port.' '; + } + + if ($this->username !== '') + { + $this->dsn .= 'user='.$this->username.' '; + + /* An empty password is valid! + * + * $db['password'] = NULL must be done in order to ignore it. + */ + $this->password === NULL OR $this->dsn .= "password='".$this->password."' "; + } + + $this->database === '' OR $this->dsn .= 'dbname='.$this->database.' '; + + /* We don't have these options as elements in our standard configuration + * array, but they might be set by parse_url() if the configuration was + * provided via string. Example: + * + * postgre://username:password@localhost:5432/database?connect_timeout=5&sslmode=1 + */ + foreach (array('connect_timeout', 'options', 'sslmode', 'service') as $key) + { + if (isset($this->$key) && is_string($this->key) && $this->key !== '') + { + $this->dsn .= $key."='".$this->key."' "; + } + } + + $this->dsn = rtrim($this->dsn); + } + + // -------------------------------------------------------------------- + + /** + * Database connection + * + * @param bool $persistent + * @return resource + */ + public function db_connect($persistent = FALSE) + { + $this->conn_id = ($persistent === TRUE) + ? pg_pconnect($this->dsn) + : pg_connect($this->dsn); + + if ($this->conn_id !== FALSE) + { + if ($persistent === TRUE + && pg_connection_status($this->conn_id) === PGSQL_CONNECTION_BAD + && pg_ping($this->conn_id) === FALSE + ) + { + return FALSE; + } + + empty($this->schema) OR $this->simple_query('SET search_path TO '.$this->schema.',public'); + } + + return $this->conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @return void + */ + public function reconnect() + { + if (pg_ping($this->conn_id) === FALSE) + { + $this->conn_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @param string $charset + * @return bool + */ + protected function _db_set_charset($charset) + { + return (pg_set_client_encoding($this->conn_id, $charset) === 0); + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + if ( ! $this->conn_id OR ($pg_version = pg_version($this->conn_id)) === FALSE) + { + return FALSE; + } + + /* If PHP was compiled with PostgreSQL lib versions earlier + * than 7.4, pg_version() won't return the server version + * and so we'll have to fall back to running a query in + * order to get it. + */ + return isset($pg_version['server']) + ? $this->data_cache['version'] = $pg_version['server'] + : parent::version(); + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return resource + */ + protected function _execute($sql) + { + return pg_query($this->conn_id, $sql); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + return (bool) pg_query($this->conn_id, 'BEGIN'); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + return (bool) pg_query($this->conn_id, 'COMMIT'); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + return (bool) pg_query($this->conn_id, 'ROLLBACK'); + } + + // -------------------------------------------------------------------- + + /** + * Determines if a query is a "write" type. + * + * @param string An SQL query string + * @return bool + */ + public function is_write_type($sql) + { + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#i', $sql)) + { + return FALSE; + } + + return parent::is_write_type($sql); + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependant string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return pg_escape_string($this->conn_id, $str); + } + + // -------------------------------------------------------------------- + + /** + * "Smart" Escape String + * + * Escapes data based on type + * + * @param string $str + * @return mixed + */ + public function escape($str) + { + if (is_php('5.4.4') && (is_string($str) OR (is_object($str) && method_exists($str, '__toString')))) + { + return pg_escape_literal($this->conn_id, $str); + } + elseif (is_bool($str)) + { + return ($str) ? 'TRUE' : 'FALSE'; + } + + return parent::escape($str); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return pg_affected_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return string + */ + public function insert_id() + { + $v = pg_version($this->conn_id); + $v = isset($v['server']) ? $v['server'] : 0; // 'server' key is only available since PosgreSQL 7.4 + + $table = (func_num_args() > 0) ? func_get_arg(0) : NULL; + $column = (func_num_args() > 1) ? func_get_arg(1) : NULL; + + if ($table === NULL && $v >= '8.1') + { + $sql = 'SELECT LASTVAL() AS ins_id'; + } + elseif ($table !== NULL) + { + if ($column !== NULL && $v >= '8.0') + { + $sql = 'SELECT pg_get_serial_sequence(\''.$table."', '".$column."') AS seq"; + $query = $this->query($sql); + $query = $query->row(); + $seq = $query->seq; + } + else + { + // seq_name passed in table parameter + $seq = $table; + } + + $sql = 'SELECT CURRVAL(\''.$seq."') AS ins_id"; + } + else + { + return pg_last_oid($this->result_id); + } + + $query = $this->query($sql); + $query = $query->row(); + return (int) $query->ins_id; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \''.$this->schema."'"; + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql.' AND "table_name" LIKE \'' + .$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * List column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT "column_name" + FROM "information_schema"."columns" + WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT "column_name", "data_type", "character_maximum_length", "numeric_precision", "column_default" + FROM "information_schema"."columns" + WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->column_name; + $retval[$i]->type = $query[$i]->data_type; + $retval[$i]->max_length = ($query[$i]->character_maximum_length > 0) ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision; + $retval[$i]->default = $query[$i]->column_default; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occured. + * + * @return array + */ + public function error() + { + return array('code' => '', 'message' => pg_last_error($this->conn_id)); + } + + // -------------------------------------------------------------------- + + /** + * ORDER BY + * + * @param string $orderby + * @param string $direction ASC, DESC or RANDOM + * @param bool $escape + * @return object + */ + public function order_by($orderby, $direction = '', $escape = NULL) + { + $direction = strtoupper(trim($direction)); + if ($direction === 'RANDOM') + { + if ( ! is_float($orderby) && ctype_digit((string) $orderby)) + { + $orderby = ($orderby > 1) + ? (float) '0.'.$orderby + : (float) $orderby; + } + + if (is_float($orderby)) + { + $this->simple_query('SET SEED '.$orderby); + } + + $orderby = $this->_random_keyword[0]; + $direction = ''; + $escape = FALSE; + } + + return parent::order_by($orderby, $direction, $escape); + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Update_Batch statement + * + * Generates a platform-specific batch update string from the supplied data + * + * @param string $table Table name + * @param array $values Update data + * @param string $index WHERE key + * @return string + */ + protected function _update_batch($table, $values, $index) + { + $ids = array(); + foreach ($values as $key => $val) + { + $ids[] = $val[$index]; + + foreach (array_keys($val) as $field) + { + if ($field !== $index) + { + $final[$field][] = 'WHEN '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $cases = ''; + foreach ($final as $k => $v) + { + $cases .= $k.' = (CASE '.$index."\n" + .implode("\n", $v)."\n" + .'ELSE '.$k.' END), '; + } + + $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); + + return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + pg_close($this->conn_id); + } + +} diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php new file mode 100644 index 0000000..8d985ba --- /dev/null +++ b/system/database/drivers/postgre/postgre_forge.php @@ -0,0 +1,205 @@ + 'INTEGER', + 'SMALLINT' => 'INTEGER', + 'INT' => 'BIGINT', + 'INT4' => 'BIGINT', + 'INTEGER' => 'BIGINT', + 'INT8' => 'NUMERIC', + 'BIGINT' => 'NUMERIC', + 'REAL' => 'DOUBLE PRECISION', + 'FLOAT' => 'DOUBLE PRECISION' + ); + + /** + * NULL value representation in CREATE/ALTER TABLE statements + * + * @var string + */ + protected $_null = 'NULL'; + + // -------------------------------------------------------------------- + + /** + * Class constructor + * + * @param object &$db Database object + * @return void + */ + public function __construct(&$db) + { + parent::__construct($db); + + if (version_compare($this->db->version(), '9.0', '>')) + { + $this->create_table_if = 'CREATE TABLE IF NOT EXISTS'; + } + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + return FALSE; + } + + if (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TYPE '.$field[$i]['type'].$field[$i]['length']; + } + + if ( ! empty($field[$i]['default'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' SET DEFAULT '.$field[$i]['default']; + } + + if (isset($field[$i]['null'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .($field[$i]['null'] === TRUE ? ' DROP NOT NULL' : ' SET NOT NULL'); + } + + if ( ! empty($field[$i]['new_name'])) + { + $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); + } + + if ( ! empty($field[$i]['comment'])) + { + $sqls[] = 'COMMENT ON COLUMN ' + .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) + .' IS '.$field[$i]['comment']; + } + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + // Reset field lenghts for data types that don't support it + if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE) + { + $attributes['CONSTRAINT'] = NULL; + } + + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) + { + $field['type'] = ($field['type'] === 'NUMERIC') + ? 'BIGSERIAL' + : 'SERIAL'; + } + } + +} diff --git a/system/database/drivers/postgre/postgre_result.php b/system/database/drivers/postgre/postgre_result.php new file mode 100644 index 0000000..354bb08 --- /dev/null +++ b/system/database/drivers/postgre/postgre_result.php @@ -0,0 +1,182 @@ +num_rows) + ? $this->num_rows + : $this->num_rows = pg_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return pg_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $field_names[] = pg_field_name($this->result_id, $i); + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = pg_field_name($this->result_id, $i); + $retval[$i]->type = pg_field_type($this->result_id, $i); + $retval[$i]->max_length = pg_field_size($this->result_id, $i); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_resource($this->result_id)) + { + pg_free_result($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * @param int $n + * @return bool + */ + public function data_seek($n = 0) + { + return pg_result_seek($this->result_id, $n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return pg_fetch_assoc($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return pg_fetch_object($this->result_id, NULL, $class_name); + } + +} diff --git a/system/database/drivers/postgre/postgre_utility.php b/system/database/drivers/postgre/postgre_utility.php new file mode 100644 index 0000000..bb5e6e0 --- /dev/null +++ b/system/database/drivers/postgre/postgre_utility.php @@ -0,0 +1,78 @@ +db->display_error('db_unsupported_feature'); + } +} diff --git a/system/database/drivers/sqlite/index.html b/system/database/drivers/sqlite/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/sqlite/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php new file mode 100644 index 0000000..16b8c29 --- /dev/null +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -0,0 +1,330 @@ +database, 0666, $error) + : sqlite_open($this->database, 0666, $error); + + isset($error) && log_message('error', $error); + + return $conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + return isset($this->data_cache['version']) + ? $this->data_cache['version'] + : $this->data_cache['version'] = sqlite_libversion(); + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return resource + */ + protected function _execute($sql) + { + return $this->is_write_type($sql) + ? sqlite_exec($this->conn_id, $sql) + : sqlite_query($this->conn_id, $sql); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + return $this->simple_query('BEGIN TRANSACTION'); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + return $this->simple_query('COMMIT'); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + return $this->simple_query('ROLLBACK'); + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependant string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return sqlite_escape_string($str); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return sqlite_changes($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return int + */ + public function insert_id() + { + return sqlite_last_insert_rowid($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = "SELECT name FROM sqlite_master WHERE type='table'"; + + if ($prefix_limit !== FALSE && $this->dbprefix != '') + { + return $sql." AND 'name' LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return bool + */ + protected function _list_columns($table = '') + { + // Not supported + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) + { + return FALSE; + } + + $query = $query->result_array(); + if (empty($query)) + { + return FALSE; + } + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]['name']; + $retval[$i]->type = $query[$i]['type']; + $retval[$i]->max_length = NULL; + $retval[$i]->default = $query[$i]['dflt_value']; + $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occured. + * + * @return array + */ + public function error() + { + $error = array('code' => sqlite_last_error($this->conn_id)); + $error['message'] = sqlite_error_string($error['code']); + return $error; + } + + // -------------------------------------------------------------------- + + /** + * Replace statement + * + * Generates a platform-specific replace string from the supplied data + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string + */ + protected function _replace($table, $keys, $values) + { + return 'INSERT OR '.parent::_replace($table, $keys, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this function maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'DELETE FROM '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + sqlite_close($this->conn_id); + } + +} diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php new file mode 100644 index 0000000..8a16594 --- /dev/null +++ b/system/database/drivers/sqlite/sqlite_forge.php @@ -0,0 +1,205 @@ +db->database) OR ! @unlink($this->db->database)) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + elseif ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @todo implement drop_column(), modify_column() + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') + { + // drop_column(): + // BEGIN TRANSACTION; + // CREATE TEMPORARY TABLE t1_backup(a,b); + // INSERT INTO t1_backup SELECT a,b FROM t1; + // DROP TABLE t1; + // CREATE TABLE t1(a,b); + // INSERT INTO t1 SELECT a,b FROM t1_backup; + // DROP TABLE t1_backup; + // COMMIT; + + return FALSE; + } + + return parent::_alter_table($alter_type, $table, $field); + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + return $this->db->escape_identifiers($field['name']) + .' '.$field['type'] + .$field['auto_increment'] + .$field['null'] + .$field['unique'] + .$field['default']; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'ENUM': + case 'SET': + $attributes['TYPE'] = 'TEXT'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['type'] = 'INTEGER PRIMARY KEY'; + $field['default'] = ''; + $field['null'] = ''; + $field['unique'] = ''; + $field['auto_increment'] = ' AUTOINCREMENT'; + + $this->primary_keys = array(); + } + } + +} diff --git a/system/database/drivers/sqlite/sqlite_result.php b/system/database/drivers/sqlite/sqlite_result.php new file mode 100644 index 0000000..d40b98a --- /dev/null +++ b/system/database/drivers/sqlite/sqlite_result.php @@ -0,0 +1,164 @@ +num_rows) + ? $this->num_rows + : $this->num_rows = @sqlite_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return @sqlite_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $field_names[$i] = sqlite_field_name($this->result_id, $i); + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = sqlite_field_name($this->result_id, $i); + $retval[$i]->type = NULL; + $retval[$i]->max_length = NULL; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * @param int $n + * @return bool + */ + public function data_seek($n = 0) + { + return sqlite_seek($this->result_id, $n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return sqlite_fetch_array($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return sqlite_fetch_object($this->result_id, $class_name); + } + +} diff --git a/system/database/drivers/sqlite/sqlite_utility.php b/system/database/drivers/sqlite/sqlite_utility.php new file mode 100644 index 0000000..59c46f9 --- /dev/null +++ b/system/database/drivers/sqlite/sqlite_utility.php @@ -0,0 +1,61 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/system/database/drivers/sqlite3/index.html b/system/database/drivers/sqlite3/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/sqlite3/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php new file mode 100644 index 0000000..9743499 --- /dev/null +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -0,0 +1,350 @@ +password) + ? new SQLite3($this->database) + : new SQLite3($this->database, SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, $this->password); + } + catch (Exception $e) + { + return FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + $version = SQLite3::version(); + return $this->data_cache['version'] = $version['versionString']; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @todo Implement use of SQLite3::querySingle(), if needed + * @param string $sql + * @return mixed SQLite3Result object or bool + */ + protected function _execute($sql) + { + return $this->is_write_type($sql) + ? $this->conn_id->exec($sql) + : $this->conn_id->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + return $this->conn_id->exec('BEGIN TRANSACTION'); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + return $this->conn_id->exec('END TRANSACTION'); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + return $this->conn_id->exec('ROLLBACK'); + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependant string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return $this->conn_id->escapeString($str); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return $this->conn_id->changes(); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return int + */ + public function insert_id() + { + return $this->conn_id->lastInsertRowID(); + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + return 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\'' + .(($prefix_limit !== FALSE && $this->dbprefix != '') + ? ' AND "NAME" LIKE \''.$this->escape_like_str($this->dbprefix).'%\' '.sprintf($this->_like_escape_str, $this->_like_escape_chr) + : ''); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * @param string $table Table name + * @return array + */ + public function list_fields($table) + { + // Is there a cached result? + if (isset($this->data_cache['field_names'][$table])) + { + return $this->data_cache['field_names'][$table]; + } + + if (($result = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) + { + return FALSE; + } + + $this->data_cache['field_names'][$table] = array(); + foreach ($result->result_array() as $row) + { + $this->data_cache['field_names'][$table][] = $row['name']; + } + + return $this->data_cache['field_names'][$table]; + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) + { + return FALSE; + } + + $query = $query->result_array(); + if (empty($query)) + { + return FALSE; + } + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]['name']; + $retval[$i]->type = $query[$i]['type']; + $retval[$i]->max_length = NULL; + $retval[$i]->default = $query[$i]['dflt_value']; + $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occured. + * + * @return array + */ + public function error() + { + return array('code' => $this->conn_id->lastErrorCode(), 'message' => $this->conn_id->lastErrorMsg()); + } + + // -------------------------------------------------------------------- + + /** + * Replace statement + * + * Generates a platform-specific replace string from the supplied data + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string + */ + protected function _replace($table, $keys, $values) + { + return 'INSERT OR '.parent::_replace($table, $keys, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'DELETE FROM '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + $this->conn_id->close(); + } + +} diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php new file mode 100644 index 0000000..43cbe33 --- /dev/null +++ b/system/database/drivers/sqlite3/sqlite3_forge.php @@ -0,0 +1,225 @@ +db->version(), '3.3', '<')) + { + $this->_create_table_if = FALSE; + $this->_drop_table_if = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Create database + * + * @param string $db_name + * @return bool + */ + public function create_database($db_name = '') + { + // In SQLite, a database is created when you connect to the database. + // We'll return TRUE so that an error isn't generated + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @param string $db_name (ignored) + * @return bool + */ + public function drop_database($db_name = '') + { + // In SQLite, a database is dropped when we delete a file + if (file_exists($this->db->database)) + { + // We need to close the pseudo-connection first + $this->db->close(); + if ( ! @unlink($this->db->database)) + { + return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + elseif ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } + + return TRUE; + } + + return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @todo implement drop_column(), modify_column() + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') + { + // drop_column(): + // BEGIN TRANSACTION; + // CREATE TEMPORARY TABLE t1_backup(a,b); + // INSERT INTO t1_backup SELECT a,b FROM t1; + // DROP TABLE t1; + // CREATE TABLE t1(a,b); + // INSERT INTO t1 SELECT a,b FROM t1_backup; + // DROP TABLE t1_backup; + // COMMIT; + + return FALSE; + } + + return parent::_alter_table($alter_type, $table, $field); + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + return $this->db->escape_identifiers($field['name']) + .' '.$field['type'] + .$field['auto_increment'] + .$field['null'] + .$field['unique'] + .$field['default']; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'ENUM': + case 'SET': + $attributes['TYPE'] = 'TEXT'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['type'] = 'INTEGER PRIMARY KEY'; + $field['default'] = ''; + $field['null'] = ''; + $field['unique'] = ''; + $field['auto_increment'] = ' AUTOINCREMENT'; + + $this->primary_keys = array(); + } + } + +} diff --git a/system/database/drivers/sqlite3/sqlite3_result.php b/system/database/drivers/sqlite3/sqlite3_result.php new file mode 100644 index 0000000..aa559ee --- /dev/null +++ b/system/database/drivers/sqlite3/sqlite3_result.php @@ -0,0 +1,194 @@ +result_id->numColumns(); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $field_names[] = $this->result_id->columnName($i); + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + static $data_types = array( + SQLITE3_INTEGER => 'integer', + SQLITE3_FLOAT => 'float', + SQLITE3_TEXT => 'text', + SQLITE3_BLOB => 'blob', + SQLITE3_NULL => 'null' + ); + + $retval = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $this->result_id->columnName($i); + + $type = $this->result_id->columnType($i); + $retval[$i]->type = isset($data_types[$type]) ? $data_types[$type] : $type; + + $retval[$i]->max_length = NULL; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_object($this->result_id)) + { + $this->result_id->finalize(); + $this->result_id = NULL; + } + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return $this->result_id->fetchArray(SQLITE3_ASSOC); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + // No native support for fetching rows as objects + if (($row = $this->result_id->fetchArray(SQLITE3_ASSOC)) === FALSE) + { + return FALSE; + } + elseif ($class_name === 'stdClass') + { + return (object) $row; + } + + $class_name = new $class_name(); + foreach (array_keys($row) as $key) + { + $class_name->$key = $row[$key]; + } + + return $class_name; + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * @param int $n (ignored) + * @return array + */ + public function data_seek($n = 0) + { + // Only resetting to the start of the result set is supported + return ($n > 0) ? FALSE : $this->result_id->reset(); + } + +} diff --git a/system/database/drivers/sqlite3/sqlite3_utility.php b/system/database/drivers/sqlite3/sqlite3_utility.php new file mode 100644 index 0000000..b47c086 --- /dev/null +++ b/system/database/drivers/sqlite3/sqlite3_utility.php @@ -0,0 +1,61 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/system/database/drivers/sqlsrv/index.html b/system/database/drivers/sqlsrv/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/sqlsrv/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php new file mode 100644 index 0000000..0cd9ce1 --- /dev/null +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -0,0 +1,542 @@ +scrollable === NULL) + { + $this->scrollable = defined('SQLSRV_CURSOR_CLIENT_BUFFERED') + ? SQLSRV_CURSOR_CLIENT_BUFFERED + : FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Database connection + * + * @param bool $pooling + * @return resource + */ + public function db_connect($pooling = FALSE) + { + $charset = in_array(strtolower($this->char_set), array('utf-8', 'utf8'), TRUE) + ? 'UTF-8' : SQLSRV_ENC_CHAR; + + $connection = array( + 'UID' => empty($this->username) ? '' : $this->username, + 'PWD' => empty($this->password) ? '' : $this->password, + 'Database' => $this->database, + 'ConnectionPooling' => ($pooling === TRUE) ? 1 : 0, + 'CharacterSet' => $charset, + 'Encrypt' => ($this->encrypt === TRUE) ? 1 : 0, + 'ReturnDatesAsStrings' => 1 + ); + + // If the username and password are both empty, assume this is a + // 'Windows Authentication Mode' connection. + if (empty($connection['UID']) && empty($connection['PWD'])) + { + unset($connection['UID'], $connection['PWD']); + } + + if (FALSE !== ($this->conn_id = sqlsrv_connect($this->hostname, $connection))) + { + // Determine how identifiers are escaped + $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); + $query = $query->row_array(); + $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; + $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); + } + + return $this->conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @param string $database + * @return bool + */ + public function db_select($database = '') + { + if ($database === '') + { + $database = $this->database; + } + + if ($this->_execute('USE '.$this->escape_identifiers($database))) + { + $this->database = $database; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return resource + */ + protected function _execute($sql) + { + return ($this->scrollable === FALSE OR $this->is_write_type($sql)) + ? sqlsrv_query($this->conn_id, $sql) + : sqlsrv_query($this->conn_id, $sql, NULL, array('Scrollable' => $this->scrollable)); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + return sqlsrv_begin_transaction($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + return sqlsrv_commit($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + return sqlsrv_rollback($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return sqlsrv_rows_affected($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * Returns the last id created in the Identity column. + * + * @return string + */ + public function insert_id() + { + return $this->query('SELECT SCOPE_IDENTITY() AS insert_id')->row()->insert_id; + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + if ( ! $this->conn_id OR ($info = sqlsrv_server_info($this->conn_id)) === FALSE) + { + return FALSE; + } + + return $this->data_cache['version'] = $info['SQLServerVersion']; + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool + * @return string $prefix_limit + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT '.$this->escape_identifiers('name') + .' FROM '.$this->escape_identifiers('sysobjects') + .' WHERE '.$this->escape_identifiers('type')." = 'U'"; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_escape_like_str, $this->_escape_like_chr); + } + + return $sql.' ORDER BY '.$this->escape_identifiers('name'); + } + + // -------------------------------------------------------------------- + + /** + * List column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT COLUMN_NAME + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->COLUMN_NAME; + $retval[$i]->type = $query[$i]->DATA_TYPE; + $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; + $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occured. + * + * @return array + */ + public function error() + { + $error = array('code' => '00000', 'message' => ''); + $sqlsrv_errors = sqlsrv_errors(SQLSRV_ERR_ERRORS); + + if ( ! is_array($sqlsrv_errors)) + { + return $error; + } + + $sqlsrv_error = array_shift($sqlsrv_errors); + if (isset($sqlsrv_error['SQLSTATE'])) + { + $error['code'] = isset($sqlsrv_error['code']) ? $sqlsrv_error['SQLSTATE'].'/'.$sqlsrv_error['code'] : $sqlsrv_error['SQLSTATE']; + } + elseif (isset($sqlsrv_error['code'])) + { + $error['code'] = $sqlsrv_error['code']; + } + + if (isset($sqlsrv_error['message'])) + { + $error['message'] = $sqlsrv_error['message']; + } + + return $error; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE TABLE '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + if ($this->qb_limit) + { + return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; + } + + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + // As of SQL Server 2012 (11.0.*) OFFSET is supported + if (version_compare($this->version(), '11', '>=')) + { + // SQL Server OFFSET-FETCH can be used only with the ORDER BY clause + empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; + + return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; + } + + $limit = $this->qb_offset + $this->qb_limit; + + // An ORDER BY clause is required for ROW_NUMBER() to work + if ($this->qb_offset && ! empty($this->qb_orderby)) + { + $orderby = $this->_compile_order_by(); + + // We have to strip the ORDER BY clause + $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); + + // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results + if (count($this->qb_select) === 0) + { + $select = '*'; // Inevitable + } + else + { + // Use only field names and their aliases, everything else is out of our scope. + $select = array(); + $field_regexp = ($this->_quoted_identifier) + ? '("[^\"]+")' : '(\[[^\]]+\])'; + for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) + { + $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) + ? $m[1] : $this->qb_select[$i]; + } + $select = implode(', ', $select); + } + + return 'SELECT '.$select." FROM (\n\n" + .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) + ."\n\n) ".$this->escape_identifiers('CI_subquery') + ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; + } + + return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data. + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string|bool + */ + protected function _insert_batch($table, $keys, $values) + { + // Multiple-value inserts are only supported as of SQL Server 2008 + if (version_compare($this->version(), '10', '>=')) + { + return parent::_insert_batch($table, $keys, $values); + } + + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + sqlsrv_close($this->conn_id); + } + +} diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php new file mode 100644 index 0000000..f915dad --- /dev/null +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php @@ -0,0 +1,144 @@ + 'SMALLINT', + 'SMALLINT' => 'INT', + 'INT' => 'BIGINT', + 'REAL' => 'FLOAT' + ); + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + $sqls[] = $sql.$this->_process_column($field[$i]); + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'INTEGER': + $attributes['TYPE'] = 'INT'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['auto_increment'] = ' IDENTITY(1,1)'; + } + } + +} diff --git a/system/database/drivers/sqlsrv/sqlsrv_result.php b/system/database/drivers/sqlsrv/sqlsrv_result.php new file mode 100644 index 0000000..fde7264 --- /dev/null +++ b/system/database/drivers/sqlsrv/sqlsrv_result.php @@ -0,0 +1,193 @@ +scrollable = $driver_object->scrollable; + } + + // -------------------------------------------------------------------- + + /** + * Number of rows in the result set + * + * @return int + */ + public function num_rows() + { + // sqlsrv_num_rows() doesn't work with the FORWARD and DYNAMIC cursors (FALSE is the same as FORWARD) + if ( ! in_array($this->scrollable, array(FALSE, SQLSRV_CURSOR_FORWARD, SQLSRV_CURSOR_DYNAMIC), TRUE)) + { + return parent::num_rows(); + } + + return is_int($this->num_rows) + ? $this->num_rows + : $this->num_rows = sqlsrv_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return @sqlsrv_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + foreach (sqlsrv_field_metadata($this->result_id) as $offset => $field) + { + $field_names[] = $field['Name']; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + foreach (sqlsrv_field_metadata($this->result_id) as $i => $field) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $field['Name']; + $retval[$i]->type = $field['Type']; + $retval[$i]->max_length = $field['Size']; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_resource($this->result_id)) + { + sqlsrv_free_stmt($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return sqlsrv_fetch_array($this->result_id, SQLSRV_FETCH_ASSOC); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return sqlsrv_fetch_object($this->result_id, $class_name); + } + +} diff --git a/system/database/drivers/sqlsrv/sqlsrv_utility.php b/system/database/drivers/sqlsrv/sqlsrv_utility.php new file mode 100644 index 0000000..726fe3e --- /dev/null +++ b/system/database/drivers/sqlsrv/sqlsrv_utility.php @@ -0,0 +1,77 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/system/database/index.html b/system/database/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/fonts/index.html b/system/fonts/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/fonts/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

                      Directory access is forbidden.

                      + + + diff --git a/system/fonts/texb.ttf b/system/fonts/texb.ttf new file mode 100644 index 0000000..383c88b Binary files /dev/null and b/system/fonts/texb.ttf differ diff --git a/system/helpers/array_helper.php b/system/helpers/array_helper.php new file mode 100644 index 0000000..3fdccf9 --- /dev/null +++ b/system/helpers/array_helper.php @@ -0,0 +1,115 @@ + '', + 'img_path' => '', + 'img_url' => '', + 'img_width' => '150', + 'img_height' => '30', + 'font_path' => '', + 'expiration' => 7200, + 'word_length' => 8, + 'font_size' => 16, + 'img_id' => '', + 'pool' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', + 'colors' => array( + 'background' => array(255,255,255), + 'border' => array(153,102,102), + 'text' => array(204,153,153), + 'grid' => array(255,182,182) + ) + ); + + foreach ($defaults as $key => $val) + { + if ( ! is_array($data) && empty($$key)) + { + $$key = $val; + } + else + { + $$key = isset($data[$key]) ? $data[$key] : $val; + } + } + + if ($img_path === '' OR $img_url === '' + OR ! is_dir($img_path) OR ! is_really_writable($img_path) + OR ! extension_loaded('gd')) + { + return FALSE; + } + + // ----------------------------------- + // Remove old images + // ----------------------------------- + + $now = microtime(TRUE); + + $current_dir = @opendir($img_path); + while ($filename = @readdir($current_dir)) + { + if (substr($filename, -4) === '.jpg' && (str_replace('.jpg', '', $filename) + $expiration) < $now) + { + @unlink($img_path.$filename); + } + } + + @closedir($current_dir); + + // ----------------------------------- + // Do we have a "word" yet? + // ----------------------------------- + + if (empty($word)) + { + $word = ''; + $pool_length = strlen($pool); + $rand_max = $pool_length - 1; + + // PHP7 or a suitable polyfill + if (function_exists('random_int')) + { + try + { + for ($i = 0; $i < $word_length; $i++) + { + $word .= $pool[random_int(0, $rand_max)]; + } + } + catch (Exception $e) + { + // This means fallback to the next possible + // alternative to random_int() + $word = ''; + } + } + } + + if (empty($word)) + { + // Nobody will have a larger character pool than + // 256 characters, but let's handle it just in case ... + // + // No, I do not care that the fallback to mt_rand() can + // handle it; if you trigger this, you're very obviously + // trying to break it. -- Narf + if ($pool_length > 256) + { + return FALSE; + } + + // We'll try using the operating system's PRNG first, + // which we can access through CI_Security::get_random_bytes() + $security = get_instance()->security; + + // To avoid numerous get_random_bytes() calls, we'll + // just try fetching as much bytes as we need at once. + if (($bytes = $security->get_random_bytes($pool_length)) !== FALSE) + { + $byte_index = $word_index = 0; + while ($word_index < $word_length) + { + // Do we have more random data to use? + // It could be exhausted by previous iterations + // ignoring bytes higher than $rand_max. + if ($byte_index === $pool_length) + { + // No failures should be possible if the + // first get_random_bytes() call didn't + // return FALSE, but still ... + for ($i = 0; $i < 5; $i++) + { + if (($bytes = $security->get_random_bytes($pool_length)) === FALSE) + { + continue; + } + + $byte_index = 0; + break; + } + + if ($bytes === FALSE) + { + // Sadly, this means fallback to mt_rand() + $word = ''; + break; + } + } + + list(, $rand_index) = unpack('C', $bytes[$byte_index++]); + if ($rand_index > $rand_max) + { + continue; + } + + $word .= $pool[$rand_index]; + $word_index++; + } + } + } + + if (empty($word)) + { + for ($i = 0; $i < $word_length; $i++) + { + $word .= $pool[mt_rand(0, $rand_max)]; + } + } + elseif ( ! is_string($word)) + { + $word = (string) $word; + } + + // ----------------------------------- + // Determine angle and position + // ----------------------------------- + $length = strlen($word); + $angle = ($length >= 6) ? mt_rand(-($length-6), ($length-6)) : 0; + $x_axis = mt_rand(6, (360/$length)-16); + $y_axis = ($angle >= 0) ? mt_rand($img_height, $img_width) : mt_rand(6, $img_height); + + // Create image + // PHP.net recommends imagecreatetruecolor(), but it isn't always available + $im = function_exists('imagecreatetruecolor') + ? imagecreatetruecolor($img_width, $img_height) + : imagecreate($img_width, $img_height); + + // ----------------------------------- + // Assign colors + // ---------------------------------- + + is_array($colors) OR $colors = $defaults['colors']; + + foreach (array_keys($defaults['colors']) as $key) + { + // Check for a possible missing value + is_array($colors[$key]) OR $colors[$key] = $defaults['colors'][$key]; + $colors[$key] = imagecolorallocate($im, $colors[$key][0], $colors[$key][1], $colors[$key][2]); + } + + // Create the rectangle + ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $colors['background']); + + // ----------------------------------- + // Create the spiral pattern + // ----------------------------------- + $theta = 1; + $thetac = 7; + $radius = 16; + $circles = 20; + $points = 32; + + for ($i = 0, $cp = ($circles * $points) - 1; $i < $cp; $i++) + { + $theta += $thetac; + $rad = $radius * ($i / $points); + $x = ($rad * cos($theta)) + $x_axis; + $y = ($rad * sin($theta)) + $y_axis; + $theta += $thetac; + $rad1 = $radius * (($i + 1) / $points); + $x1 = ($rad1 * cos($theta)) + $x_axis; + $y1 = ($rad1 * sin($theta)) + $y_axis; + imageline($im, $x, $y, $x1, $y1, $colors['grid']); + $theta -= $thetac; + } + + // ----------------------------------- + // Write the text + // ----------------------------------- + + $use_font = ($font_path !== '' && file_exists($font_path) && function_exists('imagettftext')); + if ($use_font === FALSE) + { + ($font_size > 5) && $font_size = 5; + $x = mt_rand(0, $img_width / ($length / 3)); + $y = 0; + } + else + { + ($font_size > 30) && $font_size = 30; + $x = mt_rand(0, $img_width / ($length / 1.5)); + $y = $font_size + 2; + } + + for ($i = 0; $i < $length; $i++) + { + if ($use_font === FALSE) + { + $y = mt_rand(0 , $img_height / 2); + imagestring($im, $font_size, $x, $y, $word[$i], $colors['text']); + $x += ($font_size * 2); + } + else + { + $y = mt_rand($img_height / 2, $img_height - 3); + imagettftext($im, $font_size, $angle, $x, $y, $colors['text'], $font_path, $word[$i]); + $x += $font_size; + } + } + + // Create the border + imagerectangle($im, 0, 0, $img_width - 1, $img_height - 1, $colors['border']); + + // ----------------------------------- + // Generate the image + // ----------------------------------- + $img_url = rtrim($img_url, '/').'/'; + + if (function_exists('imagejpeg')) + { + $img_filename = $now.'.jpg'; + imagejpeg($im, $img_path.$img_filename); + } + elseif (function_exists('imagepng')) + { + $img_filename = $now.'.png'; + imagepng($im, $img_path.$img_filename); + } + else + { + return FALSE; + } + + $img = ' '; + ImageDestroy($im); + + return array('word' => $word, 'time' => $now, 'image' => $img, 'filename' => $img_filename); + } +} diff --git a/system/helpers/cookie_helper.php b/system/helpers/cookie_helper.php new file mode 100644 index 0000000..ca43244 --- /dev/null +++ b/system/helpers/cookie_helper.php @@ -0,0 +1,113 @@ +input->set_cookie($name, $value, $expire, $domain, $path, $prefix, $secure, $httponly); + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('get_cookie')) +{ + /** + * Fetch an item from the COOKIE array + * + * @param string + * @param bool + * @return mixed + */ + function get_cookie($index, $xss_clean = NULL) + { + is_bool($xss_clean) OR $xss_clean = (config_item('global_xss_filtering') === TRUE); + $prefix = isset($_COOKIE[$index]) ? '' : config_item('cookie_prefix'); + return get_instance()->input->cookie($prefix.$index, $xss_clean); + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('delete_cookie')) +{ + /** + * Delete a COOKIE + * + * @param mixed + * @param string the cookie domain. Usually: .yourdomain.com + * @param string the cookie path + * @param string the cookie prefix + * @return void + */ + function delete_cookie($name, $domain = '', $path = '/', $prefix = '') + { + set_cookie($name, '', '', $domain, $path, $prefix); + } +} diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php new file mode 100644 index 0000000..c43209f --- /dev/null +++ b/system/helpers/date_helper.php @@ -0,0 +1,796 @@ +format('j-n-Y G:i:s'), '%d-%d-%d %d:%d:%d', $day, $month, $year, $hour, $minute, $second); + + return mktime($hour, $minute, $second, $month, $day, $year); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('mdate')) +{ + /** + * Convert MySQL Style Datecodes + * + * This function is identical to PHPs date() function, + * except that it allows date codes to be formatted using + * the MySQL style, where each code letter is preceded + * with a percent sign: %Y %m %d etc... + * + * The benefit of doing dates this way is that you don't + * have to worry about escaping your text letters that + * match the date codes. + * + * @param string + * @param int + * @return int + */ + function mdate($datestr = '', $time = '') + { + if ($datestr === '') + { + return ''; + } + elseif (empty($time)) + { + $time = now(); + } + + $datestr = str_replace( + '%\\', + '', + preg_replace('/([a-z]+?){1}/i', '\\\\\\1', $datestr) + ); + + return date($datestr, $time); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('standard_date')) +{ + /** + * Standard Date + * + * Returns a date formatted according to the submitted standard. + * + * As of PHP 5.2, the DateTime extension provides constants that + * serve for the exact same purpose and are used with date(). + * + * @todo Remove in version 3.1+. + * @deprecated 3.0.0 Use PHP's native date() instead. + * @link http://www.php.net/manual/en/class.datetime.php#datetime.constants.types + * + * @example date(DATE_RFC822, now()); // default + * @example date(DATE_W3C, $time); // a different format and time + * + * @param string $fmt = 'DATE_RFC822' the chosen format + * @param int $time = NULL Unix timestamp + * @return string + */ + function standard_date($fmt = 'DATE_RFC822', $time = NULL) + { + if (empty($time)) + { + $time = now(); + } + + // Procedural style pre-defined constants from the DateTime extension + if (strpos($fmt, 'DATE_') !== 0 OR defined($fmt) === FALSE) + { + return FALSE; + } + + return date(constant($fmt), $time); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('timespan')) +{ + /** + * Timespan + * + * Returns a span of seconds in this format: + * 10 days 14 hours 36 minutes 47 seconds + * + * @param int a number of seconds + * @param int Unix timestamp + * @param int a number of display units + * @return string + */ + function timespan($seconds = 1, $time = '', $units = 7) + { + $CI =& get_instance(); + $CI->lang->load('date'); + + is_numeric($seconds) OR $seconds = 1; + is_numeric($time) OR $time = time(); + is_numeric($units) OR $units = 7; + + $seconds = ($time <= $seconds) ? 1 : $time - $seconds; + + $str = array(); + $years = floor($seconds / 31557600); + + if ($years > 0) + { + $str[] = $years.' '.$CI->lang->line($years > 1 ? 'date_years' : 'date_year'); + } + + $seconds -= $years * 31557600; + $months = floor($seconds / 2629743); + + if (count($str) < $units && ($years > 0 OR $months > 0)) + { + if ($months > 0) + { + $str[] = $months.' '.$CI->lang->line($months > 1 ? 'date_months' : 'date_month'); + } + + $seconds -= $months * 2629743; + } + + $weeks = floor($seconds / 604800); + + if (count($str) < $units && ($years > 0 OR $months > 0 OR $weeks > 0)) + { + if ($weeks > 0) + { + $str[] = $weeks.' '.$CI->lang->line($weeks > 1 ? 'date_weeks' : 'date_week'); + } + + $seconds -= $weeks * 604800; + } + + $days = floor($seconds / 86400); + + if (count($str) < $units && ($months > 0 OR $weeks > 0 OR $days > 0)) + { + if ($days > 0) + { + $str[] = $days.' '.$CI->lang->line($days > 1 ? 'date_days' : 'date_day'); + } + + $seconds -= $days * 86400; + } + + $hours = floor($seconds / 3600); + + if (count($str) < $units && ($days > 0 OR $hours > 0)) + { + if ($hours > 0) + { + $str[] = $hours.' '.$CI->lang->line($hours > 1 ? 'date_hours' : 'date_hour'); + } + + $seconds -= $hours * 3600; + } + + $minutes = floor($seconds / 60); + + if (count($str) < $units && ($days > 0 OR $hours > 0 OR $minutes > 0)) + { + if ($minutes > 0) + { + $str[] = $minutes.' '.$CI->lang->line($minutes > 1 ? 'date_minutes' : 'date_minute'); + } + + $seconds -= $minutes * 60; + } + + if (count($str) === 0) + { + $str[] = $seconds.' '.$CI->lang->line($seconds > 1 ? 'date_seconds' : 'date_second'); + } + + return implode(', ', $str); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('days_in_month')) +{ + /** + * Number of days in a month + * + * Takes a month/year as input and returns the number of days + * for the given month/year. Takes leap years into consideration. + * + * @param int a numeric month + * @param int a numeric year + * @return int + */ + function days_in_month($month = 0, $year = '') + { + if ($month < 1 OR $month > 12) + { + return 0; + } + elseif ( ! is_numeric($year) OR strlen($year) !== 4) + { + $year = date('Y'); + } + + if (defined('CAL_GREGORIAN')) + { + return cal_days_in_month(CAL_GREGORIAN, $month, $year); + } + + if ($year >= 1970) + { + return (int) date('t', mktime(12, 0, 0, $month, 1, $year)); + } + + if ($month == 2) + { + if ($year % 400 === 0 OR ($year % 4 === 0 && $year % 100 !== 0)) + { + return 29; + } + } + + $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); + return $days_in_month[$month - 1]; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('local_to_gmt')) +{ + /** + * Converts a local Unix timestamp to GMT + * + * @param int Unix timestamp + * @return int + */ + function local_to_gmt($time = '') + { + if ($time === '') + { + $time = time(); + } + + return mktime( + gmdate('G', $time), + gmdate('i', $time), + gmdate('s', $time), + gmdate('n', $time), + gmdate('j', $time), + gmdate('Y', $time) + ); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('gmt_to_local')) +{ + /** + * Converts GMT time to a localized value + * + * Takes a Unix timestamp (in GMT) as input, and returns + * at the local value based on the timezone and DST setting + * submitted + * + * @param int Unix timestamp + * @param string timezone + * @param bool whether DST is active + * @return int + */ + function gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE) + { + if ($time === '') + { + return now(); + } + + $time += timezones($timezone) * 3600; + + return ($dst === TRUE) ? $time + 3600 : $time; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('mysql_to_unix')) +{ + /** + * Converts a MySQL Timestamp to Unix + * + * @param int MySQL timestamp YYYY-MM-DD HH:MM:SS + * @return int Unix timstamp + */ + function mysql_to_unix($time = '') + { + // We'll remove certain characters for backward compatibility + // since the formatting changed with MySQL 4.1 + // YYYY-MM-DD HH:MM:SS + + $time = str_replace(array('-', ':', ' '), '', $time); + + // YYYYMMDDHHMMSS + return mktime( + substr($time, 8, 2), + substr($time, 10, 2), + substr($time, 12, 2), + substr($time, 4, 2), + substr($time, 6, 2), + substr($time, 0, 4) + ); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('unix_to_human')) +{ + /** + * Unix to "Human" + * + * Formats Unix timestamp to the following prototype: 2006-08-21 11:35 PM + * + * @param int Unix timestamp + * @param bool whether to show seconds + * @param string format: us or euro + * @return string + */ + function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us') + { + $r = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' '; + + if ($fmt === 'us') + { + $r .= date('h', $time).':'.date('i', $time); + } + else + { + $r .= date('H', $time).':'.date('i', $time); + } + + if ($seconds) + { + $r .= ':'.date('s', $time); + } + + if ($fmt === 'us') + { + return $r.' '.date('A', $time); + } + + return $r; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('human_to_unix')) +{ + /** + * Convert "human" date to GMT + * + * Reverses the above process + * + * @param string format: us or euro + * @return int + */ + function human_to_unix($datestr = '') + { + if ($datestr === '') + { + return FALSE; + } + + $datestr = preg_replace('/\040+/', ' ', trim($datestr)); + + if ( ! preg_match('/^(\d{2}|\d{4})\-[0-9]{1,2}\-[0-9]{1,2}\s[0-9]{1,2}:[0-9]{1,2}(?::[0-9]{1,2})?(?:\s[AP]M)?$/i', $datestr)) + { + return FALSE; + } + + sscanf($datestr, '%d-%d-%d %s %s', $year, $month, $day, $time, $ampm); + sscanf($time, '%d:%d:%d', $hour, $min, $sec); + isset($sec) OR $sec = 0; + + if (isset($ampm)) + { + $ampm = strtolower($ampm); + + if ($ampm[0] === 'p' && $hour < 12) + { + $hour += 12; + } + elseif ($ampm[0] === 'a' && $hour === 12) + { + $hour = 0; + } + } + + return mktime($hour, $min, $sec, $month, $day, $year); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('nice_date')) +{ + /** + * Turns many "reasonably-date-like" strings into something + * that is actually useful. This only works for dates after unix epoch. + * + * @param string The terribly formatted date-like string + * @param string Date format to return (same as php date function) + * @return string + */ + function nice_date($bad_date = '', $format = FALSE) + { + if (empty($bad_date)) + { + return 'Unknown'; + } + elseif (empty($format)) + { + $format = 'U'; + } + + // Date like: YYYYMM + if (preg_match('/^\d{6}$/i', $bad_date)) + { + if (in_array(substr($bad_date, 0, 2), array('19', '20'))) + { + $year = substr($bad_date, 0, 4); + $month = substr($bad_date, 4, 2); + } + else + { + $month = substr($bad_date, 0, 2); + $year = substr($bad_date, 2, 4); + } + + return date($format, strtotime($year.'-'.$month.'-01')); + } + + // Date Like: YYYYMMDD + if (preg_match('/^(\d{2})\d{2}(\d{4})$/i', $bad_date, $matches)) + { + return date($format, strtotime($matches[1].'/01/'.$matches[2])); + } + + // Date Like: MM-DD-YYYY __or__ M-D-YYYY (or anything in between) + if (preg_match('/^(\d{1,2})-(\d{1,2})-(\d{4})$/i', $bad_date, $matches)) + { + return date($format, strtotime($matches[3].'-'.$matches[1].'-'.$matches[2])); + } + + // Any other kind of string, when converted into UNIX time, + // produces "0 seconds after epoc..." is probably bad... + // return "Invalid Date". + if (date('U', strtotime($bad_date)) === '0') + { + return 'Invalid Date'; + } + + // It's probably a valid-ish date format already + return date($format, strtotime($bad_date)); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('timezone_menu')) +{ + /** + * Timezone Menu + * + * Generates a drop-down menu of timezones. + * + * @param string timezone + * @param string classname + * @param string menu name + * @param mixed attributes + * @return string + */ + function timezone_menu($default = 'UTC', $class = '', $name = 'timezones', $attributes = '') + { + $CI =& get_instance(); + $CI->lang->load('date'); + + $default = ($default === 'GMT') ? 'UTC' : $default; + + $menu = ''; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('timezones')) +{ + /** + * Timezones + * + * Returns an array of timezones. This is a helper function + * for various other ones in this library + * + * @param string timezone + * @return string + */ + function timezones($tz = '') + { + // Note: Don't change the order of these even though + // some items appear to be in the wrong order + + $zones = array( + 'UM12' => -12, + 'UM11' => -11, + 'UM10' => -10, + 'UM95' => -9.5, + 'UM9' => -9, + 'UM8' => -8, + 'UM7' => -7, + 'UM6' => -6, + 'UM5' => -5, + 'UM45' => -4.5, + 'UM4' => -4, + 'UM35' => -3.5, + 'UM3' => -3, + 'UM2' => -2, + 'UM1' => -1, + 'UTC' => 0, + 'UP1' => +1, + 'UP2' => +2, + 'UP3' => +3, + 'UP35' => +3.5, + 'UP4' => +4, + 'UP45' => +4.5, + 'UP5' => +5, + 'UP55' => +5.5, + 'UP575' => +5.75, + 'UP6' => +6, + 'UP65' => +6.5, + 'UP7' => +7, + 'UP8' => +8, + 'UP875' => +8.75, + 'UP9' => +9, + 'UP95' => +9.5, + 'UP10' => +10, + 'UP105' => +10.5, + 'UP11' => +11, + 'UP115' => +11.5, + 'UP12' => +12, + 'UP1275' => +12.75, + 'UP13' => +13, + 'UP14' => +14 + ); + + if ($tz === '') + { + return $zones; + } + + return isset($zones[$tz]) ? $zones[$tz] : 0; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('date_range')) +{ + /** + * Date range + * + * Returns a list of dates within a specified period. + * + * @param int unix_start UNIX timestamp of period start date + * @param int unix_end|days UNIX timestamp of period end date + * or interval in days. + * @param mixed is_unix Specifies whether the second parameter + * is a UNIX timestamp or a day interval + * - TRUE or 'unix' for a timestamp + * - FALSE or 'days' for an interval + * @param string date_format Output date format, same as in date() + * @return array + */ + function date_range($unix_start = '', $mixed = '', $is_unix = TRUE, $format = 'Y-m-d') + { + if ($unix_start == '' OR $mixed == '' OR $format == '') + { + return FALSE; + } + + $is_unix = ! ( ! $is_unix OR $is_unix === 'days'); + + // Validate input and try strtotime() on invalid timestamps/intervals, just in case + if ( ( ! ctype_digit((string) $unix_start) && ($unix_start = @strtotime($unix_start)) === FALSE) + OR ( ! ctype_digit((string) $mixed) && ($is_unix === FALSE OR ($mixed = @strtotime($mixed)) === FALSE)) + OR ($is_unix === TRUE && $mixed < $unix_start)) + { + return FALSE; + } + + if ($is_unix && ($unix_start == $mixed OR date($format, $unix_start) === date($format, $mixed))) + { + return array(date($format, $unix_start)); + } + + $range = array(); + + /* NOTE: Even though the DateTime object has many useful features, it appears that + * it doesn't always handle properly timezones, when timestamps are passed + * directly to its constructor. Neither of the following gave proper results: + * + * new DateTime('') + * new DateTime('', '') + * + * --- available in PHP 5.3: + * + * DateTime::createFromFormat('', '') + * DateTime::createFromFormat('', '', 'setTimestamp($unix_start); + if ($is_unix) + { + $arg = new DateTime(); + $arg->setTimestamp($mixed); + } + else + { + $arg = (int) $mixed; + } + + $period = new DatePeriod($from, new DateInterval('P1D'), $arg); + foreach ($period as $date) + { + $range[] = $date->format($format); + } + + /* If a period end date was passed to the DatePeriod constructor, it might not + * be in our results. Not sure if this is a bug or it's just possible because + * the end date might actually be less than 24 hours away from the previously + * generated DateTime object, but either way - we have to append it manually. + */ + if ( ! is_int($arg) && $range[count($range) - 1] !== $arg->format($format)) + { + $range[] = $arg->format($format); + } + + return $range; + } + + $from->setDate(date('Y', $unix_start), date('n', $unix_start), date('j', $unix_start)); + $from->setTime(date('G', $unix_start), date('i', $unix_start), date('s', $unix_start)); + if ($is_unix) + { + $arg = new DateTime(); + $arg->setDate(date('Y', $mixed), date('n', $mixed), date('j', $mixed)); + $arg->setTime(date('G', $mixed), date('i', $mixed), date('s', $mixed)); + } + else + { + $arg = (int) $mixed; + } + $range[] = $from->format($format); + + if (is_int($arg)) // Day intervals + { + do + { + $from->modify('+1 day'); + $range[] = $from->format($format); + } + while (--$arg > 0); + } + else // end date UNIX timestamp + { + for ($from->modify('+1 day'), $end_check = $arg->format('Ymd'); $from->format('Ymd') < $end_check; $from->modify('+1 day')) + { + $range[] = $from->format($format); + } + + // Our loop only appended dates prior to our end date + $range[] = $arg->format($format); + } + + return $range; + } +} diff --git a/system/helpers/directory_helper.php b/system/helpers/directory_helper.php new file mode 100644 index 0000000..cdc4c16 --- /dev/null +++ b/system/helpers/directory_helper.php @@ -0,0 +1,101 @@ + 0) && is_dir($source_dir.$file)) + { + $filedata[$file] = directory_map($source_dir.$file, $new_depth, $hidden); + } + else + { + $filedata[] = $file; + } + } + + closedir($fp); + return $filedata; + } + + return FALSE; + } +} diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php new file mode 100644 index 0000000..a6463df --- /dev/null +++ b/system/helpers/download_helper.php @@ -0,0 +1,158 @@ + 0) + ? @rmdir($path) + : TRUE; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('get_filenames')) +{ + /** + * Get Filenames + * + * Reads the specified directory and builds an array containing the filenames. + * Any sub-folders contained within the specified path are read as well. + * + * @param string path to source + * @param bool whether to include the path as part of the filename + * @param bool internal variable to determine recursion status - do not use in calls + * @return array + */ + function get_filenames($source_dir, $include_path = FALSE, $_recursion = FALSE) + { + static $_filedata = array(); + + if ($fp = @opendir($source_dir)) + { + // reset the array and make sure $source_dir has a trailing slash on the initial call + if ($_recursion === FALSE) + { + $_filedata = array(); + $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; + } + + while (FALSE !== ($file = readdir($fp))) + { + if (is_dir($source_dir.$file) && $file[0] !== '.') + { + get_filenames($source_dir.$file.DIRECTORY_SEPARATOR, $include_path, TRUE); + } + elseif ($file[0] !== '.') + { + $_filedata[] = ($include_path === TRUE) ? $source_dir.$file : $file; + } + } + + closedir($fp); + return $_filedata; + } + + return FALSE; + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('get_dir_file_info')) +{ + /** + * Get Directory File Information + * + * Reads the specified directory and builds an array containing the filenames, + * filesize, dates, and permissions + * + * Any sub-folders contained within the specified path are read as well. + * + * @param string path to source + * @param bool Look only at the top level directory specified? + * @param bool internal variable to determine recursion status - do not use in calls + * @return array + */ + function get_dir_file_info($source_dir, $top_level_only = TRUE, $_recursion = FALSE) + { + static $_filedata = array(); + $relative_path = $source_dir; + + if ($fp = @opendir($source_dir)) + { + // reset the array and make sure $source_dir has a trailing slash on the initial call + if ($_recursion === FALSE) + { + $_filedata = array(); + $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; + } + + // Used to be foreach (scandir($source_dir, 1) as $file), but scandir() is simply not as fast + while (FALSE !== ($file = readdir($fp))) + { + if (is_dir($source_dir.$file) && $file[0] !== '.' && $top_level_only === FALSE) + { + get_dir_file_info($source_dir.$file.DIRECTORY_SEPARATOR, $top_level_only, TRUE); + } + elseif ($file[0] !== '.') + { + $_filedata[$file] = get_file_info($source_dir.$file); + $_filedata[$file]['relative_path'] = $relative_path; + } + } + + closedir($fp); + return $_filedata; + } + + return FALSE; + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('get_file_info')) +{ + /** + * Get File Info + * + * Given a file and path, returns the name, path, size, date modified + * Second parameter allows you to explicitly declare what information you want returned + * Options are: name, server_path, size, date, readable, writable, executable, fileperms + * Returns FALSE if the file cannot be found. + * + * @param string path to file + * @param mixed array or comma separated string of information returned + * @return array + */ + function get_file_info($file, $returned_values = array('name', 'server_path', 'size', 'date')) + { + if ( ! file_exists($file)) + { + return FALSE; + } + + if (is_string($returned_values)) + { + $returned_values = explode(',', $returned_values); + } + + foreach ($returned_values as $key) + { + switch ($key) + { + case 'name': + $fileinfo['name'] = basename($file); + break; + case 'server_path': + $fileinfo['server_path'] = $file; + break; + case 'size': + $fileinfo['size'] = filesize($file); + break; + case 'date': + $fileinfo['date'] = filemtime($file); + break; + case 'readable': + $fileinfo['readable'] = is_readable($file); + break; + case 'writable': + $fileinfo['writable'] = is_really_writable($file); + break; + case 'executable': + $fileinfo['executable'] = is_executable($file); + break; + case 'fileperms': + $fileinfo['fileperms'] = fileperms($file); + break; + } + } + + return $fileinfo; + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('get_mime_by_extension')) +{ + /** + * Get Mime by Extension + * + * Translates a file extension into a mime type based on config/mimes.php. + * Returns FALSE if it can't determine the type, or open the mime config file + * + * Note: this is NOT an accurate way of determining file mime types, and is here strictly as a convenience + * It should NOT be trusted, and should certainly NOT be used for security + * + * @param string $filename File name + * @return string + */ + function get_mime_by_extension($filename) + { + static $mimes; + + if ( ! is_array($mimes)) + { + $mimes = get_mimes(); + + if (empty($mimes)) + { + return FALSE; + } + } + + $extension = strtolower(substr(strrchr($filename, '.'), 1)); + + if (isset($mimes[$extension])) + { + return is_array($mimes[$extension]) + ? current($mimes[$extension]) // Multiple mime types, just give the first one + : $mimes[$extension]; + } + + return FALSE; + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('symbolic_permissions')) +{ + /** + * Symbolic Permissions + * + * Takes a numeric value representing a file's permissions and returns + * standard symbolic notation representing that value + * + * @param int $perms Permissions + * @return string + */ + function symbolic_permissions($perms) + { + if (($perms & 0xC000) === 0xC000) + { + $symbolic = 's'; // Socket + } + elseif (($perms & 0xA000) === 0xA000) + { + $symbolic = 'l'; // Symbolic Link + } + elseif (($perms & 0x8000) === 0x8000) + { + $symbolic = '-'; // Regular + } + elseif (($perms & 0x6000) === 0x6000) + { + $symbolic = 'b'; // Block special + } + elseif (($perms & 0x4000) === 0x4000) + { + $symbolic = 'd'; // Directory + } + elseif (($perms & 0x2000) === 0x2000) + { + $symbolic = 'c'; // Character special + } + elseif (($perms & 0x1000) === 0x1000) + { + $symbolic = 'p'; // FIFO pipe + } + else + { + $symbolic = 'u'; // Unknown + } + + // Owner + $symbolic .= (($perms & 0x0100) ? 'r' : '-') + .(($perms & 0x0080) ? 'w' : '-') + .(($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-')); + + // Group + $symbolic .= (($perms & 0x0020) ? 'r' : '-') + .(($perms & 0x0010) ? 'w' : '-') + .(($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-')); + + // World + $symbolic .= (($perms & 0x0004) ? 'r' : '-') + .(($perms & 0x0002) ? 'w' : '-') + .(($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-')); + + return $symbolic; + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('octal_permissions')) +{ + /** + * Octal Permissions + * + * Takes a numeric value representing a file's permissions and returns + * a three character string representing the file's octal permissions + * + * @param int $perms Permissions + * @return string + */ + function octal_permissions($perms) + { + return substr(sprintf('%o', $perms), -3); + } +} diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php new file mode 100644 index 0000000..3e10395 --- /dev/null +++ b/system/helpers/form_helper.php @@ -0,0 +1,1032 @@ +config->site_url($CI->uri->uri_string()); + } + // If an action is not a full URL then turn it into one + elseif (strpos($action, '://') === FALSE) + { + $action = $CI->config->site_url($action); + } + + $attributes = _attributes_to_string($attributes); + + if (stripos($attributes, 'method=') === FALSE) + { + $attributes .= ' method="post"'; + } + + if (stripos($attributes, 'accept-charset=') === FALSE) + { + $attributes .= ' accept-charset="'.strtolower(config_item('charset')).'"'; + } + + $form = '
                      \n"; + + // Add CSRF field if enabled, but leave it out for GET requests and requests to external websites + if ($CI->config->item('csrf_protection') === TRUE && strpos($action, $CI->config->base_url()) !== FALSE && ! stripos($form, 'method="get"')) + { + $hidden[$CI->security->get_csrf_token_name()] = $CI->security->get_csrf_hash(); + } + + if (is_array($hidden)) + { + foreach ($hidden as $name => $value) + { + $form .= ''."\n"; + } + } + + return $form; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_open_multipart')) +{ + /** + * Form Declaration - Multipart type + * + * Creates the opening portion of the form, but with "multipart/form-data". + * + * @param string the URI segments of the form destination + * @param array a key/value pair of attributes + * @param array a key/value pair hidden data + * @return string + */ + function form_open_multipart($action = '', $attributes = array(), $hidden = array()) + { + if (is_string($attributes)) + { + $attributes .= ' enctype="multipart/form-data"'; + } + else + { + $attributes['enctype'] = 'multipart/form-data'; + } + + return form_open($action, $attributes, $hidden); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_hidden')) +{ + /** + * Hidden Input Field + * + * Generates hidden fields. You can pass a simple key/value string or + * an associative array with multiple values. + * + * @param mixed $name Field name + * @param string $value Field value + * @param bool $recursing + * @return string + */ + function form_hidden($name, $value = '', $recursing = FALSE) + { + static $form; + + if ($recursing === FALSE) + { + $form = "\n"; + } + + if (is_array($name)) + { + foreach ($name as $key => $val) + { + form_hidden($key, $val, TRUE); + } + + return $form; + } + + if ( ! is_array($value)) + { + $form .= '\n"; + } + else + { + foreach ($value as $k => $v) + { + $k = is_int($k) ? '' : $k; + form_hidden($name.'['.$k.']', $v, TRUE); + } + } + + return $form; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_input')) +{ + /** + * Text Input Field + * + * @param mixed + * @param string + * @param mixed + * @return string + */ + function form_input($data = '', $value = '', $extra = '') + { + $defaults = array( + 'type' => 'text', + 'name' => is_array($data) ? '' : $data, + 'value' => $value + ); + + return '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_password')) +{ + /** + * Password Field + * + * Identical to the input function but adds the "password" type + * + * @param mixed + * @param string + * @param mixed + * @return string + */ + function form_password($data = '', $value = '', $extra = '') + { + is_array($data) OR $data = array('name' => $data); + $data['type'] = 'password'; + return form_input($data, $value, $extra); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_upload')) +{ + /** + * Upload Field + * + * Identical to the input function but adds the "file" type + * + * @param mixed + * @param string + * @param mixed + * @return string + */ + function form_upload($data = '', $value = '', $extra = '') + { + $defaults = array('type' => 'file', 'name' => ''); + is_array($data) OR $data = array('name' => $data); + $data['type'] = 'file'; + + return '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_textarea')) +{ + /** + * Textarea field + * + * @param mixed $data + * @param string $value + * @param mixed $extra + * @return string + */ + function form_textarea($data = '', $value = '', $extra = '') + { + $defaults = array( + 'name' => is_array($data) ? '' : $data, + 'cols' => '40', + 'rows' => '10' + ); + + if ( ! is_array($data) OR ! isset($data['value'])) + { + $val = $value; + } + else + { + $val = $data['value']; + unset($data['value']); // textareas don't use the value attribute + } + + return '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_multiselect')) +{ + /** + * Multi-select menu + * + * @param string + * @param array + * @param mixed + * @param mixed + * @return string + */ + function form_multiselect($name = '', $options = array(), $selected = array(), $extra = '') + { + $extra = _attributes_to_string($extra); + if (stripos($extra, 'multiple') === FALSE) + { + $extra .= ' multiple="multiple"'; + } + + return form_dropdown($name, $options, $selected, $extra); + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('form_dropdown')) +{ + /** + * Drop-down Menu + * + * @param mixed $data + * @param mixed $options + * @param mixed $selected + * @param mixed $extra + * @return string + */ + function form_dropdown($data = '', $options = array(), $selected = array(), $extra = '') + { + $defaults = array(); + + if (is_array($data)) + { + if (isset($data['selected'])) + { + $selected = $data['selected']; + unset($data['selected']); // select tags don't have a selected attribute + } + + if (isset($data['options'])) + { + $options = $data['options']; + unset($data['options']); // select tags don't use an options attribute + } + } + else + { + $defaults = array('name' => $data); + } + + is_array($selected) OR $selected = array($selected); + is_array($options) OR $options = array($options); + + // If no selected state was submitted we will attempt to set it automatically + if (empty($selected)) + { + if (is_array($data)) + { + if (isset($data['name'], $_POST[$data['name']])) + { + $selected = array($_POST[$data['name']]); + } + } + elseif (isset($_POST[$data])) + { + $selected = array($_POST[$data]); + } + } + + $extra = _attributes_to_string($extra); + + $multiple = (count($selected) > 1 && stripos($extra, 'multiple') === FALSE) ? ' multiple="multiple"' : ''; + + $form = '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_checkbox')) +{ + /** + * Checkbox Field + * + * @param mixed + * @param string + * @param bool + * @param mixed + * @return string + */ + function form_checkbox($data = '', $value = '', $checked = FALSE, $extra = '') + { + $defaults = array('type' => 'checkbox', 'name' => ( ! is_array($data) ? $data : ''), 'value' => $value); + + if (is_array($data) && array_key_exists('checked', $data)) + { + $checked = $data['checked']; + + if ($checked == FALSE) + { + unset($data['checked']); + } + else + { + $data['checked'] = 'checked'; + } + } + + if ($checked == TRUE) + { + $defaults['checked'] = 'checked'; + } + else + { + unset($defaults['checked']); + } + + return '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_radio')) +{ + /** + * Radio Button + * + * @param mixed + * @param string + * @param bool + * @param mixed + * @return string + */ + function form_radio($data = '', $value = '', $checked = FALSE, $extra = '') + { + is_array($data) OR $data = array('name' => $data); + $data['type'] = 'radio'; + + return form_checkbox($data, $value, $checked, $extra); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_submit')) +{ + /** + * Submit Button + * + * @param mixed + * @param string + * @param mixed + * @return string + */ + function form_submit($data = '', $value = '', $extra = '') + { + $defaults = array( + 'type' => 'submit', + 'name' => is_array($data) ? '' : $data, + 'value' => $value + ); + + return '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_reset')) +{ + /** + * Reset Button + * + * @param mixed + * @param string + * @param mixed + * @return string + */ + function form_reset($data = '', $value = '', $extra = '') + { + $defaults = array( + 'type' => 'reset', + 'name' => is_array($data) ? '' : $data, + 'value' => $value + ); + + return '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_button')) +{ + /** + * Form Button + * + * @param mixed + * @param string + * @param mixed + * @return string + */ + function form_button($data = '', $content = '', $extra = '') + { + $defaults = array( + 'name' => is_array($data) ? '' : $data, + 'type' => 'button' + ); + + if (is_array($data) && isset($data['content'])) + { + $content = $data['content']; + unset($data['content']); // content is not an attribute + } + + return '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_label')) +{ + /** + * Form Label Tag + * + * @param string The text to appear onscreen + * @param string The id the label applies to + * @param string Additional attributes + * @return string + */ + function form_label($label_text = '', $id = '', $attributes = array()) + { + + $label = ' 0) + { + foreach ($attributes as $key => $val) + { + $label .= ' '.$key.'="'.$val.'"'; + } + } + + return $label.'>'.$label_text.''; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_fieldset')) +{ + /** + * Fieldset Tag + * + * Used to produce
                      text. To close fieldset + * use form_fieldset_close() + * + * @param string The legend text + * @param array Additional attributes + * @return string + */ + function form_fieldset($legend_text = '', $attributes = array()) + { + $fieldset = '\n"; + if ($legend_text !== '') + { + return $fieldset.''.$legend_text."\n"; + } + + return $fieldset; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_fieldset_close')) +{ + /** + * Fieldset Close Tag + * + * @param string + * @return string + */ + function form_fieldset_close($extra = '') + { + return '
                      '.$extra; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_close')) +{ + /** + * Form Close Tag + * + * @param string + * @return string + */ + function form_close($extra = '') + { + return ''.$extra; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_prep')) +{ + /** + * Form Prep + * + * Formats text so that it can be safely placed in a form field in the event it has HTML tags. + * + * @deprecated 3.0.0 An alias for html_escape() + * @param string|string[] $str Value to escape + * @return string|string[] Escaped values + */ + function form_prep($str) + { + return html_escape($str, TRUE); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('set_value')) +{ + /** + * Form Value + * + * Grabs a value from the POST array for the specified field so you can + * re-populate an input field or textarea. If Form Validation + * is active it retrieves the info from the validation class + * + * @param string $field Field name + * @param string $default Default value + * @param bool $html_escape Whether to escape HTML special characters or not + * @return string + */ + function set_value($field, $default = '', $html_escape = TRUE) + { + $CI =& get_instance(); + + $value = (isset($CI->form_validation) && is_object($CI->form_validation) && $CI->form_validation->has_rule($field)) + ? $CI->form_validation->set_value($field, $default) + : $CI->input->post($field, FALSE); + + isset($value) OR $value = $default; + return ($html_escape) ? html_escape($value) : $value; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('set_select')) +{ + /** + * Set Select + * + * Let's you set the selected value of a