From: will Date: Thu, 16 Nov 2023 23:08:18 +0000 (-0600) Subject: Initial commit X-Git-Url: https://lifelog.hopto.org/gitweb/?a=commitdiff_plain;h=5bf09189bfa675fd553d5f3bbee9b552fb229d9d;p=LifeLog.git Initial commit --- 5bf09189bfa675fd553d5f3bbee9b552fb229d9d diff --git a/CNF_Specs.md b/CNF_Specs.md new file mode 100644 index 0000000..d86aa10 --- /dev/null +++ b/CNF_Specs.md @@ -0,0 +1,278 @@ +# Configuration Network File Format Specifications + + +## Introduction + +This is a simple and fast file format. That allows setting up of network applications with initial configuration values. +These are usually standard, property and value pairs. Containing possible also SQL database structures statements with basic data. +It is designed to accommodate a parser to read and provide for CNF property tags. These can be of three types, using all a textual similar presentation. +In general are recognised as constants, anons or sqlites. + +Operating system environmental settings or variables are considered only as the last resort to provide for a value. +This is however to be avoided as it hides the attention and expectation for a setting. + +With this type of an application configuration system. Global settings can also be individual scripted with an meaningful description. +Which is pretty much welcomed and encouraged. + +## General CNF Formatting Rules + +1. Text that isn't CNF tagged is ignored in the file and can be used as comments. +2. CNF tag begins with an **<<** or **<<<** and ends with an **>>>** or **>>**. +3. If instruction is contained the tag begins with **<<** and ends with a **>>**. +4. Multi line values are tag ended on a separate line with an **>>>**. +5. CNF tag value can post processed by placing macros making it a template. +6. Standard markup of a macro is to enclose the property name or number with a triple dollar signifier **\$\$\$**{macro}**\$\$\$**. + 1. Presedence of resloving the property name/value is by first passed macros, then config anons and finally the looking up constances. + 2. Nested macros resolving from linked in other properties is currently not supported. +7. CNF instructions and constants are uppercase. + 1. Example 1 format with instruction: ```<<>>``` autonoumus const, with inner properties. + 2. Example 2 format with instruction: ```<<{$sig}{NAME}>>``` A single const property with a multi line value. + 3. Example 3 format with instruction: ```<>>``` A single const property with a multi line value. + 4. Example 4 format with instruction: ```<<{NAME}<{INSTRUCTION}<{value}>>>``` A anon. + 5. Example 5 format with instruction: ```<<{$sig}{NAME}<{INSTRUCTION}\n{value}\n>>>```. + +8. CNF instructions are all uppercase and unique, to the processor. +9. A CNF constant in its property name is prefixed with an '**$**' signifier. +10. Constants are usually scripted at the beginning of the file, or parsed first in a separate file. +11. The instruction processor can use them if signifier $ surrounds the constant name. Therefore, replacing it with the constants value if further found in the file. + +```HTML + <<>> + <>> + ``` + +12. Property names, Constant, Anon refer to the programmatically assinged variable name. +13. CNF Constant values are store specific. +14. Constants can't be changed for the life of the application or service issued. +15. Storage of CNF constants declared can be preceded to the file based one. +16. i.e. If stored in a database or on a network node. After the file declaration fact. +17. Missing file based storage settings can be next queried from the environmental one. + 1. This is to be avoided if possible. +18. File storage encountered constants override system environmental ones. + 1. i.e. System administrator has set them. +19. Database storage encountered constants override file set ones. + 1. i.e. User of application has set them. +20. CNF Constant values can be changed in the script file. + 1. If not present in script file, then an application setting must procede with its default. + 2. CNF Constants can be declared only once during initial parsing of script files. + 3. Rule of thumb is that Constants are synchonized with an applications release version. + 4. Static constants, are script or code only assigned values. + 5. CNF Anons can overide in contrast previously assigned value. +21. A CNF Anon is similar to constants but a more simpler property and value only pair. + 1. Anons are so called because they are unknown or unexpected by the configuration framework, store to object intermidiate. + 2. Constants that turn up in the anon list, are a good indicator that they are not handled from script. Forgotten become anons. + 3. Anons similar to constants, once in the database, overtake the scripted or application default settings value. + 4. Static anons, are those that are set in the database, and/or are not merged with application defaults. + 5. Anons hashed are programatically accessed separately to constants. + 1. It is fine to have several different applications, to share same storage, even if they have different implementation. + 2. Contants will be specific to application, while anons can change in different purpose script files. +22. Anon is not instruction processed. Hence anonymous in nature for its value. +23. Anon has no signifier, and doesn't need to have an application default. +24. Anon value is global to the application and its value can be modified. + + ```HTML + <>> + <>> + ``` + 1. Anon value can be scripted to contain template like but numbered parameters. + 2. When querying for an anon value, replacement parameter array can be passed. + 3. Numbering is from **\$\$\$1\$\$\$**..**$$$(n...)\$\$\$** to be part of its value. Strategically placed. + + ```HTML + <>> + ``` + ```PERL + # Perl language + my $url = $cnf->anon('GET_SUB_URL',('tech','main.cgi')); + # $url now should be: https://www.tech.acme.com/main.cgi + eval ($url =~ m/https:\.*/) + or warn "Failed to obtain expected URL when querying anon -> GET_SUB_URL" + ``` + +## CNF Tag Formats + +### Property Value Tag + + ```HTML + <<{name}<{value}>>> + ``` + +### Instruction Value Tag + + ```HTML + <<<{INSTRUCTION} + {value\n...valuen\n}>>> + ``` + +### Full Tag + + ```javascript + <<{$sig}{name}<{INSTRUCTION} + {value\n...value\n} + >>> + ``` + +**Examples:** + + ```HTML + <<$HELP> + <<> + <> + ``` + +## Database and SQL Instruction Formatting + +(Note - this documentation section not complete, as of 2020-02-14) + +### About + +CNF supports basic SQL Database structure statement generation. This is done via instruction based CNF tags. Named **sqlites**. + +1. Supported is table, view, index and data creation statements. +2. Database statements are generic text, that is not further processed. +3. There is limited database interaction, handling or processing to be provided. + 1. Mainly for storage transfer of CNF constants, from file to database. + 2. File changes precede database storage only in newly assigned constants. +4. Database generated is expected to have a system SYS_CNF_CONFIG table, containing the constants unique name value pairs, with optional description for each. + 1. This is a reserved table and name. + 2. This table must contain a **$RELEASE_VER** constants record at least. + +### SQLite Formatting + +* SQLites have the following reserved instructions: +1. TABLE + + ```HTML + <>> + ``` +2. INDEX + + ```HTML + <>> + ``` +3. SQL + 1. SQL statements are actual full SQL placed in the tag body value. + + ```HTML + <VIEW + CREATE VIEW VW_ALIASES AS SELECT ID,ALIAS ORDER BY ALIAS; + >>> + ``` + +4. DATA + 1. Data rows are ended with the **~** delimiter. In the tag body. + 2. Data columns are delimited with the invert quote **`** (back tick) within a row. + 3. These should appear as last in the config file as they are translated into insert statements. + 4. First column is taken as the unique and record identity column (UID). + 5. Data is to be updated in storage if any column other than the UID, has its contents changed in the file. + 1. This behaviour can be controlled by disabling something like an auto file storage update. i.e. during application upgrades. To prevent user set settings to reset to factory defaults. + 2. The result would then be that database already stored data remains, and only new ones are added. This exercise is out of scope of this specification. + + ```HTML + <> + ``` + +1. FILE + 1. Expects a file name assigned value, file containing actual further CNF DATA rows instructions, separately. + 2. The file is expected to be located next to the main config file. + 3. File is to be sequentially buffer read and processed instead as a whole in one go. + 4. The same principles apply in the file as to the DATA instruction CNF tag format, expected to be contained in it. + + ```HTML + < + ``` + +2. MIGRATE + 1. Migration are brute sql statements to be run based on currently installed previous version of the SQL database. + 2. Migration is to be run from version upwards as stated and in the previous database encountered. + 1. i.e. If encountered old v.1.5, it will be upgraded to v.1.6 first, then v.1.7... + 3. Migration is not run on newly created databases. These create the expected latest data structure. + 4. SQL Statements a separated by ';' terminator. To be executed one by one. + + ```HTML + <<1.6> + <<1.8> + ``` + +## Sample Perl Language Usage + +**~/my_application.pl** file contents: +```PERL + +use lib "system/modules"; +use lib $ENV{'PWD'}.'/perl_dev/WB_CNF/system/modules'; +require CNFParser; +require Settings; + +my @expected = ("$MY_APP_LIB_RELATIVE", "$MY_APP_DB_RELATIVE"); +my $path = $ENV{'PWD'}."/perl_dev/WB_CNF/db/configuration.cnf"; +# Loading twice config here with object constructor with and without path. +# To show dual purpose use. +my $cnf1 = CNFParser->new($path); +# Nothing parsed yet construct. +my $cnf2 = CNFParser->new(); + # We relay that the OS environment has been set for CNF constant settings if missing + # in the configuration file. Adding after parse has no effect if found in file. + $cnf2 -> addENVList(@expected); + # Parse finally now. Parse can be called on multiple different files, if desired. + $cnf2 -> parse($path); +my $LIB_PATH; + +print "List of constants in file: $path\n"; +foreach my $prp ($cnf->constants()){ + print "$prp=", $cnf->constant($prp),"\n"; +} +if(!$cnf->constant('$MY_APP_LIB_RELATIVE')){ + warn 'Missing $MY_APP_LIB_RELATIVE setting.'; + $LIB_PATH = $cnf2->constant('$MY_APP_LIB_RELATIVE'); + die 'Unable to get required $MY_APP_LIB_RELATIVE setting!' if(not $LIB_PATH) +} + +print "Welcome to ", $cnf->constant('$APP_NAME'), " version ", $cnf->constant('$RELEASE_VER'), ".\n"; + +``` +**~//perl_dev/WB_CNF/db/configuration.cnf** file contents: +```HTML +# List command anon with the name of 'list'. +<ls -lh dev|sort> +<<>> + +``` + +*** + + Document is from project -> + + An open source application. + +
Moon Stage - v.1.1 2020
+ diff --git a/Current Development Check List.md b/Current Development Check List.md new file mode 100644 index 0000000..1224cac --- /dev/null +++ b/Current Development Check List.md @@ -0,0 +1,342 @@ +# Branch Development Life Log in Perl + +*This page lists current development and issues being worked on in the LifeLog app.* + +## Life Log Application Development + +### New Development v.2.3+ + +* [ ] Backup options revisited/retested. +* [ ] Categories display and intereaction to be bettered. +* [ ] Bug 37 Keywords only search not wotking on detecting very old items. +* [x] Fix uninitialized $scalars and warnings. My style of programming uses this as a perl feature, as unutilized is also null or empty. Linter disagrees with that. Empty or null isn't also 0 for it. Null, empty, undef, and zero should be the same thing in scalar context and logic. +* [ ] Stats and config page should check github for latest version, as background pull. +* [ ] Implement template based CGI processing (slower but better separation of concerns). + * This separation of concern currently not really necessary as at the main.cgi is the whole file, that also incorporates buffering and complex database rendering. Thereby a slight performance penalty would be having to read and process also an template. Buffering is also directly compressed to client. Giving fast pages that some webservers might not have inbuilt or provide (rare). We will see. Templates are good, as the page layout is easier to change and rearrange. +* [ ] Module installation script should check, on main.cnf and on perl soundness and compatibility. + * Should check and display autonomes that contain expected defaults changed or disabled in configuration. i.e AUTO_LOGIN or DBI_MULTI_USER_DB + * A trouble_shoot_configuration.pl should be available to perform this, and be independently available from the main directory. +* [ ] Process actions. + * Configured in main.cnf, to import perl action to execute, in parallel of returning pages. + * Action programable are on login, logout, row. + * Where the row action processed is pushed back to browser on each main.cgi page call, logout action is pushed back to login_ctr.cgi page. + + ```html + # Separate process actions to execute in parallel. + <actions/reminders.pl>> + <actions/log.pl>> + <actions/log.pl>> + ``` + +* [ ] Search panel revisited. + * [ ] Search and previous view setup made fully session persisted. + * [ ] Provide button reset search. + * [x] Some longer keywords, even repeating from log to log, don't show in autocomplete. +* [x] Sums and dynamic calculations, interactions further to be refined. + * Canceling submit, leaves the translated '**\n**' for transfer not reverted. +* [x] Setting should provide page color defaults in form of an hash. + * These should/can change based on selected theme. That possibly in future can be changed via config. + * colBG,colFG, colSHDW, etc... +* [x] Printout page to include Amount column if category of items has valued asset, expense or income set. Providing also totals. Of Assets, and total on income and expense. + * Introduce Currency setting, to replace amount '#'. Even though it could be number of, something not currency related. +* [x] Interaction - When editing an existing log entry, it needs confirmation, if it isn't a copy (now button wasn't pressed), before overwriting. + * i.e, Warning! - Existing entry has been changed, are you sure do you want to overwrite it? +* [x] Configuration needs to be updated, to use CNF 2.2, for system reset, etc. + * Config file "Data Fix* reset of settings updated to properly revert to factory defaults. + * We need to also display stats for log file of the web server. + * Maybe provide an rotational purge on config page access. i.e. if line count is over 1000, purge to tail -n 1000. + * This sure an config file setting. i.e. <<1000>>> +* [x] Backup/Restore made various db engine aware and compatible. As the data is the same. + * The data is the same, Structure, binary data and password handling is different, engine dependant. +* [x] Fix themes. Themes don't display and set consistently the pages throughout. + * Login page should use standard default or last set theme. + * All provided themes to have background image. + * Stats page needs, new layout. +* [x] Add AUTO_LOGOFF setting. Default is no. + * On session expired makes the page semi usable and still visible. +* [x] RTF load of the zero document if present. When RTF attaching to a new log, you can save the rtf, + it is called a zero document (not assigned), as the log hasn't been saved yet. This reload can be useful, as it is always stored... +* [x] Implement backup/restore on Pg based data. Restore only partially works from older backup. +* ✔ Bug 35. SQL migration, version update, not working for PG based databases. +* ✔ JS - Event, on expense sum in log numbers found at beginning of lines. +* ✔ Update to CNF v.2.2, branch to $RELEASE_VER = 2.3, Earth Stage initial. + +#### Not Urgent New Development ( In Planning/Suggestions ) + +* Plugins + * Perl files enabled by being including them in main.cnf file under the <>> list, and placed in the plugins directory. + * This plugin perl file is then be executed, to provide auto installation and checks. + * The plugins are further stored and made available to the system via database settings and dynamics. + * Removed entry in config file, will also start the process of removing it from the database settings. +* Config file custom SQL tables. +* Bank Statements Page + * Import/Display by Account + * CSV Format, stored in separate table. + * BANK_ACCOUNT = ID, BANK, ACC_NAME(16), ACC_NUMBER(20) + * BANK_TRANSACTIONS = ACC_ID, DATE, AMOUNT, DETAILS(64) +* Email selected log entries. + * Sendmail must be working, and configuration file has an jason property <>>. + * Selection on foot might need an menu instead of buttons. + + ``` JSON + <>> + ``` + +* Migration from SQLite to Server SQL script provided. + * This one will use the new config settings in main.cnf to migrate log data from and SQLite local db file. +* Global view overrides. These get generated in the db if set on logon. And used instead of the normal view. +* Overrides must always show todays log entries, regardless of criteria. +* VIEW_OVERRIDE_SYSLOGS={0/1}, anon if set 1-true, will hide older than today system logs. Doesn't affect category and keywords searches/views. +* VIEW_OVERRIDE_WHERE={""/{your where clause}}, allows your own WHERE override. Doesn't affect category and keywords searches/views. + * i.e. <>>, will show only these type of log entries. + * i.e. < DATE('now','start of month', '-2 month')">>>, will show only logs from current last two months. + * i.e. <>>, same as setting <>>. +* Page section plugins. + * Appears and is rendered in page section, via dynamic loading, json rendered html, server side in real time. + * Configured in main.cnf. + * Accessed via side menu to appear. + * Default is to link to documentation, and about page. + * Plugin behavior is to be invoked in real time on demand, utilizing in most complex scenario JSON as medium. + * i.e. News or service feed, special view, file interaction. + +### v.2.2 SUN STABLE + +* Search keep in session should preserve and always set options as selection till it is ticked. + * Reset Whole View to page view, should still set the search option till it is ticked. + * Unticking Keep in Session should be honored on next browsing. + * Keyword should be stripped from, punctuations. +* Deleting multiple items, RTF, should mark for vacuum on next logout. +* Order by Categories added to search/view. +* Search on multiple words should rank by encounter of words specified and display first. (That one is difficult) +* Auto collapse/expand on multi line logs by 0-none as default. Setting to 1 or more shows only that number of lines. (That one is difficult) +* ✔ Send to system log, password change, backup issued, main.inf page view changes. +* ✔ Command line logging, server side. i.e. LifeLog/log.pl -database {name} {-alias} {-password:} + * Update CNFParser v.2.0. +* ✔ Bug 34 - DB fix in config, removes associated RTF documents to logs, for some reason. +* ✔ Page categories exclusion option in main.cnf. Log view server side is modified not to include excluded categories +older by certain amount of days, default is 0, for from today older. + +### v.2.1 RC1 + +*It has been 2 years, 4 months, 8 hours, 56 minutes, and 55 seconds +between 2018-08-22 04:13:55 **Moon Stable** production release and this +2020-12-22 13:10:50 **Sun Stable v.2.1**, next and final is the Earth release stage.* + +* ✔ Print View Selected. +* ✔ Config. page set session expires times has to be validated not to be under 2 minutes. +* ✔ Implement mapped provision of named timezones via main.inf, for cities not available in global zone list. + * Javascript also needs to be updated to translate this properly. +* ✔ PostgreSQL to be further tested. Implement server managed database. + * On errors sessions appear not to be closed by driver, maybe this is required and they expire? + * Not all sql has been translated or proper database everywhere established. +* ✔ Session expired should disable the log entry form. +* ✔ Implement log text field limit setting. 0 - Unlimited, 1024 - Default n>128 as minimum size. +* ✔ System configuration variables should be sorted and listed by name and grouped by type. Anons presented at the bottom. +* ✔ Provide office share public link for main.inf linked categories, No login required but no log creation or search is possible. +* ✔ main.inf - Make the dbname uniform across all source types with Settings, as backups use the file format, not the database name. +* ✔ Edit button to show if hidden is the log entry section. +* ✔ Implement title bolding on logs using markdown, so tags can be avoided, for multiline logs. +* ✔ Multi db driver type support. Earth stage requires same SQL related code to work on at least one more DBMS type other than SQLight. + * PostgreSQL is the candidate as MySQL is not easy to install and bulky for all systems. + * Developing and adopting to MySQL or any other system is not prerogative, as it works well as it is with inbuilt simplicity. +* ✔ Single database, multi-user login. +* Static pages setting for the pages directory. +* Provide markdown text functionality to html pages. For quick vanilla plain documentation. + +### v.2.0 SUN RC2 Encountered + +* Sub users list with passwords in config to be provided, with access and category, permissions settings. Default enabled permission is Event view category. +* [Scrapt] Multiple search views and their settings, should be preserved as last preset. Maybe even have named multiple ones in a dropdown or part of the page menu. + * Scrapt -> as view display is different to actual time based normal page display of records. Maybe in the future. +* [Scrapt] Multiple category assignment to be enabled, where the first selected is the primary, others put in a separate cross reference table, parseed as hashtags maybe. + * Scrapt -> as many categories per log complex and not necessary as many categories per view is already there. +* ✔ Export to CVS button on selected logs. +* ✔ RTF based view of log entries. +* ✔ Check and test cross release migration. +* ✔ Minimise Log form when in View Mode. +* ✔ Restore of backup on different version of LifeLog should fail with detecting this in provided error. + * Provided Backup/Restore Specifications, and message that restoration has been invalidated as that is an invalid backup file. + +### v.1.9 SUN RC1 Encountered + +* ✔ Hover over log entries, to make more visible what log entry is being ticked on wider screens. +* ✔ Implement gzip http page encoding compression of traffic. +* ✔ Autocompletion picks up long false words, in html and code type logs. + +### v.1.8 SUN STABLE Encountered/Fixed + +* ✔ Implement View by Amount Type, reset button for categories. +* ✔ Introduce a new column header background colour. +* ✔ Autologin bypasses actual wanted login. + * This is bug 20. + +### v.1.7 MOON STAGE Encountered?Fixed + +* ✔ Database backup tgz ball, upload and download button on config page. + * You must have the password you logged in to unscramble the backup. + * Alias -> pass -> backup password. Information required. +* Application log needed in the background for System based logs. +* New CNF Development. + * ✔ Migration is currently hard to maintain and data export and import is wrongly reliant to CVS. + * ✔ Anons to be enabled. + * CVS imports/exports of full database are to be made obsolete in the future. It is not safe. + * This will be still available via command line. +* RTF Documents header lister page, to provide for, new log entry assignment, deletion, edits. + * There isnt and shouldn't be a full relationship to docs. Hence new log entries can link to existing, docs. +* ✔Use the pages cat_list meta data elements for dealing with categories in java scripts. +* ✔ New Categories dropdown, grouping in ascending order and presenting in columns of five at a time. +* ✔ Sticky rows bg colour, to be a shade different to other normal rows. +* ✔ Login system log and out to be implemented. With system variable $TRACK_LOGINS to disable/enable. +* ✔Change all code to use Exceptions as project is becoming hard to manage. + * The harder it is to foresee possible problems, the less likely you will add unnecessary complexity. -- bud@ +* ✔ Notes to Log table should be other way in relationship direction. + * LOG.ID_RTF -> NOTES.rowid + * This is currently causing problems when the log renumerates, or entries are imported. +* ✔ In config page Categories section to appear after system settings. As less likely to be changed. + * System Configuration section is to be sorted. As in future it is more likelly to grow. +* ✔ New system setting, $VIEW_ALL_LMT=1000. To limit view all records displayed on huge databases. +* ✔ Provide system logs on stats page runs. +* ✔ Menus updated in other pages to have button look. +* ✔ main.cnf newer versions should have precedence to id and entry name to previously set or stored in db. +* ✔ Config stored list of excludes. Provide multiple excludes view. +* ✔ Settings module requires subroutines for debug logging and db properties access. +* ✔ LifeLog codebase release version upgrade tracking and procedures with older databases. +* ✔ JS based session logout timer warning to be implemented. +* ✔ Mutli new alias access flood attack security trigger implementation. +* ✔ Debug system settings implementation. +* ✔ Delete page updated to show better display of entries. +* ✔ Login page to identify host. +* ✔ Session cleanup on autologin not clearing properly. + * A dbfix, should clear older entries as well. + +### v.1.6 and less + +* ✔ $CUR_MTH_SVIEW - Start view page is for current month, and the sticky set. +* ✔ Some System settings to be stored in session. As these are known even before logon. + * i.e. $SESSN_EXPR, $RELEASE_VER, $TIME_ZONE, $LOG_PATH +* ✔ Various system setups, not dealing well with $ENV{'home'} in multi perl environment, releases. + +## Urgent FIXES and Known Issues + +* ✔ CVS Export and Import has not been implemented for RTF type log entries. + * CVS feature has been made obsolete, it shouldn't be used. +* ✔ Expired sessions, swallow submits into void. +* ✔ Dynamic toggle of page sections, interaction fixed, bettered. + +## Planned New Possible Features of Minor Relevance + +* Plugin subpages. + * Configured in main.cnf + * Appear on menu or as dropdouwn in the header. + * Downloaded/Configured from the configuration page. +* View save feature. Where you name and save to config or session a dropdown of views. +* Fit to page log. Making log subpage scrollable rather than whole page to see the bottom. +* Make session timeout sub pages aware via JSON. +* Multiple category assignment table (set via hashtags and end of a post). +* Log cards Export/Import. Send log entries via email or USB, why not? +* Provide sub alias login that sets data visible to only a set of categories. + * View specific based login on a different password. +* ✔ Table sort in config system settings by variable name. +* Enable automatic bold title heading for specified cattegories. +* Theme colours to be revisited, bettered +* Enable file attachment to log entries. +* Enable Armour Mode + * In this mode settings page is disabled. And can be enabled only by System Admin. +* Provide About button and info. + +## Life Log RTF Documents using Quill Javascript RTF API + +* Deal with export/import of RTF Documents. + +## Bugs + +### v. 2.3+ Encountered/Fixed + +* Bug 37 Keywords only search not wotking on detecting very old items. +* ✔ Bug 36.1, Introduced bug, old backup delete not working. +* ✔ Bug 36, DBFix not fully working on PG based install and restore not working from backups made with older versions of OpenSSL. + * Also, restore not working on uploaded backups, from local computer. + +### v. 2.2 Encountered/Fixed + +* ✔ Bug 35, Migration and version updating SQL is wrong for PG database, it doesn't have rowid's. +* Bug 34, DB fix in config, removes associated RTF documents, for some reason. +* ✔ Bug 33 Changing session timeout in config to an lib. background unparsable format cause unrecoverable system error. + * i.e. Putting +1hr instead of +1h. +* ✔ Bug 32 RTF creating/saving is broken. + +### v. 2.1 Encountered/Fixed + +* ✔ Bug 31 PostgreSQL new created log view is not being created. + * On newly created database the view without the schema specified are seen as temporary views. +* ✔ Bug 30 Wrongly entered or modified locale can't be reset no more to an valid one. + +### v. 2.0 Encountered/Fixed + +* ✔ Bug 29 HTML output is incorrect since introducing buffering and content compression. Browser corrects, hence it was not noticed before. + +### v. 1.9 Encountered/Fixed + +* ✔ Bug 28 - System info stats logs not reporting host anymore. +* Bug 27 - Restore of old backups not working anymore. +* Bug 26 - In Chrome editing log entry not working. Something refreshes page, after 5 seconds. +* ✔ Bug 25 - SQLite view not properly sorting in new databases. Newer records listed last. + * View should order by time function desc, ascended is default. +* ✔ Bug 24 - Logs row sum calculation not working/wrong, with negative and positive values. +* ✔ Bug 23 - Delete not working in view mode. +* ✔ Bug 22 - Delete selection of entries not working after a while, db fix in config page required. +* ✔ Bug 21 - Income sum for year in stats is displayed wrong. +* ✔ Bug 20 - Autologin bypasses, wanted new alias login (on logoff). + +### v. 1.8 Encountered/Fixed + +* ✔ Bug 19 - Same day datediff is displaying wrong report in time stack on the page. +* ✔ Issue 18 - Setting excludes for views, deliveres page but long delays with server finished exchange (page doesn't hang). + * The page is server delivered, if sections contain external internet links, this timeouts page browser delivery if the internet is down. +* ✔ Bug 17 - Editing of entries on occasions, duplicates entries. +* ✔ Bug 16 - Saving new log entries with rtf overides previous log entries rtf. + * Issue 16.1 - Currently importing of records linked to rtf notes is not supported. +* ✔ Issue 15 Date diff, showes upside down first range by current date with multiple selections. + * Range should be selected from date in selected latest to current date last as inbetween difference. +* ✔ Issue 14 Subpages pages links to main, restart main page session counter, making the main page fully usable. + * Not really a bug. Session will expire but time remaining will be displayed wrong on the main page. + * All subpages need either to inherit the counter, and jump user to the login screen if expired. + * Or update main pages timer countdown. Which is not possible if browsers back button is pressed. + * Pressing back button brings the page display to initial time it was loaded from. + * This has been now marked as an complex issue. Not worth much spending time on. + +* ✔ Bug 13 - Migrated old data, linking to wrong id, db fix in config page seems to fix this. +* ✔ Bug 12 - Invalid login only shows db error. + +### v. 1.6 Encountered/Fixed + +* ✔ Bug - 11 View runs, brocken since sticky feature implementation. Page record sets don't work. +* ✔ Bug - 10 Expense type entries don't fill amount field on edit button clicked. +* ✔ Bug - 09 RTF documents lost on data renumeration of log. Data fix options in config. Needs urgent revision. +* Bug - 08 CSV imports duplicate on DB Fix in config page. +* ✔ Bug - 07, Editing and RTF entry, doesn't strip the attached html to view in place. +* ✔ Bug - 06, Invalid Time 00. Javascript error thrown, when 00am used. +* ✔ Bug - 05, CRLF and apostrophe replacement not working. +* ✔ Bug - 04, Local not picked up properly on current date. +* ✔ Bug - 03, Keyword search not working on words as they are categorized wrongly by other dropdown in the background. +* ✔ Bug - 02, Record set paging to previous page not always working. Getting stuck. + * This occurs on new records placed in the far past. Complex problem. +* ✔ Bug - 01, date validation for proper entered time, there is no 24 h. + +*** + + Document is from project -> + + An open source application. + +
Life Log - Sun Stable Stage v.2.1 (2020)
diff --git a/Installation.txt b/Installation.txt new file mode 100644 index 0000000..21cf808 --- /dev/null +++ b/Installation.txt @@ -0,0 +1,398 @@ +*** LifeLog Requirements *** + + - Web Server (any will do that supports CGI perl execution) + - SQLite + - Perl Modules (Run the provided ./install_modules.sh) + - git (git clone https://github.com/wbudic/LifeLog) + + -- Note - Perl and some modules might take time to install + as they are fetched and tested for your computer. + - Provided sudo ./install.sh will do most stuff for you explained in this old doc. + + + +### Obtain from GIT repository latest stable release with: +## + git clone https://github.com/wbudic/LifeLog.git +## +### + + +# Optional install cpanm to make installing other modules easier. +# You need to type these commands into a Terminal emulator (Mac OS X, Win32, Linux) + +sudo apt install cpanminus + + +# Install SQLite +sudo cpan DBD::SQLite; +# or download latest from: https://www.sqlite.org/download.html +# Optional but recommended install a ProgresSQL database server and driver see: Installation_ProgresSQL.txt + +## +# To compile install from source latest Perl Language Interpreter, to local home. +# Note I do not recommended now to compile build install +# for the whole system, if it comes with perl. Systems can come and go. +# Your $HOME directory is important. +# +# Example: +$ mkdir ~/dev; cd ~/dev +$ wget https://www.cpan.org/src/5.0/perl-5.34.0.tar.gz +$ sudo tar -xzf perl-5.34.0.tar.gz +$ cd perl-5.34.0 +$ ./Configure -Dusethreads -des -Dprefix=~$HOME/localperl +$ sudo make +$ sudo make test +$ sudo make install +# Once it is installed in $HOME/localperl you can run: +$ rm -rf ~/dev/perl-5.34.0 +# Modify vim ~/.bashrc to have: +PATH="/home/will/localperl/bin${PATH:+:${PATH}}"; export PATH; +# We use sudo to cpan install stuff for the whole system. +# This is currently located at: +export PERL5LIB=/usr/local/share/perl/5.30.0/ + + +./Configure -des \ + -Duse64bitall \ + -Dcccdlflags='-fPIC' \ + -Dcccdlflags='-fPIC' \ + -Dccdlflags='-rdynamic' \ + -Dlocincpth=' ' \ + -Duselargefiles \ + -Dusethreads \ + -Duseshrplib \ + -Dd_semctl_semun \ + -Dusenm \ + -Dprefix=~$HOME/localperl + + + +## Development Environment Perl Install + +# Developer? Install VSCode, not from flatpack. Use Microsoft site -> https://code.visualstudio.com/ +Requirements: G++ and gcc compilers, and Gcc-4.8 GNU Compiler + +# Install Perl, properly, don't use the distro provided perl interpreter (might be outdated or has missing modules). + +This best is explained? If running under sudo and cgi based scripts, you will be using the system wide or provided installation of perl. +If logged in shell as normal user issue, 'perl -v', you might be getting a different user updated version of it. +To troubleshoot, you can compare, issue, '/usr/bin/perl -v', best is if both return same, version. +Solution already provided for this is to use /usr/bin/local/perl executable which should be the latest if installing the latest perl. +Notice - Most web server configuration files, require cgi settings to point to right perl executable. +If still experiencing problems, running provided ./install_modules.sh was probably not issued, and could solve requirements. + + +## +sudo apt install perlbrew +## +#https://learn.perl.org/installing/unix_linux.html +curl -L http://xrl.us/installperlnix | bash +# Perl compiled based on your hardware infrastructure now, is Very Good. +#Developer? Switch to it, and cpan modules: + +# Perlbrew allowes you to switch to newer (securer) patched versions of perl. +# Example bellow builds from a $HOME/dev/perl-5.30.1.tar.gz source code archive +# a descent perl installation for development on your machine. + +perlbrew install ~/dev/perl-5.30.1.tar.gz --thread --multi --64int --64all --no-patchperl --debug +#switch to it in a terminal. +perlbrew use 5.30.1 +sudo apt install libperl-critic-perl +#libperl-dev is required for the lang server +sudo apt install libperl-dev +sudo apt-get install zlib1g-dev +sudo cpan Perl::LanguageServer + + +NOTICE -> Above Perl installation and modules can take time as they build (get compiled) and are tested + using your computers configuration and hardware for optimal performance. + The Perl::LanguageServer, can fail in tests, as it is development specific, this can be ignored. + +# Install OpenSSL (Optional, used by backup routines) +https://www.openssl.org/ + +Avoid: sudo apt install openssl +Install preferably by building. Older versions have not all options. +i.e.: +curl -c https://www.openssl.org/source/openssl-1.1.1l.tar.gz | tar -xz + +cd openssl-1.1.1l; +export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64 +./configure linux-x86_64 --prefix=/usr/local --openssldir=/usr/local +make +make test +sudo make install +cd .. +rm -rf openssl-1.1.1l + + +# LifeLog Required Perl modules. + +# Since 2.4 To get to work with latest installed perl version, (not the roots/system wide one). +perl -v +#v5.30.0 or grater is preferred. + +# Following is a way to install modules if not having sudo access. +perl -MCPAN -e 'install DBI' +perl -MCPAN -e 'install CGI' +perl -MCPAN -e 'install CGI::Session' +perl -MCPAN -e 'install DBD::Pg' +perl -MCPAN -e 'install Syntax::Keyword::Try' +perl -MCPAN -e 'install DateTime::Format::SQLite' +perl -MCPAN -e 'install Capture::Tiny' +perl -MCPAN -e 'install Text::CSV'; +perl -MCPAN -e 'install Regexp::Common' +perl -MCPAN -e 'install Gzip::Faster' +perl -MCPAN -e 'install CGI:Session' +perl -MCPAN -e 'install Crypt::CBC' +perl -MCPAN -e 'install Crypt::Blowfish' + + + + +# Following is instruction is for system wide perl installation. +# In most cases the following will work fine if having sudo access, and no intension to upgrade perl. +# On some systems, is you have the PERL5LIB env. variable set, installed modules might not be found. +# Without setting this env. var. explicitly, normal location of these should be the /usr/local/share/perl/5.3* directory, available to all users. +# Without sudo running "cpan" you might have to set this PERL5LIB={path} in .bashrc to include your users home directory. +# +### +# since 1.8 switched to: +# before was -> sudo cpanm Try::Tiny; +sudo cpan Exception::Class +sudo cpan Log::Log4per +sudo cpan Syntax::Keyword::Try + +sudo cpan DateTime; +sudo cpan DateTime::Format::Human::Duration +sudo cpan DateTime::Format::SQLite; +sudo cpan Text::CSV; +sudo cpan Number::Bytes::Human; +sudo cpan Gzip::Faster; +sudo cpan Number/Bytes/Human.pm; +sudo cpan Regexp::Common; +sudo cpan JSON; +sudo cpan Switch; +sudo cpan IPC::Run; +sudo cpan Syntax::Keyword::Try; +sudo cpan Text::Markdown +sudo cpan Crypt::Blowfish; +sudo cpan Compress::Zlib; +sudo cpan IO::Compress::Gzip; +sudo cpan IO::Prompter; +sudo cpan IO::Interactive; +sudo cpan -T DBD::Pg; +sudo cpan CGI CGI::Session; + + + + +#Install next after installing desired ciphers, we use Blowfish only. +sudo cpan Crypt::CBC; + +#Install DBI module +sudo cpan DBI; +sudo cpan DBD::SQLite; +#For PostgreSQL see Installation_PostgreSQL.txt before installing perl driver: +#cpan DBD::Pg; + +#Final Perl Installation Notes + +This perl setup might take time and efforts. But, it is worth it. +You get it build and tested professionally, based on your hardware. +Platforms supported, Windows, Unix (all), Mac. + +Installing perl as an developer, requires no sudo. +But hence can't run server (system level) like. + +If developer and running perlbrew, recommended is to use +cpan to install required modules. + +#Upgrade Instructions + +To upgrade to newer version of this software requires data migration. +Before installing newer version scripts, perform an data export. + +cd /home/{user}/thttpd_dev/dbLifeLog +sqlite3 -csv data_log.db "select * from LOG;" > current_log.csv + +## You should run module install, after every upgrade/update just in case something is missing: +# +# +./install_modules.sh +# +## Note, install modules doesn't require any restarts or reboots, this is perl baby. +## However, allow some time as it also tests these, to make sure all is running fine. + +##Install LifeLog Independently +cd /home/{user}/ +git clone https://github.com/wbudic/LifeLog +mkdir /home/{user}/thttpd_dev/dbLifeLog +chmod +x /home/{user}/thttpd_dev/cgi-bin/*.cgi + +Copy from /home/{user}/LifeLog/htdocs/cgi-bin to /home/{user}/thttpd_dev/htdocs/cgi-bin +if doing development. Copy also the /home/{user}/LifeLog/.git to /home/{user}/thttpd_dev/ + +Access the webserver cgi-bin. http://localhost:8080/cgi-bin/main.cgi +(this might redirect to login.cgi or config.cgi in the future) + +##Install LifeLog Dependably (not automatic, manual developer way) +cd /home/{user}/ +git clone https://github.com/wbudic/LifeLog +run thttpd with: +cd LifeLog; ./startDevWebServer.sh + +##Import CSV Exported File +This requires all CGI working. As it will create a brand new database for you. +Once created you must import the from above example current_log.csv +cd /home/{user}/thttpd_dev/dbLifeLog +see: http://www.sqlitetutorial.net/sqlite-import-csv/ + +Example (data_dev1_2_log.db would be created as the latest version by the CGI created): +cd /home/{user}/thttpd_dev/dbLifeLog +sqlite3 data_dev1_2_log.db +sqlite> .mode csv +sqlite> .import current_log.csv LOG; +sqlite> select * FROM LOG; +sqlite>.quit + +Note exporting/importing of other tables is similar, but not recommended. + + +#Current Latest Development Branch +git fetch && git checkout dev.1.3 + + +#Install thttpd_dev as an Linux System Service +Not recommended, but the thttpd development environment for LifeLog +can be installed to start on reboot. + +sudo cp startDevWebServer.sh /etc/init.d/ + +Modify the following to the path of your development environment +where thttpd.conf file is in /etc/init.d/startDevWebServer.sh + +Modify line -> cd /home/will/thttpd_dev +vim /etc/init.d/startDevWebServer.sh + +Install as service with: +sudo update-rc.d startDevWebServer.sh defaults + + +#Developer Notes + +* For vscode. Before installing perl, and perl::LanguageServer extension. + *$ sudo cpan -r Perl::LanguageServer + * This will recompile and test the language server with the system default installation of perl you have. + * With out the -r option, you might have experimental features compatibilities issues. + +##Automate GIT Push + +vim your ./LifeLog/.git/conf file to include: + [remote "origin"] + url = https://{user}:{password}github.com/wbudic/LifeLog.git + ... +Where {user} and {password} are your git login credentials. +Don't worry, these credentials are not uploaded. And someone must have +access to your computers login to specifically hack to obtain them. + +##Troubleshoot Data Problems + +To reset factory defaults, for categories and configuration. +You might need to delete data in some tables. +Issue either the bellow statements externally. + +sqlite3 data_{alias}_log.db "delete from CAT;" +sqlite3 data_{alias}_log.db "delete from CONFIG;" + +Subsequent versions of LifeLog software might require this operation. +You can export and modify your added categories via an CSV file. +Making sure the ID first column across all entries has a unique number. + +#Install AUTO_LOGIN +On a personal network or small network, you might prefer to auto login when browsing to the LifeLog, +instead of entering every time user name and password. It makes sense, as you are the only one using it, +don't need that extra security. + +Other scenario is that the LifeLog in an Office Environment is accessed by multiple people., +using same alias and password. Don't need to have any extra security as the alias and password is known. + + +Modify, in dbLifeLog/main.cnf +Look for < +And change have your general login credential's. i.e.: +< + +Then login one last time, and enable AUTO_LOGIN at the configuration page. + + + +## Install tiny thttpd web server ## + +Note - This is still recommended, if not willing to configure or have to run +a heavier more complex web server configuration. +The recommendation is to skip this webserver and install LightHTTPD, +which is more modern and maintained. + + +https://acme.com/software/thttpd/ + +wget https://acme.com/software/thttpd/thttpd-2.29.tar.gz +tar -xvzf thttpd-2.29.tar.gz +cd thttpd-2.29/ +sudo groupadd www +./configure +sudo mkdir /usr/local/man/man1 +sudo make +sudo make install + +#rm thttpd-2.29.tar.gz +#rm -rf thttpd-2.29 + +Create an mkdir ~/thttpd_dev directory. + +Run server using this config file, where {user} is your home login location. + + +# This section overrides defaults +dir=/home/{user}/thttpd_dev/htdocs +user={user} +logfile=/home/{user}/thttpd_dev/log/thttpd.log +pidfile=/home/{user}/thttpd_dev/run/thttpd.pid +# This section _documents_ defaults in effect +port=8080 +# nosymlink# default = !chroot +# novhost +# nocgipat +# nothrottles +host=0.0.0.0 +charset=utf-8 +cgipat=**.cgi + +After modifying the thttpd.conf +you'll have to modify the startDevWebServer.sh to reflect your setup before running the script. + +The full URL to the LifeLog is the following link (if not working try without cgi-bin, and proceed with further installation): +# +# + http://localhost:8080/cgi-bin/ +# +# + +## Network Troubleshooting ## + +With some server software/hardware the following setting, might help if experiencing an lag. + +### Modify sysctl.conf: +sudo vim /etc/sysctl.conf + +So it lists later: +sudo sysctl -p + +net.ipv4.tcp_no_metrics_save = 1 +net.core.netdev_max_backlog = 5000 +net.ipv4.tcp_rmem = 10240 87380 12582912 +net.core.wmem_max = 12582912 +net.core.rmem_max = 12582912 +net.ipv4.tcp_window_scaling = 1 diff --git a/Installation_LightHTTPD.txt b/Installation_LightHTTPD.txt new file mode 100644 index 0000000..058e443 --- /dev/null +++ b/Installation_LightHTTPD.txt @@ -0,0 +1,80 @@ +# Compile/Install LightHTTPD with SSL Support +# wget https://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.54.tar.gz + +sudo apt install lighttpd + +cd ~/dev/lighttpd-1.4.54 +tar xvzf lighttpd-1.4.54.tar.gz +sudo apt autoremove -y +sudo apt install intltool -y +sudo apt install pcre-config -y +sudo apt install build-essential -y +sudo apt install libssl-dev -y +sudo apt install libpcre3-dev -y +sudo apt install libbz2-dev -y +sudo apt install libssl-dev -y + +./configure --prefix=/usr/local/lighttpd --with-openssl --with-sqlite --with-pgsql +make +sudo make install + +#check SSL enabled with: +lighttpd -V + +## Create Selfsigned SSL Certificate + +cd ~/dev +openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \ + -keyout elite.key -out elite.crt -subj "/CN=elite.net" \ + -addext "subjectAltName=DNS:elite.net,DNS:www.elite.net,IP:192.168.1.45" + +openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \ + -keyout elite.key -out xip.crt -subj "/CN=104-225-141-231.cloud-xip.com" \ + -addext "subjectAltName=DNS:104-225-141-231.cloud-xip.com,IP:104.225.141.231" + + +cat elite.key elite.crt > elite.net.pem + +cat xip.key xip.crt > xip.com.pem + +## Setup virtual Host with SSL + +To set up Virtual Host with SSL, edit lighttpd config file /etc/lighttpd/lighttpd.conf with the following values. + +#Add "mod_openssl" to server module list. +server.modules = ( "mod_access", + "mod_setenv", + ... + "mod_openssl" +) + + +$SERVER[“socket”] == “:443” { + +ssl.engine = “enable” +ssl.pemfile = “/home/will/dev/elite.net.pem” + +# ssl.ca-file = “/etc/lighttpd/ssl/CA_issuing.crt” + +server.name = “elite.net” +server.document-root = “/sites/vhosts/elite.net/public” +server.errorlog = “/var/log/lighttpd/elite.net.error.log” +accesslog.filename = “/var/log/lighttpd/elite.net.access.log” + +} + +## Start "lighty" with -D option for interactive console trouble shooting and testing. + +/usr/sbin/lighttpd -D -f ~/dev/LifeLog/lighttpd.conf + + +## Run as service, we don't want default: lighttpd -D -f /etc/lighttpd/lighttpd.conf + +sudo systemctl start lighttpd -D -f /home/will/dev/LifeLog/lighttpd.conf +sudo systemctl enable lighttpd +sudo systemctl status lighttpd + +## Optional Enable as separate service, so it runs always, after reboot too. +sudo systemctl link /home/will/dev/LifeLog/LifeLogLighttpd.service +sudo systemctl enable LifeLogLighttpd +sudo systemctl start LifeLogLighttpd \ No newline at end of file diff --git a/Installation_PostgreSQL.txt b/Installation_PostgreSQL.txt new file mode 100644 index 0000000..108991e --- /dev/null +++ b/Installation_PostgreSQL.txt @@ -0,0 +1,161 @@ +# Notes + +PostgreSQL Server is a full database service solution (RDBSM). Handling interaction, like multiple enterprise schemas, databases, users and backups. +These all are and can be handled outside the scope of the LifeLog application. +However, it is not required or recommended to have a fully managed database system service, just to use for the LifeLog app. + + +Modify the following anon driver property tag in dbLifeLog/main.cnf to specify: +< + +The alias is by default assumed the actual database name as well as the user. + +Modify the following anon property, to have the SQL Server provide multiple users as different aliases for the loging into a specified single database. +< +to something like, to make logins now for the database users: +< +Where 'lifelog' is the server managed database. + +Hope all works for you, and happy logging! + + +# Install PostgreSQL +sudo mkdir /usr/include/postgresql +## Create the file repository configuration: +sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' + +## Import the repository signing key: +wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - + +## Update the package lists: +sudo apt-get update -y +sudo apt upgrade -y + +## Install the latest version of PostgreSQL. +## If you want a specific version, use 'postgresql-12' or similar instead of 'postgresql': +sudo apt-get -y install libpq-dev +sudo apt-get -y install postgresql-12 + +## Optional -> Enable port 5432 for PG server for local network on server. +sudo uwf allow 5432/tcp +sudo vim /etc/postgresql/12/main/postgresql.conf to modify--> listen_addresses = '*' +sudo vim pg_hba.conf -> +host all all 0.0.0.0/0 md5 +host all all ::/0 md5 + +# New PG version: If want remote client access add in server /etc/postgresql/14/main/pg_hba.conf: +host all all {client-server-access-ip}/24 scram-sha-256 + + +sudo service postgresql restart + +## Install required libpq-dev to compile test perl driver, later. +sudo apt install libpq-dev + +## Install perl driver. +sudo cpan DBD::Pg; + + +# To assign default Postgres SQL user roles. +sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'postgres';" +sudo -u postgres psql -c "CREATE ROLE lifelog WITH LOGIN SUPERUSER CREATEDB CREATEROLE INHERIT NOREPLICATION CONNECTION LIMIT -1 PASSWORD 'xxxxxxx'"; +sudo -u postgres psql -c "CREATE DATABASE lifelog;" +sudo -u postgres psql -c "grant all privileges on database lifelog to lifelog;" + + + +## Start stop Postgres SQL +sudo service postgresql start + +## Manually Obtain dep. if encountering lib problems. with i.e.: +wget https://apt.postgresql.org/pub/repos/apt/pool/main/p/postgresql-12/libpq-dev_12.4-1.pgdg20.04+1_amd64.deb +dpkg -i libpq-dev_12.4-1.pgdg20.04+1_amd64.deb +###Than run again driver install +sudo cpan DBD::Pg; + +# Installing pgAdmin4 +sudo apt install python3-pip +sudo python3 -m pip install https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v4.30/pip/pgadmin4-4.30-py3-none-any.whl + +# Data directory location for backup +sudo -u postgres psql -c "SHOW data_directory;" | grep -G / +## Quick tar all +sudo tar czvf ~/postgresql.db.backup.tar $(sudo -u postgres psql -c "SHOW data_directory;" | grep -G /) + +# Backup/Restore +# You must setup an ~/.pgpass, and change the following cat string to your systems setup. + +cat "hostname:port:database:username:password" >> ~/.pgpass; chmod 600 ~/.pgpass; + +# Backup with: +pg_dump --file "~/dev/LifeLog/dbLifeLog/bck-pg-$DB_NAME.sql" $DB_NAME + +# Now you can run your backup utility. To include your ~/dev/ directory. +# Or use and setup mine @see -> https://github.com/wbudic/B_L_R_via_sshfs +# p.s. If this saved you one day, let me know. :) + +# Restore with: +psql $DB_NAME < "~/dev/LifeLog/dbLifeLog/bck-pg-$DB_NAME.sql" + +############################### + Important pgAdmin4 Notes +############################### + +What pgAdmin4 and their documentation and installation doesn't describe, +that the default web server is python based. The web based package will install the apache web server. +You most likely don't want that. And the pgAdmin-desktop, you possibly don't need that. +(Can use any browser instead) :) + +I recommend to only install pgAdmin via python pip utility ONLY. + + +pip install flask + +To run locally (you): + +$ sudo mkdir /var/lib/pgadmin +$ sudo mkdir /var/log/pgadmin +$ sudo chown $USER /var/lib/pgadmin +$ sudo chown $USER /var/log/pgadmin +$ python3 -m venv pgadmin4 +$ source pgadmin4/bin/activate +(pgadmin4) $ pip install pgadmin4 +... +(pgadmin4) $ pgadmin4 +NOTE: Configuring authentication for SERVER mode. + +Enter the email address and password to use for the initial pgAdmin user account: + +Email address: user@domain.com +Password: +Retype password: +Starting pgAdmin 4. Please navigate to http://127.0.0.1:5050 in your browser. + * Serving Flask app "pgadmin" (lazy loading) + * Environment: production + WARNING: Do not use the development server in a production environment. + Use a production WSGI server instead. + * Debug mode: off + +# Have you forgotten master password to enter pgadmin4? Recreate by: +$ rm -rf /var/lib/pgadmin/*.db +$ pgadmin4 + +Before upgrades first: + +(Notice - the previous user and password might not work anymore after:) +pip uninstall pgadmin4 +pip install pgadmin4 + + + + +(Sorry, I use, but don't program in python, to document here any further) + +My Criticism: +From admin perspective, anything not systemd configurable, tend leave files allover the place. +This makes things harder to manage. Local user installed or developer system, are different thing on linux. +PostgreSQL as database system is server, and pgAdmin only a client. Don't mix in installation, two different placings. +This is neither secure, neither healthy to trouble shoot. + + + diff --git a/Life Log.mm b/Life Log.mm new file mode 100644 index 0000000..9a27958 --- /dev/null +++ b/Life Log.mm @@ -0,0 +1,4 @@ + + + + diff --git a/LifeLogLighttpd.service b/LifeLogLighttpd.service new file mode 100644 index 0000000..b51f27e --- /dev/null +++ b/LifeLogLighttpd.service @@ -0,0 +1,14 @@ +[Unit] +Description=LifeLog Lighttpd Daemon +After=network-online.target + +[Service] +Type=simple +PIDFile=/run/lighttpd.pid +ExecStartPre=/usr/sbin/lighttpd -tt -f /etc/lighttpd/lighttpd.conf +ExecStart=/usr/sbin/lighttpd -D -f /home/will/dev/LifeLog/lighttpd.conf +ExecReload=/bin/kill -USR1 $MAINPID +Restart=on-failure + +[Install] +WantedBy=multi-user.target diff --git a/LifeLogLighttpd_8080.cnf b/LifeLogLighttpd_8080.cnf new file mode 100644 index 0000000..c8ea11c --- /dev/null +++ b/LifeLogLighttpd_8080.cnf @@ -0,0 +1,37 @@ +#ExecStart=/usr/sbin/lighttpd -D -f /home/will/dev/LifeLog/lighttpd.conf +server.document-root = "/home/will/dev/LifeLog/" + +server.port = 8080 + +server.username = "will" +server.groupname = "will" + +server.modules = ( +#"mod_access", +"mod_accesslog", +#"mod_auth", +"mod_expire", +"mod_compress", +"mod_redirect", +"mod_setenv", +"mod_rewrite", +"mod_alias", +"mod_cgi" +#"mod_openssl" +) +mimetype.assign = ( + ".html" => "text/html", + ".txt" => "text/plain", + ".jpg" => "image/jpeg", + ".png" => "image/png" +) + +static-file.exclude-extensions = ( ".ico" ) +index-file.names = ( "index.html" ) +server.dir-listing = "enable" + +$HTTP["host"] == "192.168.1.44" { +# server.document-root = "/var/www/servers/www2.example.org/pages/" +server.document-root = "/home/will/dev/LifeLog/htdocs" +} + diff --git a/README.md b/README.md new file mode 100644 index 0000000..0e7fdee --- /dev/null +++ b/README.md @@ -0,0 +1,127 @@ +# Life Log + +Web Application that keeps an everyday CGI accessible log of database entries of various categories. +Preferably on a small inexpensive server connected to your local network. + +Written in Perl, easy to implement and modify. + +Latest stable version is **2.5** in **SUN** stage. + +## What is new in this release? + +* Has demo and test site [test site](https://lifelog.hopto.org) for entering EARTH ready stage. +* Can be now installed further to an PostgresSQL Database System. + * Backups/Restore fully integrated, between SQLite and PostgresSQL. +* Bettered user Interaction. + * i.e. amount if blank will apply the mini calculator if it detects numbers in log. At the begging of lines. +* Updated Configuration (to CNFParser v.2.2) and Statistics pages. + * Added several options and tweaks. + * Minor Data structure and migration adopted. +* Themes have been upgraded. +* RTF note taking revisited and tested. + + +## PC Requirements + +* Any Operating System +* Processor 1.2+ GHZ or better, 2+ cores. +* Only 2 GB+ physical. + +Setup is requiring some Perl/Admin knowledge to install and enable, and tweak this application. The main application sources are located in the ../htdocs/cgi-bin directory. +Instructions are provided. + +### Quick Setup + +* After downloading this application and installing in a directory (default is **~/dev**), which both can be done with: + * ```git clone https://github.com/wbudic/LifeLog.git``` + * Check here for further [instuctions](./Installation.txt). + * Before modifying any configuration, run the module installation and testing process. + * ```./install_modules.sh``` + * This might be necessary after even upgrades. + * Upgrades support preserving of data, and migration to any possible new data structures, automatically. + * Rolling back to an previous version even if not expected, it is not affected by any new modules you might have installed, down the track. + +## What is the purpose of having this log kept? + +Here are some things that come to mind: + +* Allows you to keep an organized historical log of every day and time events. +* All logs are categorized, easy to search, view modify. +* Only latest and last entries are listed of the current, which usually is of interest. + ** Special log entries can be made sticky on top to be listed, and in future dated logs can be added, for what ever reason or flow. +* Fast search based on categories, keywords, from to date, all integrated. + * Historical view of data as such is not cluttered by none relevant log entries. Which is a common problem in spreadsheets. + * Export/DateDiff/Print selected log entries. + * Need to compare current purchase, with any last times of the same. Be it in days or cost, total of the expense? Now you can. +* Optionally assign accounting values to log entries, is it an asset, income or expense? + * These are per page calculated. + * View through the static page your logged current income and expense, for the current year. + * Your Expense there is of interest. No? + * Statics page also gives you runtime information of your server and log. +* RTF documents can be attached to an log. + * These range from simple to further more styled documentation of the log entry. + * Web snippets can be copied and pasted. The Reach Text Format is real a document object, stored in one place, with others. + * Images added to RTF can be links or virtually embedded, making it part of you db type file. +* Having an vast historical log, it is easy to backup and transport. +* To access the log, security is applied based on alias. + * Backup and Restore is user or alias specific, so it is not possible to restore from another alias db into yours, to view data. + * Backup is inbuilt, you make one, if unsure if deleting and rampaging and exploring with the log, might make you loose data. + * Each alias creates its own log database, so if working on something specific, this you use to that by alias separately can access/share. + * In turn this database configuration can have its own list of categories, it is independent. + * All is unique and configurable in its own instance. Defaults are provided by this applications in an custom unique fast configuration file system. + * i.e. The main.cnf is used with own bummed configuration parsing routines, all part of this applications program, you have the code. + * The configuration system here is rare. As it takes into account three states of preservation of concerns. + 1. System and application provided default. (Application release defaults, gets overridden on app code update.) + 2. Application own default. (Application in code provided defaults, has someone deleted/damaged the text config file?) + 3. User set configuration. (Application, user set, added, amended in database configuration, must be preserved on software or release update.) +* Interaction and configuration is user friendly, provided in the interface, no need to access a server located main.inf file, for most parts. +* Data migration on software updates are automatically provided. + * Data structures and footprint is tiny. + * Amount of data a log can contain is unlimited. + * You only browse in a small view sections of it. +* Data is stored in a standard SQL based database. + * System admins, database developers, managers, large or small; will find this useful in case they need to do something with it, in the future or current situation. + * Web developers with no Perl coding skills, can access and modify the HTML containing .cgi files and modify them as needed, for simple edits. + * All relevant *perl code* and HTML is in one file per web page, shared settings, configuration, session, parameter names, constance's, in one place, not scattered around in several files. +* **Perl** is used to deliver the pages and all the interaction. + * It is being interpreted using libraries that directly link to fast system routines. + * Nothing unnecessary is loaded or searched for, to provide execution on the fly. + * There is no waste on reference to reference in memory, referencing an instance, that references the actual address. + * You don't need virtual machine loading, path resolving, then encapsulated traverse on complex object structure being created, to start the program execution. However, it is necessary unfortunate, that other languages have to do that. + +## Life Log version v.2.+ + +* Mulitple SQL database support ready and tested, currently PostgreSQL, LightSQL (default). +* Data searches, views, updated, enhanced and upgraded. +* Migration upgraded and test. +* Cross version releases, automatic migration of data and structures. +* Tested and provided also now installation instruction for HTTPS based webserver lighty. +* Tested and working now on ubuntu, debian and mint distros. + +## Life Log version v.1.8 + +* Automated install module script **`./install_modules.sh`** +* Has Secure Backup/Restore. Providing accurate full data restore and merging with existing for live databases. +* Now with a distinct data page and view mode. +* New category selection, storing approuch. +* Better and more efficient application configuration and setup. +* Numerous fixes, and better exception handling. + +## Life Log version 1.7 + +* Views updated, having option to exlude by category now, during the session logging. +* New system configuration options. i.e. $DEBUG for some sql statements. +* Server system based snapshot logs, on stats invocation. +* Server indentifier on login. + +## Life Log version 1.5+ + +* Ritch Text Documents can be attached to Logs. +* Theme support. Change the look and feel. From the congiguration page. +* Expenses and Income totals, various new calculations. +* LTags inclusion, format and output better information. +* Better interactivity. + +![Sample](VS-on-METABOX-42.png) + +![Sample](VS-on-METABOX-34.png) diff --git a/ReleaseTestCheckupList-v-2.2.md b/ReleaseTestCheckupList-v-2.2.md new file mode 100644 index 0000000..c827158 --- /dev/null +++ b/ReleaseTestCheckupList-v-2.2.md @@ -0,0 +1,64 @@ +# Life Log Interactive Test Checklist + +## Main Page + +### Page Display/Functionality + +- ☑ Menu, Links, interaction working. +- ☑ Show/Hide forms, menu working. +- ☑ Log number displayed per page ($REC_LIMIT), forward, back, top, end. +- ☑ Calculations are correct. +- ☑ Test look and feel on different browsers. +- ☑ Check Export select, sum selected. +- ☑ Date Diff button. +- ☑ Select All, Unselect All. +- ☑ Delete Selected. + +### Log Form + +- ☑ Date,log,category entry, validation. +- ☑ Log entry time zone, and order, properly displayed. +- ☑ Help clouds, display and position. +- ☑ Sticky log entries working and showing on top. +- ☑ Check RTF document creation, saving. RTF doc. pane showing with menu. + + +### Search Form + +- ☑ Date dialogs showing. +- ☐ Each View button working, page getting into view mode. +- ☐ Keywords dropdown assist working. +- ☐ Categories included and excluded with key words narrowing working. + +### RTF Documents + +- ☐ Are saving and linking to an log entry. +- ☐ Are being deleted if log entry is deleted. +- ☐ Menu showing, check text formatting, colours, fonts, styles is working. +- ☐ Check if RTF documents are backed up restored. + +### Config Page config.cgi + +- ☑ Look & Feel, autonom variables, like release version showing at end of System Configuration, clustered as edit enabled. +- ☑ Editing and changing works. +- ☐ Categories, adding, deleting, renaming works. +- ☐ Database fixes all work. +- ☐ Does a database fix issued, reassigns also documents to new remunerated log entries. +- ☐ Backup/Restore working, security around it also correct and works. + +### Configuration Check main.cnf + +- ☑ Autologin works. +- ☑ Auto Timezone setting. +- ☑ Timezone Mapping. +- ☑ Backup disabled/enabled works. +- ☑ Database source change works. +- ☐ Central database external users access works. + +--- +:sleeping: +| Unchecked | Checked | +| --------- | ------- | +| ☐ | ☑ | + +/play yodel \ No newline at end of file diff --git a/VS-on-METABOX-25.png b/VS-on-METABOX-25.png new file mode 100644 index 0000000..67ec8c9 Binary files /dev/null and b/VS-on-METABOX-25.png differ diff --git a/VS-on-METABOX-34.png b/VS-on-METABOX-34.png new file mode 100644 index 0000000..01e68fb Binary files /dev/null and b/VS-on-METABOX-34.png differ diff --git a/VS-on-METABOX-42.png b/VS-on-METABOX-42.png new file mode 100644 index 0000000..7c05de9 Binary files /dev/null and b/VS-on-METABOX-42.png differ diff --git a/backupDBLifeLog.sh b/backupDBLifeLog.sh new file mode 100755 index 0000000..20cb672 --- /dev/null +++ b/backupDBLifeLog.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# +# Following is an hardcoded script that can be used on your local machine +# to archive from server all the latest SQLite databases on the DB Life Log server. +# +# Usefull to cron, to auto backup the databases just in case. +# +# Programed by: Will Budic (Вячаслав Будитьий) +# Open Source License -> https://choosealicense.com/licenses/isc/ +# Example crontab -e entry for every four hours. +# in crontab have -> 0 */4 * * * /home/will/dev/backupDBLifeLog.sh > /dev/null 2>&1 + +export DISPLAY=":0" +export XDG_RUNTIME_DIR=/run/user/$(id -u) +export XAUTHORITY="/home/will/.Xauthority" +export SSHPASS='N0-MA-E9-5E-4A-C6-MJ-2F' +DIR="/home/will/backups/r2d2_dbLifeLog" +NOW=`date +%Y%m%d` + +if [ ! -d "$DIR" ]; then + mkdir $DIR +fi +cd $DIR + +sshpass -e sftp -oIdentityFile=~/.ssh/id_dsa -oBatchMode=no r2d2@192.168.1.20:/home/r2d2/dev/dbLifeLog/ < https://choosealicense.com/licenses/isc/ + +# Credential format:<>> , + to enable AUTO_LOGIN option bellow, the config in app, has to also be enabled. +<>> +# BACKUP_ENABLED -> Enable (1), disable (0) backups to be restored from config page. +<>> +<>> +<>> +<>> + +######################################################################### + Note Remove -> '!' prefix to a tag name, to enable, set, + and override any previously set from now on, + it is from top to end file approach, in this type of configuration. +# + +# Default database driver is SQLite, anyhow. +# SQLite DB driver. +<>> + +# ProgresSQL DB driver. Remove '!' to enable. +<>> + + +# LOG actual variable size limit, - 8192 default, 128 minimum value. +<>> + +# Set the following to an database name, with external managed multiple users, that are to connect to a single database. +# Users have to be externally set, and alias is then used for their userid to be able to login. (Add user roles to AUTH table). +# By default this setting is disabled with 0, making alias name, its own log database, per user. +# +<>> + +# Timezoning, if set to 1, country locale setting for timezone in config page is ignored. +<>> + +# Public, enabled list of categories. Remove -> '!' prefix before tag name, to enable. Be careful what category you add/enable here. +# Public records view feature only, it doesn't allow new log entries to be added and have pin point searching of all existing. +<>>#File,System log and Event. +# Following is similar to AUTO_LOGIN setting above, and must be set. +<>> +<> +< +$`$`$`$`Dollar Sign~ +€`€`€`€`Euro Sign~ +£`£`£`£`Pound Sign~ +¤`¤`¤`¤`Currency Sign~ +₽`₽`₽`Ruble Sign~ +Â¥`¥`¥`¥`Yen Sign~ +₨`₨`₨`Rupee Sign~ +à§³`৳`৳`Bengali Rupee Sign~ +฿`฿`฿`Thai Currency Symbol Baht~ +>> + +<help.pl +BankingPlugin->banking.pl +>> + +# @See help at bottom of config for all the following. + +<>> <- (Diary,System Log,Poetry) category id's only, does set in the config page also work. +<>> +<=6 AND >>> + +#For internal use only. +<<^CONFIG_META<200>The reserved id range for config table is from 200, upwards.>> + +# +# The following are initial setup constance's. We use them instead of hard coding a lot. +# Modifying them after the fact of a database creation is futile, a limp biscuit. +# Use/see anon properties before, enabling changing settings from this actual config file. +# +< +00|$RELEASE_VER = 2.5`LifeLog Application Version. +01|$REC_LIMIT = 25`Records shown per page. +03|$TIME_ZONE = Australia/Sydney`Time zone of your country and city. +05|$PRC_WIDTH = 80`Default presentation width for pages. +08|$LOG_PATH = ../../dbLifeLog/`Path to folder containing data. +10|$SESSN_EXPR = +30m`Login session expiration time setting, can be seconds, minutes or hours. +12|$DATE_UNI = 0`Setting of how dates are displayed, universal yyyy-mm-dd or local dd-mm-yyyy. +14|$LANGUAGE = English`Default language locale. +18|$IMG_W_H = 210x120`Default embedded image width. +20|$AUTO_WRD_LMT= 1024`Autocomplete word gathering limit. +22|$AUTO_LOGIN = 0`Autologin option, that expires only if login out. Enter Credentials in main.cnf. +23|$AUTO_LOGOFF = 0`Auto logoff on session expires, default is false. +24|$FRAME_SIZE = 0`Youtube frame size settings, 0 - Large, 1 - Medium, 2- Small. +26|$RTF_SIZE = 2`RTF Document height, 0 - Large, 1 - Medium, 2- Small. +28|$THEME = Standard`Theme to apply, Standard, Sun, Moon, Earth. +30|$DEBUG = 0`Development page additional debug output, off (default) or on. +32|$KEEP_EXCS = 0`Cache excludes between sessions, off (default) or on. +34|$VIEW_ALL_LMT=1000`Limit of all records displayed for large logs. Set to 0, for unlimited. +36|$TRACK_LOGINS=1`Create system logs on login/logout of Life Log. +38|$COMPRESS_ENC=0`Compress Encode pages, default -> 0=false, 1=true. +40|$SUBPAGEDIR =docs`Directory to scan for subpages like documents. +42|$DISP_ALL = 1`Display whole log entry, default -> 1=true, 0=false for display single line only. +44|$TRANSPARENCY= 1`Should log panel be transparent, default is yes or on. +50|$CURR_SYMBOL = $`Currency symbol. +52|$AUDIO_ENABLED=1`Enable/Disable audio on some events and actions. +>> +< +01|Unspecified `For quick uncategorized entries. +03|File System `Operating file system/Application short log. +06|System Log `Operating system important log. +09|Event `Event that occurred, meeting, historically important. +28|Personal `Personal log of historical importance, diary type. +32|Expense `Significant yearly expense. +35|Income `Significant yearly income. +40|Work `Work related entry, worth monitoring. +45|Food `Quick reference to recipes, observations. +50|Music `Music reference of interest. Youtube embedded. +52|Sport/Club `Sport or Social related entry. +55|Cars `Car(s) related entry. +60|Online `Online purchases (ebay, or received/ordered from online source). +88|Diary `Diary specific log and entry. Your daily yaddi-yadda that have decided to place here. +90|Fitness `Fitness steps, news, info, and useful links. Amount is steps. +>> +< +NOTES|DROP TABLE NOTES;' ver. 1.5 fts4 virtual tables have been scratched as they require special SQLite compilation. +LOG<5>|Run Query ' ver. 1.5 + +## HELP SECTION ON OPTIONS + + + Global view overrides. These get generated in the db if set on logon. And used instead of the normal data view. + Overrides must always show todays log entries, regardless of criteria. + Overrides don't affect category and keywords desired searches and views. They are mainly useful to filter out + the not required to see on the main pages. + NOTE - These settings AND on VW_LOG_WITH_EXCLUDES if they are set. VW_ prefix signifies, database view, + meaning this will be created. Based on the settings bellow you make. An interesting concept, don't you think? + +### PAGE_VIEW_EXCLUDES + + Setting to modify the page view to exclude older log entries by a list of categories from today minus days back. + This is to avoid and page only list relevant logs on logon. Searching by category will list them and still make visible. + value: {days=}{category id},.. days default to zero, if you don't want from yesterday to the past category entries listed. + +< <- (Diary,System Log,Poetry) category id's only, does set in the config page also work. + + +### VIEW_OVERRIDE_SYSLOGS overrides not to show system logs that are older than today. Same to CAT!=6 by default, +# Default is 0, disabled. + +### VIEW_OVERRIDE_WHERE + + This option overrides what log entries to filter out from the page view, in more detail. + It translated via keywords to appropriate required SQL. This filter by default is + not active on 24 hours old entries. PAGE_VIEW_EXCLUDES option entries are included. + +#### CAT is the ID_CAT column, keyword. +* i.e VIEW_OVERRIDE_WHERE= 6>, selects all categories from and category id 6. +PAGE_VIEW_EXCLUDES and VIEW_OVERRIDE_SYSLOGS don't have to be set. But preside if set. + +#### AND/OR keyword, logically joins the instructions. +* i.e VIEW_OVERRIDE_WHERE< CAT > 6 AND CAT != 'Personal' >, selects all categories from +category id 6, excluding resolved category entries. + +#### OLDER_THAN keyword translates to date column older than from today up to an specified date in the past. +* This is assigned by either months, days, hours. +** i.e VIEW_OVERRIDE_WHERE, this instructs skip older then to months logs and all sys logs. + +#### FROM/TO in either months, days, hours. +* Selects only FROM or TO an specified date only log entries. +** i.e VIEW_OVERRIDE_WHERE + +#### NOT keyword, logically negates. +** i.e VIEW_OVERRIDE_WHERE, select only log entries that contain attached RTF documents, if they +are older than 24 hours. Remember, the default filtering is on 24 hour and older log entries. +** i.e VIEW_OVERRIDE_WHERE, don't select log entries that contain attached RTF documents. +** i.e VIEW_OVERRIDE_WHERE, +category is not (!=), resolved category id by name. And also exclude all logs older than an year. +All is FROM to OLDER_THAN, affected. So from today (now) to FROM 'will' be paged, visible. diff --git a/dbLifeLog/zone.csv b/dbLifeLog/zone.csv new file mode 100644 index 0000000..4177f71 --- /dev/null +++ b/dbLifeLog/zone.csv @@ -0,0 +1,425 @@ +"1","AD","Europe/Andorra" +"2","AE","Asia/Dubai" +"3","AF","Asia/Kabul" +"4","AG","America/Antigua" +"5","AI","America/Anguilla" +"6","AL","Europe/Tirane" +"7","AM","Asia/Yerevan" +"8","AO","Africa/Luanda" +"9","AQ","Antarctica/McMurdo" +"10","AQ","Antarctica/Casey" +"11","AQ","Antarctica/Davis" +"12","AQ","Antarctica/DumontDUrville" +"13","AQ","Antarctica/Mawson" +"14","AQ","Antarctica/Palmer" +"15","AQ","Antarctica/Rothera" +"16","AQ","Antarctica/Syowa" +"17","AQ","Antarctica/Troll" +"18","AQ","Antarctica/Vostok" +"19","AR","America/Argentina/Buenos_Aires" +"20","AR","America/Argentina/Cordoba" +"21","AR","America/Argentina/Salta" +"22","AR","America/Argentina/Jujuy" +"23","AR","America/Argentina/Tucuman" +"24","AR","America/Argentina/Catamarca" +"25","AR","America/Argentina/La_Rioja" +"26","AR","America/Argentina/San_Juan" +"27","AR","America/Argentina/Mendoza" +"28","AR","America/Argentina/San_Luis" +"29","AR","America/Argentina/Rio_Gallegos" +"30","AR","America/Argentina/Ushuaia" +"31","AS","Pacific/Pago_Pago" +"32","AT","Europe/Vienna" +"33","AU","Australia/Lord_Howe" +"34","AU","Antarctica/Macquarie" +"35","AU","Australia/Hobart" +"36","AU","Australia/Currie" +"37","AU","Australia/Melbourne" +"38","AU","Australia/Sydney" +"39","AU","Australia/Broken_Hill" +"40","AU","Australia/Brisbane" +"41","AU","Australia/Lindeman" +"42","AU","Australia/Adelaide" +"43","AU","Australia/Darwin" +"44","AU","Australia/Perth" +"45","AU","Australia/Eucla" +"46","AW","America/Aruba" +"47","AX","Europe/Mariehamn" +"48","AZ","Asia/Baku" +"49","BA","Europe/Sarajevo" +"50","BB","America/Barbados" +"51","BD","Asia/Dhaka" +"52","BE","Europe/Brussels" +"53","BF","Africa/Ouagadougou" +"54","BG","Europe/Sofia" +"55","BH","Asia/Bahrain" +"56","BI","Africa/Bujumbura" +"57","BJ","Africa/Porto-Novo" +"58","BL","America/St_Barthelemy" +"59","BM","Atlantic/Bermuda" +"60","BN","Asia/Brunei" +"61","BO","America/La_Paz" +"62","BQ","America/Kralendijk" +"63","BR","America/Noronha" +"64","BR","America/Belem" +"65","BR","America/Fortaleza" +"66","BR","America/Recife" +"67","BR","America/Araguaina" +"68","BR","America/Maceio" +"69","BR","America/Bahia" +"70","BR","America/Sao_Paulo" +"71","BR","America/Campo_Grande" +"72","BR","America/Cuiaba" +"73","BR","America/Santarem" +"74","BR","America/Porto_Velho" +"75","BR","America/Boa_Vista" +"76","BR","America/Manaus" +"77","BR","America/Eirunepe" +"78","BR","America/Rio_Branco" +"79","BS","America/Nassau" +"80","BT","Asia/Thimphu" +"81","BW","Africa/Gaborone" +"82","BY","Europe/Minsk" +"83","BZ","America/Belize" +"84","CA","America/St_Johns" +"85","CA","America/Halifax" +"86","CA","America/Glace_Bay" +"87","CA","America/Moncton" +"88","CA","America/Goose_Bay" +"89","CA","America/Blanc-Sablon" +"90","CA","America/Toronto" +"91","CA","America/Nipigon" +"92","CA","America/Thunder_Bay" +"93","CA","America/Iqaluit" +"94","CA","America/Pangnirtung" +"95","CA","America/Atikokan" +"96","CA","America/Winnipeg" +"97","CA","America/Rainy_River" +"98","CA","America/Resolute" +"99","CA","America/Rankin_Inlet" +"100","CA","America/Regina" +"101","CA","America/Swift_Current" +"102","CA","America/Edmonton" +"103","CA","America/Cambridge_Bay" +"104","CA","America/Yellowknife" +"105","CA","America/Inuvik" +"106","CA","America/Creston" +"107","CA","America/Dawson_Creek" +"108","CA","America/Fort_Nelson" +"109","CA","America/Vancouver" +"110","CA","America/Whitehorse" +"111","CA","America/Dawson" +"112","CC","Indian/Cocos" +"113","CD","Africa/Kinshasa" +"114","CD","Africa/Lubumbashi" +"115","CF","Africa/Bangui" +"116","CG","Africa/Brazzaville" +"117","CH","Europe/Zurich" +"118","CI","Africa/Abidjan" +"119","CK","Pacific/Rarotonga" +"120","CL","America/Santiago" +"121","CL","America/Punta_Arenas" +"122","CL","Pacific/Easter" +"123","CM","Africa/Douala" +"124","CN","Asia/Shanghai" +"125","CN","Asia/Urumqi" +"126","CO","America/Bogota" +"127","CR","America/Costa_Rica" +"128","CU","America/Havana" +"129","CV","Atlantic/Cape_Verde" +"130","CW","America/Curacao" +"131","CX","Indian/Christmas" +"132","CY","Asia/Nicosia" +"133","CY","Asia/Famagusta" +"134","CZ","Europe/Prague" +"135","DE","Europe/Berlin" +"136","DE","Europe/Busingen" +"137","DJ","Africa/Djibouti" +"138","DK","Europe/Copenhagen" +"139","DM","America/Dominica" +"140","DO","America/Santo_Domingo" +"141","DZ","Africa/Algiers" +"142","EC","America/Guayaquil" +"143","EC","Pacific/Galapagos" +"144","EE","Europe/Tallinn" +"145","EG","Africa/Cairo" +"146","EH","Africa/El_Aaiun" +"147","ER","Africa/Asmara" +"148","ES","Europe/Madrid" +"149","ES","Africa/Ceuta" +"150","ES","Atlantic/Canary" +"151","ET","Africa/Addis_Ababa" +"152","FI","Europe/Helsinki" +"153","FJ","Pacific/Fiji" +"154","FK","Atlantic/Stanley" +"155","FM","Pacific/Chuuk" +"156","FM","Pacific/Pohnpei" +"157","FM","Pacific/Kosrae" +"158","FO","Atlantic/Faroe" +"159","FR","Europe/Paris" +"160","GA","Africa/Libreville" +"161","GB","Europe/London" +"162","GD","America/Grenada" +"163","GE","Asia/Tbilisi" +"164","GF","America/Cayenne" +"165","GG","Europe/Guernsey" +"166","GH","Africa/Accra" +"167","GI","Europe/Gibraltar" +"168","GL","America/Godthab" +"169","GL","America/Danmarkshavn" +"170","GL","America/Scoresbysund" +"171","GL","America/Thule" +"172","GM","Africa/Banjul" +"173","GN","Africa/Conakry" +"174","GP","America/Guadeloupe" +"175","GQ","Africa/Malabo" +"176","GR","Europe/Athens" +"177","GS","Atlantic/South_Georgia" +"178","GT","America/Guatemala" +"179","GU","Pacific/Guam" +"180","GW","Africa/Bissau" +"181","GY","America/Guyana" +"182","HK","Asia/Hong_Kong" +"183","HN","America/Tegucigalpa" +"184","HR","Europe/Zagreb" +"185","HT","America/Port-au-Prince" +"186","HU","Europe/Budapest" +"187","ID","Asia/Jakarta" +"188","ID","Asia/Pontianak" +"189","ID","Asia/Makassar" +"190","ID","Asia/Jayapura" +"191","IE","Europe/Dublin" +"192","IL","Asia/Jerusalem" +"193","IM","Europe/Isle_of_Man" +"194","IN","Asia/Kolkata" +"195","IO","Indian/Chagos" +"196","IQ","Asia/Baghdad" +"197","IR","Asia/Tehran" +"198","IS","Atlantic/Reykjavik" +"199","IT","Europe/Rome" +"200","JE","Europe/Jersey" +"201","JM","America/Jamaica" +"202","JO","Asia/Amman" +"203","JP","Asia/Tokyo" +"204","KE","Africa/Nairobi" +"205","KG","Asia/Bishkek" +"206","KH","Asia/Phnom_Penh" +"207","KI","Pacific/Tarawa" +"208","KI","Pacific/Enderbury" +"209","KI","Pacific/Kiritimati" +"210","KM","Indian/Comoro" +"211","KN","America/St_Kitts" +"212","KP","Asia/Pyongyang" +"213","KR","Asia/Seoul" +"214","KW","Asia/Kuwait" +"215","KY","America/Cayman" +"216","KZ","Asia/Almaty" +"217","KZ","Asia/Qyzylorda" +"218","KZ","Asia/Qostanay" +"219","KZ","Asia/Aqtobe" +"220","KZ","Asia/Aqtau" +"221","KZ","Asia/Atyrau" +"222","KZ","Asia/Oral" +"223","LA","Asia/Vientiane" +"224","LB","Asia/Beirut" +"225","LC","America/St_Lucia" +"226","LI","Europe/Vaduz" +"227","LK","Asia/Colombo" +"228","LR","Africa/Monrovia" +"229","LS","Africa/Maseru" +"230","LT","Europe/Vilnius" +"231","LU","Europe/Luxembourg" +"232","LV","Europe/Riga" +"233","LY","Africa/Tripoli" +"234","MA","Africa/Casablanca" +"235","MC","Europe/Monaco" +"236","MD","Europe/Chisinau" +"237","ME","Europe/Podgorica" +"238","MF","America/Marigot" +"239","MG","Indian/Antananarivo" +"240","MH","Pacific/Majuro" +"241","MH","Pacific/Kwajalein" +"242","MK","Europe/Skopje" +"243","ML","Africa/Bamako" +"244","MM","Asia/Yangon" +"245","MN","Asia/Ulaanbaatar" +"246","MN","Asia/Hovd" +"247","MN","Asia/Choibalsan" +"248","MO","Asia/Macau" +"249","MP","Pacific/Saipan" +"250","MQ","America/Martinique" +"251","MR","Africa/Nouakchott" +"252","MS","America/Montserrat" +"253","MT","Europe/Malta" +"254","MU","Indian/Mauritius" +"255","MV","Indian/Maldives" +"256","MW","Africa/Blantyre" +"257","MX","America/Mexico_City" +"258","MX","America/Cancun" +"259","MX","America/Merida" +"260","MX","America/Monterrey" +"261","MX","America/Matamoros" +"262","MX","America/Mazatlan" +"263","MX","America/Chihuahua" +"264","MX","America/Ojinaga" +"265","MX","America/Hermosillo" +"266","MX","America/Tijuana" +"267","MX","America/Bahia_Banderas" +"268","MY","Asia/Kuala_Lumpur" +"269","MY","Asia/Kuching" +"270","MZ","Africa/Maputo" +"271","NA","Africa/Windhoek" +"272","NC","Pacific/Noumea" +"273","NE","Africa/Niamey" +"274","NF","Pacific/Norfolk" +"275","NG","Africa/Lagos" +"276","NI","America/Managua" +"277","NL","Europe/Amsterdam" +"278","NO","Europe/Oslo" +"279","NP","Asia/Kathmandu" +"280","NR","Pacific/Nauru" +"281","NU","Pacific/Niue" +"282","NZ","Pacific/Auckland" +"283","NZ","Pacific/Chatham" +"284","OM","Asia/Muscat" +"285","PA","America/Panama" +"286","PE","America/Lima" +"287","PF","Pacific/Tahiti" +"288","PF","Pacific/Marquesas" +"289","PF","Pacific/Gambier" +"290","PG","Pacific/Port_Moresby" +"291","PG","Pacific/Bougainville" +"292","PH","Asia/Manila" +"293","PK","Asia/Karachi" +"294","PL","Europe/Warsaw" +"295","PM","America/Miquelon" +"296","PN","Pacific/Pitcairn" +"297","PR","America/Puerto_Rico" +"298","PS","Asia/Gaza" +"299","PS","Asia/Hebron" +"300","PT","Europe/Lisbon" +"301","PT","Atlantic/Madeira" +"302","PT","Atlantic/Azores" +"303","PW","Pacific/Palau" +"304","PY","America/Asuncion" +"305","QA","Asia/Qatar" +"306","RE","Indian/Reunion" +"307","RO","Europe/Bucharest" +"308","RS","Europe/Belgrade" +"309","RU","Europe/Kaliningrad" +"310","RU","Europe/Moscow" +"311","RU","Europe/Simferopol" +"312","RU","Europe/Kirov" +"313","RU","Europe/Astrakhan" +"314","RU","Europe/Volgograd" +"315","RU","Europe/Saratov" +"316","RU","Europe/Ulyanovsk" +"317","RU","Europe/Samara" +"318","RU","Asia/Yekaterinburg" +"319","RU","Asia/Omsk" +"320","RU","Asia/Novosibirsk" +"321","RU","Asia/Barnaul" +"322","RU","Asia/Tomsk" +"323","RU","Asia/Novokuznetsk" +"324","RU","Asia/Krasnoyarsk" +"325","RU","Asia/Irkutsk" +"326","RU","Asia/Chita" +"327","RU","Asia/Yakutsk" +"328","RU","Asia/Khandyga" +"329","RU","Asia/Vladivostok" +"330","RU","Asia/Ust-Nera" +"331","RU","Asia/Magadan" +"332","RU","Asia/Sakhalin" +"333","RU","Asia/Srednekolymsk" +"334","RU","Asia/Kamchatka" +"335","RU","Asia/Anadyr" +"336","RW","Africa/Kigali" +"337","SA","Asia/Riyadh" +"338","SB","Pacific/Guadalcanal" +"339","SC","Indian/Mahe" +"340","SD","Africa/Khartoum" +"341","SE","Europe/Stockholm" +"342","SG","Asia/Singapore" +"343","SH","Atlantic/St_Helena" +"344","SI","Europe/Ljubljana" +"345","SJ","Arctic/Longyearbyen" +"346","SK","Europe/Bratislava" +"347","SL","Africa/Freetown" +"348","SM","Europe/San_Marino" +"349","SN","Africa/Dakar" +"350","SO","Africa/Mogadishu" +"351","SR","America/Paramaribo" +"352","SS","Africa/Juba" +"353","ST","Africa/Sao_Tome" +"354","SV","America/El_Salvador" +"355","SX","America/Lower_Princes" +"356","SY","Asia/Damascus" +"357","SZ","Africa/Mbabane" +"358","TC","America/Grand_Turk" +"359","TD","Africa/Ndjamena" +"360","TF","Indian/Kerguelen" +"361","TG","Africa/Lome" +"362","TH","Asia/Bangkok" +"363","TJ","Asia/Dushanbe" +"364","TK","Pacific/Fakaofo" +"365","TL","Asia/Dili" +"366","TM","Asia/Ashgabat" +"367","TN","Africa/Tunis" +"368","TO","Pacific/Tongatapu" +"369","TR","Europe/Istanbul" +"370","TT","America/Port_of_Spain" +"371","TV","Pacific/Funafuti" +"372","TW","Asia/Taipei" +"373","TZ","Africa/Dar_es_Salaam" +"374","UA","Europe/Kiev" +"375","UA","Europe/Uzhgorod" +"376","UA","Europe/Zaporozhye" +"377","UG","Africa/Kampala" +"378","UM","Pacific/Midway" +"379","UM","Pacific/Wake" +"380","US","America/New_York" +"381","US","America/Detroit" +"382","US","America/Kentucky/Louisville" +"383","US","America/Kentucky/Monticello" +"384","US","America/Indiana/Indianapolis" +"385","US","America/Indiana/Vincennes" +"386","US","America/Indiana/Winamac" +"387","US","America/Indiana/Marengo" +"388","US","America/Indiana/Petersburg" +"389","US","America/Indiana/Vevay" +"390","US","America/Chicago" +"391","US","America/Indiana/Tell_City" +"392","US","America/Indiana/Knox" +"393","US","America/Menominee" +"394","US","America/North_Dakota/Center" +"395","US","America/North_Dakota/New_Salem" +"396","US","America/North_Dakota/Beulah" +"397","US","America/Denver" +"398","US","America/Boise" +"399","US","America/Phoenix" +"400","US","America/Los_Angeles" +"401","US","America/Anchorage" +"402","US","America/Juneau" +"403","US","America/Sitka" +"404","US","America/Metlakatla" +"405","US","America/Yakutat" +"406","US","America/Nome" +"407","US","America/Adak" +"408","US","Pacific/Honolulu" +"409","UY","America/Montevideo" +"410","UZ","Asia/Samarkand" +"411","UZ","Asia/Tashkent" +"412","VA","Europe/Vatican" +"413","VC","America/St_Vincent" +"414","VE","America/Caracas" +"415","VG","America/Tortola" +"416","VI","America/St_Thomas" +"417","VN","Asia/Ho_Chi_Minh" +"418","VU","Pacific/Efate" +"419","WF","Pacific/Wallis" +"420","WS","Pacific/Apia" +"421","YE","Asia/Aden" +"422","YT","Indian/Mayotte" +"423","ZA","Africa/Johannesburg" +"424","ZM","Africa/Lusaka" +"425","ZW","Africa/Harare" diff --git a/htdocs/cgi-bin/.redirect b/htdocs/cgi-bin/.redirect new file mode 100644 index 0000000..921792d --- /dev/null +++ b/htdocs/cgi-bin/.redirect @@ -0,0 +1 @@ +/cgi-bin/ /cgi-bin/main.cgi diff --git a/htdocs/cgi-bin/CNFServices.cgi b/htdocs/cgi-bin/CNFServices.cgi new file mode 100755 index 0000000..651e8aa --- /dev/null +++ b/htdocs/cgi-bin/CNFServices.cgi @@ -0,0 +1,134 @@ +#!/usr/bin/env perl +# CNF Services operator. The plugins and services themselve should return html. +# Idea is that this CGI file contains the actuall CNF to interact in realtime with a web page. +# +use v5.30; +use strict; +use warnings; +use Exception::Class ('CNFHTMLServiceError'); +use Syntax::Keyword::Try; +use utf8; +use CGI::Tiny; +use Path::Tiny; +no warnings qw(experimental::signatures); +use feature qw(signatures); +## +# We use dynamic perl compilations. The following ONLY HERE required to carp to browser on +# system requirments or/and unexpected perl compiler errors. +## +use CGI::Carp qw(fatalsToBrowser set_message); + +## +# This is a entry point script (main). +## +use lib::relative "system/modules"; +require CNFParser; +require CNFNode; + +our $GLOB_HTML_SERVE = "'{}/*.cgi' '{}/*.htm' '{}/*.html' '{}/*.md' '{}/*.txt'"; +our $script_path = $0; $script_path =~ s/\w+.cgi$//; +use constant LOG_Settings =>q( +<<@<%LOG> + file = web_server.log + # Should it mirror to console too? + console = 0 + # Disable/enable output to file at all? + enabled = 0 + # Tail size cut, set to 0 if no tail cutting is desired. + tail = 1000 +>> +); + +cgi { + my $cgi = $_; + $cgi->set_error_handler( + sub { + my ($cgi, $error, $rendered) = @_; + chomp $error; + $cgi->render(text=>qq(You have unfortunately hit an cgi-bin::CNFHTMLServiceError +
$error

+ + ) + ); + } + ); + exit CNFHTMLService($cgi); +}; + + +sub CNFHTMLService { + + my ($cgi,$ptr) = (shift, undef); + my $cnf = CNFParser -> new (undef,{ DO_ENABLED => 1, HAS_EXTENSIONS=>1, ANONS_ARE_PUBLIC => 1, CGI=>$cgi }); + $cnf->parse(undef,_getServiceScript($cgi)); + $ptr = $cnf->data(); + $ptr = $ptr->{'PAGE'}; + #say $$ptr if $ptr; + $cgi -> render(text=>$$ptr); + return 0 +} + +sub _getServiceScript($cgi) { + my $service = $cgi->param('service'); + unless ($service){ + $cgi->set_response_status(404); + CNFHTMLServiceError->throw(error=>'The Service parameter \'service\' is not set!', show_trace=>1); + } + if($service eq 'feeds'){ + return _CNF_Script_For_Feeds(); + } +} + +sub _CNF_Script_For_Feeds { +LOG_Settings . <<__CNF_IS_COOL__; +< + + RUN_FEEDS = yes + CONVERT_TO_CNF_NODES = yes + OUTPUT_TO_CONSOLE = false + OUTPUT_TO_MD = no + BENCHMARK = no + TZ=Australia/Sydney + OUTPUT_DIR = "./rss_output" + + + CONVERT_CNF_HTML = yes + CNF_TREE_STORE = true + + package : RSSFeedsPlugin + subroutine : process + property : RSS_FEEDS + +>> +// Following is a table having a list of details for available RSS feeds to process. +|| The more rows have here the longer it takes to fetch them, what is it, once a day, week, month? +<< RSS_FEEDS +ID`Name`URL`Description~ +#`CPAN`http://search.cpan.org/uploads.rdf`CPAN modules news and agenda.~ +#`The Perl Foundation RSS Feed`https://news.perlfoundation.org/rss.xml`The Perl Foundation is dedicated to the advancement +of the Perl programming language through open discussion, collaboration, design, and code. + The Perl Foundation is a non-profit organization* based in Holland, Michigan~ +#`Perl Weekly`https://perlweekly.com/perlweekly.rss`A free, once a week e-mail round-up of hand-picked news and articles about Perl. +The Perl Weekly ( http://perlweekly.com/ ) is a newsletter including links to blog posts and other news items + related to the Perl programming language.~ +#`The Cipher Brief RSS Feed`https://www.thecipherbrief.com/feed`The Cipher Brief is the go-to digital platform for the latest security news and high-level analysis. Each day, we offer multiple expert perspectives, engaging the private sector to find solutions and foster dialogue on what events mean for businesses and organizations around the world. More than just reporting on the news, The Cipher Brief helps readers understand what the news means to you.~ +#`Viral Now`https://viralnow.uk/feed/`ViralNow is a dynamic online platform at the forefront of curating and delivering trending and viral content. ViralNow brings you the latest and most engaging stories, videos, and articles from around the world.~ +#`The Sydney Morning Herald - World RSS Feed`http://www.smh.com.au/rssheadlines/world/article/rss.xml`The Sydney Morning Herald is Australia's leading news source. The Sydney Morning Herald sets the standard for journalistic excellence for Sydney, Australia, and the rest of the world. From breaking news, to travel and fashion, The Sydney Morning Herald continues to transform the way Australians get their news.~ +#`Life Hacker`https://lifehacker.com/rss`Lifehacker’s an award-winning daily blog that features tips, shortcuts, and downloads that help you work and live smarter and more efficiently.~ +#`Politico`http://www.politico.com/rss/politicopicks.xml`POLITICO strives to be the dominant source for news on politics and policy in power centers across every continent where access to reliable information, nonpartisan journ.lism and real-time tools create, inform and engage a global citizenry.~ +>> + +__CNF_IS_COOL__ +} + +__END__ + +=begin copyright +Programed by : Will Budic +EContactHash : 990MWWLWM8C2MI8K (https://github.com/wbudic/EContactHash.md) +Source : https://github.com/wbudic/LifeLog + This source file is copied and usually placed in a local directory, outside of its repository project. + So it could not be the actual or current version, can vary or has been modiefied for what ever purpose in another project. + Please leave source of origin in this file for future references. +Open Source Code License -> https://github.com/wbudic/PerlCNF/blob/master/ISC_License.md +=cut copyright \ No newline at end of file diff --git a/htdocs/cgi-bin/config.cgi b/htdocs/cgi-bin/config.cgi new file mode 100755 index 0000000..207f220 --- /dev/null +++ b/htdocs/cgi-bin/config.cgi @@ -0,0 +1,1874 @@ +#!/usr/bin/env perl +# +# Programed by: Will Budic +# Open Source License -> https://choosealicense.com/licenses/isc/ +# +use v5.30; +use strict; +use warnings; + +use DBI; +use DBD::Pg; +use DBD::Pg qw(:pg_types); +use Exception::Class ('LifeLogException'); +use Syntax::Keyword::Try; +use CGI; + +use DateTime::Format::SQLite; +use Date::Language; +use Capture::Tiny ':all'; +use Text::CSV; +use Scalar::Util qw(looks_like_number); +use Sys::Syslog qw(:DEFAULT :standard :macros); #openLog, closelog macros +use Compress::Zlib; +use bignum qw/hex/; + +#DEFAULT SETTINGS HERE! +use lib "system/modules"; +require Settings; +require CNFParser; #<- Only ever used here, as for best performance CNF2.2 type particulars are only needed. + +#15mg data post limit +$CGI::POST_MAX = 1024 * 15000; +## + +my ( $RDS, $TR_STATUS, $LOGOUT, $ERROR ) = ( "", "", 0, "" ); +my $sys = `uname -n`; +my $db = Settings::fetchDBSettings(); +my $cgi = Settings->cgi(); +my $sid = Settings::sid(); +my $dbname = Settings::dbName(); +my $alias = Settings::alias(); +my $rv; +my $dbs; +my $lang = Date::Language->new( Settings::language() ); +my $today = Settings::today(); +my $tz = $cgi->param('tz'); +my $csvp = $cgi->param('csv'); +my $CID = 'rowid'; +$CID = 'ID' if Settings::isProgressDB(); + +exportToCSV() if ($csvp); +if ( $cgi->param('bck') ) { &backup } #?bck=1 (js set) +elsif ( $_ = $cgi->param('bck_del') ) { + backupDelete($_); +} #?bck_del=... (js set) +elsif ( $cgi->param('bck_upload') ) { &restore } #upload backup (form set) +elsif ( $_ = $cgi->param('bck_file') ) { restore($_) } +elsif ( $cgi->param('data_cat') ) { &importCatCSV } +elsif ( $cgi->param('data_log') ) { &importLogCSV } + +my $stmtCat = 'SELECT * FROM CAT ORDER BY ID;'; +my $status = $RDS = "Ready for change!"; +my $cats; +my %hshCats = (); +cats(); +############### +processSubmit(); +############### +Settings::setupTheme(); +Settings::session()->param( "theme", Settings::theme('css') ); +Settings::session()->param( "bgcolor", Settings::bgcol() ); +getHeader(); + +if ($ERROR) { &error; } +else { + print +qq(); +} + +my $tbl = ' + + '; +my $foot = ""; +$dbs = Settings::selectRecords( $db, $stmtCat ); +while ( my @row = $dbs->fetchrow_array() ) { + if ( $row[0] > 0 ) { + $tbl .= ' + + + '; + } +} + +my $frmCats = qq( + ) . $tbl . qq( + + + + + + + + + + + + +
* CATEGORIES CONFIGURATION *
IDCategoryDescription
' . $row[0] . '
    + or Categories Configuration In -> $dbname  +
WARNING! + Removing or changing categories is permanent! Each category one must have an unique ID. + Blank a category name to remove it. LOG records will change to the + Unspecified (id 1) category! And the categories Unspecified, Income and Expense can't be removed! +
+

); + +$tbl = + qq($TR_STATUS + + + + + + + ); +my $stm = 'SELECT ID, NAME, VALUE, DESCRIPTION FROM CONFIG ORDER BY NAME;'; +$dbs = Settings::selectRecords( $db, $stm ); +my $REL = ""; + +while ( my @row = $dbs->fetchrow_array() ) { + + my $n = $row[1]; + next if ( $n =~ m/^\^/ ); #skip private tagged settings + my $i = $row[0]; + my $v = $row[2]; + my $d = $row[3]; + $d = "" if !$d; + + if ( $n eq "TIME_ZONE" ) { + $n = '' . $n . ''; + if ($tz) { + $v = $tz; + } + $v = + ''; + $d = '[' . $d . ']'; + } + elsif ( $n eq "DATE_UNI" ) { + my ( $l, $u ) = ( "", "" ); + if ( $v == 0 ) { + $l = "SELECTED"; + } + else { + $u = "SELECTED"; + } + $v = qq(); + } + elsif ( $n eq "AUTO_LOGIN" ) { + my ( $l, $u ) = ( "", "" ); + if ( $v == 0 ) { + $l = "SELECTED"; + } + else { + $u = "SELECTED"; + } + $v = qq(); + } + elsif ( $n eq "FRAME_SIZE" ) { + my ( $l, $m, $s, $t ) = ( "", "", "", "" ); + if ( $v == 0 ) { + $l = "SELECTED"; + } + elsif ( $v == 1 ) { + $m = "SELECTED"; + } + elsif ( $v == 2 ) { + $s = "SELECTED"; + } + else { + $t = $v; + } + $v = qq(); + } + elsif ( $n eq "RTF_SIZE" ) { + my ( $l, $m, $s, $t ) = ( "", "", "", "" ); + if ( $v == 0 ) { + $l = "SELECTED"; + } + elsif ( $v == 1 ) { + $m = "SELECTED"; + } + elsif ( $v == 2 ) { + $s = "SELECTED"; + } + else { + $t = $v; + } + $v = qq(); + + } + elsif ( $n eq "THEME" ) { + my ( $s0, $s1, $s2, $s3 ) = ( "", "", "", "" ); + if ( $v eq 'Standard' ) { + $s0 = " SELECTED"; + } + elsif ( $v eq 'Sun' ) { + $s1 = " SELECTED"; + } + elsif ( $v eq 'Moon' ) { + $s2 = " SELECTED"; + } + elsif ( $v eq 'Earth' ) { + $s3 = " SELECTED"; + } + + $v = qq(); + } + elsif ( $n eq "RELEASE_VER" ) { + $REL = qq( + + ); + next; + } + elsif ( $n eq "COMPRESS_ENC" ) { + my ( $l, $u ) = ( "", "" ); + if ( $v == 0 ) { + $l = "SELECTED"; + } + else { + $u = "SELECTED"; + } + $v = qq(); + } + elsif ( $n eq "DISP_ALL" or $n eq 'AUDIO_ENABLED') { + my ( $l, $u ) = ( "", "" ); + if ( $v == 0 ) { + $l = "SELECTED"; + } + else { + $u = "SELECTED"; + } + $v = qq(); + } + elsif ($n eq "KEEP_EXCS" + or $n eq 'TRACK_LOGINS' + or $n eq 'DEBUG' + or $n eq 'TRANSPARENCY' + or $n eq 'AUTO_LOGOFF') { + my ( $l, $u ) = ( "", "" ); + if ( $v == 0 ) { + $l = "SELECTED"; + } + else { + $u = "SELECTED"; + } + $v = qq(); + } + elsif ( $n eq 'SUBPAGEDIR' + or !defined( Settings::anon($n) ) ) + { #change into settable field to us found here unknown and not anon. + + + + ); + + if ( $i < 300 ) { $tbl .= $tr } + else { $foot .= $tr } +} + +$tbl = qq($tbl$foot$REL) + ; #RELEASE VERSION we make to outstand last, can't be changed. :) + +my $frmVars = qq( + $tbl + + + + + + + +
* SYSTEM CONFIGURATION *
VariableValueDescription
$n$v$d'; + } + my $tr = qq(
$n$v$d
System Settings In -> $dbname 
Note - Use DB Fix to reset this system settings to factory defaults.

); + +$tbl = qq( + + ); + +my $frmDB = qq( + $tbl + + + + + + + + + + + + +
* DATA FIX *
Extra ActionDescription
Reset SettingsResets system settings to default values.
Wipe SettingsWipes system settings to be forced from the config file (will initiate logoff).
Reset CategoriesResets Categories to factory values (will initiate logoff).
Delete by Category
+ $cats
Selects and displays by category logs to delete.
Delete from Date
+
Selects and displays from a date to into deep past logs to delete..
Data maintenance for -> $dbname 
Perform this change/check in the event of experiencing data problems. Or periodically for data check and maintenance.
+ Use 'Reset Settings' option to revert to current stored configuration. The changes you made since installation.
+ Use the 'Wipe Settings' option if updating the application or need new defaults from main.cnf config file.
+ Select both to reset and wipe, to overwrite all changes you made to config file settings.
+ WARNING! Checking any of the above extra actions will cause loss + of your changes. Please, export/backup first.

+ ); +$tbl = qq( + + ); +my $frmPASS = qq( + $tbl + + + + + + + +
* CHANGE PASS *
Existing:
New:
Confirmation:
Pass change for -> $alias 
WARNING! Changing passwords will make past backups unusuable.

+ ); +$frmPASS = qq(Password changing has been dissabled!) + if Settings::isProgressDB(); + +my @backups = (); +my ( $file, $bck_list ) = ""; +opendir my $dir, &Settings::logPath; +while ( $file = readdir $dir ) { + next if $file eq '.' or $file eq '..' or index( $file, 'bck_' ) == -1; + push @backups, $file; +} +close $dir; +foreach my $file ( sort @backups ) { + + #my $n = substr $file, length(&Settings::logPath); + $bck_list .= +"$file
"; +} +if ( length $bck_list == 0 ) { + $bck_list = +'

Restore will bring back and merge log entries from the time of backup.

+ + '; +} +else { + $bck_list = + qq(

Tick Select Backup to Restore or Delete

$bck_list

+   ); +} + +my $inpRestore = qq(Local File:   +  ); + +my $inpCVS = +qq(  +); +if ( ( Settings::anon("backup_enabled") == 0 ) ) { + $inpRestore = $inpCVS = + ' Sorry this feature has been dissabled!'; +} + +# +# Page printout from here! +# +print qq( +
+
$frmVars
+
$frmCats
+
$frmDB
+
$frmPASS
+
+  Configuration status -> $status  +
+
+
+ + + + + + + + + + + + + + + + + + + + + + +

Backup File Format


$bck_list

Notice - Uploads might fail on large backups, corrupt file, and/or due to browser settings.
+
+ $inpRestore + +

+

CSV File Format

Notice: (This is an obsolete feature, use is not recommended!)

This Servers DSN is ->
) + . Settings::dsn() + . qq(

+ Import Categories: +
+
Export Categories: +   + +
+
+ Import Log:
+
Export Log:$inpCVS +

↟ Go to Top of page +
+
+
+

Backup Specs

+

    +
  1. Backup Rules

    +
      +
    1. Backup provides an compressed archive of only the current logged in database.
    2. +
    3. Backup should and can be uploaded to local client to later restore.
    4. +
    5. Issuing backup always creates on the server an copy.
    6. +
    7. Backups are issued manually and are interactive.
    8. +
    9. Backups are server side encrypted.
    10. +
    11. Backups can be particularly server specific, therefore not suitable for restoration on new or different hardware.
    12. +
    13. Backup uses OpenSSL, wich under different versions can be uncompatible in the implemented type of encryption.
    14. +
    +
  2. +
  3. Restore Rules

    +
      +
    1. The restoring is only possible if logged into current database the backup belongs.
    2. +
    3. Restoration is of only logs found missing in current log.
    4. +
    5. Restoration is not removing entries in existing current log data.
    6. +
    7. Restoration might not be possible after an server application upgrade.
    8. +
    9. Restoration of old backups is not made possible or is safe, on new stable application releases. +
      • Upgrade your application after restoring it first, as an upgrade will/might migrate structure and data.
    10. +
    11. + Restoration will import on an previous date backuped data, in case when recreating a newly created same alias database. +
      • For example: If the database file has been deleted or is blank on login, you than can run a restore, if you have an backup, for given server.
      +
    12. + + +
    +
  4. +
  5. Purpose

    +
      +
    1. Provides a direct safeguard, besides any external backup procedures.
    2. +
    3. Provides a before snapshot, if venturing into major log modifications.
    4. +
    5. Encourages experimentation, with data deletion and modification.
    6. +
    7. Required if downgrading from an failed application upgrade, or found a missuesed or corrupted state of current data.
    8. +
    +
  6. +

+
+ +
+ +); + +print $cgi->end_html; +$db->disconnect(); + +exit; + +sub getHeader { + print $cgi->header( -expires => "+6s", -charset => "UTF-8" ); + print $cgi->start_html( + -title => "Personal Log", + -BGCOLOR => Settings::theme('colBG'), + -onload => "onBodyLoadGeneric();", + -style => [ + { -type => 'text/css', -src => 'wsrc/jquery-ui.css' }, + { -type => 'text/css', -src => 'wsrc/jquery-ui.theme.css' }, + { + -type => 'text/css', + -src => 'wsrc/jquery-ui-timepicker-addon.css' + }, + { -type => 'text/css', -src => 'wsrc/tip-skyblue/tip-skyblue.css' }, + { + -type => 'text/css', + -src => 'wsrc/tip-yellowsimple/tip-yellowsimple.css' + }, + { -type => 'text/css', -src => 'wsrc/effects.css' }, + { -type => 'text/css', -src => Settings::theme('css') }, + ], + -script => [ + { -type => 'text/javascript', -src => 'wsrc/main.js' }, + { -type => 'text/javascript', -src => 'wsrc/jquery.js' }, + { -type => 'text/javascript', -src => 'wsrc/jquery-ui.js' }, + { + -type => 'text/javascript', + -src => 'wsrc/jquery-ui-timepicker-addon.js' + }, + { + -type => 'text/javascript', + -src => 'wsrc/jquery-ui-sliderAccess.js' + }, + { -type => 'text/javascript', -src => 'wsrc/jquery.poshytip.js' } + ], + ); +} + +sub processSubmit { + + my $change = $cgi->param("cchg"); + my $chgsys = $cgi->param("sys"); + my $chdbfix = $cgi->param("db_fix"); + my $passch = $cgi->param("pass_change"); + my $del_by_cats = $cgi->param("del_by_cats"); + my $category = $cgi->param("cats"); + my $del_by_date = $cgi->param("del_from"); + my $del_date_from = $cgi->param("date_from"); + my ( $s, $d ); + + try { + $dbs = Settings::selectRecords( $db, $stmtCat ); + if ($passch) { + my ( $ex, $ne, $cf ) = ( + $cgi->param("existing"), + $cgi->param("new"), $cgi->param("confirm") + ); + if ( $ne ne $cf ) { + $status = "New pass must match confirmation!"; + print +"

Client Error: $status

"; + } + else { + if ( confirmExistingPass($ex) ) { + &changePass($ne); + $status = "Pass Has Been Changed"; + } + else { + $status = +"Wrong existing pass was entered, are you user by alias: $alias ?"; + print +"

Client Error: $status

"; + } + } + Settings::toLog( $db, $status ); + openlog( Settings::dsn(), 'cons,pid', "user" ); + syslog( 'info', 'Status:%s', $status ); + syslog( 'info', 'Password change request for %s', $alias ); + closelog(); + $TR_STATUS = +qq($status) + if $status !~ m/$RDS/; + } + elsif ( $change == 1 ) { + + while ( my @row = $dbs->fetchrow_array() ) { + + my $cid = $row[0]; + my $cnm = $row[1]; + my $cds = $row[2]; + + my $pnm = $cgi->param( 'nm' . $cid ); + my $pds = $cgi->param( 'ds' . $cid ); + + if ( $pnm ne $cnm || $pds ne $cds ) { + + if ( ( $cid != 1 && $cid != 32 && $cid != 35 ) + && $pnm eq "" ) + { + + $s = "SELECT $CID, ID_CAT FROM LOG WHERE ID_CAT =" + . $cid . ";"; + $d = $db->prepare($s); + $d->execute(); + + while ( my @r = $d->fetchrow_array() ) { + $s = "UPDATE LOG SET ID_CAT=1 WHERE $CID=" + . $r[0] . ";"; + $d = $db->prepare($s); + $d->execute(); + } + + #Delete + $s = "DELETE FROM CAT WHERE ID=" . $cid . ";"; + $d = $db->prepare($s); + $d->execute(); + + } + else { + #Update + $s = + "UPDATE CAT SET NAME='" + . $pnm + . "', DESCRIPTION='" + . $pds + . "' WHERE ID=" + . $cid . ";"; + $d = $db->prepare($s); + $d->execute(); + } + } + } + $status = "Updated Categories!"; + $TR_STATUS = qq($status); + } + + if ( $change > 1 ) { + + my $caid = $cgi->param('caid'); + my $canm = $cgi->param('canm'); + my $cade = $cgi->param('cade'); + my $valid = 1; + + while ( my @row = $dbs->fetchrow_array() ) { + + my $cid = $row[0]; + my $cnm = $row[1]; + my $cds = $row[2]; + + if ( $cid == $caid || $cnm eq $canm ) { + $valid = 0; + last; + } + } + + if ($valid) { + $d = $db->prepare('INSERT INTO CAT VALUES (?,?,?)'); + $d->execute( $caid, $canm, $cade ); + $status = "Added Category $canm!"; + } + else { + $status = "ID->" + . $caid + . " or -> Category->" + . $canm + . " is already assigned, these must be unique!"; + die +"

Client Error: $status

"; + } + $status = "Inserted new category[$canm]"; + + } + elsif ( $chgsys == 1 ) { + &changeSystemSettings; + $status = "Changed System Settings!"; + } + elsif ($chdbfix) { + + my $isByCat = ( $del_by_cats eq 'on' && $category > 0 ); + my $isByDate = ( $del_by_date eq 'on' ); + + if ( $isByCat || $isByDate ) { + + my $output = +qq(
+ + + + + + + + ); + my $sel = ""; + if ($isByCat) { $sel = "ID_CAT ='$category'" } + if ($isByDate) { + $sel .= " AND " if ($isByCat); + $sel .= "DATE<='$del_date_from'"; + } + + $dbs = Settings::selectRecords( $db, +"SELECT $CID, ID_CAT, DATE, LOG FROM LOG WHERE $sel ORDER BY DATE;" + ); + while ( my @row = $dbs->fetchrow_array() ) { + my $id = $row[0]; # rowid + my $ct = $hshCats{ $row[1] }; #ID_CAT + my $dt = + DateTime::Format::SQLite->parse_datetime( $row[2] ); + my $log = $row[3]; + my ( $dty, $dtf ) = $dt->ymd; + my $dth = $dt->hms; + if ( Settings::universalDate() == 1 ) { + $dtf = $dty; + } + else { + $dtf = $lang->time2str( "%d %b %Y", $dt->epoch, + Settings::timezone() ); + } + + $log =~ s/''/'/g; + $log =~ s/\\n/
/gs; + + $output .= qq( + + + + + ); + } #while + $output .= qq( + +

Select Categories To Delete

DateTimeLog#Category
$dtf$dth$log$ct + +
+ To Top + Go Back + + + + +
); + + &Settings::setupTheme; + &getHeader; + + print "
$output
"; + + print $cgi->end_html; + $db->disconnect(); + exit; + + } + else { processDBFix() } + $status = "Performed Database Fixes!"; + } + $TR_STATUS = qq(Status -> $status) + if $status !~ m/$RDS/; + + } + catch { + + my $err = $@; + my $pwd = `pwd`; + $pwd =~ s/\s*$//; + + $ERROR = + "
SERVER ERROR on " + . DateTime->now + . "
"
+          . $pwd
+          . "/$0 -> &"
+          . caller
+          . " -> [$err]", "
", + + } + + openlog( Settings::dsn(), 'cons,pid', "user" ); + syslog( 'info', 'Status:%s', $status ); + syslog( 'err', '%s', $ERROR ) if ($ERROR); + closelog(); +} + +sub confirmExistingPass { + my $crypt = encryptPassw( $_[0] ); + my $sql = "SELECT ALIAS from AUTH WHERE ALIAS='$alias' AND PASSW='$crypt';"; + + $dbs = Settings::selectRecords( $db, $sql ); + my @a = $dbs->fetchrow_array(); + if ( @a == 1 && $a[0] eq $alias ) { + return 1; + } + return 0; +} + +sub changePass { + my $pass = encryptPassw( $_[0] ); + $dbs = Settings::selectRecords( $db, + "UPDATE AUTH SET PASSW='$pass' WHERE ALIAS='$alias';" ); + my @a = $dbs->fetchrow_array(); + if ( @a == 1 && $a[0] eq $alias ) { + return 1; + } + return 0; +} + +sub encryptPassw { + return uc crypt $_[0], hex Settings->CIPHER_KEY; +} + +sub processDBFix { + + my $rs_syst = $cgi->param("reset_syst"); + my $rs_cats = $cgi->param("reset_cats"); + my $wipe_ss = $cgi->param("wipe_syst"); + + my $sql; + my $date; + my $cntr_upd = 0; + try { + + my %dates = (); + + #Hash is unreliable for returning sequential order of keys so array must do. + my @dlts = (); + my $cntr_del = 0; + my $existing; + my @row; + + getHeader() if (&Settings::debug); + print "

Database Records Fix Result

\n
" if &Settings::debug; + print "
Started transaction!\n"          if &Settings::debug;
+
+        #Transactions work if driver is set properly!
+        $db = Settings::connectDBWithAutocommit();
+
+#DBI->connect(Settings::dsn(), $alias, $p, {AutoCommit => 0, RaiseError => 1, PrintError => 0, show_trace=>1});
+        $db->do('BEGIN TRANSACTION;');
+
+# Check for duplicates, which are possible during imports or migration as internal rowid is not primary in log.
+# @TODO Following should be selecting an cross SQL compatibe view.
+        $dbs = Settings::selectRecords( $db,
+            "SELECT $CID, DATE FROM LOG ORDER BY DATE;" );
+
+        while ( @row = $dbs->fetchrow_array() ) {
+            my $existing = $dates{ $row[0] };
+            if ( $existing && $existing eq $row[1] ) {
+                $dlts[ $cntr_del++ ] = $row[0];
+            }
+            else {
+                $dates{ $row[0] } = $row[1];
+            }
+        }
+
+        foreach my $del (@dlts) {
+            $sql = "DELETE FROM LOG WHERE $CID=$del;";
+            print "$sql\n
"; + my $st_del = $db->prepare($sql); + $st_del->execute(); + } + + &renumerate; + print "Doing removeOldSessions next..." if &Settings::debug; + &Settings::removeOldSessions; + print "done!\n" if &Settings::debug; + + + if ($rs_cats) { + print "Doing resetCategories next..." if &Settings::debug; + #Let migration algorithm handle re-creation on logon. + $db->do("DELETE FROM CAT;"); + $db->do("DROP TABLE CAT;"); + $LOGOUT = 1; + print "done!\n" if &Settings::debug; + } + + if ($rs_syst) { + print "Doing resetSystemConfiguration next..." if &Settings::debug; + &resetSystemConfiguration(); + print "Doing resetSystemConfiguration next..." if &Settings::debug; + }elsif ($wipe_ss) { + print "Doing wipeSystemConfiguration next..." if &Settings::debug; + Settings::saveReserveAnons() + ; #So we can bring back from dead application reserve variables. + #Let migration algorithm handle re-creation on logon. + $db->do("DELETE FROM CONFIG;"); + $db->do("DROP TABLE CONFIG;"); + $LOGOUT = 1; + print "done!\n" if &Settings::debug; + } + + $db->do('COMMIT;') if (&Settings::debug); + print "Commited ALL!
" if (&Settings::debug); + + + + if (&Settings::debug) { + $db = Settings::connectDB(); + $dbs = $db->do("VACUUM;"); + print "Issued VACUUM!
" if (&Settings::debug); + } + + if ($LOGOUT) { + &logout; + } + if (&Settings::debug) { + print +"
You are in debug mode further actions are halted!
"; + exit; + } + + } + catch { + $db->do('ROLLBACK;'); + LifeLogException->throw( + error => +qq(@&processDBFix error -> $_ with statement->[$sql] for $date update counter:$cntr_upd \nERROR->$@).Settings::dumpVars(), + show_trace => 1 + ); + } +} + +sub renumerate { + + # NOTE: This is most likelly all performed under an transaction. + my $sql; + +# Fetch list by date identified rtf attached logs, with possibly now an old LID, to be updated to new one. + print "Doing renumerate next...\n" if &Settings::debug; + + $sql = "SELECT $CID, DATE FROM LOG WHERE RTF > 0;"; + + my @row = Settings::selectRecords( $db, $sql )->fetchrow_array(); + my %notes = (); + if ( scalar @row > 0 ) { + $notes{ $row[1] } = $row[0]; #<- This is current LID, will change. + print "Expecting Note entry for " + . $row[1] + . " LOG.ID[" + . $row[0] + . "]<- LID...\n"; + } + + ### RENUMERATE LOG + $db->do("CREATE TABLE life_log_temp_table AS SELECT * FROM LOG;"); + if (&Settings::isProgressDB) { + $db->do('DROP TABLE LOG CASCADE;'); + } + else { + $db->do('DROP TABLE LOG;'); + } + $db->do(&Settings::createLOGStmt); + $db->do( + q(INSERT INTO LOG (ID_CAT, DATE, LOG, RTF, AMOUNT,AFLAG) + SELECT ID_CAT, DATE, LOG, RTF, AMOUNT, AFLAG FROM life_log_temp_table ORDER by DATE;) + ); + $db->do('DROP TABLE life_log_temp_table;'); + ### + + # Update notes with new log id, if it changed. + + foreach my $date ( keys %notes ) { + my $old = $notes{$date}; + $sql = "SELECT $CID FROM LOG WHERE RTF > 0 AND DATE = '$date';"; + print "Selecting -> $sql\n"; + $dbs = Settings::selectRecords( $db, $sql ); + @row = $dbs->fetchrow_array(); + if ( scalar @row > 0 ) { + my $new = $row[0]; + if ( $new ne $old ) { + $db->do("UPDATE NOTES SET LID =$new WHERE LID=$old;"); + print "Updated Note in LID[$old] to be LID[$new]\n"; + } + else { + print "All fine skipping LID[$new]\n"; + } + } + else { + print "ERROR NOT FOUND: $date for LID:$old!\n"; + } + + } + + # Delete Orphaned Notes entries if any? + + $dbs = Settings::selectRecords( + $db, "SELECT LID, LOG.$CID from NOTES LEFT JOIN LOG ON + NOTES.LID = LOG.$CID WHERE LOG.rowid is NULL;" + ); + + if ($dbs) { + foreach ( @row = $dbs->fetchrow_array() ) { + $db->do("DELETE FROM NOTES WHERE LID=$row[0];") + if $row[0] + ; # 0 is the place keeper for the shared zero record, don't delete. + } + } + print "done!\n" if &Settings::debug; +} + + + +sub resetSystemConfiguration { + + my ( $id, $name, $value, $desc); + my $cnf = new CNFParser( &Settings::logPath . 'main.cnf' ); + my $inData = 0; + my $err = ""; + my %vars = {}; + my @lines = split( '\n', $cnf->anon('CONFIG') ); + + try { + my $insert = $db->prepare('INSERT INTO CONFIG VALUES (?,?,?,?)'); + my $update = $db->prepare('UPDATE CONFIG SET VALUE=? WHERE ID=?;'); + my $updExs = $db->prepare('UPDATE CONFIG SET NAME=?, VALUE=? WHERE ID=?;'); + foreach my $line ( @lines ) { + my @tick = split( "`", $line ); + next if $line eq '4'; + if ( scalar(@tick) == 2 ) { + + #Specification Format is: ^{id}|{property}={value}`{description}\n + #There is no quoting necessary unless capturing spaces or tabs for value! + my %hsh = $tick[0] =~ m[(\S+)\s*=\s*(\S+)]g; + if ( scalar(%hsh) == 1 ) { + for my $key ( keys %hsh ) { + my %nash = $key =~ m[(\d+)\s*\|\$\s*(\S+)]g + ; # {id}|{property} <- is the key. + if ( scalar(%nash) == 1 ) { + for my $id ( keys %nash ) { + $name = $nash{$id}; + $value = $hsh{$key}; # <- {value}. + if ( $vars{$id} ) { + $err .= + "UID{$id} taken by $vars{$id}-> $line\n"; + } + else { + $dbs = Settings::selectRecords( $db, +"SELECT ID, NAME, VALUE, DESCRIPTION FROM CONFIG WHERE NAME LIKE '$name';" + ); + my @row = $dbs->fetchrow_array(); + if ( scalar @row == 0 ) { + + #The id in config file has precedence to the one in the db, + # from a possible previous version. + $dbs = Settings::selectRecords( $db, +"SELECT ID FROM CONFIG WHERE ID = $id;" + ); + @row = $dbs->fetchrow_array(); + if ( scalar @row == 0 ) { + $insert->execute( + $id, $name, + $value, $tick[1] + ); + } + else { + #rename, revalue exsisting id + $updExs->execute( $name, $value, + $id ); + } + } + else { + $update->execute( $value, $id ); + } + } + } + } + else { + $err .= +"Invalid, spected {uid}|{setting}`{description}-> $line\nlines:\n@lines"; + } + + } #rof + } + else { + $err .= "Invalid, spected entry -> $line\n"; + } + + } + elsif ( length($line) > 0 ) { + if ( scalar(@tick) == 1 ) { + $err .= "Corrupt entry, no description supplied -> $line\n <<CONFIG<\n".$cnf->anon('CONFIG')."\n>>>;\n"; + } + else { + $err .= "Corrupt Entry -> $line\n"; + } + } + } + die "Configuration script " + . &Settings::logPath + . "main.cnf' contains errors." + if $err; + Settings::getConfiguration($db); + } + catch { + print $cgi->header; + print +"SERVER ERROR![id:$id,name:$name,value:$value]->$@
" + . $_ + . "
$err
"; + print $cgi->end_html; + exit; + } +} + +sub logout { + Settings::session()->delete(); + Settings::session()->flush(); + print $cgi->redirect("login_ctr.cgi"); + exit; +} + +sub changeSystemSettings { + my $updated; + my $id_theme; + try { + $dbs = Settings::selectRecords( $db, + "SELECT ID FROM CONFIG WHERE NAME LIKE 'THEME';" ); + while ( my @r = $dbs->fetchrow_array() ) { $id_theme = $r[0] } + $dbs = Settings::selectRecords( $db, "SELECT ID, NAME FROM CONFIG;" ); + while ( my @r = $dbs->fetchrow_array() ) { + my $var = $cgi->param( 'var' . $r[0] ); + if ( defined $var ) { + Settings::configProperty( $db, $r[0], undef, $var ); + $updated = 1; + Settings::saveCurrentTheme($var) if $r[0] == $id_theme; + } + } + Settings::getConfiguration($db) if ($updated); + } + catch { + die "\nException\@$0::changeSystemSettings() line ", + __LINE__ + . " failed ->\n $@" + ; #<- It is actually better to die than throw exception traces. Easier to find problem this way. + } +} + +sub backupDelete { + my $n = shift; + my $f = &Settings::logPath . $n; + try { + if ( -e $f ) { + LifeLogException->throw( +"File -> [$n] is not a backup file or it doesn't belong to $alias (you)!" + ) if ( index( $file, /bck_\d+$alias\_log/ ) == -1 ); + unlink($f) or LifeLogException->throw("Failed to delete $n! -> $!"); + print $cgi->redirect("config.cgi?CGISESSID=$sid"); + exit; + } + else { + LifeLogException->throw("File $n does not exist!"); + } + } + catch { + my $err = $@; + &getHeader; + print $cgi->start_html; + print qq(
Delete Has Failed!
[$err]
+ + ); + print $cgi->end_html; + exit; + }; +} + +# Notice -> Fetch on the page calls this subroutine, and if it fails to produce one, +# the most likely problem is that the Notes table has a wrong binary type. +# since v.2.4 this method has been tested and will not fail any db engine structure. +# As the backup produced is in the original deployed source, which is sqlite not the other db engine. +# Here the insert stament is FROM (data...) into -> SQLite.NOTES((LID INT PRIMARY KEY NOT NULL, DOC BLOB) +sub backup { + + my $pass = Settings::pass(); + my @dr = split( ':', Settings::dbSrc() ); + my $ball = + 'bck_' . $today->strftime('%Y%m%d%H%M%S_') . $dr[1] . "_$dbname.osz"; + + my $file = + &Settings::logPath . 'data_' . $dr[1] . '_' . "$dbname" . "_log.db"; + my $dsn = "DBI:SQLite:dbname=$file"; + my $weProgress = Settings::isProgressDB(); + my $stamp = $today . "\t"; + $stamp =~ s/T/ /g; + open( my $fhLog, ">>", &Settings::logPath . "backup.log" ) + if &Settings::debug; + + if ($weProgress) { + print $fhLog $stamp, "Started Pg database backup.\n" + if &Settings::debug; + try { + $pass = uc crypt $pass, hex Settings->CIPHER_KEY; + unlink $file if -e $file; # we will recreate it next. + } + catch { }; + my $dbB = + DBI->connect( $dsn, $alias, $pass, + { AutoCommit => 1, RaiseError => 1 } ) + or LifeLogException->throw( + error => "Invalid database! $dsn [$@]", + show_trace => &Settings::debug + ); + &Settings::resetToDefaultDriver; + $dbB->do(&Settings::createCATStmt); + $dbB->do(&Settings::createLOGStmt); + $dbB->do(&Settings::createNOTEStmt); + print $fhLog $stamp, "Created file database $file from -> ", + Settings::dbSrc(), "\n" + if &Settings::debug; + + my $in = $dbB->prepare('INSERT INTO CAT VALUES (?,?,?)'); + my $st = Settings::selectRecords( $db, 'SELECT * FROM CAT;' ); + while ( my @c = $st->fetchrow_array() ) { + $in->execute( $c[0], $c[1], $c[2] ); + } + + $in = $dbB->prepare( +'INSERT INTO LOG (ID_CAT, DATE, LOG, RTF, AMOUNT, AFLAG, STICKY) VALUES (?,?,?,?,?,?,?);' + ); + $st = Settings::selectRecords( $db, +'SELECT ID_CAT, DATE, LOG, RTF, AMOUNT, AFLAG, STICKY FROM LOG order by DATE;' + ); + while ( my @c = $st->fetchrow_array() ) { + $in->execute( $c[0], $c[1], $c[2], $c[3], $c[4], $c[5], $c[6] ); + } + $in = $dbB->prepare('INSERT INTO NOTES (LID, DOC) VALUES(?,?);'); + $st = Settings::selectRecords( $db, 'SELECT LID, DOC FROM NOTES;' ); + while ( my @c = $st->fetchrow_array() ) { + try { + # $in->bind_param(1, $c[0]); + # $in->bind_param(2, $c[1]);#, { pg_type => DBD::Pg::PG_BYTEA }); + # $in->execute(); + + # my $d = uncompress($c[1]); + # my $cipher = Settings::newCipher(Settings::pass()); + # my $doc = $cipher->decrypt($d); + + # $cipher = Settings::newCipher($pass); + # $doc = compress($cipher->encrypt($doc)); + # $inNotes->bind_param(1, $c[0]); + # $inNotes->bind_param(2, $doc); + $in->execute( $c[0], $c[1] ); + } + catch { + print $fhLog $stamp, "Error NOTES.LID[$c[0]]-> $@" + if &Settings::debug; + } + } + $dbB->disconnect(); + } + else { + print $fhLog $stamp, "Started database backup.\n" if &Settings::debug; + $file = Settings::dbFile(); + } + + my $pipe = + "tar czf - " + . &Settings::logPath + . 'main.cnf' . " " + . $file + . " | openssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 100000 -salt -S " + . Settings->CIPHER_KEY + . " -pass pass:$pass-$alias -out " + . &Settings::logPath + . $ball + . " 2>/dev/null"; + if (&Settings::debug) { + print $fhLog $stamp, $pipe, "\n"; + close $fhLog; + } + + print $cgi->header( + -charset => "UTF-8", + -type => "application/octet-stream", + -attachment => $ball + ); + my $rez = `$pipe`; + open( my $TAR, "<", &Settings::logPath . $ball ) + or die "Failed creating backup -> $ball"; + while (<$TAR>) { print $_; } + close $TAR; + + unlink $file if $weProgress; + exit; +} + +sub restore { + + my $file = shift; + my ( $tar, $pipe, @br, $stdout, $b_db ); + my $pass = Settings::pass(); + my $hndl = $cgi->param('bck_upload'); + my $dbck = &Settings::logPath . "bck/"; + `mkdir $dbck` if ( !-d $dbck ); + my $stage = "Initial"; + my $stamp = $today . "\t"; + $stamp =~ s/T/ /g; + my $fhLog; + open( $fhLog, ">>", &Settings::logPath . "backup_restore.log" ); + print $fhLog $stamp, "Started restore procedure.\n"; + + try { + getHeader(); + print $cgi->start_html; + + if ($file) { #Open handle on server where backup is to be restored. + my $f = &Settings::logPath . $file; + open( $hndl, '<', $f ) or die "Can't open $f: $!"; + print $fhLog $stamp, "Reading on server backup file -> $file\n"; + $tar = $dbck . $file; + } + else { + print $fhLog $stamp, "Uploading to server backup file -> $hndl\n"; + $tar = $dbck . $hndl; + } + + print $cgi->pre( "Restore started: " . Settings::today(), + "\n", "Reading $tar ..." ); + + my $stdout = capture_stdout { + $tar =~ s/osz$/tar/; + my $srcIsPg = 0; + my $passw = $pass; + $passw = uc crypt $pass, hex Settings->CIPHER_KEY + if &Settings::isProgressDB; + open( $pipe, "|-", +"openssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 100000 -d -salt -S " + . Settings->CIPHER_KEY + . " -pass pass:$passw-$alias -in /dev/stdin -out $tar" ) + or die "Pipe Failed for $tar: $!"; + + while (<$hndl>) { print $pipe $_; die "bad decoding" if $?; } + close $pipe; + close $hndl; + +#cat bck_20210819160848_SQLite_admin.osz | openssl enc -d -des-ede3-cfb -salt -S 95d7a85ba891da -pass pass:42FAP5H0JUSZM-admin -in /dev/stdin > extract.tar +#openssl des-ede3-cfb -d -salt -S 95d7a85ba891da -pass pass:42FAP5H0JUSZM-admin -pbkdf2 -in bck_20210830133220_NUc_SQLite_admin.osz -out extract.tar + + print "
\n";
+
+            my $m1 =
+              "it is not permitted to restore from anothers backup file.";
+            $m1 = "has your log password changed?"
+              if ( $tar =~ /_data_$alias/ );
+            $stage = "Backup extraction start";
+
+            my $cmd = `tar tvf $tar 2>/dev/null`
+              or die
+qq(Error: A possible security issue, $m1\n
BACKUP FILE HAS BEEN INVALIDATED!\n + Archive:$tar\n + Your alias is: $alias\n
+ Your DSN is: ) . Settings::dsn() . qq(
+ Your LifeLog version is:), Settings::release() . "\n"; + + print "Contents->\n" . $cmd . "\n\n"; + $cmd = `tar xzvf $tar -C $dbck --strip-components 1 2>/dev/null` + or die "Failed extracting $tar"; + print "Extracted->\n" . $cmd . "\n" or die "Failed extracting $tar"; + my @dr = split( ':', Settings::dbSrc() ); + my $b_base = $dbck . 'data_' . $dbname . '_log.db'; + + # We check if db file has been extracted first? + unless ( -e $b_base ) { + if (&Settings::isProgressDB) { + $b_base = + $dbck . 'data_' . $dr[1] . '_' . $dbname . '_log.db'; + } + else { # maybe the source is a Pg db backup? + $b_base = $dbck . 'data_Pg_' . $dbname . '_log.db'; + } + if ( -e $b_base ) { + $srcIsPg = 1; + } + else { + die "Failed to locate database in archive -> $b_base"; + } + } + + my $dsn = "DBI:SQLite:dbname=$b_base"; + $b_db = DBI->connect( $dsn, $alias, $pass, { RaiseError => 1 } ) + or LifeLogException->throw( + error => "Invalid database! $dsn->$hndl [$@]", + show_trace => &Settings::debug + ); + + print "Connected to -> " + . Settings::dsn() + . " (\$srcIsPg == $srcIsPg)\n"; + $stage = "Merging categories table."; + print "Merging from backup categories table..."; + my $stats = DBMigStats->new(); + my $insCAT = $db->prepare( + 'INSERT INTO CAT (ID, NAME, DESCRIPTION) VALUES(?,?,?);') + or die "Failed CAT prepare."; + my $b_pst = Settings::selectRecords( $b_db, + 'SELECT ID, NAME, DESCRIPTION FROM CAT;' ); + + while ( @br = $b_pst->fetchrow_array() ) { + next + if not $br[0] + ; #@2021-08-12 For some reason this still could be null + $stage .= "
id:" . $br[0] . "->" . $br[1]; + my $pst = Settings::selectRecords( $db, + "SELECT ID, NAME, DESCRIPTION FROM CAT WHERE ID=" + . $br[0] + . ";" ); + my @ext = $pst->fetchrow_array(); + if ( scalar(@ext) == 0 ) { + $insCAT->execute( $br[0], $br[1], $br[2] ); + print "\nAdded CAT->" . $br[0] . "|" . $br[1]; + $stats->cats_inserts_incr(); + } + elsif ( $br[0] ne $ext[0] or $br[1] ne $ext[1] ) { + $db->do("UPDATE CAT SET NAME='" + . $br[1] + . "', DESCRIPTION='" + . $br[2] + . "' WHERE ID=$br[0];" ) + or die "Cat update failed!"; + print "\nUpdated->" . $br[0] . "|" . $br[1] . "|" . $br[2]; + $stats->cats_updates_incr(); + } + + } + + print "\nFinished with merging CAT table.\n"; + print "There where -> " + . $stats->cats_inserts() + . " inserts, and " + . $stats->cats_updates() + . " updates.\n"; + + $stage = "Merging backup LOG"; + print "\n\nMerging from backup LOG table...\n"; + + my %backupLIDS = (); + my $insLOG = $db->prepare( +'INSERT INTO LOG (ID_CAT, DATE, LOG, RTF, AMOUNT, AFLAG, STICKY) VALUES(?,?,?,?,?,?,?);' + ) or die "Failed LOG prepare."; + + $b_pst = Settings::selectRecords( $b_db, +"SELECT rowid, ID_CAT, DATE, LOG, RTF, AMOUNT, AFLAG, STICKY FROM LOG;" + ); + while ( @br = $b_pst->fetchrow_array() ) { + my $dt = $br[2]; + my $pst = Settings::selectRecords( $db, + "SELECT DATE FROM LOG WHERE DATE='" . $dt . "';" ); + my @ext = $pst->fetchrow_array(); + if ( scalar(@ext) == 0 ) { + try { + $insLOG->execute( + $br[1], $br[2], $br[3], $br[4], + $br[5], $br[6], $br[7] + ); + print "Added->" + . $br[0] . "|" + . $br[2] . "|" + . $br[3] . "\n"; + $stats->logs_inserts_incr(); + if ( $br[4] ) { + $pst = Settings::selectRecords( $db, + "SELECT max($CID) FROM LOG" ); + my @r = $pst->fetchrow_array(); + $backupLIDS{ $br[0] } = $r[0]; + } + } + catch { + print "Insert insert of ->[" + . $br[0] . "|" + . $br[2] . "|\n" + . $br[3] + . "]
Error -> $@
\n"; + } + } + } + print "\nFinished with merging LOG table.\n"; + print "There where -> " . $stats->logs_inserts() . " inserts.\n"; + + $stage = "Merging Notes"; + print "\nMerging from backup NOTES table...\n"; + my $insNOTES = + $db->prepare('INSERT INTO NOTES (LID, DOC) VALUES(?,?);') + or die "Failed NOTES prepare."; + $b_pst = + Settings::selectRecords( $b_db, 'SELECT LID, DOC FROM NOTES;' ); + + while ( @br = $b_pst->fetchrow_array() ) { + my $in_id = $backupLIDS{ $br[0] }; + if ( $in_id && $br[1] ) { + if ( Settings::isProgressDB() ) { + $insNOTES->bind_param( 1, $in_id ); + try { + if ( not $srcIsPg ) { #IT is NOT PG to PG DB + # We with Pg currently the password do not encrypted and the binary is different, we need to convert. + # Reason it is not encrypted? Only because externally it will be pain to access the db with such user and password. + my $d = uncompress( $br[1] ); + my $cipher = Settings::newCipher($passw); + my $doc = $cipher->decrypt($d); + + #print $doc; + $cipher = Settings::newCipher($pass); + $doc = compress( $cipher->encrypt($doc) ); + $insNOTES->bind_param( 2, $doc, + { pg_type => DBD::Pg::PG_BYTEA } ); + $insNOTES->execute(); + print + "Converted to Pg a notes doc $in_id to Pg.\n"; + } + else { + $insNOTES->bind_param( 2, $br[1], + { pg_type => DBD::Pg::PG_BYTEA } ); + $insNOTES->execute(); + print +"Recovered in a Pg based notes doc id[$in_id]\n"; + } + print "Added " . $dr[1] . " NOTES -> LID:$in_id\n"; + $stats->notes_incr(); + + } + catch { + print "FAILED TO INSERT RTF -> LID:$in_id Err:$@\n"; + } + + } + else { + try { + if ($srcIsPg) { #IT is PG to SQLite DB + my $d = uncompress( $br[1] ); + my $cipher = Settings::newCipher( + Settings::configProperty( $db, 222 ) ); + my $doc = $cipher->decrypt($d); + + #print $doc; + $cipher = Settings::newCipher($passw); + $br[1] = compress( $cipher->encrypt($doc) ); + print "Converted notes doc $in_id to SQLite.\n"; + } + $insNOTES->execute( $in_id, $br[1] ); + print "Added NOTES -> LID:$in_id\n"; + $stats->notes_incr(); + } + catch { + print +"FAILED TO INSERT RTF -> LID:$in_id Error -> $@\n"; + } + } + } + } + print "\nFinished with merging NOTES table.\n"; + print "There where -> " . $stats->notes_inserts() . " inserts.\n"; + if ( $stats->notes_inserts() > 0 ) { + print +"Note that the notes merge didn't recover documents for any currently existing log entries.\n"; + print +"To do this, delete those log entries, then run restore again.\n"; + } + Settings::configProperty( $db, 230, '^STATS_RESTORE_DATE', $today ); + Settings::configProperty( $db, 232, '^STATS_CAT_INSERT_CNT', + $stats->cats_inserts() ); + Settings::configProperty( $db, 234, '^STATS_LOG_INSERT_CNT', + $stats->logs_inserts() ); + Settings::configProperty( $db, 236, '^STATS_RTF_INSERT_CNT', + $stats->notes_inserts() ); + print "Done!\n"; + print "Restore ended: " . Settings::today(), "\n"; + }; + print $fhLog $stamp, "\n", "-" x 20, "Debug Output Start", "-" x 20, + "\n", $stdout, "-" x 20, "Debug Output End", "-" x 20, "\n"; + print $stdout; + $b_db->disconnect(); + $db->disconnect(); +############### + `rm -rf $dbck/`; +############### + } + catch { + $ERROR = + "
Full Restore Failed!
$@ \n"; + $ERROR .= "br:[@br]" if (@br); + $ERROR .= "
Failed at stage: $stage"; + print $fhLog $stamp, "Error: $@ at:@br.\n"; + openlog( Settings::dsn(), 'cons,pid', "user" ); + syslog( 'err', '%s', $ERROR ); + closelog(); + }; + + my $back = $cgi->url( -relative => 1 ); + print "
$ERROR
" if ($ERROR); + print "\n
"; + print +qq(
Go Back
or
Go to LOG
); + close $fhLog; + print $cgi->end_html; + exit; + +} + +package DBMigStats { + + sub new { + my $class = shift; + my $self = bless { + cats_ins => 0, + cats_upd => 0, + logs_ins => 0, + logs_upd => 0, + notes => 0 + }, $class; + } + + sub cats_inserts() { my $s = shift; return $s->{cats_ins} } + sub cats_inserts_incr() { my $s = shift; $s->{cats_ins}++ } + sub cats_updates() { my $s = shift; return $s->{cats_upd} } + sub cats_updates_incr() { my $s = shift; $s->{cats_upd}++ } + + sub logs_inserts() { my $s = shift; return $s->{logs_ins} } + sub logs_inserts_incr() { my $s = shift; $s->{logs_ins}++ } + sub logs_updates() { my $s = shift; return $s->{logs_upd} } + sub logs_updates_incr() { my $s = shift; $s->{logs_upd}++ } + + sub notes_inserts() { my $s = shift; return $s->{notes} } + sub notes_incr() { my $s = shift; $s->{notes}++ } + +} + +sub exportToCSV { + try { + my $csv = Text::CSV->new( { binary => 1, strict => 1, eol => $/ } ); + if ( $csvp > 2 ) { + $dbs = Settings::selectRecords( $db, + "SELECT ID, NAME, DESCRIPTION FROM CAT ORDER BY ID;" ); + } + else { + $dbs = Settings::selectRecords( $db, "SELECT * FROM LOG;" ); + } + + if ( $csvp == 2 || $csvp == 4 ) { + print $cgi->header( -charset => "UTF-8", -type => "text/html" ); + print "
\n";
+        }
+        else {
+            my $type = 'categories';
+            $type = 'log' if ( $csvp == 1 );
+            print $cgi->header(
+                -charset    => "UTF-8",
+                -type       => "application/octet-stream",
+                -attachment => "$dbname.$type.csv"
+            );
+        }
+
+        #print "ID,NAME,DESCRIPTION\n";
+        while ( my $row = $dbs->fetchrow_arrayref() ) {
+            my $out = $csv->print( *STDOUT, $row );
+            print $out if ( length $out > 1 );
+        }
+        if ( $csvp == 2 || $csvp == 4 ) {
+            print "
"; + } + $dbs->finish(); + $db->disconnect(); + exit; + } + catch { + print "SERVER ERROR->exportLogToCSV:" + . $_; + } +} + +sub importCatCSV { + my $hndl = $cgi->upload("data_cat"); + my $csv; + try { + $csv = Text::CSV->new( { binary => 1, strict => 1, eol => $/ } ); + while ( my $line = <$hndl> ) { + chomp $line; + if ( $csv->parse($line) ) { + my @fields = $csv->fields(); + updateCATDB(@fields); + } + else { + warn "Data could not be parsed: $line\n"; + } + } + } + catch { + LifeLogException->throw( + error => "Category update failed! CSV_STATUS->" + . $csv->error_diag() + . "\nfile_hndl->$hndl", + show_trace => &Settings::debug + ); + }; +} + +sub updateCATDB { + my @fields = @_; + if ( @fields > 2 ) { + my $id = $fields[0]; + my $name = $fields[1]; + my $desc = $fields[2]; + + #is it existing entry? + $dbs = Settings::selectRecords( $db, + "SELECT ID FROM CAT WHERE ID = '$id';" ); + if ( !$dbs->fetchrow_array() ) { + $dbs = $db->prepare('INSERT INTO CAT VALUES (?,?,?)'); + $dbs->execute( $id, $name, $desc ); + $dbs->finish; + } + else { + #TODO Update + } + } + else { + LifeLogException->throw("Invalid CSV data format!"); + } +} + +sub importLogCSV { + my $hndl = $cgi->upload("data_log"); + my $csv; + try { + + $csv = Text::CSV->new( { binary => 1, strict => 1, eol => $/ } ); + + while ( my $line = <$hndl> ) { + chomp $line; + if ( $csv->parse($line) ) { + my @fields = $csv->fields(); + updateLOGDB(@fields); + } + else { + warn "Data could not be parsed: $line\n"; + } + } + &renumerate; + $db->disconnect(); + print $cgi->redirect('main.cgi'); + + } + catch { + LifeLogException->throw( + error => "Log update failed! CSV_STATUS->" + . $csv->error_diag() + . "\nfile_hndl->$hndl", + show_trace => &Settings::debug + ); + }; + exit; +} + +sub updateLOGDB { + my @fields = @_; + if ( scalar(@fields) > 6 ) { + + my $i = 0; + my $id_cat = $fields[ $i++ ]; + my $date = $fields[ $i++ ]; + my $log = $fields[ $i++ ]; + my $rtf = $fields[ $i++ ]; + my $amv = $fields[ $i++ ]; + my $amf = $fields[ $i++ ]; + my $sticky = $fields[ $i++ ]; + + # Is it old pre. 1.8 format -> ID, DATE, LOG, AMOUNT, AFLAG, RTF, STICKY + if ( !looks_like_number($rtf) ) { + $i = 0; + $id_cat = $fields[ $i++ ]; + $rtf = $fields[ $i++ ]; + $date = $fields[ $i++ ]; + $log = $fields[ $i++ ]; + $amv = $fields[ $i++ ]; + $amf = $fields[ $i++ ]; + $sticky = $fields[ $i++ ]; + } + my $pdate = DateTime::Format::SQLite->parse_datetime($date); + + #Check if valid date log entry? + if ( $id_cat == 0 || $id_cat == "" || !$pdate ) { + return; + } + + #is it existing entry? + $dbs = Settings::selectRecords( $db, + "SELECT DATE FROM LOG WHERE DATE is '$pdate';" ); + my @rows = $dbs->fetchrow_array(); + if ( scalar @rows == 0 ) { + $dbs = $db->prepare('INSERT INTO LOG VALUES (?,?,?,?,?,?,?)'); + $dbs->execute( $id_cat, $pdate, $log, $rtf, $amv, $amf, $sticky ); + } + $dbs->finish(); + } + else { + LifeLogException->throw("Invalid CSV data format!"); + } +} + +sub cats { + $cats = qq('; +} + +sub error { + my $url = $cgi->url( -path_info => 1 ); + print +qq(
+ $ERROR + ); + print "

CGI Parameters

    "; + foreach ( $cgi->param ) { + print '
  1. ' . $_ . '==' . $cgi->param($_) . '
  2. '; + } + print "
\n"; + print +"
Return to -> $url

"; + + print $cgi->end_html; + $db->disconnect(); + exit; +} + diff --git a/htdocs/cgi-bin/data.cgi b/htdocs/cgi-bin/data.cgi new file mode 100755 index 0000000..7f983b2 --- /dev/null +++ b/htdocs/cgi-bin/data.cgi @@ -0,0 +1,419 @@ +#!/usr/bin/env perl +# +# Programed in vim by: Will Budic +# Open Source License -> https://choosealicense.com/licenses/isc/ +# +use v5.30; #use diagnostics; +use warnings; +use strict; +no warnings "experimental::smartmatch"; + +use Exception::Class ('LifeLogException'); +use Syntax::Keyword::Try; +use DateTime::Format::Human::Duration; +use Regexp::Common qw /URI/; +use Text::CSV; + + +use lib "system/modules"; +require Settings; + +my $human = DateTime::Format::Human::Duration->new(); +my $db = Settings::fetchDBSettings(); +my $PRC_WIDTH = Settings::pagePrcWidth(); +my $DEBUG = Settings::debug(); +my $today = Settings::today(); +my $tbl_rc = 0; +my $imgw = 210; +my $imgh = 120; +my $cgi = Settings::cgi(); +my $opr = $cgi->param("opr"); $opr=0 if !$opr; +my $confirmed = $cgi->param('confirmed'); + +if ($opr == 1){ + DisplayDateDiffs(); + exit; +} +if ($opr == 3){ + PrintView(); +} +elsif ($confirmed){ + DeletionConfirmed(); +}else{ + print $cgi->redirect('main.cgi') if not $cgi->param('chk'); + ConfirmForDeletionPage(); +} +$db->disconnect(); + +sub DisplayDateDiffs { + + my $tbl = ' + '; + + my $stm = 'SELECT DATE, LOG FROM VW_LOG WHERE '; + my @ids = $cgi->param('chk'); + @ids = reverse @ids; + foreach (@ids){ + $stm .= "PID = " . $_ .""; + if( \$_ != \$ids[-1] ) { + $stm = $stm." OR "; + } + } + $stm .= ' ORDER BY PID;'; + print $cgi->pre("###[stm:$stm]") if($DEBUG); + my $st = Settings::selectRecords($db, $stm); + my ($dt,$dif,$first,$last,$tnext, $dt_prev) = (0,0,0,0,0,$today); + while(my @row = $st->fetchrow_array()) { + my $rdat = $row[0]; + my $rlog = $row[1]; + $rlog =~ m/\n/; + $dt = DateTime::Format::SQLite->parse_julianday( $rdat ); + $dt -> set_time_zone(&Settings::timezone); + $dif = dateDiff($dt_prev, $dt); + $tbl .= ' + ". + ''; + $last = $dt_prev; + $dt_prev = $dt; + if($tnext){ + $dif = dateDiff($today, $dt,''); + $tbl .= ''; + } + else{$tnext=1; $first = $dt;} + } + if($first != $last){ + $dif = dateDiff($first, $dt_prev,'(first above)'); + $tbl .= ''; + } + $tbl .= '
* DATE DIFFERENCES *
'. $dt->ymd . ''.$rlog."
'.$dif.'
'.$dif. '
'.$dif. '
'; + printHeader("Date Difference Report"); + print '
'.$tbl.'

'; + print $cgi->end_html(); + +} + +sub dateDiff { + my($d1,$d2,$ff,$sw)=@_; + if($d1->epoch()>$d2->epoch()){ + $sw = $d1; + $d1 = $d2; + $d2 = $sw; + }else{$sw="";} + my $dur = $human->format_duration_between($d1, $d2); + my ($t1,$t2) = ("",""); + $t1 = " today " if ($d1->ymd() eq $today->ymd());# Notice in perl == can't be used here! + $t2 = " today " if ($d2->ymd() eq $today->ymd()); +return sprintf( "%s
between $ff $t1 %s and $t2 %s[%s]", $dur, boldDate($d1), boldDate($d2), $d1->ymd()); + +} + +sub boldDate { + my($d)=@_; +return "".$d->ymd()." ".$d->hms; +} + +sub printHeader { + +my $title = shift; +print $cgi->header(-expires=>"+6os"); +&Settings::setupTheme; +print $cgi->start_html(-title => $title, -BGCOLOR => Settings::theme('colBG'), + -script=> [ {-type => 'text/javascript', -src => 'wsrc/jquery.js'}, + {-type => 'text/javascript', -src => 'wsrc/jquery-ui.js'}, + {-type => 'text/javascript', -src => 'wsrc/main.js'} + ], + -style => [ {-type => 'text/css', -src => Settings::theme('css')}, + {-type => 'text/css', -src => 'wsrc/jquery-ui.css'}, + {-type => 'text/css', -src => 'wsrc/jquery-ui.theme.css'}, + {-type => 'text/css', -src => 'wsrc/jquery-ui.theme.css'} + ], + -onload => "onBodyLoadGeneric()" + ) +} + +sub ConfirmForDeletionPage { + +try{ + my $SQLID = 'rowid'; $SQLID = 'ID' if( Settings::isProgressDB() ); + my $stmS = "SELECT ID, PID, (select NAME from CAT WHERE ID_CAT = CAT.ID) as CAT, DATE, LOG from VW_LOG WHERE"; + my $stmE = " ORDER BY DATE DESC, ID DESC;"; + if($opr == 2){ + $stmS = "SELECT $SQLID as ID, ID_CAT as IDCAT, DATE, LOG, AMOUNT from LOG WHERE"; + $stmE = " ORDER BY date(DATE);"; + } + + #Get ids and build confirm table and check + my $stm = $stmS ." "; + my @chks= $cgi->param('chk'); + foreach my $id (@chks){ + if($opr == 2){ + $stm = $stm . "$SQLID = " . $id . " OR "; + } + else{ + $stm = $stm . "PID = " . $id . " OR "; + } + } + $stm =~ s/ OR $//; $stm .= $stmE; + my $st = Settings::selectRecords($db, $stm); + + + if($opr == 0){ + printHeader('Confirm Deletion'); + print $cgi->pre("###ConfirmForDeletionPage()->[stm:$stm]\n]opr:$opr]") if($DEBUG); + + my $r_cnt = 0; + my $rs = "r1"; + + my $tbl = '
+ + + '; + + + while(my @row = $st->fetchrow_array()) { + + my $ct = $row[2]; + my $dt = DateTime::Format::SQLite->parse_datetime( $row[3] ); + my $log = log2html($row[4]); + + $tbl .= '" . + '" . + '\n". + ''; + if($rs eq "r1"){ + $rs = "r0"; + } + else{ + $rs = "r1"; + } + $r_cnt++; + } + + $tbl .= ' + +
Date Time Log Category
'. $dt->ymd . "' . $dt->hms . " +
'."$log
' . $ct. '
+
+

Please Confirm You Want
The Above Record'.($r_cnt>1?'s':'').' Deleted?


+ +
+
+ +
+
'; + + print qq(
$tbl
); + + print $cgi->end_html(); + } + elsif($opr == 2){ + my $csv = Text::CSV-> new ( { binary => 1, escape_char => "\\", strict => 1, eol => $/ } ); + my @columns = ("ID", "CAT", "DATE", "LOG", "AMOUNT"); + print $cgi->header(-charset=>"UTF-8", -type=>"application/octet-stream", -attachment=>Settings::dbName()."_sel.csv"); + print $csv->print(*STDOUT, \@columns); + while (my $row=$st->fetchrow_arrayref()){ + # $row[3] =~ s/\\\\n/\n/gs; + my $out = $csv->print(*STDOUT, $row); + print $out if(length $out>1); + } + exit; + }else{ + LifeLogException->throw(error => "Invalid Operation \$opr => $opr", show_trace=>1) + } + $st->finish(); +}catch($e){ + errorPage($e,'ConfirmForDeletionPage') +} +} + + +sub DeletionConfirmed { + try{ + my $SQLID = 'rowid'; $SQLID = 'ID' if Settings::isProgressDB(); + my $st1 = $db->prepare("DELETE FROM LOG WHERE $SQLID = ?;"); + my $st2 = $db->prepare("DELETE FROM NOTES WHERE LID = ?;"); + #print $cgi->header(-expires=>"+6os"); + foreach my $id ($cgi->param('chk')){ + my $st = Settings::selectRecords($db, 'select RTF from LOG where '.$SQLID.'='.$id); + my @ra = $st->fetchrow_array(); + $st1->execute($id) or die "

Error->$_

"; + $st2->execute($id) if $ra[0]; + } + #2021-08-11 Added just in case next an renumeration. + # Above also checks now, if a log has flagged having an RTF before deleting the note entry. + Settings::renumerate($db); + print $cgi->redirect('main.cgi'); + + }catch($e){ + errorPage ($e, 'DeletionConfirmed'); + } +} + +sub errorPage{ +my ($err, $sub) = @_; +printHeader("ERROR"); +print "

".ref($err)." Encountered!


Building $sub Failed!

Error: ".$err."
"; +print $cgi->end_html() +} + + +use Text::Wrap; $Text::Wrap::columns=80; $Text::Wrap::separator="\n"; + +sub log2html { + my $log = shift; + my ($re_a_tag, $sub) = qr/.*<\/a>/si; + $log = wrap('','',$log); + $log =~ s/''/'/g; + $log =~ s/\r\n/
/gs; + $log =~ s/\\n/
/gs; + + if ( $log =~ /<', $idx ); + $sub = substr( $log, $idx + 1, $len - $idx - 1 ); + my $url = qq($sub); + $log =~ s/<+/$url/osi; + } + + if ( $log =~ /<', $idx ); + $sub = substr( $log, $idx + 1, $len - $idx - 1 ); + my $url = qq(); + $log =~ s/<+/$url/osi; + } + elsif ( $log =~ /<', $idx ); + $sub = substr( $log, $idx + 1, $len - $idx - 1 ); + my $lnk = $sub; + if ( $lnk =~ /_frm.png/ ) { + my $ext = substr( $lnk, index( $lnk, '.' ) ); + $lnk =~ s/_frm.png/$ext/; + if ( not -e "./images/$lnk" ) { + $lnk =~ s/$ext/.jpg/; + if ( not -e "./images/$lnk" ) { + $lnk =~ s/.jpg/.gif/; + } + } + $lnk = + qq(\n + ); + } + else { + #TODO fetch from web locally the original image. + $lnk = qq(\n); + } + $log =~ s/<+/$lnk/o; + } + + #Replace with a full link an HTTP URI + if ( $log =~ /); + $b = q(); + $log =~ s/$a/$b/o; + } + else { + my @chnks = split( /($re_a_tag)/si, $log ); + foreach my $ch_i (@chnks) { + next if $ch_i =~ /$re_a_tag/; + next if index( $ch_i, " -1; + $ch_i =~ s/https/http/gsi; + $ch_i =~ s/($RE{URI}{HTTP})/$1<\/a>/gsi; + } + $log = join( '', @chnks ); + } + +return $log; +} + + +sub PrintView { + +try{ + my $SQLID = 'rowid'; $SQLID = 'ID' if( Settings::isProgressDB() ); + my $stmS = "SELECT ID, PID, (select NAME from CAT WHERE ID_CAT = CAT.ID) as CAT, DATE, LOG, AMOUNT from VW_LOG WHERE"; + my $stmE = " ORDER BY DATE DESC, ID DESC;"; + + #Get ids and build confirm table and check + my $stm = " "; my @chks= $cgi->param('chk'); + foreach my $id (@chks){ + if($opr == 2){ + $stm = $stm . "$SQLID = " . $id . " OR "; + } + else{ + $stm = $stm . "PID = " . $id . " OR "; + } + } + $stm =~ s/ OR $//; + my $sql = $stmS.$stm.$stmE; + print $cgi->header(-expires=>"+6os"); + print $cgi->start_html(-title => "LifeLog Excerpt ".Settings::dbFile()." - ".$today->strftime('%d/%m/%Y %H:%M'), + -style => {-type => 'text/css', -src => "wsrc/print.css"} + ); + print $cgi->pre("###PrintView()->[sql:$sql]") if($DEBUG); + + my $st = Settings::selectRecords($db, "SELECT sum(AMOUNT) FROM VW_LOG WHERE $stm;"); + my $hasAmmounts = 0; while(my @r = $st->fetchrow_array()) {if($r[0]>0){$hasAmmounts = 1}} + + + my ($tot,$assets,$th_amt) = (0,0,''); $th_amt = ''.Settings::currenySymbol().'' if $hasAmmounts; + my $tbl = qq( + + $th_amt); + $st = Settings::selectRecords($db, $sql); + while(my @row = $st->fetchrow_array()) { + my $ct = $row[2]; + my $dt = DateTime::Format::SQLite->parse_datetime( $row[3] ); + my $log = log2html($row[4]); + my $amt = $row[5]; + if($hasAmmounts){ + if($ct eq 'Expense'){ + $tot = $tot - $amt; $amt = "-$amt"; + }elsif($ct eq 'Income'){ + $tot += $amt; + }else{ + $assets += $amt; + } + $amt="'; + }else{$amt=""} + + $tbl .= '" . + '" . qq($amt); + } + $tot = Settings::currenySymbol().cam($tot); + if ($assets){$assets = 'Assets: '.Settings::currenySymbol().cam($assets)}else{$assets=""} + if($hasAmmounts || $assets){ + $tbl .= qq( + + ); + $tbl .= '
DateTimeLogCategory
".cam($amt).'
'. $dt->ymd . "' . $dt->hms . "$log$ct
$assets Total:$tot
'; + } + + print "
\n$tbl\n
"; + +}catch($e){ + errorPage($e,'ConfirmForDeletionPage') +} +print $cgi->end_html(); +} +sub cam { + my $am = sprintf( "%.2f", shift); + # Add one comma each time through the do-nothing loop + 1 while $am =~ s/^(-?\d+)(\d\d\d)/$1,$2/; + return $am; +} + +1; \ No newline at end of file diff --git a/htdocs/cgi-bin/docs/About.md b/htdocs/cgi-bin/docs/About.md new file mode 100644 index 0000000..2c2428c --- /dev/null +++ b/htdocs/cgi-bin/docs/About.md @@ -0,0 +1,10 @@ +# About Life Log + +* Life Log is an full database implementation, web journal of categorized logs and events in time. +* It is meant to be limitless, fully searchable and viewed as mostly desired. +* Can be used and expanded, as it is also fully configurable. + +![Example Page](images/VS-on-METABOX-42.png) + + + diff --git a/htdocs/cgi-bin/docs/LogTagsHelp.md b/htdocs/cgi-bin/docs/LogTagsHelp.md new file mode 100644 index 0000000..2f31547 --- /dev/null +++ b/htdocs/cgi-bin/docs/LogTagsHelp.md @@ -0,0 +1,43 @@ +# LifeLog Post Tags + +```CNF +<> +<> +<> +<> +<> +<> +``` + +* frm.png images file pairs are located in the ./images folder of the cgi-bin directory. These are manually resized by the user. Next to the original. Otherwise, considered as standalone icons. +* _frm.png Image is resized to -> width="210" height="120" + +Examples: + +```sh + ../cgi-bin/images/ + my_cat_simon_frm.png + my_cat_simon.jpg + + For log entry, place: +  < <> + This is my pet, can you hold him for a week while I am on holiday? + + Explicitly tag an URL in the log entry. Required if using in log IMG or FRM tags. + Otherwise link appears as plain text: +  <> + +``` + +* YouTube embed script is automatically parsed. + +Example: + +```pre + + + +``` diff --git a/htdocs/cgi-bin/docs/PerlCNF/AdoptedPerlProgrammingPractices.md b/htdocs/cgi-bin/docs/PerlCNF/AdoptedPerlProgrammingPractices.md new file mode 100644 index 0000000..8793478 --- /dev/null +++ b/htdocs/cgi-bin/docs/PerlCNF/AdoptedPerlProgrammingPractices.md @@ -0,0 +1,270 @@ +# Adopted Best Perl Programming Practices + +APPP, Similar to the jargon of Internet Marketings strategy of 3 P's: + + +1. **Permission** – to increase your response rate, get permission from people first before you send them email marketing messages. +1. **Personality** – let your personality shine through in all your marketing communications to better connect with your ideal clients. +1. **Personalization** – narrow your service offerings to a very specialized niche market to make it easier for potential clients to find you. + +This document highlights my personal adopted practices to efficiently and uniformly use the Perl language, through to all the code and future revisions. +As the number of projects mount, and experience and the encountered other best practices come to light. Hopefully and possibly, this document will be updated and worked on to reflect, give answers or remind. Why something is implemented in a particular way, and to some readers for god sake, also why? + +## Perl Objects + +Perl objects start with **variables** progress to **blocks** where variables are used in a expression context as encountered from one statement to next. +Grouped and reused operations are called **subroutines**. Subroutines choice of use is, is incredibly in many ways flexible further. Where they can be void, functions and even method like, when used in a **package** object. Beside packaging your variables and subroutines for reuse into a single object. It is worth mentioning, that packages can be placed into modules, for further better organization, however modules are not objects. + +### Variables + +* Global variables are package variables, the most primitive and default package is called ```main::```. Your script runs in it, I can bet on it. +* Lexical variables are part of a block, their life starts in it and ends, declared by **my**, **local** or **state**, and are initialized by the type of data they represent. + * Basic Variable Data Types are: + * `$` Scalars + * `@` Arrays/Lists (Arrays -> [] are immutable and don't use with list functions.) + * `%` Hashes + * Use of **my** is the preferred declaration. As **local** will not create a private variable, contained to the subroutine. + * **local** variables are dynamic variables, and are available to other blocks and visible to other called subroutines within the block where declared. +* Special variables, inbuilt, reserved, magical, these are part also of the Perl language, and are suggested reading about. + * These are not covered in this document, and if not familiar with, not a required further reading. + * Or if still curious here -> [https://perldoc.perl.org/perlvar] +* The main benefit of Perl is actually that it isn't strictly typed, and scalars will automatically best can convert, outcome for your expressions, declarations. + * Remember it is designed to be an fast interpreted on the fly language, providing you an flexible way to interact and work in a script with behind the scene libraries that are not high level. Making it an excellent candidate for prototyping, testing, implementing algorithm logistics without to be constrained to any needed structures, levels of complex what an external framework implementation requirements is? And where? + * Has garbage collection, mutability, and one of the actual first kind of functional languages is Perl. It functions, without having to do much setup, configuration or tooling. If you do, it is most likely that you are reinventing the wheel. + * Good practice is to keep to adopted version of Perl, provided features. And not use experimental features in your scripts, not available to an existing old installation on your network. Rest is its long history. Old code has to be compatible with newer version of the Perl interpreter. + +### Subroutines + +Subroutines can also be in nature anonymous, clojure. They are fastest accessed without parenthesis. + +* Instead of an empty argument list, use the pod signifier **&** that is for subroutines, as this passes the current running block argument list (@_) to them. + * >i.e.: use ```&foo;``` instead of calling with ``` foo(); ``` is faster and preferred. +* Arguments to a subroutines are a flat list copy of variables passed. Don't pass globals, and avoid local variables, if you expect them to change by the subroutine. + +### Methods + +Object methods return encapsulate different variable values but structured by same the name. Those variable names must not change, and some times also the variable value is not to be changed form the initialized one, as it is to stay private. + +* Package variables are to be private, otherwise forget about it. +* Package objects are to be created by default with an fixed list of names of the variable, in form of a hashtable that is blessed to an instance. + * Example: + + ```Perl + package Example{ + sub create{ + my ($pck,$args) = @_; + + bless { + name => $args->{name}, + value => $args->{value}?$args->{value}:0, + }, $pck; + } + } + my $example = Example->create({name=>"ticket", value=>2.50}); + + ``` + +* Variables of an package object is to have ONE subroutine to deal with setting or getting the value. + * Unlike in OOP get/set methods, Perl doesn't need two methods. Why make the object bigger? Even if it is only in its initial state. + * Example: + + ```Perl + package Example{ + ... + sub name {shift->{cnt}} + sub value {my($this, $set)=@_;if($set){$this->{value} = $set};$this->{value}} + } + + ``` + + * In example above the **name** object variable is read only. While **value** is both an true get/setter method rolled into one. + +* The parent container to package objects, is to be a separate entity, to which its children don't have access. +* Containers or composites lists of particular type of object should use ```ref(.)``` method, and not function prototypes, that is the function signature approach. + * Example: + + ```Perl + package Container { + + sub create { + my ($this) = @_; + bless {items=>()},$this; + } + sub add { + my ($this,$item) = @_; + my $r = ; + if(ref($item) eq 'Example'){ + push (@{$this->{items}}, $item); + + }else{ + die "put $item, not of package type -> Example" + } + } + sub iterate { + my ($this,$with) = @_; + foreach(@{$this->{items}}){ + do $this->$with($_); + } + } + } + + ``` + + * Example above creates a flat list or array that can contain only items of a certain package type object. + * Some might say; seeing this, *oh life is not easy in the Perl suburbs of code*, put it can get more complicated.The container can be hashref type of list, where each item is a unique property, searchable and nested further. + * Good saying is also keep it short smart, when bloated is stupid. Iteration method can be passed an anonymous subroutine, that out of scope of the container, performs individual action on items in the container. The container contains, and by purpose restricts or allows, what ever implementation you fit as appropriate with it. + * + + ```Perl + + my $container = Container->create(); + ... + $container->iterate(sub {print "Reached Property -> ".$_->name(),"\n"}); + + ``` + +## Expressions and Logic + +* Use **references** for passing lists, arrays and hashes if knowing they are further being read only not changed. + * In your ``main::`` package you have all in front, and know what are you doing, don't you? + * However, not using references is secure way, to pass to an module a copy of an extremely huge list. With which it can modify and do what ever its munchkins wants. You are right. +* **IF** statements should and can be tested to for the scalar default exclusively. + * ``if($v){..do something}`` + * It is not needed to test for null, or in Perls parlang which is the value of ``nothing`` or ``0``. + * Post declaration testing and setting of variables as one liners are encouraged, don't know why someone sees them as an eye sore? + * The motto is, the less lines of code the better. + * Example: + + ```perl + my $flag = 0; $flag = 1 if scalar(@args)>1; + ``` + + * Following is not a **scalar**, so must not to be coded at all as: + + ```perl + my @arr; + print "@arr is not declared!" if !@arr; + @arr=(1 2 3 "check", this, "out", "some elements here are not comma separated but is valid!"); + print "@arr is declared!" if @arr; + ``` + + * Surprisingly to some coders out there, where this fails is on the last ``if`` statement. Which should be written as: + + ```perl + ... + print "\@arr is declared an empty list!" if scalar @arr == 0; + ``` + +* **IF** statements with further curly brace clauses, should be expression based normal logical statements. + + ```perl + if(!@arr){ + print "\@arr is not declared!"; + } + elsif (scalar @arr == 0){ + print "\@arr is declared but an empty list!" + } + else{ + return hollySmokeHereWeGo(\@arr); #We are passing an reference to our @arr. + } + ``` + +## References + +* References are only alike with pointers in C, all variable assignments create copies, same is for lists or hashes. +* Dereferencing outside a scope will create a copy for the purpose of the packages scope. To purposely share a packages hash, return it as a hash reference (**\\%**). + + ```perl + package A; + our $S_ =""; + our %HOUSEHOLD = ( + pets => {dogs=>2, cats=>1} + furniture => {pianos=>1, tables=>3, chairs=>12} + )sub household {$S_=shift;\%{$HOUSEHOLD{$S_}}}; + ``` + +* ``` sub household ``` is known like this as an method of package A. Opening access to the %HOUSEHOLD hash. +* Following examples use static access package directive A::, an object instance i.e. A->new(), will have own copy of all variables and lists, private to the package. +* ``` my $pets1 = A::household(pets); ``` Scalar $pets1 has an hash reference to the inner hash property of the household hash. +* ``` my %pets2 = ${A::household(pets)}; ``` Hash %pets2 is here dereferencing the other packages owning hash, however this creates an copy. Something not possibly wanted. +* ``` $pets1 -> {'pigeons'} = 140 ``` Scalar here adds to referenced in package A::%{HOUSEHOLD}->%{pets}, a new entry pigeons and the number of them. +* ``` $pets2{'pigeons'} = 180 ``` We can add to the hash copy similar the same, like this, the usual way, things are added to an hash. But A::%{HOUSEHOLD}->%{pets}, would not about it be any more wiser. It will retain its value. And/Or if to copy we added any new entries, would not have a clue about it. +* ``` my %pets3 = %$pets1 ``` is misleading, it creates the current snapshot copy of $pets1, so similar but not same to assigning ``` my %pets3 = ${A::household(pets)}; ```. The later which you most probably want, a shared and packaged nested anonymous hash. + +```text +pets => {dogs=>2, cats=>1} <- This is called an anonymous hash when in curly braces. +As the 'pets' entry is a key, not a variable. + +``` + +```perl +my %hsh = (a=>'shared'); <-Normal named and declared hash. Allowed to be declared wrongly + also with curly braces instead of brackets. +my $ref_hsh = \%std1; +$ref_hsh -> {a} = 'changed'; <- Magically we changed the value of a via perls inbuilt autovification process. +print (($ref_hsh->{a} eq $hsh{a}) ?"true":"false"); <- prints true. + +``` + +* We pass to subroutines references to an obj, array or hash, when the same is to transform. Example: ``` my @transformed = process(\@myArray); ```. + * Variable @transformed is quite an obsolete declaration. As it will contain a copy of @myArray if sub process is returning an array. + * Subroutines that receive and return a list from its scope, will create new ones on the receiving end. This can be avoided. By changing via array reference (**@$**). + +```perl + +package A{ + sub process { + my $into_ref_array = shift; + push @$into_ref_array, "Aaaaa, real good!" + } +} + +my @this_song = ('Push it!'); <-- Notice list type with brackets declaration, it is mistake + to declare as a protected fixed array + i.e. with my @this_song = ['Push it!']; +A::process(\@this_song); +say join ' ', @this_song; + +Push it! Aaaaa, real good! <- Prints. See -> Salt-N-Pepa - Push It (Official Music Video) + +``` + +* That all said, this is all is happening from script to initial state of default existence of an program flow. To preserve changed states and dynamic data or even objects. This will require persistance and most likely dynamic object creation. + +## Bad Programming Practices Section + +* The following example has been taken from the following blog, Cheese Louise! How some people wrongly code and should not be programmers or stop writing critiques, like this guy --> [HFT - A Developer From London](https://thehftguy.com/2019/10/07/perl-is-dying-quick-could-be-extinct-by-2023/) + + ```perl + #!/usr/bin/perl + use strict; + use warnings; + use CGI; + + my $cgi = CGI->new; + my %param = map { $_ => scalar $cgi->param($_) } $cgi->param() ; + print $cgi->header( -type => 'text/plain' ); + print qq{PARAM:\N}; + for my $k ( sort keys %param ) { + print join ": ", $k, $param{$k}; + print "\n"; + } + # PARAM: + # foo: bar + ``` + +* Here is what is wrong? + * By printing the```perl print $cgi->header``` he already got the output format ready to be sent to the client, has the CGI object been properly initialized? So he is saying fibs in his critique. + * With ```perl print join ": ", $k, $param{$k};```, the join statement is redundant, Perl has fantastic string interpolation that even modern Python doesn't match. But Python took routines and what deemed working from being available in Perl for decades. + * At the beginning, he is remapping with $cgi to a hash map the CGI is already designed with subroutine params to provide them all, this isn't efficient. + * Being ignorant to distinguish between interpreted script language from a binary producing strict type script is very common. And is only a product of not having experience with possible both cases. + * OOP, and threading is already here for Perl too. In form of modules to be enabled. But main goal of Modules and Perl is and was not to reinvent the wheel when it comes to algorithms and how to most efficiently also implement them. That is for what the CPAN repository is for. I agree it can be bad when it comes approachable documentation, but also some of the best IT books out there are written for the topic Perl. The Authors are quite amazing writers, and should be supported. + +*** + +### Released: v.1.2 Date:20210629 (v.1.1 Date:20210610) + +>This document has been written by ***Will Budic*** and is from the [PerlCNF](https://github.com/wbudic/PerlCNF) project. +> +>Any disclaim, ideas and statements encountered are of personal opinion and facts. Acquired from personal study and experience. Author, removes him self from any responsibility for any third party accepting or implementing the aforementioned document into practice. Amendments and critique are welcomed, as this is an open public letter document. +>However, No permission has been given, for publishing, or copying parts of this document, the only permission been given by the author, is to remove this document from after acquiring any other project code or files, which are open source. diff --git a/htdocs/cgi-bin/docs/PerlCNF/Mermaid_Diagrams.md b/htdocs/cgi-bin/docs/PerlCNF/Mermaid_Diagrams.md new file mode 100644 index 0000000..1b81087 --- /dev/null +++ b/htdocs/cgi-bin/docs/PerlCNF/Mermaid_Diagrams.md @@ -0,0 +1,13 @@ +# Example 1 - CNF Usage Flow + +```mermaid +graph TD; + CNF<-->Application + Application-->Database + Application-->WebService + WebService<-->CNF + WebService<-->Database + + Database <--> CNF + +``` diff --git a/htdocs/cgi-bin/docs/PerlCNF/PerlCNFConstantAnonExplained.md b/htdocs/cgi-bin/docs/PerlCNF/PerlCNFConstantAnonExplained.md new file mode 100644 index 0000000..7cdce0a --- /dev/null +++ b/htdocs/cgi-bin/docs/PerlCNF/PerlCNFConstantAnonExplained.md @@ -0,0 +1,160 @@ +# PerlCNF Constant, Anon, Values and Data Types Explained + + CNF has so called instructional property name value pairs. + This document delves a little bit further into explaining them, how and why are as such implemented. + +## Instructual Types + + 1. Data type of values is determined and implemented by computer language doing the interpretation. + 2. These data types must cover maximums, like 64 bit Integer for numbers, and String of UTF 8 unicode base as the minimum. + 3. The following are instructional value types CNF must cover. + 1. Constant + 2. Anon + 3. Collections + 5. Data + +## Constant + +A CNF Constant is as the name suggests, can't be changed once declared in the configuration. +There are additional rules with these constants. + + * They are private settings to every instance of the Parser, hence not global. + * They can be declared only once. + - Subsequent parsing of scripts and includes, by the same Parser will issue warnings or exceptions. + * They must be present in the configuration, otherwise an Application can't function. + - The Application might provide itself inbuilt defaults, but that is now considered bad practice. + * Constant is preferred and recommended setting requirement for further CNF properties settings like, special instructions or plugins. + * Can be shortened to **CONST**. + +Accessed best is via method: + + ```PERL + $parser->const('ThreadPoolSize'); + ``` + +Or directly with: + + ```PERL + $parser->{'ThreadPoolSize'}; + ``` + +### CNF Basic Format + + ```CNF + + #This is the number of threads to make available as workers. + <10>> + ``` + +### CNF Multiline Format + +Quotes are not necessary in CNF, they get trimmed if present. +Constants can't be further instructional, as the reserved word CONSTANT or CONST is the instruction. + + +```CNF + +<<>> +``` + +## Anon + + A CNF anon is the variable version of a property and value. + They are in nature of no concern to the Parser and can be overwritten or omitted from a script. + Hence their name. + + * They are a composite to the parser and considered global and public by default. + * Setting parser to ANONS_ARE_PUBLIC => 0, will make them private. + - Private or the Parser instance will have only its own Anon's assigned. + * Anon instructional type is also considered also to be the basic form of an CNF property. + +Accessed for value only via method: + +```Perl +$parser->anon('CurrentDate'); +``` + +### Basic Format + +```CNF +#Check is logs need trimming. +<>> +#Assign current date the Parse has parsed this script. +<now>> +<2023-09-21 10:57:44>> +``` + +### Multiline Format + +Since version 2.8, multiline format can also be used with the VAR or VARIABLE instruction. +But only for simple property value pairs. +Anons which are instructional must be scripted standalone. + +```CNF +<<>> +``` + +## CNF Property + + A CNF property is in simplest form a anon, but also is a complex instruction value, like a collection. + Or a processed data value, will come from a property. + Collections will be processed in form of a property to. + + +## Format + +```CNF +< + ...The Property Body... +>> +``` + +## Type Of Collections + + There is three type of collections. + Convention is to prefix collection property name with the instruction signifier of either **@** or **%**. + + The list signifier is a **$$** postfix to the name. + +1. Array type. + ```CNF + <<@SomeList<@> + Blue, + Red, + Green + >> + ``` + +2. Hash Type. + ```CNF + <<%SomeHash<%> + Blue = #0000FF + Red = #FF0000 + Green = #008000 + > + ``` + + ```PERL + my @list = $parser->collection('@SomeList'); + my %hash = %{$parser->collection('%SomeHash')}; + ``` + +3. List Type (experimental) + 1. Collections as a named list so can be scripted into multiple properties or files (includes). + ```CNF + <1,3,5,9,13>> + <19,23, + 113>> + ``` + ```PERL + my @list = $parser->list('MyList'); + ``` diff --git a/htdocs/cgi-bin/docs/PerlCNF/README.md b/htdocs/cgi-bin/docs/PerlCNF/README.md new file mode 100644 index 0000000..64f0aae --- /dev/null +++ b/htdocs/cgi-bin/docs/PerlCNF/README.md @@ -0,0 +1,109 @@ + +# PerlCNF + +Perl based Configuration Network File Format Parser and Specifications. +CNF file format supports used format extraction from any text file. +Useful for templates and providing initial properties and values for an application settings. +Has own textual data format. Therefore, can also be useful for database data batch processing. + +This project also contains a custom build TestManager module for general and all test driven development. +It is at current v.2.9, and specification implemented. + +[You can find the original up-to-date specification here.](https://github.com/wbudic/PerlCNF/Specifications_For_CNF_ReadMe.md) + +--- +## Status +(2023-14-6) - v.2.9, new meta flags and priority can be set via these pre-evaluation settings for instructions. + Node processing on demand and JSON translation on demand of CNFNode's (TREE instruction) is now available. + Online demo made available. +(2023-5-13) - v.2.8, has new instructions VARIABLE, to streamline under one tag like CONST, but for anons. +Has better tag mauling algorithm. PLUGIN code has been improved, particularly the synchronizing and the linking of properties. + +(2022-11-18) - PerlCNF now provides custom test manager and test cases. +That will in future be used for all projects as an copy from this project. +This is all available in the ./test directory and is not a Perl module. + +--- + +## Installation Of This Perl GitHub Project + +* Installation is standard. + +```sh + mkdir ~/dev; cd ~/dev + git clone https://github.com/wbudic/PerlCNF.git + cd PerlCNF +``` + +* To install required modules locally to home, do not run following with sudo in front. + * cd ~/dev/PerlCNF; #Perl tests and project directory is required to be the starting location. +```sh + ./install_cpan_modules_required.pl +``` + + +## Usage + +* Copy the system/modules/CNFParser.pm module into your project. +* From your project you can modify and adopt, access it. +* You can also make an perl bash script. + + ```perl + use lib "system/modules"; + use lib $ENV{'PWD'}.'/htdocs/cgi-bin/system/modules'; + require CNFParser; + + my $cnf1 = new CNFParser('sample.cnf'); + #Load config with enabled evaluation on the fly, of perl code embedded in config file. + my $cnf2 = new CNFParser('sample.cnf',{DO_enabled=>1, duplicates_overwrite=0}); + + ``` + +## Sample CNF File + +```CNF +<<>> +<<$APP_DESCRIPTION +This application presents just +a nice multi-line template. +>> + +<<@<@LIST_OF_COUNTRIES> +Australia, USA, "Great Britain", 'Ireland', "Germany", Austria +Spain, Serbia +Russia +Thailand, Greece +>> + +Note this text here, is like a comment, not affecting and simply ignored. + +

Other tags like this paragraph, is better to put into a CNF property to be captured.

+ +``` + +```perl + +my $cnf = new CNFParser('sample.cnf'); +my @LIST_OF_COUNTRIES = @{$cnf -> collection('@LIST_OF_COUNTRIES')}; +print "[".join(',', sort @LIST_OF_COUNTRIES )."]"; +#prints -> [Australia,Austria,Germany,Great Britain,Greece,Ireland,Russia,Serbia,Spain,Thailand,USA] +print "App Name: ".$cnf->constant('$APP_NAME')."]"; +#prints -> App Name: Test Application + +``` + +## Run Test Cases + +* Tests are located in the projects **./test directory. +* Example how to run them: + +```sh + perl ./tests/testAll.pl +``` + +* Check also the latest Perl CNF [example.cnf](https://github.com/wbudic/PerlCNF/blob/master/tests/example.cnf) scripted also as a tutorial. + * Yes! That is an actual valid configuration file. + * To only just run it or check use ``` perl ./tests/testExample.pl ``` diff --git a/htdocs/cgi-bin/docs/PerlCNF/Specifications_For_CNF_ReadMe.md b/htdocs/cgi-bin/docs/PerlCNF/Specifications_For_CNF_ReadMe.md new file mode 100644 index 0000000..5360754 --- /dev/null +++ b/htdocs/cgi-bin/docs/PerlCNF/Specifications_For_CNF_ReadMe.md @@ -0,0 +1,545 @@ +# Configuration Network File Format Specifications + +## Introduction + +This is a simple and fast file format. That allows setting up of network and database applications with initial configuration values. +These are usually standard, property name and value pairs. Containing possible also SQL database structures statements with basic data. +It is designed to accommodate a parser to read and provide for CNF property tags. + +These can be of four types, using all a textual similar presentation. +In general are recognized as constants, anons, collections or lists, that are either arrays or hashes. + +Operating system environmental settings or variables are considered only as the last resort to provide for a property value. +As these can hide and hold the unexpected value for a setting. + +With the CNF type of application configuration system. Global settings can also be individual scripted with a meaningful description. +Which is pretty much welcomed and encouraged. As the number of them can be quite large, and meanings and requirements, scattered around code comments or various documentation. Why not keep this information next to; where you also can set it. + +CNF type tags are script based, parsed tags of text, everything else is ignored. DOM based parsed tags, require definitions and are hierarchy specific, path based. Even comments, have specified format. A complete different thing. However, in a CNF file you, can nest and tag, DOM based scripts. But not the other way. DOM based scripts are like HTML, XML. They might scream errors if you place in them CNF stuff. + +Quick Jump: [CNF Tag Formats](#cnf-tag-formats) | [CNF Collections Formatting](#cnf-collections-formatting) | [Instructions & Reserved Words](#instructions-and-reserved-words) | [Scripted Data Related Instructions](#scripted-data-related-instructions) + +## General CNF Formatting Rules + +1. Text that isn't CNF tagged is ignored in the file and can be used as comments. +2. CNF tag begins with an **<<** or **<<<** and ends with an **>>>** or **>>**. +3. If instruction is contained the tag begins with **<<** and ends with a **>>**. +4. Multi line values are tag ended on a separate line with an **>>>**. +5. CNF tag value can post processed by placing macros making it a template. +6. Standard markup of a macro is to enclose the property name or number with a triple dollar signifier **\$\$\$**{macro}**\$\$\$**. + 1. Precedence of resolving the property name/value is by first passed macros, then config anons and finally the looking up in constants. + 2. Nested macros resolving from linked in other properties is currently not supported. +7. CNF full tag syntax format: ```<<{$|@|%}NAME{}{}>>```, the name and instruction parts, sure open but don't have to be closed with **>** on a multiple line value. +8. CNF instructions and constants are uppercase. + 1. Example 1 format with instruction: ```<<>>``` autonomous const, with inner properties. + 2. Example 2 format with instruction: ```<<{$sig}{NAME}>>``` A single const property with a multi line value. + 3. Example 3 format with instruction: ```<>>``` A single const property with a multi line value. + 4. Example 4 format with instruction: ```<<{NAME}<{INSTRUCTION}<{value}>>>``` A anon. + 5. Example 5 format with instruction: ```<<{$sig}{NAME}<{INSTRUCTION}\n{value}\n>>>```. +9. CNF instructions are all uppercase and unique, to the processor. +10. A CNF constant in its property name is prefixed with an '**$**' signifier. +11. Constants are usually scripted at the beginning of the file, or parsed first in a separate file. +12. The instruction processor can use them if signifier $ surrounds the constant name. Therefore, replacing it with the constants value if further found in the file. + + ```CNF + <<>> + <>> + ``` + +13. Property names, Constant, Anon refer to the programmatically assigned variable name. +14. *CNF Constant* values are store specific. +15. Constants can't be changed for the life of the application or service issued. +16. Storage of CNF constants declared can be preceded to the file based one. +17. A Constant CNF value is not synchronized, unlike an anon from script to storage configuration. It has to be created from the scripted if missing in storage. +18. i.e. If stored in a database or on a network node. After the file declaration fact. +19. Missing file based storage settings can be next queried from the environmental one. + 1. This is to be avoided if possible. +20. File storage encountered constants override system environmental ones. + 1. i.e. System administrator has set them. +21. Database storage encountered constants override file set ones. + 1. i.e. User of application has set them. +22. CNF Constant values can be changed in the script file. + 1. If not present in script file, then an application setting must proceed with its default. + 2. CNF Constants can be declared only once during initial parsing of script files. + 3. Rule of thumb is that Constants are synchronized with an applications release version. + 4. Static constants, are script or code only assigned values. + 5. CNF Anons can override in contrast previously assigned value. +23. A CNF Anon is similar to constants but a simpler property and value only pair. + 1. Anons are so called because they are unknown or unexpected by the configuration framework, store to object intermediate. + 2. Constants that turn up in the anon list, are a good indicator that they are not handled from script. Forgotten become anons. + 3. Anons similar to constants, once in the database, overtake the scripted or application default settings value. + 4. Static anons, are those that are set in the database, and/or are not merged with application defaults. + 5. Anons hashed are programmatically accessed separately to constants. + 1. It is fine to have several applications, to share same storage, even if they have different implementation. + 2. Constants will be specific to application, while anons can change in different purpose script files. +24. *Anon* is not instruction processed. Hence, anonymous in nature for its value. Applications using this CNF system usually process and handles this type of entries. +25. Anon has no signifier, and doesn't need to have an application default. +26. Anon value is in best practice and in general synchronized, from script to a database configuration store. It is up to the implementation. +27. Anon value is global to the application and its value can be modified. + + ```CNF + <>> + <>> + ``` + + 1. Anon value can be scripted to contain template like but numbered parameters. + 2. When querying for an anon value, replacement parameter array can be passed. + 3. Numbering is from **$$$1$$$**..**$$$(n...)$$$** to be part of its value. Strategically placed. + + ```CNF + <>> + ``` + + ```PERL + # Perl language + my $url = $cnf->anon('GET_SUB_URL',('tech','main.cgi')); + # $url now should be: https://www.tech.acme.com/main.cgi + eval ($url =~ m/https:\.*/) + or warn "Failed to obtain expected URL when querying anon -> GET_SUB_URL" + ``` + +28. Listing is a reappearing same name tag postfixed with an **\$\$**. + + ```CNF Example 1: + <ls -la>> + <uname -a>> + ``` + +29. Listing is usually a named list of instructions, items grouped and available as individual entries of the listing value. + + ```CNF Example 2: + <Cat>> + <Dog>> + <Eagle>> + ``` + +30. Anon used as an **reserve** format is some applications internal meta property. + 1. These are prefixed with an **^** to the anon property name. + 2. They are not expected or in any specially part of the CNF processing, but have here an special mention. + 3. It is not recommended to use reserve anons as their value settings, that is; can be modified in scripts for their value. + 4. Reserve anon if present is usually a placeholder, lookup setting, that in contrast if not found there, might rise exceptions from the application using CNF. + + ```CNF Example 3: + Notice to Admin, following please don't modify in any way! + Start --> { + <<^RELEASE>2.3>> + <<^REVISION>5>> + <^INIT=1`^RUN=1`^STAGES_EXPECTED=5>> } <-- End + ``` + + +## CNF Tag Formats + +Quick Jump: [Introduction](#introduction) | [CNF Collections Formatting](#cnf-collections-formatting) | [Instructions & Reserved Words](#instructions-and-reserved-words) | [Scripted Data Related Instructions](#scripted-data-related-instructions) + +### Property Value Tag + + ```CNF + <<{name}<{value}>>> + ``` + +### Instruction Value Tag + + ```CNF + <<<{INSTRUCTION} + {value\n...valuen\n}>>> + ``` + + ```CNF + <<{name}<{INSTRUCTION} + {value\n...valuen\n}>>> + ``` + +### Full Tag + +```CNF + <<{$sig}{name}<{INSTRUCTION}> + {value\n...value\n} + >> +``` + +**Examples:** + +```CNF + <<$HELP> + <<> + <> +``` + +## Mauling Explained + +1. Mauling refers to allowing for/or encountering inadequate possible script format of an CNF property. + 1. These still should pass the parsers scrutiny and are not in most cases errors. + 2. There are in general three parts expected for an CNF property. + 1. Tag name. + 2. Instruction. + 3. Value + 3. CNF property value tag turns the instruction the value, if the value is not separated from it. + 4. CNF only instructed, will try to parse the whole value to make multiple property value pairs. + 1. The newline is the separator for each on created. + 5. Ver. 2.8 of PerlCNF is the third rewrite to boom and make this algorithm efficient. +2. Example. Instruction is mauling value: + + ```cnf + <>> + ``` + +3. Example. Instruction mauls into multi-new line value: + + ```cnf + <> + ``` + +4. Example. Tag name mauled: + + ```cnf + <<> + ``` + +5. Example. Instruction mauled or being disabled for now: + 1. This will fire warnings but isn't exactly an error. + 2. Introduced with CNF release v.2.5. + + ```cnf + <path/to/something>> + ``` + + +## CNF Collections Formatting +Quick Jump: [Introduction](#introduction) | [CNF Tag Formats](#cnf-tag-formats) | [Instructions & Reserved Words](#instructions-and-reserved-words) | [Scripted Data Related Instructions](#scripted-data-related-instructions) + +1. CNF collections are named two list types. + 1. Arrays + 2. Hashtables +2. Collection format. + 1. {T} stands for type signifier. Which can only be either ''@'' for array type, or ''%'' for hash. + 2. NAME is the name of the collection, required. Later this is searched for with signifier prefixed. + 3. DATA is delimited list of items. + 1. For hashes named as property value pairs and assigned with '=', for value. + 1. Hash entries are delimited by a new line. + 2. For arrays, values are delimited by new line or a comma. + 3. White space is preserved if values are quoted, otherwise are trimmed. + + ```cnf + Format: <<@<{T}NAME{$$}>DATA>>> + + Examples: + # Following provides an array of listed animal types. Notice how you don't need text to be quoted. + <<@<@animals>> + # Following provides an array with numbers from 0..8 + <<@<@numbers<1,2,3,4,5 + 6 + 7 + 8 + >>> + + # Following is hashing properties. Notice the important % signifier for the hash name as %settings. + <<@<%settings< + AppName = "UDP Server" + port = 3820 + buffer_size = 1024 + pool_capacity = 1000 + >> + ``` + +## Instructions And Reserved Words + +Quick Jump: [Introduction](#introduction) | [CNF Tag Formats](#cnf-tag-formats) | [CNF Collections Formatting](#cnf-collections-formatting) | [Scripted Data Related Instructions](#scripted-data-related-instructions) + + 1. Reserved words relate to instructions, that are specially treated, and interpreted by the parser to perform extra or specifically processing on the current value. + 2. Reserved instructions can't be used for future custom ones, and also not recommended tag or property names. + 3. Current Reserved words list is. + - CONST - Concentrated list of constances, or individually tagged name and its value. + - VARIABLE - Concentrated list of anons, or individually tagged name and its value. + - DATA - CNF scripted delimited data property, having uniform table data rows. + - FILE - CNF scripted delimited data property is in a separate file. + - %LOG - Log settings property, i.e. enabled=1, console=1. + - TABLE - SQL related. + - TREE - Property is a CNFNode tree containing multiple depth nested children nodes. + - INCLUDE - Include properties from another file to this repository. + - Included files constances are ignored if are in parent file assigned. + - Includes are processed last and not on the spot, so their anons encountered take over precedence. + - Include instruction use is not recommended and is as same to as calling the parse method of the parser. + - INDEX - SQL related. + - INSTRUCT - Provides custom new anonymous instruction. + - VIEW - SQL related. + - PLUGIN - Provides property type extension for the PerlCNF repository. + - SQL - SQL related. + - MIGRATE - SQL related. + - MACRO + 1. Value is searched and replaced by a property value, outside the property scripted. + 2. Parsing abruptly stops if this abstract property specified is not found. + 3. Macro format specifications, have been aforementioned in this document. However, make sure that your macro a constant also including the *$* signifier if desired. + +## Database and SQL Instruction Formatting + +(Note - this documentation section not complete, as of 2020-02-14) + +### About + +CNF supports basic SQL Database structure statement generation. This is done via instruction based CNF tags. Named **sqlites**. + +1. Supported is table, view, index and data creation statements. +2. Database statements are generic text, that is not further processed. +3. There is limited database interaction, handling or processing to be provided. + 1. Mainly for storage transfer of CNF constants, from file to database. + 2. File changes precede database storage only in newly assigned constants. +4. Database generated is expected to have a system SYS_CNF_CONFIG table, containing the constants unique name value pairs, with optional description for each. + 1. This is a reserved table and name. + 2. This table must contain a **$RELEASE_VER** constants record at least. + +### SQLite Formatting + +* SQLites have the following reserved instructions: + +1. TABLE + + ```CNF + <>> + ``` + +2. INDEX + + ```CNF + <>> + ``` + +3. SQL + 1. SQL statements are actual full SQL placed in the tag body value. + + ```CNF + <SQL + CREATE VIEW VW_ALIASES AS SELECT ID,ALIAS ORDER BY ALIAS; + >>> + ``` + +4. MIGRATE + 1. Migration are brute SQL statements to be run based on currently installed previous version of the SQL database. + 2. Migration is to be run from version upwards as stated and in the previous database encountered. + 1. i.e. If encountered old v.1.5, it will be upgraded to v.1.6 first, then v.1.7... + 3. Migration is not run on newly created databases. These create the expected latest data structure. + 4. SQL Statements a separated by ';' terminator. To be executed one by one. + + ```CNF + <<1.6> + <<1.8> + ``` + +### Scripted Data Related Instructions + +1. DATA + 1. Data is specifically parsed, not requiring quoted strings and isn't delimited by new lines alone. + 2. Data rows are ended with the **"~"** delimiter. In the tag body. + 3. Data columns are delimited with the invert quote **"`"** (back tick) making the row. + 4. First column can be taken as the unique and record identity column (UID). + 1. If no UID is set, or specified with # or, 0, ID is considered to be auto-numbered based on data position plus 1, so not to have zero IDs. + 2. When UID is specified, an existing previous assigned UID cannot be overridden, therefore can cause duplicates. + 3. Data processing plugins can be installed to cater and change behavior on this whole concept. + 5. Data is to be updated in storage if any column other than the UID, has its contents changed in the file. + 1. This behavior can be controlled by disabling something like an auto file storage update. i.e. during application upgrades. To prevent user set settings to reset to factory defaults. + 2. The result would then be that database already stored data remains, and only new ones are added. This exercise is out of scope of this specification. + + ```CNF + <> + ``` + +2. FILE + 1. Expects a file name assigned value, file containing actual further CNF DATA rows instructions, separately. + 2. The file is expected to be located next to the config file. + 3. File is to be sequentially buffer read and processed instead as a whole in one go. + 4. The same principles apply in the file as to the DATA instruction CNF tag format, that is expected to be contained in it. + + ```CNF + <> + ``` + +3. PLUGIN + 1. Plugin instruction is specific outside program that can be run for various configuration task, on post loading of all properties. + This can be special further. + 1. Further, processing of data collections. + 2. Issuing actions, revalues. + 3. Checking structures, properties and values that are out of scope of the parser. + 2. To a plugin parser itself will be passed to access. + 1. Required attributes are: + 1. package : Path or package name of plugin. + 2. subroutine: Subroutine name to use to pass the parser, after plugin initialization. + 3. property : property to be passed directly, if required, like with data processing. + 3. Requirements are for plugins to work to have the DO_ENABLED=>1 config attribute set. + 1. Plugins currently also will require be last specified in the file, to have access to previous anons that are instructed. + + ```CNF + /** + * Plugin instructions are the last one setup and processed, + * by placing the actual result into the plugins tag name. + */ + < + package : DataProcessorPlugin + subroutine : process + property : employees + >> + ``` + +4. TREE (NEW FEATURE - 20221128) + 1. Will create an CNF property having a CNF Node object, that contains further child nodes or attributes in a tree structure. + 1. This is a hash of anons for attributes and a list of further nodes, all having their own one text value. + 2. Property can have its value, contain attributes, and also other properties within. + 1. The property markup in the tree script is called body, and follows the Perl CNF style. + The difference is that both ' **<,>** ' and ' **[,]** ' are signifiers for the property or multiline value, start and end tags. + 1. All tags require to be on a line of their own. + 2. Current algorithm uses sub buffering to parse each property's body. + So deeply nesting a large property body is not recommended and also not suitable for encapsulating in there data. + 3. An opening tag is opened being surrounded with the same signifier into the direction of the property body. + 4. The closing tag is in the opposite direction same signifiers. + - **[sesame[** I am an open and closed value now, nothing you can do about it (X|H)TML! **]sesame]** + 3. The node characteristic is that each sub property is linked to its parent property + 1. This is contained in the ' **@** ' attribute. + 2. Node characteristic is also the tree can be searched via path. + 3. Perl doesn't require type casting and conversion for node values, but for only few rare occasions. + 4. All attributes and sub properties have to have unique names. + 1. Emphasis of having uniquely named properties is to avoid having a tree to be used as a collection. + 2. A property can have its contained collection however, which are multiple sub properties placed into an ' **@@** ' field or attribute. + 5. However, deeply nested in. The contained attributes and other properties are assigned and accessed by a path statement. + 6. Attributes can be either assigned with an ' **:** ' or ' **=** ' signifier, no quotes are needed; unless capturing space. + - Attributes must be specified on a single line. + - Future versions might provide for allowing to assign similar as property values, with the multiline value tag. + 2. The TREE instruction will create an CNF Node object assigned to a unique anon. + 1. The value of a property is delimited with an [ **#** ] tag as start, end [ **/#** ] as the ending. + 1. Each property's start and end tag must stand and be on its own line, withing the body, except for the value or array attributes. + 2. A value tagged property section is its text and can't contain further nested tree notes. + Invalid: ```[#[<**>]#]``` + 3. Tree can contain links to other various properties, anons, that means also to other trees then the current one. + 1. A link (pointer) to an outside anon or property is specified in form of ⇾ ```cnf [*[ {path/name} ]*]```. + 1. The link can read only point to: + - A repository anon or constant value. + - A tree path value. + - A Perl package constant value,``` MyPackage::SOME_CONSTANCE ```. + - A Perl static subroutine accepting **this** CNF node and changing possible its value, ``` main::setNodeValue(.) ```. + 2. It is not recommended to make circular links, or to prioritize properties themselves containing links. + 3. To aid parsing priority a parse special instruction can be used if for example linking trees. + 1. Specified the best just after the tree instruction as ⇾ ``` <<... _HAS_PROCESSING_PRIORITY_ ```. + 2. This is currently a TREE instruction only inbuilt option in Perl CNF, for the CNF Nodes individuals scripts order of processing. + 4. Links in the root parent node of the tree are assigned as attributes or unique values. In subroperties they are set as own nodes. + 4. Tree Format Example: + ```cnf + <> + + < + <**> + thread: 28 + title = My Application + client> + >> + ``` + +## Sample Perl Language Usage + +Quick Jump: [Introduction](#introduction) | [CNF Collections Formatting](#cnf-collections-formatting) | [Instructions & Reserved Words](#instructions-and-reserved-words) | [Scripted Data Related Instructions](#scripted-data-related-instructions) | [CNF Tag Formats](#cnf-tag-formats) + +1. *DO* + 1. CNF DO instruction is *experimental*, purely Perl programming language related. + 2. It provides Perl code evaluation during parsing giving also access to parser and its variables as DO's further sequentially appear. + 3. It is recommended to disable this feature, if not need Perl code snippets to be in the configuration file. + 4. These, if named are assigned as anons, with the last processed value as the return. Making them evaluated and processed ever only once. + +```CNF +<<>> +``` + +**~/my_application.pl** file contents: + +```PERL + +use lib "system/modules"; +use lib $ENV{'PWD'}.'/perl_dev/WB_CNF/system/modules'; +require CNFParser; +require Settings; + +my @expected = ("$MY_APP_LIB_RELATIVE", "$MY_APP_DB_RELATIVE"); +my $path = $ENV{'PWD'}."/perl_dev/WB_CNF/db/configuration.cnf"; +# Loading twice config here with object constructor with and without path. +# To show dual purpose use. +my $cnf1 = CNFParser->new($path); +# Nothing parsed yet construct. +my $cnf2 = CNFParser->new(); + # We relay that the OS environment has been set for CNF constant settings if missing + # in the configuration file. Adding after parse has no effect if found in file. + $cnf2 -> addENVList(@expected); + # Parse finally now. Parse can be called on multiple different files, if desired. + $cnf2 -> parse($path); +my $LIB_PATH; + +print "List of constants in file: $path\n"; +foreach my $prp ($cnf->constants()){ + print "$prp=", $cnf->constant($prp),"\n"; +} +if(!$cnf->constant('$MY_APP_LIB_RELATIVE')){ + warn 'Missing $MY_APP_LIB_RELATIVE setting.'; + $LIB_PATH = $cnf2->constant('$MY_APP_LIB_RELATIVE'); + die 'Unable to get required $MY_APP_LIB_RELATIVE setting!' if(not $LIB_PATH) +} + +print "Welcome to ", $cnf->constant('$APP_NAME'), " version ", $cnf->constant('$RELEASE_VER'), ".\n"; +``` + +**~//perl_dev/WB_CNF/db/configuration.cnf** file contents: + +```CNF + +# List command anon with the name of 'list'. +<>> +<<>> + +``` + +*** + + Document is from project ⇾ + + An open source application. + +
Sun Stage - v.2.8 2023
+ diff --git a/htdocs/cgi-bin/docs/Squeezed In Between Poetry/pix/arrDbl_left.gif b/htdocs/cgi-bin/docs/Squeezed In Between Poetry/pix/arrDbl_left.gif new file mode 100644 index 0000000..84ce312 Binary files /dev/null and b/htdocs/cgi-bin/docs/Squeezed In Between Poetry/pix/arrDbl_left.gif differ diff --git a/htdocs/cgi-bin/docs/Squeezed In Between Poetry/pix/arrDbl_right.gif b/htdocs/cgi-bin/docs/Squeezed In Between Poetry/pix/arrDbl_right.gif new file mode 100644 index 0000000..28671f5 Binary files /dev/null and b/htdocs/cgi-bin/docs/Squeezed In Between Poetry/pix/arrDbl_right.gif differ diff --git a/htdocs/cgi-bin/docs/Squeezed In Between Poetry/pix/arrDbl_top.gif b/htdocs/cgi-bin/docs/Squeezed In Between Poetry/pix/arrDbl_top.gif new file mode 100644 index 0000000..78780a9 Binary files /dev/null and b/htdocs/cgi-bin/docs/Squeezed In Between Poetry/pix/arrDbl_top.gif differ diff --git a/htdocs/cgi-bin/docs/Squeezed In Between Poetry/pix/thournwhaul_logo.jpg b/htdocs/cgi-bin/docs/Squeezed In Between Poetry/pix/thournwhaul_logo.jpg new file mode 100644 index 0000000..14338bc Binary files /dev/null and b/htdocs/cgi-bin/docs/Squeezed In Between Poetry/pix/thournwhaul_logo.jpg differ diff --git a/htdocs/cgi-bin/docs/Squeezed In Between Poetry/vol1.html b/htdocs/cgi-bin/docs/Squeezed In Between Poetry/vol1.html new file mode 100644 index 0000000..64fc416 --- /dev/null +++ b/htdocs/cgi-bin/docs/Squeezed In Between Poetry/vol1.html @@ -0,0 +1,1541 @@ + + +Squeezed In Between Poetry - Vol I + + + + + + +
+ + + + + + + + +
+

+   Squeezed In Between Poetry +

+ + + + + + +

Volume I

Volume II

+ +
+

+This is a private and sacred unpublished poetry collection. Born out of need and desperation by the author, to return any left sense of art, that has slowly begun to disappear from the Internet scene. The turn of the new century brought only continuums of wars (middle east). The west is experiencing floods, bad economy, retrenchments. Morale values in people are getting even more so degrading. Time has come to heal, save planet earth and follow in spirit (at least) non-monetary values. +

+

+This collection is a study and a poetry practice, future published works will not be part of this collection. The strive of all this was to produce a generation less verse, play of words, trying to suit everyone. In hope it will entertain if not heal in this uncertain times of information overflow. Nothing here found is particularly political, gender or religion sided. The only protagonist is; and will continue to be, the right to freedom of speech, art and mutual respect of thought. +
+ +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

10-Dec-2002
For the Love of Syringa


Facing The River Dream

Just Another Testament

Dog Patrol

Abstained Melodrama

Cross Eyed

The Flock Trip

Coined System

Sun Stark

The Shaved Nun Tail Rap

Disturbed Kitten

Creation

Troll

Remind Me What I am Not

+
+ +

Poetry of
Thourn Whaul

+
+ +

For the Love of Syringa

+
+My village is burning feelings convulse
+home away on a trench bench rest
+Feelings don't take me away, avulse
+what was left behind in jest
+
+Is it my grandfathers house? but family aside
+the Syringa  bloom  has taken over mourn
+Occupied presence grasping left out pride
+seduced hope by facts of youth adjourn.
+ 
+You violate flower let your self go 
+from the roads that you follow so carefully stringed
+Through orchards full in fruit keep your self low
+Bring me the perfume of hair loosened, been tinged
+Childhood mists of woodlands chased, 
+and moments well discrete you witnessed, fringed
+Syringa release the visions of home
+bride moments and the children's play.
+Obscured  plight then in a phase of epitome
+only you can again seduce as such, but be belay.
+
+My land under plunder, arson, rape 
+scratching years, breathing smoke
+Digging hollows, when ditches undrape 
+Syringa roots a loyal subject to invoke
+as wishes march with this boots that follow
+many good men and their own turn of reasons
+A lilac now missed grew from a barrow
+rich, powerful, to sustain the seasons.
+
+
+
+

+

Intro

+

+ "Facing The River Dream" is one of my favourites. It is a "hook-on" poem to a famous Led Zeppelin song. It tries to be a riddle with how it approaches abstraction. Maybe its my odd personal taste, but it is a shame that this type of poems are not considered anymore to be of "style". Hint - It is a riddle since it has nothing to do directly on what it preaches or is being hook-up on, but helps ;) +

+
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

12-Nov-2002
Facing The River Dream


Just Another Testament

Dog Patrol

Abstained Melodrama

Cross Eyed

The Flock Trip

Coined System

Sun Stark

The Shaved Nun Tail Rap

Disturbed Kitten

Creation

Troll

Remind Me What I am Not

+
+ +

Poetry of
Thourn Whaul

+
+ +

Facing The River Dream

+
Harsh peace a vision yet to face
+when confronted with distances revealed
+Wasted beauty this foreign place
+unfazed by mortals time over left to bleed.
+
+Tasting the river green was bitter
+it carried the foot pilgrims smell
+Embracing them as their desert sitter
+of opiates less visions daring to foretell.
+
+Disturbed was thought by the sight of a body
+floating, after taken from the stake
+Healing stretched turning ghoulie
+to return to life just before the lake.
+
+Time to go, dream is over 
+moment enough to let loose only a tear
+The becoming is bedding in clouds passover
+decision made, moving to Kashmir.
+
+

+
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

05-Nov-2002
Just Another Testament


Dog Patrol

Abstained Melodrama

Cross Eyed

The Flock Trip

Coined System

Sun Stark

The Shaved Nun Tail Rap

Disturbed Kitten

Creation

Troll

Remind Me What I am Not

+
+ +

Poetry of
Thourn Whaul

+
+ +

Just Another Testament

+
+What have you done
+with the scent that walked by
+What have you stun
+with looks that freed my
+You just be there
+while we carry the burden mount
+You just be fare
+to the disease taking count.
+
+Whish this words could come any easy
+whish you new things you instinctively do
+So let me wonder into my thing
+that maligned decision came to sing.
+
+I do my job well as we fight what needs to expel
+In hope a revelation without fear
+that when gone from verses I'll reappear. 
+Then talk to me as a stranger
+Introduce your self as you whish.
+Find me coming along, find me happy in full song.
+Courage a revelation without fear
+when I am gone to you I'll become less dear.
+For no use to be in mourning
+For no time was spend or ever lost
+Your served and wise went days
+with this lover and his ways.
+
+
+

+
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

19/08/2002
Dog Patrol


Abstained Melodrama

Cross Eyed

The Flock Trip

Coined System

Sun Stark

The Shaved Nun Tail Rap

Disturbed Kitten

Creation

Troll

Remind Me What I am Not

+
+ +

Poetry of
Thourn Whaul

+
+ +

Dog Patrol

+
+Pulled into place the angry hound
+by hands well groomed for the job.
+Enemy astound, surprised 
+another direction to go lob.
+
+Sleep in peace you mankind layer
+don't dog your best friend.
+Heard let it be in thy prayer
+then join healed by a noseband.
+
+A lonely setting is the dog patrol
+every day bringing much of the same.
+Drugged in the smell of carbinol
+reason enough not to feel any blame. 
+
+In the hardest hour, why do we search 
+for reasons of devour?
+Fruit taken, any, even sour.
+Forgotten next and the dearest,
+like that passing by flower.
+
+

+

Intro

+

Theme food. One of those [AAPC] challenges (usenet).

+
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

19/08/2002
Abstained Melodrama


Cross Eyed

The Flock Trip

Coined System

Sun Stark

The Shaved Nun Tail Rap

Disturbed Kitten

Creation

Troll

Remind Me What I am Not

+
+ +

Poetry of
Thourn Whaul

+
+ +

Abstained Melodrama

+
	   
+To many weeks passed in abstention
+then finally it is time and a dash to the store.
+First I caressed the melon
+then peeled to suck on the core.
+
+Sticky fingers juices everywhere
+all divulged like an �clair.
+
+
+
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

08/09/2002
Cross Eyed


+

The Flock Trip

Coined System

Sun Stark

The Shaved Nun Tail Rap

Disturbed Kitten

Creation

Troll

Remind Me What I am Not

+
+ +

Poetry of
Thourn Whaul

+
+ +

Cross Eyed

+
+Cross eyed images on what is yet to be known.
+When in a shuffle, cards change hands 
+and things over sudden, quickly turn;
+no longer a price years spend to learn.
+
+For the hunted is a prey confused.
+Smuggling looks when caught stalking gifts
+(You always stepped in front of me with a smile.)
+In fear is a chest signed on the sweetly abused.
+But gifts found more suiting, another.
+(I watch you in motion; 
+probing of how much you gain from about the same.)
+Time based shifts appeal confessing on the done, 
+then rather.
+Balancing inhibits with suggestions.
+Following rules like a spinning eagle pair.
+Taken into winds that grasp the inception.
+Minding not, time taken for the dare.
+
+Long searched but found is the refuge, to precious;
+leaving is out of question!
+So we pass each others territory;
+in good company, no thanks need a mention.
+
+

Intro

+

It has been said that Nostradamus and his quatrains, depict and predict like an oracle at first sight.

+
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

06/09/2002
The Flock Trip


+

Coined System

Sun Stark

The Shaved Nun Tail Rap

Disturbed Kitten

Creation

Troll

Remind Me What I am Not

+
+ +

Poetry of
Thourn Whaul

+
+ + +

The Flock Trip

+
+The flock has landed
+with no seed ever thrown.
+On a field green and mended.
+Full in pain, a new keeper has grown.
+
+People want times to be dear.
+No problem being a bit queer.
+Earth in shocking state.
+Past the river of blood, 2 and 8 will mate.
+(I am loosing inspiration, should I shutdown?)
+
+Cages clean as never seen.
+From all, only two saw eye to eye.
+
+
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

03/08/2002
 Coined System


Sun Stark

The Shaved Nun Tail Rap

Disturbed Kitten

Creation

Troll

Remind Me What I am Not

+
+ +

Poetry of
Thourn Whaul

+
+ + + +

Coined System

+
+Two sides of the coin
+Spin it my friend and watch it land.
+Short in decision, short in fall
+Careful now don't miss the hand.
+
+Taken by spin and magic turn, 
+Third side appears, the forgotten one
+Standing blank, late pockets burn
+To late now, the coin be gone.
+
+Third day of life has entered
+Just only confirming the aware
+Life as much as it is centred
+Then pluck what you can prepare.
+
+Found the circling birthmark
+Found third side of the coin
+Obscure images glowing stark
+What a joyous moment,
+a hit in the groin.
+Closing eyes from pain 
+and time come to clack.
+(Some would swear rather 
+ then clack; but I disagree;)	
+A ready tool is my scraper.
+in hurry seated down to notice,
+there is no toilet paper.
+
+

Intro

+

War kills in any form presented. 'Sun Stark' is dedicated to all innocent victims of September 11. +

+
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

30/08/2002
Sun Stark


The Shaved Nun Tail Rap

Disturbed Kitten

Creation

Troll

Remind Me What I am Not

+
+ +

Poetry of
Thourn Whaul

+
+ + + + +

Sun Stark

+
+Two giants down long the suffer,
+And you follow best you can,
+in mourn molding a new 'him'.
+Abandoned made into a fin.
+No waves found to where we swim.
+
+Anaesthetic, a drag to deep,
+drowned pagers on a heap.
+Grasped direction to much care,
+Stifle rollbug gaining bare.
+
+Sun stark in oblivion,
+And you follow best you can.
+My love, lets try reach.
+The harden melody of behold,
+of loosen huff then unpluged leech.
+
+Soul was clasped out of skin.
+No waves found, to where we swim.
+
+ +
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

27/08/2002
The Shaved Nun Tail Rap


Disturbed Kitten

Creation

Troll

Remind Me What I am Not

+
+ +

Poetry of
Thourn Whaul

+
+ + + + +

The Shaved Nun Tail Rap

+
+Across the street an old fell'a
+laundering his yellow stained underwear.
+Cotton reflects neon lights
+Words, 'No visitors after 23 PM'
+
+Don't ask now for prick pity. 
+You used up cotton resisting tear and wear.
+Old hands are patient,
+with titbits left to pick.
+Collected and saved, what for haven sake.
+
+Intaken is the stench of the collected,
+poor vapour of the sick.
+Fuelling a neon light,
+That flaps with pigeons in fright.
+
+A kicked bottle spins into corners
+Turning over a beggars tin
+Into the passage a nun, just arrived
+Tongue stapled eyelid,
+rocking beads between her teeth.
+What a pro!
+But was she worth waiting for?
+
+The shaved nun issues a warning:
+'If God is none, watch next of kin.'
+The beggar changed his sign next morning:
+'If the Devil is 1 and 0, how did I got in-between?'.
+
+Across the street an old fell'a
+Smiling back to his tail teller.
+Lifting now a female pair.
+Under armpit Amway bleach
+Whistling into evergreen,
+'life is all but what we teach'.
+
+ +
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + +

24/08/2002
Disturbed Kitten


Creation

Troll

Remind Me What I am Not

+
+ +

Poetry of
Thourn Whaul

+
+ + + + +

Disturbed Kitten

+
+Defanged kitten, left barely alive.
+Such shared among convicts for pleasure's sake.
+Kitten's survival jerks, poor reason of vibe.
+An awful sight, to keep you awake.
+
+Proclaimed insane, villain is not.
+Destined master of his own wrought.
+
+She laid down late, next to having a man.
+Playing circles round and such.
+Man fast asleep, she opens her gown.
+Exited occasion, a solo touch.
+
+She whispers words learned by day.
+Mixing moan and the understood.
+Pushing beast out of hay.
+Pressing slowly enough to be wooed.
+
+Done without sweat, 
+she embraced the snored.
+Falling asleep contented and hot.
+Not minding to stay, restless and bored
+Pierced in trouble hawking snot.
+
+The same morning, rise and shine.
+Dreamy as if handed in a sham.
+Husband summons his concubine.
+Smelly thing in a day break come.
+
+Given into words,
+is the rest of the day.
+Ruled by hordes,
+makes a kitten pay.
+
+ +
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ +
+ + + + + + + + + + + + + + + + + + +

22/08/2002
Creation


Troll

Remind Me What I am Not

+
+ +

Poetry of
Thourn Whaul

+

+
+ + + + +

Creation

+
+Poetry is creation!
+A mightier sword then pen.
+That captures dust particles,
+sun ray dancing,
+in the whirlpool of your den.
+
+Capturing only, but not zooming in.
+To explore further the world within.
+
+Tossed in the corner, a rotting book.
+Written once, reprinted many times.
+Collecting and making dust.
+The critic bites the hook.
+Cut with the pen, bleeds in rimes.
+What a curious moment, missing meaning just.
+
+Captured and taken away, in a lunatic suit.
+A frozen computer screen has suddenly reset.
+What a laugh, this mad delight.
+Captives cannot know what hasn't been saved.
+It has been lost together with its guide.
+
+

Intro

+

+I discovered one night, this tiny scary looking bug. +It looks like a tick but is a bit bigger. +It comes out at night, and feeds on sugar traces, from cups that collect them self on my computer desk. +Didn't kill it, but will clean up my act from now. +

+
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ +
+ + + + + + + + + + + + + + +

20/08/2002
Troll


Remind Me What I am Not

+
+ +

Poetry of
Thourn Whaul

+

+
+ + + + +

Troll

+
+Since a while back, I got this Troll.
+Squatting there griming, on me left shoulder.
+It burrows thoughts, this unwanted maul.
+As time passes, becoming ever so bolder.
+
+The soul reason for all the blames.
+It itches my ear, and plays dirty games.
+Still only; from time to time.
+This gruesome and annoying,
+new found friend of mine.
+
+Pumpkin soup taken, it disappears for a while.
+Found out, it is much less there,
+when taken with wine.
+
+Learned to trick it, from day to day.
+Take some more wine, and it will go away.
+Then one day in hour of blissful merry.
+Shocked! I find out it turned into a fairy.
+
+ +

Intro

+

+Communism has been proven dead wrong. But how much did things changed with Capitalism. +

+
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

10/05/2002
Remind Me What I am Not


Facing The River Dream

Just Another Testament

Dog Patrol

Abstained Melodrama

Cross Eyed

The Flock Trip

Coined System

Sun Stark

The Shaved Nun Tail Rap

Disturbed Kitten

Creation

Troll

+
+ +

Poetry of
Thourn Whaul

+
+ + +

Remind Me What I am Not

+
+Somone from above likes me!
+And, I wish I was talking about God.
+In reality, the servant of his own success no one likes
+As servants make people think.
+
+So, loop back before you think.
+It is important who likes you!
+So, speek at times before you think
+It is important that people get to know you.
+
+The youtfull eye wants to see you dance
+And the old, only fight how mutch they want
+Not to forget, the fact how really late their are.
+
+Now, when we also realised the level of shame
+Don't be silenced, since its known, no one can jump their skin.
+Should we tattoo the moment where it fits appropriately?
+Sure not! As crap, eventually has to be wiped by someone.
+
+After all said, if still bound to things that don't work.
+Don't despair
+someone from above likes you.
+
+ +
+

Copyright � Thourn Whaul all rights reserved.
+

+
+ + + \ No newline at end of file diff --git a/htdocs/cgi-bin/docs/Squeezed In Between Poetry/vol2.html b/htdocs/cgi-bin/docs/Squeezed In Between Poetry/vol2.html new file mode 100644 index 0000000..97b8c48 --- /dev/null +++ b/htdocs/cgi-bin/docs/Squeezed In Between Poetry/vol2.html @@ -0,0 +1,485 @@ + + +Squeezed In Between Poetry Vol II + + + + + + + + + + + + + +
+

+   Squeezed In Between Poetry +

+ + + + +

Volume I

Volume II

+
+

+Following is a collection of poems in the genre of story telling.
+Please wander of to Volume I and find out what made this small website come into life. +Also poems there, might breathe in more sense of what is being contained within here.
+ + +
("Those who dream by day are cognizant of many things which +escape those who dream only by night" - Edgar Allen Poe) +

+(What you can do, or dream you can do, begin it; boldness has genius,
power and magic in it. +- Johann von Goethe ) +

+ ( + +
+ +The Picture of Dorian Gray +by +Oscar Wilde +
+
+ +
+CHAPTER 1
+The studio was filled with the rich odour of roses, and when the light summer wind stirred amidst the trees of the garden, there came through the open door the heavy scent of the lilac, or the more delicate perfume of the pink-flowering thorn...
+) + +

+

+ + + +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

18-Aug-2003
A Walk to Frame Sydney


Swamp Rejoiced Cricket Drum Noise

- Volume I -

Facing The River Dream

Just Another Testament

Dog Patrol

Abstained Melodrama

Cross Eyed

The Flock Trip

Coined System

Sun Stark

The Shaved Nun Tail Rap

Disturbed Kitten

Creation

Troll

Remind Me What I am Not

+
+ +

Poetry of
Thourn Whaul

+
+ +

+
+ +

A Walk to Frame Sydney

+
Immunised equilibrium riddled the porosity we face
+all downhill now into a carrot grinding better health
+The dealers indeed only ware bravado penguin suites
+"Pick the best as any good book would tell you, Son"!
+But the real book is buried past all distractions
+It takes Dvorak guts and a staccato walk to frame
+To find some answers in the late Goya walls
+"Off you go, find your gay bar translator"
+
+She went, leaving the soup kitchen behind
+Found her book, but had no money left.
+No one saw her and no one knew him
+Till now!
+
+Pumpernickel abused by Rosamunde 
+a sweet-talk worth a waitress
+Everyone was smiling, enjoying 
+amber recall of ghost encounters
+Disfiguring sex of the local priest, 
+politician, decant & moron
+Minding their own business 
+    imitated reads
+Winding pastoral tick-tocks or 
+jail house torments in showers
+Finding Art Deco placebo soup kitchens
+Here, no translator is needed but creed 
+"All for one and all for a jazzy lip job".
+The translator balances the dictaphone
+marching to Bach in a 3 buy 3 rented opera house
+And freedom is permanently parked outside of form 
+for a hobo sap walk saving up for book and cover.
+
+Still, no one wins over Maharaja pigeon dreams
+They keep on reminding those willing some read
+"Relax, look over here, my books make the box
+I'll give you one, but it will crash the nest".
+
+
+

+

+ Click here to get the song complimenting this poem +

+
+
SQUEEZED
+IN BETWEEN
+POETRY
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

25-Jun-2003
Swamp Rejoiced Cricket Drum Noise


- Volume I -

Facing The River Dream

Just Another Testament

Dog Patrol

Abstained Melodrama

Cross Eyed

The Flock Trip

Coined System

Sun Stark

The Shaved Nun Tail Rap

Disturbed Kitten

Creation

Troll

Remind Me What I am Not

+
+ +

Poetry of
Thourn Whaul

+
+ +

+
+ +

Swamp Rejoiced Cricket Drum Noise

+
In first voice suddenly it takes away
+the cabbage cricket sounds pitch of tear
+a chanson soft it trembles in its play
+just making a hiss silent drums of fear
+
+Never wished to have to fight
+As jewels when once drawn
+pull a sparkle to be matched
+Turn the gravel out be grown
+stand for life's worth's again
+Telling this, out go and fancy 
+From afar recall don't refrain
+Brave in battle brave ardency
+of days past of no known pain
+Telling, brush away the swamps
+Dare go recall to sain sustain
+wishes thrown into hat of punts.
+
+The path was usual but what a finding
+of Solomon riches such unseen, untouched
+Weakness ever now passing to be blinding
+as if to mask protect the carriers might
+bringing spoils in skirtings patched.
+
+Voiceless sitting deep in foliage
+invisible witness, tired valiance
+Hidden behind fem growth of coilage
+watching the secret wild people dance
+Tribe brought some blessings in food
+I've waited for the end of the binge
+Watched for long, lost to horror glued
+near a shrine at the forest fringe. 
+Agenda was about youth coming into age
+for these folk of both gender sacred
+what unfolded edged on outrage
+The lot sung, women's breasts swagged
+calling spirits scaring the encircled
+Dig, dig or we will never end, dig
+with your hands, and most did
+Till a bamboo bundle large unveiled
+an old body placed aside in silence
+Then cries slammed rhythm continued
+as the elders on rot eagerly peeled
+Youth was forced with urine to awake
+a body dry and dirty "don't be thrilled"!
+Most obliged but some for no sake
+just couldn't do it; 'til morn' brake.
+
+A generations cast to the alimony
+left out, eight girls and two lads 
+Near the end of the ceremony 
+left out, to face nightmare alidades
+One of the boys and all the girls 
+succumbed finally to torment frills
+But desperate tribe men lifted spears
+as the last odd one wouldn't budge
+tips cut touching skin, just to smudge
+It would've been a terror gruesome end
+If a loud voice didn't break into echo 
+The whole tribe into silence 
+The whole tribe dropped to their knees.
+The forgotten dead body was now standing
+Risen and pointing making way to the boy
+A boy stubborn, shaking, holding tears
+rejecting reason of forced fait ploy.
+"He shall be the chosen one!"
+You are the next Shaman
+My Apprentice!
+He must marry the eight least girls
+The other boy will be his shadow 
+enemy and friend, successor if failed
+his nature wisdom's challenge coil.
+For good or for worse let us rejoice, 
+let them now be, let them serve
+This our God's wish, our voice
+against the evil peril perve"
+
+As the tribe left a weakness begun
+A bitten target of insect stung
+A body laying hiding from it all
+A body swarmed with reddish adore
+in flakes float of unnoticed spore
+Tried to scream, run out tall
+but to late, no voice, no accord
+poison melting start flesh to dung. 
+Painful, illusive was the effort
+of a ghost crawling out of growth 
+Thinking nothing, going forth
+fighting for survival for life's worth
+getting out, slow steady deport.
+
+Thankful reached the laid blessings
+took first drink on some sweet tea
+Days passed slow, getting better
+feeding on beetles half cooked pea.
+Such discovered
+by the rest of the expedition
+but trust lost at the moment 
+lost even to amend
+For no sake of company 
+No tale ambition, telling
+was a stashed giant diamond 
+wrapped in a Shaman's headband.
+
+
+
...
+

+
+

Copyright � Thourn Whaul all rights reserved.
+ Feel free to hyper link to this pages and content; however no permission has been given to copy,
+ use or publish any content or style from this website.

+
+ + + \ No newline at end of file diff --git a/htdocs/cgi-bin/e_vars.pl b/htdocs/cgi-bin/e_vars.pl new file mode 100644 index 0000000..6d64e16 --- /dev/null +++ b/htdocs/cgi-bin/e_vars.pl @@ -0,0 +1,225 @@ +#!/usr/bin/perl + +#################################################################### +# +# Environmantal Variables (E-Vars) +# ©2002, PerlScriptsJavaScripts.com +# +# Requires: Perl5+ +# Created: January, 2002 +# Author: John Krinelos +# Contact: john@perlscriptsjavascripts.com +# +# This script / program is copyright material! +# +# Agent for copyright : +# Gene Volovich +# Law Partners, +# 140 Queen St. +# Melbourne +# Ph. +61 3 9602 2266 +# gvolovich@lawpartners.com.au +# http://www.lawpartners.com.au/ +# +#################################################################### + +#################################################################### +# +# Place this in any cgi-bin CHMOD it to 755 (if UNIX) then call +# it from your browser. Eg. http://www.you.com/cgi-bin/vars.cgi + +$of = qq~~; +$cf = qq~~; + +my @slocs = qw~ + /usr/sbin/sendmail + /usr/bin/sendmail + /sbin/sendmail + /usr/slib/sendmail + /usr/lib/sendmail + /bin/sendmail + /lib/sendmail + /slib/sendmail + /usr/sendmail + /sendmail + sendmail +~; + +print qq~Content-type: text/html + + + +Enviromental Variables Report. PerlScriptsJavaScripts.com + + +
+$ofEnviromental Variables returned by this server. A PerlScriptsJavaScripts Product$cf +
+
+ + + + + +~; + +my @vars = sort(keys(%ENV)); +foreach(@vars) { + $ENV{$_} ||= qq~ ~; + print qq~ + + + + + ~; +} + +print qq~ + + + + + + + + + + + + + + + + + + + + + + + + +
$ofVariable$cf$ofValue$cf
$of\$ENV{$_}$cf$of$ENV{$_}$cf
$of\$ENV{DOCUMENT_NAME}$cf$of$ENV{DOCUMENT_NAME}  $cf
$of\$ENV{DOCUMENT_URI}$cf$of$ENV{DOCUMENT_URI}  $cf
$of\$ENV{LAST_MODIFIED}$cf$of$ENV{LAST_MODIFIED}  $cf
$of\$ENV{DATE_GMT}$cf$of$ENV{DATE_GMT}  $cf
$of\$ENV{DATE_LOCAL}$cf$of$ENV{DATE_LOCAL}  $cf
$of\$ENV{REMOTE_USER}$cf$of$ENV{REMOTE_USER} This var returns the value of a .ht username$cf
+
+ +
+$ofPath(s) to Sendmail$cf +
+
+ + +~; + +foreach(@slocs) { + if(-e $_){ + print qq~ + + + + ~; + } +} + +print qq~ +
$of$_$cf
+
+ +
+$ofAdditional Information$cf +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
$ofVariable$cf$ofValue$cf$ofDescription$cf
$of\$] $cf$of$]$cf $of Version of Perl$cf
$of\$0 $cf$of$0$cf $of Script name$cf
$of\$\$ $cf$of$$ $cf $of Process ID$cf
$of\$^O $cf$of$^O $cf $of Operating System$cf
$of\$! $cf$of$!$cf $ofError returned by server$cf
+
+ +
+$ofList of Modules Installed on this server$cf +
+
+ + + + + + + +
$ofName$cf$ofName$cf
+~; + +find(\&wanted, @INC); + +@found = sort { uc($a) cmp uc($b) } @found; + +for($c = 0; $c < int(@found / 2); $c++){ + $search = $found[$c]; + $search =~ s/\.pm$//i; + print qq~$of $found[$c]
\n~; +} + +print qq~$cf
~; + +for($d = $c; $d < @found; $d++){ + $search = $found[$d]; + $search =~ s/\.pm$//i; + print qq~$of $found[$d]
\n~; +} + +($sec, $min, $hour, $day, $mon, $year, $weekday, $dayofyear, $dst) = localtime(time); + +$year += 1900; + +print qq~$cf
+
+
+$of Copyright $year PerlScriptsJavaScripts.com$cf +
+
+ + +~; + +sub wanted { + use File::Find; + $num = 0; + if ($File::Find::name =~ /\.pm$/){ + if(open(M,$File::Find::name)){ + while(){ + if (/^ *package +(\S+);/){ + push (@found, $1); + last; + } + } + chomp(@found); + } + } +} diff --git a/htdocs/cgi-bin/env.html b/htdocs/cgi-bin/env.html new file mode 100644 index 0000000..99c4fd0 --- /dev/null +++ b/htdocs/cgi-bin/env.html @@ -0,0 +1,2913 @@ +Content-type: text/html + + + +Enviromental Variables Report. PerlScriptsJavaScripts.com + + +
+Enviromental Variables returned by this server. A PerlScriptsJavaScripts Product +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VariableValue
$ENV{HOME}/home/will
$ENV{LANG}en_AU.UTF-8
$ENV{LANGUAGE}en_AU:en
$ENV{LESSCLOSE}/usr/bin/lesspipe %s %s
$ENV{LESSOPEN}| /usr/bin/lesspipe %s
$ENV{LOGNAME}will
$ENV{LS_COLORS}rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
$ENV{MAIL}/var/mail/will
$ENV{NODE_PATH}/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
$ENV{OLDPWD}/home/will/thttpd_dev/htdocs
$ENV{PATH}/home/will/bin:/home/will/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/local/go/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$ENV{PWD}/home/will/thttpd_dev/htdocs/cgi-bin
$ENV{SHELL}/bin/bash
$ENV{SHLVL}2
$ENV{SSH_CLIENT}192.168.0.3 46970 22
$ENV{SSH_CONNECTION}192.168.0.3 46970 192.168.0.16 22
$ENV{SSH_TTY}/dev/pts/0
$ENV{STY}2730.NET
$ENV{TERM}screen
$ENV{TERMCAP}SC|screen|VT 100/ANSI X3.64 virtual terminal:\ + :DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:bs:bt=\E[Z:\ + :cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:ct=\E[3g:\ + :do=^J:nd=\E[C:pt:rc=\E8:rs=\Ec:sc=\E7:st=\EH:up=\EM:\ + :le=^H:bl=^G:cr=^M:it#8:ho=\E[H:nw=\EE:ta=^I:is=\E)0:\ + :li#35:co#103:am:xn:xv:LP:sr=\EM:al=\E[L:AL=\E[%dL:\ + :cs=\E[%i%d;%dr:dl=\E[M:DL=\E[%dM:dc=\E[P:DC=\E[%dP:\ + :im=\E[4h:ei=\E[4l:mi:IC=\E[%d@:ks=\E[?1h\E=:\ + :ke=\E[?1l\E>:vi=\E[?25l:ve=\E[34h\E[?25h:vs=\E[34l:\ + :ti=\E[?1049h:te=\E[?1049l:us=\E[4m:ue=\E[24m:so=\E[3m:\ + :se=\E[23m:mb=\E[5m:md=\E[1m:mh=\E[2m:mr=\E[7m:\ + :me=\E[m:ms:\ + :Co#8:pa#64:AF=\E[3%dm:AB=\E[4%dm:op=\E[39;49m:AX:\ + :vb=\Eg:G0:as=\E(0:ae=\E(B:\ + :ac=\140\140aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~..--++,,hhII00:\ + :po=\E[5i:pf=\E[4i:Km=\E[M:k0=\E[10~:k1=\EOP:k2=\EOQ:\ + :k3=\EOR:k4=\EOS:k5=\E[15~:k6=\E[17~:k7=\E[18~:\ + :k8=\E[19~:k9=\E[20~:k;=\E[21~:F1=\E[23~:F2=\E[24~:\ + :F3=\E[1;2P:F4=\E[1;2Q:F5=\E[1;2R:F6=\E[1;2S:\ + :F7=\E[15;2~:F8=\E[17;2~:F9=\E[18;2~:FA=\E[19;2~:kb=:\ + :K2=\EOE:kB=\E[Z:kF=\E[1;2B:kR=\E[1;2A:*4=\E[3;2~:\ + :*7=\E[1;2F:#2=\E[1;2H:#3=\E[2;2~:#4=\E[1;2D:%c=\E[6;2~:\ + :%e=\E[5;2~:%i=\E[1;2C:kh=\E[1~:@1=\E[1~:kH=\E[4~:\ + :@7=\E[4~:kN=\E[6~:kP=\E[5~:kI=\E[2~:kD=\E[3~:ku=\EOA:\ + :kd=\EOB:kr=\EOC:kl=\EOD:km:
$ENV{USER}will
$ENV{WINDOW}1
$ENV{XDG_DATA_DIRS}/home/will/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
$ENV{XDG_RUNTIME_DIR}/run/user/1000
$ENV{XDG_SESSION_COOKIE}f1285b673e054311b158f354c6c52198-1551346125.854829-475566251
$ENV{XDG_SESSION_ID}1
$ENV{_}/usr/bin/perl
$ENV{DOCUMENT_NAME}  
$ENV{DOCUMENT_URI}  
$ENV{LAST_MODIFIED}  
$ENV{DATE_GMT}  
$ENV{DATE_LOCAL}  
$ENV{REMOTE_USER} This var returns the value of a .ht username
+
+ +
+Path(s) to Sendmail +
+
+ + + + + + + + + + + +
/usr/sbin/sendmail
/usr/lib/sendmail
+
+ +
+Additional Information +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VariableValueDescription
$] 5.022001  Version of Perl
$0 e_vars.pl  Script name
$$ 14611   Process ID
$^O linux   Operating System
$! No such file or directory Error returned by server
+
+ +
+List of Modules Installed on this server +
+
+ + + + + + + +
NameName
+ Algorithm::Diff
+ Algorithm::FastPermute
+ aliased
+ App::cpanminus
+ App::cpanminus::fatscript
+ AptPkg
+ AptPkg::Cache
+ AptPkg::Config
+ AptPkg::hash
+ AptPkg::PkgRecords
+ AptPkg::Policy
+ AptPkg::Source
+ AptPkg::System
+ AptPkg::Version
+ Archive::Zip
+ Archive::Zip::Archive
+ Archive::Zip::BufferedFileHandle
+ Archive::Zip::DirectoryMember
+ Archive::Zip::FileMember
+ Archive::Zip::Member
+ Archive::Zip::MemberRead
+ Archive::Zip::MockFileHandle
+ Archive::Zip::NewFileMember
+ Archive::Zip::StringMember
+ Archive::Zip::Tree
+ Archive::Zip::ZipFileMember
+ Array::Compare
+ attributes
+ Authen::PAM
+ Authen::SASL
+ Authen::SASL::CRAM_MD5
+ Authen::SASL::EXTERNAL
+ Authen::SASL::Perl
+ Authen::SASL::Perl::ANONYMOUS
+ Authen::SASL::Perl::CRAM_MD5
+ Authen::SASL::Perl::DIGEST_MD5
+ Authen::SASL::Perl::EXTERNAL
+ Authen::SASL::Perl::GSSAPI
+ Authen::SASL::Perl::LOGIN
+ Authen::SASL::Perl::PLAIN
+ autodie
+ autodie::exception
+ autodie::exception::system
+ autodie::hints
+ autodie::Scope::Guard
+ autodie::Scope::GuardStack
+ autodie::skip
+ autodie::Util
+ AutoLoader
+ B::Hooks::EndOfScope
+ B::Hooks::EndOfScope::PP
+ B::Hooks::EndOfScope::XS
+ B::Hooks::OP::Check
+ B::Hooks::OP::Check::Install::Files
+ B::Hooks::OP::PPAddr
+ B::Hooks::OP::PPAddr::Install::Files
+ base
+ Bundle::DBD::Pg
+ Bundle::DBI
+ Bundle::DBI
+ bytes
+ Cache::BaseCache
+ Cache::BaseCacheTester
+ Cache::Cache
+ Cache::CacheMetaData
+ Cache::CacheSizer
+ Cache::CacheTester
+ Cache::CacheUtils
+ Cache::FileBackend
+ Cache::FileCache
+ Cache::MemoryBackend
+ Cache::MemoryCache
+ Cache::NullCache
+ Cache::Object
+ Cache::SharedMemoryBackend
+ Cache::SharedMemoryCache
+ Cache::SizeAwareCache
+ Cache::SizeAwareCacheTester
+ Cache::SizeAwareFileCache
+ Cache::SizeAwareMemoryCache
+ Cache::SizeAwareSharedMemoryCache
+ Cairo
+ Cairo::Install::Files
+ Capture::Tiny
+ Carp
+ Carp::Clan
+ Carp::Heavy
+ CGI
+ CGI::Carp
+ CGI::Cookie
+ CGI::File::Temp
+ CGI::HTML::Functions
+ CGI::Pretty
+ CGI::Push
+ CGI::Session
+ CGI::Session::Driver
+ CGI::Session::Driver::DBI
+ CGI::Session::Driver::db_file
+ CGI::Session::Driver::file
+ CGI::Session::Driver::mysql
+ CGI::Session::Driver::postgresql
+ CGI::Session::Driver::sqlite
+ CGI::Session::ErrorHandler
+ CGI::Session::ID::incr
+ CGI::Session::ID::md5
+ CGI::Session::ID::static
+ CGI::Session::Serialize::default
+ CGI::Session::Serialize::freezethaw
+ CGI::Session::Serialize::storable
+ CGI::Session::Test::Default
+ CGI::Session::Tutorial
+ CGI::Util
+ charstar
+ Class::Accessor
+ Class::Accessor::Fast
+ Class::Accessor::Faster
+ Class::Data::Inheritable
+ Class::Factory::Util
+ Class::Inspector
+ Class::Inspector::Functions
+ Class::Load
+ Class::Load::PP
+ Class::Load::XS
+ Class::Method::Modifiers
+ Class::MOP
+ Class::MOP::Attribute
+ Class::MOP::Class
+ Class::MOP::Class::Immutable::Trait
+ Class::MOP::Deprecated
+ Class::MOP::Instance
+ Class::MOP::Method
+ Class::MOP::Method::Accessor
+ Class::MOP::Method::Constructor
+ Class::MOP::Method::Generated
+ Class::MOP::Method::Inlined
+ Class::MOP::Method::Meta
+ Class::MOP::Method::Wrapped
+ Class::MOP::MiniTrait
+ Class::MOP::Mixin
+ Class::MOP::Mixin::AttributeCore
+ Class::MOP::Mixin::HasAttributes
+ Class::MOP::Mixin::HasMethods
+ Class::MOP::Mixin::HasOverloads
+ Class::MOP::Module
+ Class::MOP::Object
+ Class::MOP::Overload
+ Class::MOP::Package
+ Class::Singleton
+ Class::Tiny
+ Class::XSAccessor
+ Class::XSAccessor::Array
+ Clone
+ Config
+ Config::Simple
+ constant
+ Convert::Number::Coptic
+ CPAN::DistnameInfo
+ CPAN::Meta
+ CPAN::Meta::Check
+ CPAN::Meta::Check
+ CPAN::Meta::Converter
+ CPAN::Meta::Feature
+ CPAN::Meta::History
+ CPAN::Meta::Merge
+ CPAN::Meta::Prereqs
+ CPAN::Meta::Requirements
+ CPAN::Meta::Spec
+ CPAN::Meta::Validator
+ CPAN::Meta::YAML
+ Crypt::PasswdMD5
+ Cwd
+ Cwd::Guard
+ Data::Alias
+ Data::OptList
+ Date::Format
+ Date::Hijri
+ Date::Language
+ Date::Language::Afar
+ Date::Language::Amharic
+ Date::Language::Austrian
+ Date::Language::Brazilian
+ Date::Language::Bulgarian
+ Date::Language::Chinese
+ Date::Language::Chinese_GB
+ Date::Language::Czech
+ Date::Language::Danish
+ Date::Language::Dutch
+ Date::Language::English
+ Date::Language::Finnish
+ Date::Language::French
+ Date::Language::Gedeo
+ Date::Language::German
+ Date::Language::Greek
+ Date::Language::Hungarian
+ Date::Language::Icelandic
+ Date::Language::Italian
+ Date::Language::Norwegian
+ Date::Language::Oromo
+ Date::Language::Romanian
+ Date::Language::Russian
+ Date::Language::Russian_cp1251
+ Date::Language::Russian_koi8r
+ Date::Language::Sidama
+ Date::Language::Somali
+ Date::Language::Spanish
+ Date::Language::Swedish
+ Date::Language::Tigrinya
+ Date::Language::TigrinyaEritrean
+ Date::Language::TigrinyaEthiopian
+ Date::Language::Turkish
+ Date::Manip
+ Date::Manip::Base
+ Date::Manip::Date
+ Date::Manip::Delta
+ Date::Manip::DM5
+ Date::Manip::DM5abbrevs
+ Date::Manip::DM6
+ Date::Manip::Lang::catalan
+ Date::Manip::Lang::danish
+ Date::Manip::Lang::dutch
+ Date::Manip::Lang::english
+ Date::Manip::Lang::finnish
+ Date::Manip::Lang::french
+ Date::Manip::Lang::german
+ Date::Manip::Lang::index
+ Date::Manip::Lang::italian
+ Date::Manip::Lang::norwegian
+ Date::Manip::Lang::polish
+ Date::Manip::Lang::portugue
+ Date::Manip::Lang::romanian
+ Date::Manip::Lang::russian
+ Date::Manip::Lang::spanish
+ Date::Manip::Lang::swedish
+ Date::Manip::Lang::turkish
+ Date::Manip::Obj
+ Date::Manip::Recur
+ Date::Manip::TZ
+ Date::Manip::TZdata
+ Date::Manip::TZ_Base
+ Date::Manip::Zones
+ Date::Parse
+ Date::Tolkien::Shire::Data
+ DateTime
+ DateTime::Calendar::Christian
+ DateTime::Calendar::Coptic
+ DateTime::Calendar::Coptic::Language
+ DateTime::Calendar::Coptic::Language::Arabic
+ DateTime::Calendar::Coptic::Language::Coptic
+ DateTime::Calendar::Coptic::Language::English
+ DateTime::Calendar::CopticEthiopic
+ DateTime::Calendar::Discordian
+ DateTime::Calendar::FrenchRevolutionary
+ DateTime::Calendar::FrenchRevolutionary::Locale
+ DateTime::Calendar::FrenchRevolutionary::Locale::en
+ DateTime::Calendar::FrenchRevolutionary::Locale::fr
+ DateTime::Calendar::Hebrew
+ DateTime::Calendar::Hijri
+ DateTime::Calendar::Japanese::Era
+ DateTime::Calendar::Julian
+ DateTime::Calendar::Mayan
+ DateTime::Calendar::Pataphysical
+ DateTime::Duration
+ DateTime::Event::Cron
+ DateTime::Event::Easter
+ DateTime::Event::ICal
+ DateTime::Event::Random
+ DateTime::Event::Sunrise
+ DateTime::Fiction::JRRTolkien::Shire
+ DateTime::Fiction::JRRTolkien::Shire::Duration
+ DateTime::Fiction::JRRTolkien::Shire::Types
+ DateTime::Fiscal::Year
+ DateTime::Format::Baby
+ DateTime::Format::Bork
+ DateTime::Format::Builder
+ DateTime::Format::Builder::Parser
+ DateTime::Format::Builder::Parser::Dispatch
+ DateTime::Format::Builder::Parser::generic
+ DateTime::Format::Builder::Parser::Quick
+ DateTime::Format::Builder::Parser::Regex
+ DateTime::Format::Builder::Parser::Strptime
+ DateTime::Format::DateManip
+ DateTime::Format::DateParse
+ DateTime::Format::DB2
+ DateTime::Format::DBI
+ DateTime::Format::Duration
+ DateTime::Format::Epoch
+ DateTime::Format::Epoch::ActiveDirectory
+ DateTime::Format::Epoch::DotNet
+ DateTime::Format::Epoch::JD
+ DateTime::Format::Epoch::Lilian
+ DateTime::Format::Epoch::MacOS
+ DateTime::Format::Epoch::MJD
+ DateTime::Format::Epoch::NTP
+ DateTime::Format::Epoch::RataDie
+ DateTime::Format::Epoch::RJD
+ DateTime::Format::Epoch::TAI64
+ DateTime::Format::Epoch::TJD
+ DateTime::Format::Epoch::Unix
+ DateTime::Format::Excel
+ DateTime::Format::HTTP
+ DateTime::Format::Human
+ DateTime::Format::ICal
+ DateTime::Format::ISO8601
+ DateTime::Format::Mail
+ DateTime::Format::MySQL
+ DateTime::Format::Pg
+ DateTime::Format::RSS
+ DateTime::Format::SQLite
+ DateTime::Format::Strptime
+ DateTime::Format::Strptime::Types
+ DateTime::Format::W3CDTF
+ DateTime::Format::WindowsFileTime
+ DateTime::Functions
+ DateTime::Helpers
+ DateTime::Incomplete
+ DateTime::Infinite
+ DateTime::Language
+ DateTime::LeapSecond
+ DateTime::Locale
+ DateTime::Locale::Base
+ DateTime::Locale::Catalog
+ DateTime::Locale::Data
+ DateTime::Locale::FromData
+ DateTime::Locale::Util
+ DateTime::PP
+ DateTime::PPExtra
+ DateTime::Set
+ DateTime::Set::ICal
+ DateTime::Span
+ DateTime::SpanSet
+ DateTime::TimeZone
+ DateTime::TimeZone::Africa::Abidjan
+ DateTime::TimeZone::Africa::Accra
+ DateTime::TimeZone::Africa::Algiers
+ DateTime::TimeZone::Africa::Bissau
+ DateTime::TimeZone::Africa::Cairo
+ DateTime::TimeZone::Africa::Casablanca
+ DateTime::TimeZone::Africa::Ceuta
+ DateTime::TimeZone::Africa::El_Aaiun
+ DateTime::TimeZone::Africa::Johannesburg
+ DateTime::TimeZone::Africa::Juba
+ DateTime::TimeZone::Africa::Khartoum
+ DateTime::TimeZone::Africa::Lagos
+ DateTime::TimeZone::Africa::Maputo
+ DateTime::TimeZone::Africa::Monrovia
+ DateTime::TimeZone::Africa::Nairobi
+ DateTime::TimeZone::Africa::Ndjamena
+ DateTime::TimeZone::Africa::Sao_Tome
+ DateTime::TimeZone::Africa::Tripoli
+ DateTime::TimeZone::Africa::Tunis
+ DateTime::TimeZone::Africa::Windhoek
+ DateTime::TimeZone::Alias
+ DateTime::TimeZone::America::Adak
+ DateTime::TimeZone::America::Anchorage
+ DateTime::TimeZone::America::Araguaina
+ DateTime::TimeZone::America::Argentina::Buenos_Aires
+ DateTime::TimeZone::America::Argentina::Catamarca
+ DateTime::TimeZone::America::Argentina::Cordoba
+ DateTime::TimeZone::America::Argentina::Jujuy
+ DateTime::TimeZone::America::Argentina::La_Rioja
+ DateTime::TimeZone::America::Argentina::Mendoza
+ DateTime::TimeZone::America::Argentina::Rio_Gallegos
+ DateTime::TimeZone::America::Argentina::Salta
+ DateTime::TimeZone::America::Argentina::San_Juan
+ DateTime::TimeZone::America::Argentina::San_Luis
+ DateTime::TimeZone::America::Argentina::Tucuman
+ DateTime::TimeZone::America::Argentina::Ushuaia
+ DateTime::TimeZone::America::Asuncion
+ DateTime::TimeZone::America::Atikokan
+ DateTime::TimeZone::America::Bahia
+ DateTime::TimeZone::America::Bahia_Banderas
+ DateTime::TimeZone::America::Barbados
+ DateTime::TimeZone::America::Belem
+ DateTime::TimeZone::America::Belize
+ DateTime::TimeZone::America::Blanc_Sablon
+ DateTime::TimeZone::America::Boa_Vista
+ DateTime::TimeZone::America::Bogota
+ DateTime::TimeZone::America::Boise
+ DateTime::TimeZone::America::Cambridge_Bay
+ DateTime::TimeZone::America::Campo_Grande
+ DateTime::TimeZone::America::Cancun
+ DateTime::TimeZone::America::Caracas
+ DateTime::TimeZone::America::Cayenne
+ DateTime::TimeZone::America::Chicago
+ DateTime::TimeZone::America::Chihuahua
+ DateTime::TimeZone::America::Costa_Rica
+ DateTime::TimeZone::America::Creston
+ DateTime::TimeZone::America::Cuiaba
+ DateTime::TimeZone::America::Curacao
+ DateTime::TimeZone::America::Danmarkshavn
+ DateTime::TimeZone::America::Dawson
+ DateTime::TimeZone::America::Dawson_Creek
+ DateTime::TimeZone::America::Denver
+ DateTime::TimeZone::America::Detroit
+ DateTime::TimeZone::America::Edmonton
+ DateTime::TimeZone::America::Eirunepe
+ DateTime::TimeZone::America::El_Salvador
+ DateTime::TimeZone::America::Fortaleza
+ DateTime::TimeZone::America::Fort_Nelson
+ DateTime::TimeZone::America::Glace_Bay
+ DateTime::TimeZone::America::Godthab
+ DateTime::TimeZone::America::Goose_Bay
+ DateTime::TimeZone::America::Grand_Turk
+ DateTime::TimeZone::America::Guatemala
+ DateTime::TimeZone::America::Guayaquil
+ DateTime::TimeZone::America::Guyana
+ DateTime::TimeZone::America::Halifax
+ DateTime::TimeZone::America::Havana
+ DateTime::TimeZone::America::Hermosillo
+ DateTime::TimeZone::America::Indiana::Indianapolis
+ DateTime::TimeZone::America::Indiana::Knox
+ DateTime::TimeZone::America::Indiana::Marengo
+ DateTime::TimeZone::America::Indiana::Petersburg
+ DateTime::TimeZone::America::Indiana::Tell_City
+ DateTime::TimeZone::America::Indiana::Vevay
+ DateTime::TimeZone::America::Indiana::Vincennes
+ DateTime::TimeZone::America::Indiana::Winamac
+ DateTime::TimeZone::America::Inuvik
+ DateTime::TimeZone::America::Iqaluit
+ DateTime::TimeZone::America::Jamaica
+ DateTime::TimeZone::America::Juneau
+ DateTime::TimeZone::America::Kentucky::Louisville
+ DateTime::TimeZone::America::Kentucky::Monticello
+ DateTime::TimeZone::America::La_Paz
+ DateTime::TimeZone::America::Lima
+ DateTime::TimeZone::America::Los_Angeles
+ DateTime::TimeZone::America::Maceio
+ DateTime::TimeZone::America::Managua
+ DateTime::TimeZone::America::Manaus
+ DateTime::TimeZone::America::Martinique
+ DateTime::TimeZone::America::Matamoros
+ DateTime::TimeZone::America::Mazatlan
+ DateTime::TimeZone::America::Menominee
+ DateTime::TimeZone::America::Merida
+ DateTime::TimeZone::America::Metlakatla
+ DateTime::TimeZone::America::Mexico_City
+ DateTime::TimeZone::America::Miquelon
+ DateTime::TimeZone::America::Moncton
+ DateTime::TimeZone::America::Monterrey
+ DateTime::TimeZone::America::Montevideo
+ DateTime::TimeZone::America::Nassau
+ DateTime::TimeZone::America::New_York
+ DateTime::TimeZone::America::Nipigon
+ DateTime::TimeZone::America::Nome
+ DateTime::TimeZone::America::Noronha
+ DateTime::TimeZone::America::North_Dakota::Beulah
+ DateTime::TimeZone::America::North_Dakota::Center
+ DateTime::TimeZone::America::North_Dakota::New_Salem
+ DateTime::TimeZone::America::Ojinaga
+ DateTime::TimeZone::America::Panama
+ DateTime::TimeZone::America::Pangnirtung
+ DateTime::TimeZone::America::Paramaribo
+ DateTime::TimeZone::America::Phoenix
+ DateTime::TimeZone::America::Porto_Velho
+ DateTime::TimeZone::America::Port_au_Prince
+ DateTime::TimeZone::America::Port_of_Spain
+ DateTime::TimeZone::America::Puerto_Rico
+ DateTime::TimeZone::America::Punta_Arenas
+ DateTime::TimeZone::America::Rainy_River
+ DateTime::TimeZone::America::Rankin_Inlet
+ DateTime::TimeZone::America::Recife
+ DateTime::TimeZone::America::Regina
+ DateTime::TimeZone::America::Resolute
+ DateTime::TimeZone::America::Rio_Branco
+ DateTime::TimeZone::America::Santarem
+ DateTime::TimeZone::America::Santiago
+ DateTime::TimeZone::America::Santo_Domingo
+ DateTime::TimeZone::America::Sao_Paulo
+ DateTime::TimeZone::America::Scoresbysund
+ DateTime::TimeZone::America::Sitka
+ DateTime::TimeZone::America::St_Johns
+ DateTime::TimeZone::America::Swift_Current
+ DateTime::TimeZone::America::Tegucigalpa
+ DateTime::TimeZone::America::Thule
+ DateTime::TimeZone::America::Thunder_Bay
+ DateTime::TimeZone::America::Tijuana
+ DateTime::TimeZone::America::Toronto
+ DateTime::TimeZone::America::Vancouver
+ DateTime::TimeZone::America::Whitehorse
+ DateTime::TimeZone::America::Winnipeg
+ DateTime::TimeZone::America::Yakutat
+ DateTime::TimeZone::America::Yellowknife
+ DateTime::TimeZone::Antarctica::Casey
+ DateTime::TimeZone::Antarctica::Davis
+ DateTime::TimeZone::Antarctica::DumontDUrville
+ DateTime::TimeZone::Antarctica::Macquarie
+ DateTime::TimeZone::Antarctica::Mawson
+ DateTime::TimeZone::Antarctica::Palmer
+ DateTime::TimeZone::Antarctica::Rothera
+ DateTime::TimeZone::Antarctica::Syowa
+ DateTime::TimeZone::Antarctica::Troll
+ DateTime::TimeZone::Antarctica::Vostok
+ DateTime::TimeZone::Asia::Almaty
+ DateTime::TimeZone::Asia::Amman
+ DateTime::TimeZone::Asia::Anadyr
+ DateTime::TimeZone::Asia::Aqtau
+ DateTime::TimeZone::Asia::Aqtobe
+ DateTime::TimeZone::Asia::Ashgabat
+ DateTime::TimeZone::Asia::Atyrau
+ DateTime::TimeZone::Asia::Baghdad
+ DateTime::TimeZone::Asia::Baku
+ DateTime::TimeZone::Asia::Bangkok
+ DateTime::TimeZone::Asia::Barnaul
+ DateTime::TimeZone::Asia::Beirut
+ DateTime::TimeZone::Asia::Bishkek
+ DateTime::TimeZone::Asia::Brunei
+ DateTime::TimeZone::Asia::Chita
+ DateTime::TimeZone::Asia::Choibalsan
+ DateTime::TimeZone::Asia::Colombo
+ DateTime::TimeZone::Asia::Damascus
+ DateTime::TimeZone::Asia::Dhaka
+ DateTime::TimeZone::Asia::Dili
+ DateTime::TimeZone::Asia::Dubai
+ DateTime::TimeZone::Asia::Dushanbe
+ DateTime::TimeZone::Asia::Famagusta
+ DateTime::TimeZone::Asia::Gaza
+ DateTime::TimeZone::Asia::Hebron
+ DateTime::TimeZone::Asia::Hong_Kong
+ DateTime::TimeZone::Asia::Hovd
+ DateTime::TimeZone::Asia::Ho_Chi_Minh
+ DateTime::TimeZone::Asia::Irkutsk
+ DateTime::TimeZone::Asia::Jakarta
+ DateTime::TimeZone::Asia::Jayapura
+ DateTime::TimeZone::Asia::Jerusalem
+ DateTime::TimeZone::Asia::Kabul
+ DateTime::TimeZone::Asia::Kamchatka
+ DateTime::TimeZone::Asia::Karachi
+ DateTime::TimeZone::Asia::Kathmandu
+ DateTime::TimeZone::Asia::Khandyga
+ DateTime::TimeZone::Asia::Kolkata
+ DateTime::TimeZone::Asia::Krasnoyarsk
+ DateTime::TimeZone::Asia::Kuala_Lumpur
+ DateTime::TimeZone::Asia::Kuching
+ DateTime::TimeZone::Asia::Macau
+ DateTime::TimeZone::Asia::Magadan
+ DateTime::TimeZone::Asia::Makassar
+ DateTime::TimeZone::Asia::Manila
+ DateTime::TimeZone::Asia::Nicosia
+ DateTime::TimeZone::Asia::Novokuznetsk
+ DateTime::TimeZone::Asia::Novosibirsk
+ DateTime::TimeZone::Asia::Omsk
+ DateTime::TimeZone::Asia::Oral
+ DateTime::TimeZone::Asia::Pontianak
+ DateTime::TimeZone::Asia::Pyongyang
+ DateTime::TimeZone::Asia::Qatar
+ DateTime::TimeZone::Asia::Qyzylorda
+ DateTime::TimeZone::Asia::Riyadh
+ DateTime::TimeZone::Asia::Sakhalin
+ DateTime::TimeZone::Asia::Samarkand
+ DateTime::TimeZone::Asia::Seoul
+ DateTime::TimeZone::Asia::Shanghai
+ DateTime::TimeZone::Asia::Singapore
+ DateTime::TimeZone::Asia::Srednekolymsk
+ DateTime::TimeZone::Asia::Taipei
+ DateTime::TimeZone::Asia::Tashkent
+ DateTime::TimeZone::Asia::Tbilisi
+ DateTime::TimeZone::Asia::Tehran
+ DateTime::TimeZone::Asia::Thimphu
+ DateTime::TimeZone::Asia::Tokyo
+ DateTime::TimeZone::Asia::Tomsk
+ DateTime::TimeZone::Asia::Ulaanbaatar
+ DateTime::TimeZone::Asia::Urumqi
+ DateTime::TimeZone::Asia::Ust_Nera
+ DateTime::TimeZone::Asia::Vladivostok
+ DateTime::TimeZone::Asia::Yakutsk
+ DateTime::TimeZone::Asia::Yangon
+ DateTime::TimeZone::Asia::Yekaterinburg
+ DateTime::TimeZone::Asia::Yerevan
+ DateTime::TimeZone::Atlantic::Azores
+ DateTime::TimeZone::Atlantic::Bermuda
+ DateTime::TimeZone::Atlantic::Canary
+ DateTime::TimeZone::Atlantic::Cape_Verde
+ DateTime::TimeZone::Atlantic::Faroe
+ DateTime::TimeZone::Atlantic::Madeira
+ DateTime::TimeZone::Atlantic::Reykjavik
+ DateTime::TimeZone::Atlantic::South_Georgia
+ DateTime::TimeZone::Atlantic::Stanley
+ DateTime::TimeZone::Australia::Adelaide
+ DateTime::TimeZone::Australia::Brisbane
+ DateTime::TimeZone::Australia::Broken_Hill
+ DateTime::TimeZone::Australia::Currie
+ DateTime::TimeZone::Australia::Darwin
+ DateTime::TimeZone::Australia::Eucla
+ DateTime::TimeZone::Australia::Hobart
+ DateTime::TimeZone::Australia::Lindeman
+ DateTime::TimeZone::Australia::Lord_Howe
+ DateTime::TimeZone::Australia::Melbourne
+ DateTime::TimeZone::Australia::Perth
+ DateTime::TimeZone::Australia::Sydney
+ DateTime::TimeZone::Catalog
+ DateTime::TimeZone::CET
+ DateTime::TimeZone::CST6CDT
+ DateTime::TimeZone::EET
+ DateTime::TimeZone::EST
+ DateTime::TimeZone::EST5EDT
+ DateTime::TimeZone::Europe::Amsterdam
+ DateTime::TimeZone::Europe::Andorra
+ DateTime::TimeZone::Europe::Astrakhan
+ DateTime::TimeZone::Europe::Athens
+ DateTime::TimeZone::Europe::Belgrade
+ DateTime::TimeZone::Europe::Berlin
+ DateTime::TimeZone::Europe::Brussels
+ DateTime::TimeZone::Europe::Bucharest
+ DateTime::TimeZone::Europe::Budapest
+ DateTime::TimeZone::Europe::Chisinau
+ DateTime::TimeZone::Europe::Copenhagen
+ DateTime::TimeZone::Europe::Dublin
+ DateTime::TimeZone::Europe::Gibraltar
+ DateTime::TimeZone::Europe::Helsinki
+ DateTime::TimeZone::Europe::Istanbul
+ DateTime::TimeZone::Europe::Kaliningrad
+ DateTime::TimeZone::Europe::Kiev
+ DateTime::TimeZone::Europe::Kirov
+ DateTime::TimeZone::Europe::Lisbon
+ DateTime::TimeZone::Europe::London
+ DateTime::TimeZone::Europe::Luxembourg
+ DateTime::TimeZone::Europe::Madrid
+ DateTime::TimeZone::Europe::Malta
+ DateTime::TimeZone::Europe::Minsk
+ DateTime::TimeZone::Europe::Monaco
+ DateTime::TimeZone::Europe::Moscow
+ DateTime::TimeZone::Europe::Oslo
+ DateTime::TimeZone::Europe::Paris
+ DateTime::TimeZone::Europe::Prague
+ DateTime::TimeZone::Europe::Riga
+ DateTime::TimeZone::Europe::Rome
+ DateTime::TimeZone::Europe::Samara
+ DateTime::TimeZone::Europe::Saratov
+ DateTime::TimeZone::Europe::Simferopol
+ DateTime::TimeZone::Europe::Sofia
+ DateTime::TimeZone::Europe::Stockholm
+ DateTime::TimeZone::Europe::Tallinn
+ DateTime::TimeZone::Europe::Tirane
+ DateTime::TimeZone::Europe::Ulyanovsk
+ DateTime::TimeZone::Europe::Uzhgorod
+ DateTime::TimeZone::Europe::Vienna
+ DateTime::TimeZone::Europe::Vilnius
+ DateTime::TimeZone::Europe::Volgograd
+ DateTime::TimeZone::Europe::Warsaw
+ DateTime::TimeZone::Europe::Zaporozhye
+ DateTime::TimeZone::Europe::Zurich
+ DateTime::TimeZone::Floating
+ DateTime::TimeZone::HST
+ DateTime::TimeZone::Indian::Chagos
+ DateTime::TimeZone::Indian::Christmas
+ DateTime::TimeZone::Indian::Cocos
+ DateTime::TimeZone::Indian::Kerguelen
+ DateTime::TimeZone::Indian::Mahe
+ DateTime::TimeZone::Indian::Maldives
+ DateTime::TimeZone::Indian::Mauritius
+ DateTime::TimeZone::Indian::Reunion
+ DateTime::TimeZone::LMT
+ DateTime::TimeZone::Local
+ DateTime::TimeZone::Local::Android
+ DateTime::TimeZone::Local::Unix
+ DateTime::TimeZone::Local::VMS
+ DateTime::TimeZone::MET
+ DateTime::TimeZone::MST
+ DateTime::TimeZone::MST7MDT
+ DateTime::TimeZone::OffsetOnly
+ DateTime::TimeZone::OlsonDB
+ DateTime::TimeZone::OlsonDB::Change
+ DateTime::TimeZone::OlsonDB::Observance
+ DateTime::TimeZone::OlsonDB::Rule
+ DateTime::TimeZone::OlsonDB::Zone
+ DateTime::TimeZone::Pacific::Apia
+ DateTime::TimeZone::Pacific::Auckland
+ DateTime::TimeZone::Pacific::Bougainville
+ DateTime::TimeZone::Pacific::Chatham
+ DateTime::TimeZone::Pacific::Chuuk
+ DateTime::TimeZone::Pacific::Easter
+ DateTime::TimeZone::Pacific::Efate
+ DateTime::TimeZone::Pacific::Enderbury
+ DateTime::TimeZone::Pacific::Fakaofo
+ DateTime::TimeZone::Pacific::Fiji
+ DateTime::TimeZone::Pacific::Funafuti
+ DateTime::TimeZone::Pacific::Galapagos
+ DateTime::TimeZone::Pacific::Gambier
+ DateTime::TimeZone::Pacific::Guadalcanal
+ DateTime::TimeZone::Pacific::Guam
+ DateTime::TimeZone::Pacific::Honolulu
+ DateTime::TimeZone::Pacific::Kiritimati
+ DateTime::TimeZone::Pacific::Kosrae
+ DateTime::TimeZone::Pacific::Kwajalein
+ DateTime::TimeZone::Pacific::Majuro
+ DateTime::TimeZone::Pacific::Marquesas
+ DateTime::TimeZone::Pacific::Nauru
+ DateTime::TimeZone::Pacific::Niue
+ DateTime::TimeZone::Pacific::Norfolk
+ DateTime::TimeZone::Pacific::Noumea
+ DateTime::TimeZone::Pacific::Pago_Pago
+ DateTime::TimeZone::Pacific::Palau
+ DateTime::TimeZone::Pacific::Pitcairn
+ DateTime::TimeZone::Pacific::Pohnpei
+ DateTime::TimeZone::Pacific::Port_Moresby
+ DateTime::TimeZone::Pacific::Rarotonga
+ DateTime::TimeZone::Pacific::Tahiti
+ DateTime::TimeZone::Pacific::Tarawa
+ DateTime::TimeZone::Pacific::Tongatapu
+ DateTime::TimeZone::Pacific::Wake
+ DateTime::TimeZone::Pacific::Wallis
+ DateTime::TimeZone::PST8PDT
+ DateTime::TimeZone::UTC
+ DateTime::TimeZone::WET
+ DateTime::Types
+ DateTime::Util::Calc
+ DateTime::Util::DayOfWeek
+ DBD::DBM
+ DBD::DBM
+ DBD::ExampleP
+ DBD::ExampleP
+ DBD::File
+ DBD::File
+ DBD::Gofer
+ DBD::Gofer
+ DBD::Gofer::Policy::Base
+ DBD::Gofer::Policy::Base
+ DBD::Gofer::Policy::classic
+ DBD::Gofer::Policy::classic
+ DBD::Gofer::Policy::pedantic
+ DBD::Gofer::Policy::pedantic
+ DBD::Gofer::Policy::rush
+ DBD::Gofer::Policy::rush
+ DBD::Gofer::Transport::Base
+ DBD::Gofer::Transport::Base
+ DBD::Gofer::Transport::corostream
+ DBD::Gofer::Transport::corostream
+ DBD::Gofer::Transport::null
+ DBD::Gofer::Transport::null
+ DBD::Gofer::Transport::pipeone
+ DBD::Gofer::Transport::pipeone
+ DBD::Gofer::Transport::stream
+ DBD::Gofer::Transport::stream
+ DBD::Mem
+ DBD::NullP
+ DBD::NullP
+ DBD::Pg::st
+ DBD::Proxy
+ DBD::Proxy
+ DBD::Sponge
+ DBD::Sponge
+ DBD::SQLite
+ DBD::SQLite2
+ DBD::SQLite::Constants
+ DBD::SQLite::VirtualTable
+ DBD::SQLite::VirtualTable::FileContent
+ DBD::SQLite::VirtualTable::PerlData
+ DBI
+ DBI
+ DBI::Const::GetInfo::ANSI
+ DBI::Const::GetInfo::ANSI
+ DBI::Const::GetInfo::ODBC
+ DBI::Const::GetInfo::ODBC
+ DBI::Const::GetInfoReturn
+ DBI::Const::GetInfoReturn
+ DBI::Const::GetInfoType
+ DBI::Const::GetInfoType
+ DBI::DBD
+ DBI::DBD
+ DBI::DBD::Metadata
+ DBI::DBD::Metadata
+ DBI::DBD::SqlEngine
+ DBI::DBD::SqlEngine
+ DBI::FAQ
+ DBI::Gofer::Execute
+ DBI::Gofer::Execute
+ DBI::Gofer::Request
+ DBI::Gofer::Request
+ DBI::Gofer::Response
+ DBI::Gofer::Response
+ DBI::Gofer::Serializer::Base
+ DBI::Gofer::Serializer::Base
+ DBI::Gofer::Serializer::DataDumper
+ DBI::Gofer::Serializer::DataDumper
+ DBI::Gofer::Serializer::Storable
+ DBI::Gofer::Serializer::Storable
+ DBI::Gofer::Transport::Base
+ DBI::Gofer::Transport::Base
+ DBI::Gofer::Transport::pipeone
+ DBI::Gofer::Transport::pipeone
+ DBI::Gofer::Transport::stream
+ DBI::Gofer::Transport::stream
+ DBI::Profile
+ DBI::Profile
+ DBI::ProfileData
+ DBI::ProfileData
+ DBI::ProfileDumper
+ DBI::ProfileDumper
+ DBI::ProfileDumper::Apache
+ DBI::ProfileDumper::Apache
+ DBI::ProfileSubs
+ DBI::ProfileSubs
+ DBI::ProxyServer
+ DBI::ProxyServer
+ DBI::SQL::Nano
+ DBI::SQL::Nano
+ DBI::Util::CacheMemory
+ DBI::Util::CacheMemory
+ DBI::Util::_accessor
+ DBI::Util::_accessor
+ Debconf::AutoSelect
+ Debconf::Base
+ Debconf::Client::ConfModule
+ Debconf::Config
+ Debconf::ConfModule
+ Debconf::Db
+ Debconf::DbDriver
+ Debconf::DbDriver::Backup
+ Debconf::DbDriver::Cache
+ Debconf::DbDriver::Copy
+ Debconf::DbDriver::Debug
+ Debconf::DbDriver::Directory
+ Debconf::DbDriver::DirTree
+ Debconf::DbDriver::File
+ Debconf::DbDriver::LDAP
+ Debconf::DbDriver::PackageDir
+ Debconf::DbDriver::Pipe
+ Debconf::DbDriver::Stack
+ Debconf::Element
+ Debconf::Element::Dialog::Boolean
+ Debconf::Element::Dialog::Error
+ Debconf::Element::Dialog::Multiselect
+ Debconf::Element::Dialog::Note
+ Debconf::Element::Dialog::Password
+ Debconf::Element::Dialog::Progress
+ Debconf::Element::Dialog::Select
+ Debconf::Element::Dialog::String
+ Debconf::Element::Dialog::Text
+ Debconf::Element::Editor::Boolean
+ Debconf::Element::Editor::Error
+ Debconf::Element::Editor::Multiselect
+ Debconf::Element::Editor::Note
+ Debconf::Element::Editor::Password
+ Debconf::Element::Editor::Progress
+ Debconf::Element::Editor::Select
+ Debconf::Element::Editor::String
+ Debconf::Element::Editor::Text
+ Debconf::Element::Gnome
+ Debconf::Element::Gnome::Boolean
+ Debconf::Element::Gnome::Error
+ Debconf::Element::Gnome::Multiselect
+ Debconf::Element::Gnome::Note
+ Debconf::Element::Gnome::Password
+ Debconf::Element::Gnome::Progress
+ Debconf::Element::Gnome::Select
+ Debconf::Element::Gnome::String
+ Debconf::Element::Gnome::Text
+ Debconf::Element::Kde::Boolean
+ Debconf::Element::Kde::ElementWidget
+ Debconf::Element::Kde::Error
+ Debconf::Element::Kde::Multiselect
+ Debconf::Element::Kde::Note
+ Debconf::Element::Kde::Password
+ Debconf::Element::Kde::Progress
+ Debconf::Element::Kde::Select
+ Debconf::Element::Kde::String
+ Debconf::Element::Kde::Text
+ Debconf::Element::Multiselect
+ Debconf::Element::Noninteractive
+ Debconf::Element::Noninteractive::Boolean
+ Debconf::Element::Noninteractive::Error
+ Debconf::Element::Noninteractive::Multiselect
+ Debconf::Element::Noninteractive::Note
+ Debconf::Element::Noninteractive::Password
+ Debconf::Element::Noninteractive::Progress
+ Debconf::Element::Noninteractive::Select
+ Debconf::Element::Noninteractive::String
+ Debconf::Element::Noninteractive::Text
+ Debconf::Element::Select
+ Debconf::Element::Teletype::Boolean
+ Debconf::Element::Teletype::Error
+ Debconf::Element::Teletype::Multiselect
+ Debconf::Element::Teletype::Note
+ Debconf::Element::Teletype::Password
+ Debconf::Element::Teletype::Progress
+ Debconf::Element::Teletype::Select
+ Debconf::Element::Teletype::String
+ Debconf::Element::Teletype::Text
+ Debconf::Element::Web::Boolean
+ Debconf::Element::Web::Error
+ Debconf::Element::Web::Multiselect
+ Debconf::Element::Web::Note
+ Debconf::Element::Web::Password
+ Debconf::Element::Web::Progress
+ Debconf::Element::Web::Select
+ Debconf::Element::Web::String
+ Debconf::Element::Web::Text
+ Debconf::Encoding
+ Debconf::Format
+ Debconf::Format::822
+ Debconf::FrontEnd
+ Debconf::FrontEnd::Dialog
+ Debconf::FrontEnd::Editor
+ Debconf::FrontEnd::Gnome
+ Debconf::FrontEnd::Kde
+ Debconf::FrontEnd::Kde::Wizard
+ Debconf::FrontEnd::Noninteractive
+ Debconf::FrontEnd::Passthrough
+ Debconf::FrontEnd::Readline
+ Debconf::FrontEnd::ScreenSize
+ Debconf::FrontEnd::Teletype
+ Debconf::FrontEnd::Text
+ Debconf::FrontEnd::Web
+ Debconf::Gettext
+ Debconf::Iterator
+ Debconf::Log
+ Debconf::Path
+ Debconf::Priority
+ Debconf::Question
+ Debconf::Template
+ Debconf::Template::Transient
+ Debconf::TmpFile
+ Debian::DebConf::Client::ConfModule
+ Debian::Debhelper::Buildsystem
+ Debian::Debhelper::Buildsystem::ant
+ Debian::Debhelper::Buildsystem::autoconf
+ Debian::Debhelper::Buildsystem::cmake
+ Debian::Debhelper::Buildsystem::makefile
+ Debian::Debhelper::Buildsystem::perl_build
+ Debian::Debhelper::Buildsystem::perl_makemaker
+ Debian::Debhelper::Buildsystem::pybuild
+ Debian::Debhelper::Buildsystem::python_distutils
+ Debian::Debhelper::Buildsystem::qmake
+ Debian::Debhelper::Buildsystem::qmake_qt4
+ Debian::Debhelper::Dh_Buildsystems
+ Debian::Debhelper::Dh_Getopt
+ Debian::Debhelper::Dh_Lib
+ Debian::Debhelper::Dh_Version
+ Debian::DictionariesCommon
+ Debian::DocBase::Common
+ Debian::DocBase::DB
+ Debian::DocBase::DocBaseFile
+ Debian::DocBase::Document
+ Debian::DocBase::Gettext
+ Debian::DocBase::InstallDocs
+ Debian::DocBase::Programs::Dhelp
+ Debian::DocBase::Programs::Dwww
+ Debian::DocBase::Programs::Scrollkeeper
+ Debian::DocBase::Utils
+ DebianLinux
+ DebianNet
+ Demo::HelloWorld
+ Devel::AssertC99
+ Devel::Caller
+ Devel::CheckCompiler
+ Devel::Declare
+ Devel::Declare::Context::Simple
+ Devel::Declare::MethodInstaller::Simple
+ Devel::GlobalDestruction
+ Devel::Hide
+ Devel::InnerPackage
+ Devel::LexAlias
+ Devel::OverloadInfo
+ Devel::PartialDump
+ Devel::StackTrace
+ Devel::StackTrace::Frame
+ Devel::Symdump
+ Devel::Symdump::Export
+ Devel::TypeTiny::Perl56Compat
+ Devel::TypeTiny::Perl58Compat
+ Digest::HMAC
+ Digest::HMAC_MD5
+ Digest::HMAC_SHA1
+ Digest::SHA1
+ Dist::CheckConflicts
+ Dpkg
+ Dpkg::Arch
+ Dpkg::BuildEnv
+ Dpkg::BuildFlags
+ Dpkg::BuildOptions
+ Dpkg::BuildProfiles
+ Dpkg::Changelog
+ Dpkg::Changelog::Debian
+ Dpkg::Changelog::Entry
+ Dpkg::Changelog::Entry::Debian
+ Dpkg::Changelog::Parse
+ Dpkg::Checksums
+ Dpkg::Compression
+ Dpkg::Compression::FileHandle
+ Dpkg::Compression::Process
+ Dpkg::Conf
+ Dpkg::Control
+ Dpkg::Control::Changelog
+ Dpkg::Control::Fields
+ Dpkg::Control::FieldsCore
+ Dpkg::Control::Hash
+ Dpkg::Control::HashCore
+ Dpkg::Control::Info
+ Dpkg::Control::Types
+ Dpkg::Deps
+ Dpkg::Dist::Files
+ Dpkg::ErrorHandling
+ Dpkg::Exit
+ Dpkg::File
+ Dpkg::Getopt
+ Dpkg::Gettext
+ Dpkg::Index
+ Dpkg::Interface::Storable
+ Dpkg::IPC
+ Dpkg::Package
+ Dpkg::Path
+ Dpkg::Shlibs
+ Dpkg::Shlibs::Cppfilt
+ Dpkg::Shlibs::Objdump
+ Dpkg::Shlibs::Symbol
+ Dpkg::Shlibs::SymbolFile
+ Dpkg::Source::Archive
+ Dpkg::Source::Functions
+ Dpkg::Source::Package
+ Dpkg::Source::Package::V1
+ Dpkg::Source::Package::V2
+ Dpkg::Source::Package::V3::Bzr
+ Dpkg::Source::Package::V3::Custom
+ Dpkg::Source::Package::V3::Git
+ Dpkg::Source::Package::V3::Native
+ Dpkg::Source::Package::V3::Quilt
+ Dpkg::Source::Patch
+ Dpkg::Source::Quilt
+ Dpkg::Substvars
+ Dpkg::Util
+ Dpkg::Vars
+ Dpkg::Vendor
+ Dpkg::Vendor::Debian
+ Dpkg::Vendor::Default
+ Dpkg::Vendor::Ubuntu
+ Dpkg::Version
+ DynaLoader
+ Email::Valid
+ Encode
+ Encode::Alias
+ Encode::Byte
+ Encode::CJKConstants
+ Encode::CN
+ Encode::CN::HZ
+ Encode::Config
+ Encode::EBCDIC
+ Encode::Encoder
+ Encode::Encoding
+ Encode::GSM0338
+ Encode::Guess
+ Encode::JP
+ Encode::JP::H2Z
+ Encode::JP::JIS7
+ Encode::KR
+ Encode::KR::2022_KR
+ Encode::Locale
+ Encode::MIME::Header
+ Encode::MIME::Header::ISO_2022_JP
+ Encode::MIME::Name
+ Encode::Symbol
+ Encode::TW
+ Encode::Unicode
+ Encode::Unicode::UTF7
+ encoding
+ Errno
+ Error
+ Error::TypeTiny
+ Error::TypeTiny::Assertion
+ Error::TypeTiny::Compilation
+ Error::TypeTiny::WrongNumberOfParameters
+ Eval::Closure
+ Eval::TypeTiny
+ Exception::Class
+ Exception::Class::Base
+ Exporter
+ Exporter::Heavy
+ Exporter::Shiny
+ Exporter::Tiny
+ ExtUtils::Config
+ ExtUtils::Depends
+ ExtUtils::Helpers
+ ExtUtils::Helpers::Unix
+ ExtUtils::Helpers::VMS
+ ExtUtils::Helpers::Windows
+ ExtUtils::InstallPaths
+ Fatal
+ Fcntl
+ feature
+ Fh
+ fields
+ File::BaseDir
+ File::Basename
+ File::Copy::Recursive
+ File::Copy::Recursive::Reduced
+ File::DesktopEntry
+ File::FcntlLock
+ File::FcntlLock::Core
+ File::FcntlLock::Errors
+ File::FcntlLock::Inline
+ File::FcntlLock::Pure
+ File::FcntlLock::XS
+ File::Find::Rule
+ File::Glob
+ File::HomeDir
+ File::HomeDir::Darwin
+ File::HomeDir::Darwin::Carbon
+ File::HomeDir::Darwin::Cocoa
+ File::HomeDir::Driver
+ File::HomeDir::FreeDesktop
+ File::HomeDir::MacOS9
+ File::HomeDir::Test
+ File::HomeDir::Unix
+ File::HomeDir::Windows
+ File::IconTheme
+ File::Listing
+ File::MimeInfo
+ File::MimeInfo::Applications
+ File::MimeInfo::Magic
+ File::MimeInfo::Rox
+ File::Path
+ File::pushd
+ File::Remove
+ File::Rename
+ File::ShareDir
+ File::ShareDir::Install
+ File::Spec
+ File::Spec::Unix
+ File::StripNondeterminism
+ File::StripNondeterminism::handlers::ar
+ File::StripNondeterminism::handlers::gzip
+ File::StripNondeterminism::handlers::jar
+ File::StripNondeterminism::handlers::javadoc
+ File::StripNondeterminism::handlers::javaproperties
+ File::StripNondeterminism::handlers::pearregistry
+ File::StripNondeterminism::handlers::png
+ File::StripNondeterminism::handlers::zip
+ File::Temp
+ File::UserDirs
+ File::Which
+ FileHandle
+ Font::AFM
+ Font::Metrics::Courier
+ Font::Metrics::CourierBold
+ Font::Metrics::CourierBoldOblique
+ Font::Metrics::CourierOblique
+ Font::Metrics::Helvetica
+ Font::Metrics::HelveticaBold
+ Font::Metrics::HelveticaBoldOblique
+ Font::Metrics::HelveticaOblique
+ Font::Metrics::TimesBold
+ Font::Metrics::TimesBoldItalic
+ Font::Metrics::TimesItalic
+ Font::Metrics::TimesRoman
+ Getopt::Long
+ Git
+ Git::I18N
+ Git::IndexInfo
+ Glib
+ Glib::CodeGen
+ Glib::GenPod
+ Glib::Install::Files
+ Glib::MakeHelper
+ Glib::Object::Subclass
+ Glib::ParseXSDoc
+ Gtk2
+ Gtk2::CodeGen
+ Gtk2::Gdk::Keysyms
+ Gtk2::Helper
+ Gtk2::Install::Files
+ Gtk2::Pango
+ Gtk2::SimpleList
+ Gtk2::SimpleMenu
+ Gtk2::TestHelper
+ Hash::Util
+ Hook::LexWrap
+ HTML::AsSubs
+ HTML::Element
+ HTML::Element::traverse
+ HTML::Entities
+ HTML::Filter
+ HTML::Form
+ HTML::FormatMarkdown
+ HTML::FormatPS
+ HTML::FormatRTF
+ HTML::Formatter
+ HTML::FormatText
+ HTML::HeadParser
+ HTML::LinkExtor
+ HTML::Parse
+ HTML::Parser
+ HTML::PullParser
+ HTML::Tagset
+ HTML::TokeParser
+ HTML::Tree
+ HTML::TreeBuilder
+ HTTP::Config
+ HTTP::Cookies
+ HTTP::Cookies::Netscape
+ HTTP::Daemon
+ HTTP::Date
+ HTTP::Headers
+ HTTP::Headers::Auth
+ HTTP::Headers::ETag
+ HTTP::Headers::Util
+ HTTP::Message
+ HTTP::Negotiate
+ HTTP::Request
+ HTTP::Request::Common
+ HTTP::Response
+ HTTP::Status
+ Importer
+ integer
+ IO
+ IO::Extended
+ IO::File
+ IO::Handle
+ IO::HTML
+ IO::Pipe
+ IO::Pty
+ IO::Seekable
+ IO::Select
+ IO::Socket
+ IO::Socket::INET
+ IO::Socket::INET6
+ IO::Socket::IP
+ IO::Socket::SSL
+ IO::Socket::SSL::Intercept
+ IO::Socket::SSL::PublicSuffix
+ IO::Socket::SSL::Utils
+ IO::Socket::UNIX
+ IO::String
+ IO::Tty
+ IO::Tty::Constant
+ IPC::Open2
+ IPC::Open3
+ IPC::Run
+ IPC::Run3
+ IPC::Run3::ProfArrayBuffer
+ IPC::Run3::ProfLogger
+ IPC::Run3::ProfLogReader
+ IPC::Run3::ProfPP
+ IPC::Run3::ProfReporter
+ IPC::Run::Debug
+ IPC::Run::IO
+ IPC::Run::Timer
+ IPC::System::Simple
+ lib
+ lib::core::only
+ LibAppArmor
+ Lintian::Architecture
+ Lintian::Check
+ Lintian::CheckScript
+ Lintian::Collect
+ Lintian::Collect::Binary
+ Lintian::Collect::Changes
+ Lintian::Collect::Group
+ Lintian::Collect::Package
+ Lintian::Collect::Source
+ Lintian::CollScript
+ Lintian::Command
+ Lintian::Command::Simple
+ Lintian::Data
+ Lintian::DepMap
+ Lintian::DepMap::Properties
+ Lintian::Internal::FrontendUtil
+ Lintian::Lab
+ Lintian::Lab::Entry
+ Lintian::Lab::Manifest
+ Lintian::Lab::ManifestDiff
+ Lintian::Output
+ Lintian::Output::ColonSeparated
+ Lintian::Output::FullEWI
+ Lintian::Output::LetterQualifier
+ Lintian::Output::XML
+ Lintian::Path
+ Lintian::Path::FSInfo
+ Lintian::Processable
+ Lintian::Processable::Package
+ Lintian::ProcessableGroup
+ Lintian::ProcessablePool
+ Lintian::Profile
+ Lintian::Relation
+ Lintian::Relation::Version
+ Lintian::Reporting::ResourceManager
+ Lintian::SlidingWindow
+ Lintian::Tag::Info
+ Lintian::Tag::Override
+ Lintian::Tag::TextUtil
+ Lintian::Tags
+ Lintian::Unpacker
+ Lintian::Util
+ List::MoreUtils
+ List::MoreUtils
+ List::MoreUtils::PP
+ List::MoreUtils::PP
+ List::MoreUtils::XS
+ List::MoreUtils::XS
+ List::Util
+ List::Util
+ List::Util::XS
+ local::lib
+ locale
+ Locale::gettext
+ LWP
+ LWP::Authen::Basic
+ LWP::Authen::Digest
+ LWP::Authen::Ntlm
+ LWP::ConnCache
+ LWP::Debug
+ LWP::DebugFile
+ LWP::MediaTypes
+ LWP::MemberMixin
+ LWP::Protocol
+ LWP::Protocol::cpan
+ LWP::Protocol::data
+ LWP::Protocol::file
+ LWP::Protocol::ftp
+ LWP::Protocol::GHTTP
+ LWP::Protocol::gopher
+ LWP::Protocol::http
+ LWP::Protocol::https
+ LWP::Protocol::loopback
+ LWP::Protocol::mailto
+ LWP::Protocol::nntp
+ LWP::Protocol::nogo
+ LWP::RobotUA
+ LWP::Simple
+
LWP::UserAgent
+ Mail::Address
+ Mail::Cap
+ Mail::Field
+ Mail::Field::AddrList
+ Mail::Field::Date
+ Mail::Field::Generic
+ Mail::Filter
+ Mail::Header
+ Mail::Internet
+ Mail::Mailer
+ Mail::Mailer::qmail
+ Mail::Mailer::rfc822
+ Mail::Mailer::sendmail
+ Mail::Mailer::smtp
+ Mail::Mailer::smtps
+ Mail::Mailer::testfile
+ Mail::Send
+ Mail::Util
+ main
+ main
+ main
+ Math::Base::Convert
+ Math::Base::Convert::Bases
+ Math::Base::Convert::Bitmaps
+ Math::Base::Convert::CalcPP
+ Math::Base::Convert::Shortcuts
+ Math::BigFloat
+ Math::BigInt
+ Math::BigInt::Calc
+ Math::BigInt::CalcEmu
+ Math::BigInt::Lib
+ Math::BigInt::Pari
+ Math::Pari
+ Math::Pari::Arr
+ Math::Round
+ metaclass
+ Method::Generate::Accessor
+ Method::Generate::BuildAll
+ Method::Generate::Constructor
+ Method::Generate::DemolishAll
+ MIME::Charset
+ MIME::Charset::UTF
+ MIME::Charset::_Compat
+ Module::Build
+ Module::Build
+ Module::Build::Base
+ Module::Build::Base
+ Module::Build::Compat
+ Module::Build::Compat
+ Module::Build::Config
+ Module::Build::Config
+ Module::Build::ConfigData
+ Module::Build::ConfigData
+ Module::Build::Cookbook
+ Module::Build::Cookbook
+ Module::Build::Dumper
+ Module::Build::Dumper
+ Module::Build::Notes
+ Module::Build::Notes
+ Module::Build::Platform::aix
+ Module::Build::Platform::aix
+ Module::Build::Platform::cygwin
+ Module::Build::Platform::cygwin
+ Module::Build::Platform::darwin
+ Module::Build::Platform::darwin
+ Module::Build::Platform::Default
+ Module::Build::Platform::Default
+ Module::Build::Platform::MacOS
+ Module::Build::Platform::MacOS
+ Module::Build::Platform::os2
+ Module::Build::Platform::os2
+ Module::Build::Platform::Unix
+ Module::Build::Platform::Unix
+ Module::Build::Platform::VMS
+ Module::Build::Platform::VMS
+ Module::Build::Platform::VOS
+ Module::Build::Platform::VOS
+ Module::Build::Platform::Windows
+ Module::Build::Platform::Windows
+ Module::Build::PodParser
+ Module::Build::PodParser
+ Module::Build::PPMMaker
+ Module::Build::PPMMaker
+ Module::Build::Tiny
+ Module::Build::XSUtil
+ Module::CPANfile
+ Module::CPANfile::Environment
+ Module::CPANfile::Prereq
+ Module::CPANfile::Prereqs
+ Module::CPANfile::Requirement
+ Module::Implementation
+ Module::Metadata
+ Module::Pluggable
+ Module::Pluggable::Object
+ Module::Runtime
+ Module::Runtime::Conflicts
+ Moo
+ Moo::HandleMoose
+ Moo::HandleMoose::FakeMetaClass
+ Moo::HandleMoose::_TypeMap
+ Moo::Object
+ Moo::Role
+ Moo::sification
+ Moo::_mro
+ Moo::_strictures
+ Moo::_Utils
+ Moose
+ Moose::Deprecated
+ Moose::Exception
+ Moose::Exception::AccessorMustReadWrite
+ Moose::Exception::AddParameterizableTypeTakesParameterizableType
+ Moose::Exception::AddRoleTakesAMooseMetaRoleInstance
+ Moose::Exception::AddRoleToARoleTakesAMooseMetaRole
+ Moose::Exception::ApplyTakesABlessedInstance
+ Moose::Exception::AttachToClassNeedsAClassMOPClassInstanceOrASubclass
+ Moose::Exception::AttributeConflictInRoles
+ Moose::Exception::AttributeConflictInSummation
+ Moose::Exception::AttributeExtensionIsNotSupportedInRoles
+ Moose::Exception::AttributeIsRequired
+ Moose::Exception::AttributeMustBeAnClassMOPMixinAttributeCoreOrSubclass
+ Moose::Exception::AttributeNamesDoNotMatch
+ Moose::Exception::AttributeValueIsNotAnObject
+ Moose::Exception::AttributeValueIsNotDefined
+ Moose::Exception::AutoDeRefNeedsArrayRefOrHashRef
+ Moose::Exception::BadOptionFormat
+ Moose::Exception::BothBuilderAndDefaultAreNotAllowed
+ Moose::Exception::BuilderDoesNotExist
+ Moose::Exception::BuilderMethodNotSupportedForAttribute
+ Moose::Exception::BuilderMethodNotSupportedForInlineAttribute
+ Moose::Exception::BuilderMustBeAMethodName
+ Moose::Exception::CallingMethodOnAnImmutableInstance
+ Moose::Exception::CallingReadOnlyMethodOnAnImmutableInstance
+ Moose::Exception::CanExtendOnlyClasses
+ Moose::Exception::CannotAddAdditionalTypeCoercionsToUnion
+ Moose::Exception::CannotAddAsAnAttributeToARole
+ Moose::Exception::CannotApplyBaseClassRolesToRole
+ Moose::Exception::CannotAssignValueToReadOnlyAccessor
+ Moose::Exception::CannotAugmentIfLocalMethodPresent
+ Moose::Exception::CannotAugmentNoSuperMethod
+ Moose::Exception::CannotAutoDereferenceTypeConstraint
+ Moose::Exception::CannotAutoDerefWithoutIsa
+ Moose::Exception::CannotCalculateNativeType
+ Moose::Exception::CannotCallAnAbstractBaseMethod
+ Moose::Exception::CannotCallAnAbstractMethod
+ Moose::Exception::CannotCoerceAttributeWhichHasNoCoercion
+ Moose::Exception::CannotCoerceAWeakRef
+ Moose::Exception::CannotCreateHigherOrderTypeWithoutATypeParameter
+ Moose::Exception::CannotCreateMethodAliasLocalMethodIsPresent
+ Moose::Exception::CannotCreateMethodAliasLocalMethodIsPresentInClass
+ Moose::Exception::CannotDelegateLocalMethodIsPresent
+ Moose::Exception::CannotDelegateWithoutIsa
+ Moose::Exception::CannotFindDelegateMetaclass
+ Moose::Exception::CannotFindType
+ Moose::Exception::CannotFindTypeGivenToMatchOnType
+ Moose::Exception::CannotFixMetaclassCompatibility
+ Moose::Exception::CannotGenerateInlineConstraint
+ Moose::Exception::CannotInitializeMooseMetaRoleComposite
+ Moose::Exception::CannotInlineTypeConstraintCheck
+ Moose::Exception::CannotLocatePackageInINC
+ Moose::Exception::CannotMakeMetaclassCompatible
+ Moose::Exception::CannotOverrideALocalMethod
+ Moose::Exception::CannotOverrideBodyOfMetaMethods
+ Moose::Exception::CannotOverrideLocalMethodIsPresent
+ Moose::Exception::CannotOverrideNoSuperMethod
+ Moose::Exception::CannotRegisterUnnamedTypeConstraint
+ Moose::Exception::CannotUseLazyBuildAndDefaultSimultaneously
+ Moose::Exception::CanOnlyConsumeRole
+ Moose::Exception::CanOnlyWrapBlessedCode
+ Moose::Exception::CanReblessOnlyIntoASubclass
+ Moose::Exception::CanReblessOnlyIntoASuperclass
+ Moose::Exception::CircularReferenceInAlso
+ Moose::Exception::ClassDoesNotHaveInitMeta
+ Moose::Exception::ClassDoesTheExcludedRole
+ Moose::Exception::ClassNamesDoNotMatch
+ Moose::Exception::CloneObjectExpectsAnInstanceOfMetaclass
+ Moose::Exception::CodeBlockMustBeACodeRef
+ Moose::Exception::CoercingWithoutCoercions
+ Moose::Exception::CoercionAlreadyExists
+ Moose::Exception::CoercionNeedsTypeConstraint
+ Moose::Exception::ConflictDetectedInCheckRoleExclusions
+ Moose::Exception::ConflictDetectedInCheckRoleExclusionsInToClass
+ Moose::Exception::ConstructClassInstanceTakesPackageName
+ Moose::Exception::CouldNotCreateMethod
+ Moose::Exception::CouldNotCreateWriter
+ Moose::Exception::CouldNotEvalConstructor
+ Moose::Exception::CouldNotEvalDestructor
+ Moose::Exception::CouldNotFindTypeConstraintToCoerceFrom
+ Moose::Exception::CouldNotGenerateInlineAttributeMethod
+ Moose::Exception::CouldNotLocateTypeConstraintForUnion
+ Moose::Exception::CouldNotParseType
+ Moose::Exception::CreateMOPClassTakesArrayRefOfAttributes
+ Moose::Exception::CreateMOPClassTakesArrayRefOfSuperclasses
+ Moose::Exception::CreateMOPClassTakesHashRefOfMethods
+ Moose::Exception::CreateTakesArrayRefOfRoles
+ Moose::Exception::CreateTakesHashRefOfAttributes
+ Moose::Exception::CreateTakesHashRefOfMethods
+ Moose::Exception::DefaultToMatchOnTypeMustBeCodeRef
+ Moose::Exception::DelegationToAClassWhichIsNotLoaded
+ Moose::Exception::DelegationToARoleWhichIsNotLoaded
+ Moose::Exception::DelegationToATypeWhichIsNotAClass
+ Moose::Exception::DoesRequiresRoleName
+ Moose::Exception::EnumCalledWithAnArrayRefAndAdditionalArgs
+ Moose::Exception::EnumValuesMustBeString
+ Moose::Exception::ExtendsMissingArgs
+ Moose::Exception::HandlesMustBeAHashRef
+ Moose::Exception::IllegalInheritedOptions
+ Moose::Exception::IllegalMethodTypeToAddMethodModifier
+ Moose::Exception::IncompatibleMetaclassOfSuperclass
+ Moose::Exception::InitializeTakesUnBlessedPackageName
+ Moose::Exception::InitMetaRequiresClass
+ Moose::Exception::InstanceBlessedIntoWrongClass
+ Moose::Exception::InstanceMustBeABlessedReference
+ Moose::Exception::InvalidArgPassedToMooseUtilMetaRole
+ Moose::Exception::InvalidArgumentsToTraitAliases
+ Moose::Exception::InvalidArgumentToMethod
+ Moose::Exception::InvalidBaseTypeGivenToCreateParameterizedTypeConstraint
+ Moose::Exception::InvalidHandleValue
+ Moose::Exception::InvalidHasProvidedInARole
+ Moose::Exception::InvalidNameForType
+ Moose::Exception::InvalidOverloadOperator
+ Moose::Exception::InvalidRoleApplication
+ Moose::Exception::InvalidTypeConstraint
+ Moose::Exception::InvalidTypeGivenToCreateParameterizedTypeConstraint
+ Moose::Exception::InvalidValueForIs
+ Moose::Exception::IsaDoesNotDoTheRole
+ Moose::Exception::IsaLacksDoesMethod
+ Moose::Exception::LazyAttributeNeedsADefault
+ Moose::Exception::Legacy
+ Moose::Exception::MatchActionMustBeACodeRef
+ Moose::Exception::MessageParameterMustBeCodeRef
+ Moose::Exception::MetaclassIsAClassNotASubclassOfGivenMetaclass
+ Moose::Exception::MetaclassIsARoleNotASubclassOfGivenMetaclass
+ Moose::Exception::MetaclassIsNotASubclassOfGivenMetaclass
+ Moose::Exception::MetaclassMustBeASubclassOfMooseMetaClass
+ Moose::Exception::MetaclassMustBeASubclassOfMooseMetaRole
+ Moose::Exception::MetaclassMustBeDerivedFromClassMOPClass
+ Moose::Exception::MetaclassNotLoaded
+ Moose::Exception::MetaclassTypeIncompatible
+ Moose::Exception::MethodExpectedAMetaclassObject
+ Moose::Exception::MethodExpectsFewerArgs
+ Moose::Exception::MethodExpectsMoreArgs
+ Moose::Exception::MethodModifierNeedsMethodName
+ Moose::Exception::MethodNameConflictInRoles
+ Moose::Exception::MethodNameNotFoundInInheritanceHierarchy
+ Moose::Exception::MethodNameNotGiven
+ Moose::Exception::MOPAttributeNewNeedsAttributeName
+ Moose::Exception::MustDefineAMethodName
+ Moose::Exception::MustDefineAnAttributeName
+ Moose::Exception::MustDefineAnOverloadOperator
+ Moose::Exception::MustHaveAtLeastOneValueToEnumerate
+ Moose::Exception::MustPassAHashOfOptions
+ Moose::Exception::MustPassAMooseMetaRoleInstanceOrSubclass
+ Moose::Exception::MustPassAPackageNameOrAnExistingClassMOPPackageInstance
+ Moose::Exception::MustPassEvenNumberOfArguments
+ Moose::Exception::MustPassEvenNumberOfAttributeOptions
+ Moose::Exception::MustProvideANameForTheAttribute
+ Moose::Exception::MustSpecifyAtleastOneMethod
+ Moose::Exception::MustSpecifyAtleastOneRole
+ Moose::Exception::MustSpecifyAtleastOneRoleToApplicant
+ Moose::Exception::MustSupplyAClassMOPAttributeInstance
+ Moose::Exception::MustSupplyADelegateToMethod
+ Moose::Exception::MustSupplyAMetaclass
+ Moose::Exception::MustSupplyAMooseMetaAttributeInstance
+ Moose::Exception::MustSupplyAnAccessorTypeToConstructWith
+ Moose::Exception::MustSupplyAnAttributeToConstructWith
+ Moose::Exception::MustSupplyArrayRefAsCurriedArguments
+ Moose::Exception::MustSupplyPackageNameAndName
+ Moose::Exception::NeedsTypeConstraintUnionForTypeCoercionUnion
+ Moose::Exception::NeitherAttributeNorAttributeNameIsGiven
+ Moose::Exception::NeitherClassNorClassNameIsGiven
+ Moose::Exception::NeitherRoleNorRoleNameIsGiven
+ Moose::Exception::NeitherTypeNorTypeNameIsGiven
+ Moose::Exception::NoAttributeFoundInSuperClass
+ Moose::Exception::NoBodyToInitializeInAnAbstractBaseClass
+ Moose::Exception::NoCasesMatched
+ Moose::Exception::NoConstraintCheckForTypeConstraint
+ Moose::Exception::NoDestructorClassSpecified
+ Moose::Exception::NoImmutableTraitSpecifiedForClass
+ Moose::Exception::NoParentGivenToSubtype
+ Moose::Exception::OnlyInstancesCanBeCloned
+ Moose::Exception::OperatorIsRequired
+ Moose::Exception::OverloadConflictInSummation
+ Moose::Exception::OverloadRequiresAMetaClass
+ Moose::Exception::OverloadRequiresAMetaMethod
+ Moose::Exception::OverloadRequiresAMetaOverload
+ Moose::Exception::OverloadRequiresAMethodNameOrCoderef
+ Moose::Exception::OverloadRequiresAnOperator
+ Moose::Exception::OverloadRequiresNamesForCoderef
+ Moose::Exception::OverrideConflictInComposition
+ Moose::Exception::OverrideConflictInSummation
+ Moose::Exception::PackageDoesNotUseMooseExporter
+ Moose::Exception::PackageNameAndNameParamsNotGivenToWrap
+ Moose::Exception::PackagesAndModulesAreNotCachable
+ Moose::Exception::ParameterIsNotSubtypeOfParent
+ Moose::Exception::ReferencesAreNotAllowedAsDefault
+ Moose::Exception::RequiredAttributeLacksInitialization
+ Moose::Exception::RequiredAttributeNeedsADefault
+ Moose::Exception::RequiredMethodsImportedByClass
+ Moose::Exception::RequiredMethodsNotImplementedByClass
+ Moose::Exception::Role::Attribute
+ Moose::Exception::Role::AttributeName
+ Moose::Exception::Role::Class
+ Moose::Exception::Role::EitherAttributeOrAttributeName
+ Moose::Exception::Role::Instance
+ Moose::Exception::Role::InstanceClass
+ Moose::Exception::Role::InvalidAttributeOptions
+ Moose::Exception::Role::Method
+ Moose::Exception::Role::ParamsHash
+ Moose::Exception::Role::Role
+ Moose::Exception::Role::RoleForCreate
+ Moose::Exception::Role::RoleForCreateMOPClass
+ Moose::Exception::Role::TypeConstraint
+ Moose::Exception::RoleDoesTheExcludedRole
+ Moose::Exception::RoleExclusionConflict
+ Moose::Exception::RoleNameRequired
+ Moose::Exception::RoleNameRequiredForMooseMetaRole
+ Moose::Exception::RolesDoNotSupportAugment
+ Moose::Exception::RolesDoNotSupportExtends
+ Moose::Exception::RolesDoNotSupportInner
+ Moose::Exception::RolesDoNotSupportRegexReferencesForMethodModifiers
+ Moose::Exception::RolesInCreateTakesAnArrayRef
+ Moose::Exception::RolesListMustBeInstancesOfMooseMetaRole
+ Moose::Exception::SingleParamsToNewMustBeHashRef
+ Moose::Exception::TriggerMustBeACodeRef
+ Moose::Exception::TypeConstraintCannotBeUsedForAParameterizableType
+ Moose::Exception::TypeConstraintIsAlreadyCreated
+ Moose::Exception::TypeParameterMustBeMooseMetaType
+ Moose::Exception::UnableToCanonicalizeHandles
+ Moose::Exception::UnableToCanonicalizeNonRolePackage
+ Moose::Exception::UnableToRecognizeDelegateMetaclass
+ Moose::Exception::UndefinedHashKeysPassedToMethod
+ Moose::Exception::UnionCalledWithAnArrayRefAndAdditionalArgs
+ Moose::Exception::UnionTakesAtleastTwoTypeNames
+ Moose::Exception::ValidationFailedForInlineTypeConstraint
+ Moose::Exception::ValidationFailedForTypeConstraint
+ Moose::Exception::WrapTakesACodeRefToBless
+ Moose::Exception::WrongTypeConstraintGiven
+ Moose::Exporter
+ Moose::Meta::Attribute
+ Moose::Meta::Attribute::Native
+ Moose::Meta::Attribute::Native::Trait
+ Moose::Meta::Attribute::Native::Trait::Array
+ Moose::Meta::Attribute::Native::Trait::Bool
+ Moose::Meta::Attribute::Native::Trait::Code
+ Moose::Meta::Attribute::Native::Trait::Counter
+ Moose::Meta::Attribute::Native::Trait::Hash
+ Moose::Meta::Attribute::Native::Trait::Number
+ Moose::Meta::Attribute::Native::Trait::String
+ Moose::Meta::Class
+ Moose::Meta::Class::Immutable::Trait
+ Moose::Meta::Instance
+ Moose::Meta::Method
+ Moose::Meta::Method::Accessor
+ Moose::Meta::Method::Accessor::Native
+ Moose::Meta::Method::Accessor::Native::Array
+ Moose::Meta::Method::Accessor::Native::Array::accessor
+ Moose::Meta::Method::Accessor::Native::Array::clear
+ Moose::Meta::Method::Accessor::Native::Array::count
+ Moose::Meta::Method::Accessor::Native::Array::delete
+ Moose::Meta::Method::Accessor::Native::Array::elements
+ Moose::Meta::Method::Accessor::Native::Array::first
+ Moose::Meta::Method::Accessor::Native::Array::first_index
+ Moose::Meta::Method::Accessor::Native::Array::get
+ Moose::Meta::Method::Accessor::Native::Array::grep
+ Moose::Meta::Method::Accessor::Native::Array::insert
+ Moose::Meta::Method::Accessor::Native::Array::is_empty
+ Moose::Meta::Method::Accessor::Native::Array::join
+ Moose::Meta::Method::Accessor::Native::Array::map
+ Moose::Meta::Method::Accessor::Native::Array::natatime
+ Moose::Meta::Method::Accessor::Native::Array::pop
+ Moose::Meta::Method::Accessor::Native::Array::push
+ Moose::Meta::Method::Accessor::Native::Array::reduce
+ Moose::Meta::Method::Accessor::Native::Array::set
+ Moose::Meta::Method::Accessor::Native::Array::shallow_clone
+ Moose::Meta::Method::Accessor::Native::Array::shift
+ Moose::Meta::Method::Accessor::Native::Array::shuffle
+ Moose::Meta::Method::Accessor::Native::Array::sort
+ Moose::Meta::Method::Accessor::Native::Array::sort_in_place
+ Moose::Meta::Method::Accessor::Native::Array::splice
+ Moose::Meta::Method::Accessor::Native::Array::uniq
+ Moose::Meta::Method::Accessor::Native::Array::unshift
+ Moose::Meta::Method::Accessor::Native::Array::Writer
+ Moose::Meta::Method::Accessor::Native::Bool::not
+ Moose::Meta::Method::Accessor::Native::Bool::set
+ Moose::Meta::Method::Accessor::Native::Bool::toggle
+ Moose::Meta::Method::Accessor::Native::Bool::unset
+ Moose::Meta::Method::Accessor::Native::Code::execute
+ Moose::Meta::Method::Accessor::Native::Code::execute_method
+ Moose::Meta::Method::Accessor::Native::Collection
+ Moose::Meta::Method::Accessor::Native::Counter::dec
+ Moose::Meta::Method::Accessor::Native::Counter::inc
+ Moose::Meta::Method::Accessor::Native::Counter::reset
+ Moose::Meta::Method::Accessor::Native::Counter::set
+ Moose::Meta::Method::Accessor::Native::Counter::Writer
+ Moose::Meta::Method::Accessor::Native::Hash
+ Moose::Meta::Method::Accessor::Native::Hash::accessor
+ Moose::Meta::Method::Accessor::Native::Hash::clear
+ Moose::Meta::Method::Accessor::Native::Hash::count
+ Moose::Meta::Method::Accessor::Native::Hash::defined
+ Moose::Meta::Method::Accessor::Native::Hash::delete
+ Moose::Meta::Method::Accessor::Native::Hash::elements
+ Moose::Meta::Method::Accessor::Native::Hash::exists
+ Moose::Meta::Method::Accessor::Native::Hash::get
+ Moose::Meta::Method::Accessor::Native::Hash::is_empty
+ Moose::Meta::Method::Accessor::Native::Hash::keys
+ Moose::Meta::Method::Accessor::Native::Hash::kv
+ Moose::Meta::Method::Accessor::Native::Hash::set
+ Moose::Meta::Method::Accessor::Native::Hash::shallow_clone
+ Moose::Meta::Method::Accessor::Native::Hash::values
+ Moose::Meta::Method::Accessor::Native::Hash::Writer
+ Moose::Meta::Method::Accessor::Native::Number::abs
+ Moose::Meta::Method::Accessor::Native::Number::add
+ Moose::Meta::Method::Accessor::Native::Number::div
+ Moose::Meta::Method::Accessor::Native::Number::mod
+ Moose::Meta::Method::Accessor::Native::Number::mul
+ Moose::Meta::Method::Accessor::Native::Number::set
+ Moose::Meta::Method::Accessor::Native::Number::sub
+ Moose::Meta::Method::Accessor::Native::Reader
+ Moose::Meta::Method::Accessor::Native::String::append
+ Moose::Meta::Method::Accessor::Native::String::chomp
+ Moose::Meta::Method::Accessor::Native::String::chop
+ Moose::Meta::Method::Accessor::Native::String::clear
+ Moose::Meta::Method::Accessor::Native::String::inc
+ Moose::Meta::Method::Accessor::Native::String::length
+ Moose::Meta::Method::Accessor::Native::String::match
+ Moose::Meta::Method::Accessor::Native::String::prepend
+ Moose::Meta::Method::Accessor::Native::String::replace
+ Moose::Meta::Method::Accessor::Native::String::substr
+ Moose::Meta::Method::Accessor::Native::Writer
+ Moose::Meta::Method::Augmented
+ Moose::Meta::Method::Constructor
+ Moose::Meta::Method::Delegation
+ Moose::Meta::Method::Destructor
+ Moose::Meta::Method::Meta
+ Moose::Meta::Method::Overridden
+ Moose::Meta::Mixin::AttributeCore
+ Moose::Meta::Object::Trait
+ Moose::Meta::Role
+ Moose::Meta::Role::Application
+ Moose::Meta::Role::Application::RoleSummation
+ Moose::Meta::Role::Application::ToClass
+ Moose::Meta::Role::Application::ToInstance
+ Moose::Meta::Role::Application::ToRole
+ Moose::Meta::Role::Attribute
+ Moose::Meta::Role::Composite
+ Moose::Meta::Role::Method
+ Moose::Meta::Role::Method::Conflicting
+ Moose::Meta::Role::Method::Required
+ Moose::Meta::TypeCoercion
+ Moose::Meta::TypeCoercion::Union
+ Moose::Meta::TypeConstraint
+ Moose::Meta::TypeConstraint::Class
+ Moose::Meta::TypeConstraint::DuckType
+ Moose::Meta::TypeConstraint::Enum
+ Moose::Meta::TypeConstraint::Parameterizable
+ Moose::Meta::TypeConstraint::Parameterized
+ Moose::Meta::TypeConstraint::Registry
+ Moose::Meta::TypeConstraint::Role
+ Moose::Meta::TypeConstraint::Union
+ Moose::Object
+ Moose::Role
+ Moose::Util
+ Moose::Util::MetaRole
+ Moose::Util::TypeConstraints
+ Moose::Util::TypeConstraints::Builtins
+ MooseX::Role::Parameterised
+ MooseX::Role::Parameterized
+ MooseX::Role::Parameterized::Meta::Role::Parameterized
+ MooseX::Role::Parameterized::Meta::Trait::Parameterizable
+ MooseX::Role::Parameterized::Meta::Trait::Parameterized
+ MooseX::Role::Parameterized::Parameters
+ MooseX::Role::WithOverloading
+ MooseX::Role::WithOverloading::Meta::Role
+ MooseX::Role::WithOverloading::Meta::Role::Application
+ MooseX::Role::WithOverloading::Meta::Role::Application::Composite
+ MooseX::Role::WithOverloading::Meta::Role::Application::Composite::ToClass
+ MooseX::Role::WithOverloading::Meta::Role::Application::Composite::ToInstance
+ MooseX::Role::WithOverloading::Meta::Role::Application::Composite::ToRole
+ MooseX::Role::WithOverloading::Meta::Role::Application::FixOverloadedRefs
+ MooseX::Role::WithOverloading::Meta::Role::Application::ToClass
+ MooseX::Role::WithOverloading::Meta::Role::Application::ToInstance
+ MooseX::Role::WithOverloading::Meta::Role::Application::ToRole
+ MooseX::Role::WithOverloading::Meta::Role::Composite
+ MooseX::Traits
+ MooseX::Traits::Util
+ MooseX::Types
+ MooseX::Types::Base
+ MooseX::Types::CheckedUtilExports
+ MooseX::Types::Combine
+ MooseX::Types::Moose
+ MooseX::Types::Structured
+ MooseX::Types::TypeDecorator
+ MooseX::Types::UndefinedType
+ MooseX::Types::Util
+ MooseX::Types::Wrapper
+ MRO::Compat
+ Music::Player::UnknownFormat
+ namespace::autoclean
+ namespace::clean
+ Net::DBus
+ Net::DBus::Annotation
+ Net::DBus::ASyncReply
+ Net::DBus::BaseObject
+ Net::DBus::Binding::Bus
+ Net::DBus::Binding::Connection
+ Net::DBus::Binding::Introspector
+ Net::DBus::Binding::Iterator
+ Net::DBus::Binding::Message
+ Net::DBus::Binding::Message::Error
+ Net::DBus::Binding::Message::MethodCall
+ Net::DBus::Binding::Message::MethodReturn
+ Net::DBus::Binding::Message::Signal
+ Net::DBus::Binding::PendingCall
+ Net::DBus::Binding::Server
+ Net::DBus::Binding::Value
+ Net::DBus::Binding::Watch
+ Net::DBus::Callback
+ Net::DBus::Dumper
+ Net::DBus::Reactor
+ Net::DBus::RemoteObject
+ Net::DBus::RemoteService
+ Net::DBus::Test::MockConnection
+ Net::DBus::Test::MockIterator
+ Net::DBus::Test::MockMessage
+ Net::DBus::Test::MockObject
+ Net::DNS
+ Net::DNS::Domain
+ Net::DNS::DomainName
+ Net::DNS::Header
+ Net::DNS::Mailbox
+ Net::DNS::Nameserver
+ Net::DNS::Packet
+ Net::DNS::Parameters
+ Net::DNS::Question
+ Net::DNS::Resolver
+ Net::DNS::Resolver::android
+ Net::DNS::Resolver::Base
+ Net::DNS::Resolver::cygwin
+ Net::DNS::Resolver::MSWin32
+ Net::DNS::Resolver::os2
+ Net::DNS::Resolver::Recurse
+ Net::DNS::Resolver::UNIX
+ Net::DNS::RR
+ Net::DNS::RR::A
+ Net::DNS::RR::AAAA
+ Net::DNS::RR::AFSDB
+ Net::DNS::RR::APL
+ Net::DNS::RR::CAA
+ Net::DNS::RR::CERT
+ Net::DNS::RR::CNAME
+ Net::DNS::RR::DHCID
+ Net::DNS::RR::DNAME
+ Net::DNS::RR::EUI48
+ Net::DNS::RR::EUI64
+ Net::DNS::RR::GPOS
+ Net::DNS::RR::HINFO
+ Net::DNS::RR::HIP
+ Net::DNS::RR::IPSECKEY
+ Net::DNS::RR::ISDN
+ Net::DNS::RR::KX
+ Net::DNS::RR::L32
+ Net::DNS::RR::L64
+ Net::DNS::RR::LOC
+ Net::DNS::RR::LP
+ Net::DNS::RR::MB
+ Net::DNS::RR::MG
+ Net::DNS::RR::MINFO
+ Net::DNS::RR::MR
+ Net::DNS::RR::MX
+ Net::DNS::RR::NAPTR
+ Net::DNS::RR::NID
+ Net::DNS::RR::NS
+ Net::DNS::RR::NULL
+ Net::DNS::RR::OPENPGPKEY
+ Net::DNS::RR::OPT
+ Net::DNS::RR::PTR
+ Net::DNS::RR::PX
+ Net::DNS::RR::RP
+ Net::DNS::RR::RT
+ Net::DNS::RR::SOA
+ Net::DNS::RR::SPF
+ Net::DNS::RR::SRV
+ Net::DNS::RR::SSHFP
+ Net::DNS::RR::TKEY
+ Net::DNS::RR::TLSA
+ Net::DNS::RR::TSIG
+ Net::DNS::RR::TXT
+ Net::DNS::RR::X25
+ Net::DNS::Text
+ Net::DNS::Update
+ Net::DNS::ZoneFile
+ Net::Domain::TLD
+ Net::HTTP
+ Net::HTTP::Methods
+ Net::HTTP::NB
+ Net::HTTPS
+ Net::IP
+ Net::LibIDN
+ Net::SMTP::SSL
+ Net::SSLeay
+ Net::SSLeay::Handle
+ Number::Bytes::Human
+ Number::Compare
+ ok
+ oo
+ oose
+ overload
+ overloading
+ Package::DeprecationManager
+ Package::Stash
+ Package::Stash::PP
+ Package::Stash::XS
+ PadWalker
+ Pango
+ Pango::Install::Files
+ Params::Util
+ Params::Validate
+ Params::Validate::Constants
+ Params::Validate::PP
+ Params::Validate::XS
+ Params::ValidationCompiler
+ Params::ValidationCompiler::Compiler
+ Params::ValidationCompiler::Exceptions
+ parent
+ Parse::DebianChangelog
+ Parse::DebianChangelog::ChangesFilters
+ Parse::DebianChangelog::Entry
+ Parse::DebianChangelog::Util
+ Parse::Method::Signatures
+ Parse::Method::Signatures::Param
+ Parse::Method::Signatures::Param::Bindable
+ Parse::Method::Signatures::Param::Named
+ Parse::Method::Signatures::Param::Placeholder
+ Parse::Method::Signatures::Param::Positional
+ Parse::Method::Signatures::Param::Unpacked
+ Parse::Method::Signatures::Param::Unpacked::Array
+ Parse::Method::Signatures::Param::Unpacked::Hash
+ Parse::Method::Signatures::ParamCollection
+ Parse::Method::Signatures::Sig
+ Parse::Method::Signatures::TypeConstraint
+ Parse::Method::Signatures::Types
+ Parse::PMFile
+ Path::Tiny
+ Perl::Tidy
+ PerlIO::gzip
+ Pod::Coverage
+ Pod::Coverage::CountParents
+ Pod::Coverage::ExportOnly
+ Pod::Coverage::Overloader
+ Pod::Man
+ Pod::ParseLink
+ Pod::Text
+ Pod::Text::Color
+ Pod::Text::Overstrike
+ Pod::Text::Termcap
+ Pod::UsageTrans
+ POSIX
+ PPI
+ PPI::Cache
+ PPI::Document
+ PPI::Document::File
+ PPI::Document::Fragment
+ PPI::Document::Normalized
+ PPI::Dumper
+ PPI::Element
+ PPI::Exception
+ PPI::Exception::ParserRejection
+ PPI::Find
+ PPI::Lexer
+ PPI::Node
+ PPI::Normal
+ PPI::Normal::Standard
+ PPI::Statement
+ PPI::Statement::Break
+ PPI::Statement::Compound
+ PPI::Statement::Data
+ PPI::Statement::End
+ PPI::Statement::Expression
+ PPI::Statement::Given
+ PPI::Statement::Include
+ PPI::Statement::Include::Perl6
+ PPI::Statement::Null
+ PPI::Statement::Package
+ PPI::Statement::Scheduled
+ PPI::Statement::Sub
+ PPI::Statement::Unknown
+ PPI::Statement::UnmatchedBrace
+ PPI::Statement::Variable
+ PPI::Statement::When
+ PPI::Structure
+ PPI::Structure::Block
+ PPI::Structure::Condition
+ PPI::Structure::Constructor
+ PPI::Structure::For
+ PPI::Structure::Given
+ PPI::Structure::List
+ PPI::Structure::Subscript
+ PPI::Structure::Unknown
+ PPI::Structure::When
+ PPI::Token
+ PPI::Token::ArrayIndex
+ PPI::Token::Attribute
+ PPI::Token::BOM
+ PPI::Token::Cast
+ PPI::Token::Comment
+ PPI::Token::DashedWord
+ PPI::Token::Data
+ PPI::Token::End
+ PPI::Token::HereDoc
+ PPI::Token::Label
+ PPI::Token::Magic
+ PPI::Token::Number
+ PPI::Token::Number::Binary
+ PPI::Token::Number::Exp
+ PPI::Token::Number::Float
+ PPI::Token::Number::Hex
+ PPI::Token::Number::Octal
+ PPI::Token::Number::Version
+ PPI::Token::Operator
+ PPI::Token::Pod
+ PPI::Token::Prototype
+ PPI::Token::Quote
+ PPI::Token::Quote::Double
+ PPI::Token::Quote::Interpolate
+ PPI::Token::Quote::Literal
+ PPI::Token::Quote::Single
+ PPI::Token::QuoteLike
+ PPI::Token::QuoteLike::Backtick
+ PPI::Token::QuoteLike::Command
+ PPI::Token::QuoteLike::Readline
+ PPI::Token::QuoteLike::Regexp
+ PPI::Token::QuoteLike::Words
+ PPI::Token::Regexp
+ PPI::Token::Regexp::Match
+ PPI::Token::Regexp::Substitute
+ PPI::Token::Regexp::Transliterate
+ PPI::Token::Separator
+ PPI::Token::Structure
+ PPI::Token::Symbol
+ PPI::Token::Unknown
+ PPI::Token::Whitespace
+ PPI::Token::Word
+ PPI::Token::_QuoteEngine
+ PPI::Token::_QuoteEngine::Full
+ PPI::Token::_QuoteEngine::Simple
+ PPI::Tokenizer
+ PPI::Transform
+ PPI::Transform::UpdateCopyright
+ PPI::Util
+ PPI::XSAccessor
+ re
+ Ref::Util
+ Ref::Util::PP
+ Ref::Util::XS
+ Regexp::Common
+ Regexp::Common::balanced
+ Regexp::Common::CC
+ Regexp::Common::comment
+ Regexp::Common::delimited
+ Regexp::Common::lingua
+ Regexp::Common::list
+ Regexp::Common::net
+ Regexp::Common::number
+ Regexp::Common::profanity
+ Regexp::Common::SEN
+ Regexp::Common::URI
+ Regexp::Common::URI::fax
+ Regexp::Common::URI::file
+ Regexp::Common::URI::ftp
+ Regexp::Common::URI::gopher
+ Regexp::Common::URI::http
+ Regexp::Common::URI::news
+ Regexp::Common::URI::pop
+ Regexp::Common::URI::prospero
+ Regexp::Common::URI::RFC1035
+ Regexp::Common::URI::RFC1738
+ Regexp::Common::URI::RFC1808
+ Regexp::Common::URI::RFC2384
+ Regexp::Common::URI::RFC2396
+ Regexp::Common::URI::RFC2806
+ Regexp::Common::URI::tel
+ Regexp::Common::URI::telnet
+ Regexp::Common::URI::tv
+ Regexp::Common::URI::wais
+ Regexp::Common::whitespace
+ Regexp::Common::zip
+ Regexp::Common::_support
+ Reply::Plugin::TypeTiny
+ Role::Tiny
+ Role::Tiny::With
+ Roman
+ Scalar::Util
+ Scalar::Util
+ Scope::Guard
+ Scope::Upper
+ SelectSaver
+ Set::Crontab
+ Set::Infinite
+ Set::Infinite::Arithmetic
+ Set::Infinite::Basic
+ Set::Infinite::_recurrence
+ Socket
+ Socket6
+ Specio
+ Specio::Coercion
+ Specio::Constraint::AnyCan
+ Specio::Constraint::AnyDoes
+ Specio::Constraint::AnyIsa
+ Specio::Constraint::Enum
+ Specio::Constraint::Intersection
+ Specio::Constraint::ObjectCan
+ Specio::Constraint::ObjectDoes
+ Specio::Constraint::ObjectIsa
+ Specio::Constraint::Parameterizable
+ Specio::Constraint::Parameterized
+ Specio::Constraint::Role::CanType
+ Specio::Constraint::Role::DoesType
+ Specio::Constraint::Role::Interface
+ Specio::Constraint::Role::IsaType
+ Specio::Constraint::Simple
+ Specio::Constraint::Structurable
+ Specio::Constraint::Structured
+ Specio::Constraint::Union
+ Specio::Declare
+ Specio::DeclaredAt
+ Specio::Exception
+ Specio::Exporter
+ Specio::Helpers
+ Specio::Library::Builtins
+ Specio::Library::Numeric
+ Specio::Library::Perl
+ Specio::Library::String
+ Specio::Library::Structured
+ Specio::Library::Structured::Dict
+ Specio::Library::Structured::Map
+ Specio::Library::Structured::Tuple
+ Specio::OO
+ Specio::PartialDump
+ Specio::Registry
+ Specio::Role::Inlinable
+ Specio::Subs
+ Specio::TypeChecks
+ Spiffy
+ Spiffy::mixin
+ SQL::Dialects::ANSI
+ SQL::Dialects::AnyData
+ SQL::Dialects::CSV
+ SQL::Dialects::Role
+ SQL::Eval
+ SQL::Parser
+ SQL::Statement
+ SQL::Statement::Function
+ SQL::Statement::Functions
+ SQL::Statement::GetInfo
+ SQL::Statement::Operation
+ SQL::Statement::Placeholder
+ SQL::Statement::RAM
+ SQL::Statement::Term
+ SQL::Statement::TermFactory
+ SQL::Statement::Util
+ strict
+ String::ShellQuote
+ Sub::Defer
+ Sub::Exporter
+ Sub::Exporter::ForMethods
+ Sub::Exporter::Progressive
+ Sub::Exporter::Util
+ Sub::Identify
+ Sub::Info
+ Sub::Install
+ Sub::Name
+ Sub::Name
+ Sub::Quote
+ Sub::Uplevel
+ Sub::Util
+ Switch
+ Symbol
+ Task::Weaken
+ Term::Size::Any
+ Term::Size::Perl
+ Term::Size::Perl::Params
+ Term::Table
+ Term::Table::Cell
+ Term::Table::CellStack
+ Term::Table::HashBase
+ Term::Table::LineBreak
+ Term::Table::Spacer
+ Term::Table::Util
+ Test2
+ Test2::API
+ Test2::API::Breakage
+ Test2::API::Context
+ Test2::API::Instance
+ Test2::API::Stack
+ Test2::AsyncSubtest
+ Test2::AsyncSubtest::Event::Attach
+ Test2::AsyncSubtest::Event::Detach
+ Test2::AsyncSubtest::Formatter
+ Test2::AsyncSubtest::Hub
+ Test2::Bundle
+ Test2::Bundle::Extended
+ Test2::Bundle::More
+ Test2::Bundle::Simple
+ Test2::Compare
+ Test2::Compare::Array
+ Test2::Compare::Bag
+ Test2::Compare::Base
+ Test2::Compare::Bool
+ Test2::Compare::Custom
+ Test2::Compare::DeepRef
+ Test2::Compare::Delta
+ Test2::Compare::Event
+ Test2::Compare::EventMeta
+ Test2::Compare::Float
+ Test2::Compare::Hash
+ Test2::Compare::Meta
+ Test2::Compare::Negatable
+ Test2::Compare::Number
+ Test2::Compare::Object
+ Test2::Compare::OrderedSubset
+ Test2::Compare::Pattern
+ Test2::Compare::Ref
+ Test2::Compare::Regex
+ Test2::Compare::Scalar
+ Test2::Compare::Set
+ Test2::Compare::String
+ Test2::Compare::Undef
+ Test2::Compare::Wildcard
+ Test2::Event
+ Test2::Event::Bail
+ Test2::Event::Diag
+ Test2::Event::Encoding
+ Test2::Event::Exception
+ Test2::Event::Fail
+ Test2::Event::Generic
+ Test2::Event::Note
+ Test2::Event::Ok
+ Test2::Event::Pass
+ Test2::Event::Plan
+ Test2::Event::Skip
+ Test2::Event::Subtest
+ Test2::Event::TAP::Version
+ Test2::Event::Times
+ Test2::Event::V2
+ Test2::Event::Waiting
+ Test2::Event::Warning
+ Test2::EventFacet
+ Test2::EventFacet::About
+ Test2::EventFacet::Amnesty
+ Test2::EventFacet::Assert
+ Test2::EventFacet::Control
+ Test2::EventFacet::Error
+ Test2::EventFacet::Hub
+ Test2::EventFacet::Info
+ Test2::EventFacet::Meta
+ Test2::EventFacet::Parent
+ Test2::EventFacet::Plan
+ Test2::EventFacet::Render
+ Test2::EventFacet::Trace
+ Test2::Formatter
+ Test2::Formatter::TAP
+ Test2::Hub
+ Test2::Hub::Interceptor
+ Test2::Hub::Interceptor::Terminator
+ Test2::Hub::Subtest
+ Test2::IPC
+ Test2::IPC::Driver
+ Test2::IPC::Driver::Files
+ Test2::Manual
+ Test2::Manual::Anatomy
+ Test2::Manual::Anatomy::API
+ Test2::Manual::Anatomy::Context
+ Test2::Manual::Anatomy::EndToEnd
+ Test2::Manual::Anatomy::Event
+ Test2::Manual::Anatomy::Hubs
+ Test2::Manual::Anatomy::IPC
+ Test2::Manual::Anatomy::Utilities
+ Test2::Manual::Contributing
+ Test2::Manual::Testing
+ Test2::Manual::Testing::Introduction
+ Test2::Manual::Testing::Migrating
+ Test2::Manual::Testing::Planning
+ Test2::Manual::Testing::Todo
+ Test2::Manual::Tooling
+ Test2::Manual::Tooling::FirstTool
+ Test2::Manual::Tooling::Formatter
+ Test2::Manual::Tooling::Nesting
+ Test2::Manual::Tooling::Plugin::TestExit
+ Test2::Manual::Tooling::Plugin::TestingDone
+ Test2::Manual::Tooling::Plugin::ToolCompletes
+ Test2::Manual::Tooling::Plugin::ToolStarts
+ Test2::Manual::Tooling::Subtest
+ Test2::Manual::Tooling::TestBuilder
+ Test2::Manual::Tooling::Testing
+ Test2::Mock
+ Test2::Plugin
+ Test2::Plugin::BailOnFail
+ Test2::Plugin::DieOnFail
+ Test2::Plugin::ExitSummary
+ Test2::Plugin::NoWarnings
+ Test2::Plugin::SRand
+ Test2::Plugin::Times
+ Test2::Plugin::UTF8
+ Test2::Require
+ Test2::Require::AuthorTesting
+ Test2::Require::EnvVar
+ Test2::Require::Fork
+ Test2::Require::Module
+ Test2::Require::Perl
+ Test2::Require::RealFork
+ Test2::Require::Threads
+ Test2::Suite
+ Test2::Todo
+ Test2::Tools
+ Test2::Tools::AsyncSubtest
+ Test2::Tools::Basic
+ Test2::Tools::Class
+ Test2::Tools::ClassicCompare
+ Test2::Tools::Compare
+ Test2::Tools::Defer
+ Test2::Tools::Encoding
+ Test2::Tools::Event
+ Test2::Tools::Exception
+ Test2::Tools::Exports
+ Test2::Tools::GenTemp
+ Test2::Tools::Grab
+ Test2::Tools::Mock
+ Test2::Tools::Ref
+ Test2::Tools::Spec
+ Test2::Tools::Subtest
+ Test2::Tools::Target
+ Test2::Tools::Tester
+ Test2::Tools::Tiny
+ Test2::Tools::Warnings
+ Test2::Util
+ Test2::Util::ExternalMeta
+ Test2::Util::Facets2Legacy
+ Test2::Util::Grabber
+ Test2::Util::HashBase
+ Test2::Util::Ref
+ Test2::Util::Stash
+ Test2::Util::Sub
+ Test2::Util::Table
+ Test2::Util::Table::Cell
+ Test2::Util::Table::LineBreak
+ Test2::Util::Term
+ Test2::Util::Times
+ Test2::Util::Trace
+ Test2::V0
+ Test2::Workflow
+ Test2::Workflow::BlockBase
+ Test2::Workflow::Build
+ Test2::Workflow::Runner
+ Test2::Workflow::Task
+ Test2::Workflow::Task::Action
+ Test2::Workflow::Task::Group
+ Test::Base
+ Test::Base::Filter
+ Test::Builder
+ Test::Builder::Formatter
+ Test::Builder::IO::Scalar
+ Test::Builder::Module
+ Test::Builder::Tester
+ Test::Builder::Tester::Color
+ Test::Builder::TodoDiag
+ Test::CleanNamespaces
+ Test::Deep
+ Test::Deep::All
+ Test::Deep::Any
+ Test::Deep::Array
+ Test::Deep::ArrayEach
+ Test::Deep::ArrayElementsOnly
+ Test::Deep::ArrayLength
+ Test::Deep::ArrayLengthOnly
+ Test::Deep::Blessed
+ Test::Deep::Boolean
+ Test::Deep::Cache
+ Test::Deep::Cache::Simple
+ Test::Deep::Class
+ Test::Deep::Cmp
+ Test::Deep::Code
+ Test::Deep::Hash
+ Test::Deep::HashEach
+ Test::Deep::HashElements
+ Test::Deep::HashKeys
+ Test::Deep::HashKeysOnly
+ Test::Deep::Ignore
+ Test::Deep::Isa
+ Test::Deep::ListMethods
+ Test::Deep::Methods
+ Test::Deep::MM
+ Test::Deep::None
+ Test::Deep::NoTest
+ Test::Deep::Number
+ Test::Deep::Obj
+ Test::Deep::Ref
+ Test::Deep::RefType
+ Test::Deep::Regexp
+ Test::Deep::RegexpMatches
+ Test::Deep::RegexpOnly
+ Test::Deep::RegexpRef
+ Test::Deep::RegexpRefOnly
+ Test::Deep::RegexpVersion
+ Test::Deep::ScalarRef
+ Test::Deep::ScalarRefOnly
+ Test::Deep::Set
+ Test::Deep::Shallow
+ Test::Deep::Stack
+ Test::Deep::String
+ Test::Differences
+ Test::Distribution
+ Test::Exception
+ Test::FailWarnings
+ Test::Fatal
+ Test::File::ShareDir
+ Test::File::ShareDir::Dist
+ Test::File::ShareDir::Module
+ Test::File::ShareDir::Object::Dist
+ Test::File::ShareDir::Object::Inc
+ Test::File::ShareDir::Object::Module
+ Test::File::ShareDir::TempDirObject
+ Test::File::ShareDir::Utils
+ Test::Inter
+ Test::LeakTrace
+ Test::LeakTrace::Script
+ Test::MockRandom
+ Test::MockTime
+ Test::Moose
+ Test::More
+ Test::Needs
+ Test::NoWarnings
+ Test::NoWarnings::Warning
+ Test::Object
+ Test::Object::Test
+ Test::Pod
+ Test::Pod::Coverage
+ Test::Requires
+ Test::Simple
+ Test::Specio
+ Test::SubCalls
+ Test::Tester
+ Test::Tester::Capture
+ Test::Tester::CaptureRunner
+ Test::Tester::Delegate
+ Test::TypeTiny
+ Test::use::ok
+ Test::Warnings
+ Test::Without::Module
+ Test::YAML
+ Text::CharWidth
+ Text::CSV
+ Text::CSV_PP
+ Text::CSV_XS
+ Text::Diff
+ Text::Diff::Config
+ Text::Diff::Table
+ Text::Glob
+ Text::Iconv
+ Text::Levenshtein
+ Text::LineFold
+ Text::ParseWords
+ Text::Soundex
+ Text::Tabs
+ Text::Wrap
+ Text::WrapI18N
+ Tie::Hash
+ Tie::IxHash
+ Time::Local
+ Time::Zone
+ Try::Tiny
+ TryCatch
+ Type::Coercion
+ Type::Coercion::FromMoose
+ Type::Coercion::Union
+ Type::Library
+ Type::Params
+ Type::Parser
+ Type::Registry
+ Type::Tiny
+ Type::Tiny::Class
+ Type::Tiny::Duck
+ Type::Tiny::Enum
+ Type::Tiny::Intersection
+ Type::Tiny::Role
+ Type::Tiny::Union
+ Type::Tiny::_HalfOp
+ Type::Utils
+ Types::Common::Numeric
+ Types::Common::String
+ Types::Standard
+ Types::Standard::ArrayRef
+ Types::Standard::CycleTuple
+ Types::Standard::Dict
+ Types::Standard::HashRef
+ Types::Standard::Map
+ Types::Standard::ScalarRef
+ Types::Standard::StrMatch
+ Types::Standard::Tied
+ Types::Standard::Tuple
+ Types::TypeTiny
+ Unicode::GCString
+ Unicode::LineBreak
+ Unicode::LineBreak
+ Unicode::UTF8
+ URI
+ URI::data
+ URI::Escape
+ URI::file
+ URI::file::Base
+ URI::file::FAT
+ URI::file::Mac
+ URI::file::OS2
+ URI::file::QNX
+ URI::file::Unix
+ URI::file::Win32
+ URI::ftp
+ URI::gopher
+ URI::Heuristic
+ URI::http
+ URI::https
+ URI::IRI
+ URI::ldap
+ URI::ldapi
+ URI::ldaps
+ URI::mailto
+ URI::mms
+ URI::news
+ URI::nntp
+ URI::pop
+ URI::QueryParam
+ URI::rlogin
+ URI::rsync
+ URI::rtsp
+ URI::rtspu
+ URI::sftp
+ URI::sip
+ URI::sips
+ URI::snews
+ URI::Split
+ URI::ssh
+ URI::telnet
+ URI::tn3270
+ URI::URL
+ URI::urn
+ URI::urn::isbn
+ URI::urn::oid
+ URI::WithBase
+ URI::_foreign
+ URI::_generic
+ URI::_idna
+ URI::_ldap
+ URI::_login
+ URI::_punycode
+ URI::_query
+ URI::_segment
+ URI::_server
+ URI::_userpass
+ utf8
+ UUID
+ Variable::Magic
+ vars
+ version
+ version::regex
+ version::vxs
+ warnings
+ warnings::register
+ WWW::RobotRules
+ WWW::RobotRules::AnyDBM_File
+ X2Go::Config
+ X2Go::Log
+ X2Go::Server
+ X2Go::Server::Agent
+ X2Go::Server::Agent::NX
+ X2Go::Server::DB
+ X2Go::Server::DB::PostgreSQL
+ X2Go::Server::DB::SQLite3
+ X2Go::SupeReNicer
+ X2Go::Utils
+ XML::Parser
+ XML::Parser::Expat
+ XML::Parser::Style::Debug
+ XML::Parser::Style::Objects
+ XML::Parser::Style::Stream
+ XML::Parser::Style::Subs
+ XML::Parser::Style::Tree
+ XML::Twig
+ XML::Twig::XPath
+ XML::XPathEngine
+ XML::XPathEngine::Boolean
+ XML::XPathEngine::Expr
+ XML::XPathEngine::Function
+ XML::XPathEngine::Literal
+ XML::XPathEngine::LocationPath
+ XML::XPathEngine::NodeSet
+ XML::XPathEngine::Number
+ XML::XPathEngine::Root
+ XML::XPathEngine::Step
+ XML::XPathEngine::Variable
+ XSLoader
+ XSLoader
+ YAML
+ YAML::Any
+ YAML::Dumper
+ YAML::Dumper::Base
+ YAML::Error
+ YAML::LibYAML
+ YAML::Loader
+ YAML::Loader::Base
+ YAML::Marshall
+ YAML::Mo
+ YAML::Node
+ YAML::Tag
+ YAML::Tiny
+ YAML::Types
+ YAML::XS
+ YAML::XS::LibYAML
+
+
+
+ Copyright 2019 PerlScriptsJavaScripts.com +
+
+ + diff --git a/htdocs/cgi-bin/favicon.ico b/htdocs/cgi-bin/favicon.ico new file mode 100644 index 0000000..29d98a7 Binary files /dev/null and b/htdocs/cgi-bin/favicon.ico differ diff --git a/htdocs/cgi-bin/images/VS-on-METABOX-42.png b/htdocs/cgi-bin/images/VS-on-METABOX-42.png new file mode 100644 index 0000000..7c05de9 Binary files /dev/null and b/htdocs/cgi-bin/images/VS-on-METABOX-42.png differ diff --git a/htdocs/cgi-bin/images/Wedges-9.1s-64px.png b/htdocs/cgi-bin/images/Wedges-9.1s-64px.png new file mode 100644 index 0000000..7dc4f9a Binary files /dev/null and b/htdocs/cgi-bin/images/Wedges-9.1s-64px.png differ diff --git a/htdocs/cgi-bin/images/WelloffHighlevelAlpinegoat.webp b/htdocs/cgi-bin/images/WelloffHighlevelAlpinegoat.webp new file mode 100644 index 0000000..bb428f0 Binary files /dev/null and b/htdocs/cgi-bin/images/WelloffHighlevelAlpinegoat.webp differ diff --git a/htdocs/cgi-bin/images/paw_to_hand_deal_done.jpg b/htdocs/cgi-bin/images/paw_to_hand_deal_done.jpg new file mode 100644 index 0000000..85adab3 Binary files /dev/null and b/htdocs/cgi-bin/images/paw_to_hand_deal_done.jpg differ diff --git a/htdocs/cgi-bin/images/paw_to_hand_deal_done_frm.png b/htdocs/cgi-bin/images/paw_to_hand_deal_done_frm.png new file mode 100644 index 0000000..1237e43 Binary files /dev/null and b/htdocs/cgi-bin/images/paw_to_hand_deal_done_frm.png differ diff --git a/htdocs/cgi-bin/index.cgi b/htdocs/cgi-bin/index.cgi new file mode 100755 index 0000000..29b1220 --- /dev/null +++ b/htdocs/cgi-bin/index.cgi @@ -0,0 +1,112 @@ +#!/usr/bin/env perl +# A delegated CNFParser processed rendering of the Document Index Web page, a Model-View-Controller Pattern approuch. +# The index.cnf script contains the structure and page skeleton, +# all configuration as well as the HTMLIndexProcessorPlugin converting the CNF to final HTML. +# It is very convienient, as both style and script for the page is separated and developed in the index.cnf. +# Which then can be moved to a respective include file over there. +# This controller binds and provides to the parser to do its magic thing. +# +use v5.30; +use strict; +use warnings; +use Exception::Class ('LifeLogException'); +use Syntax::Keyword::Try; +## +# We use dynamic perl compilations. The following ONLY HERE required to carp to browser on +# system requirments or/and unexpected perl compiler errors. +## +use CGI::Carp qw(fatalsToBrowser set_message); + +BEGIN { + sub handle_errors { + my $err = shift; + say "

Server Error

Error: $err
"; + } + set_message(\&handle_errors); +} + +use lib "system/modules"; +require CNFParser; +require CNFNode; + +our $GLOB_HTML_SERVE = "'{}/*.cgi' '{}/*.htm' '{}/*.html' '{}/*.md' '{}/*.txt'"; +our $script_path = $0; $script_path =~ s/\w+.cgi$//; + +exit &HTMLPageBuilderFromCNF; + +sub HTMLPageBuilderFromCNF { + my $html = obtainDirListingHTML('docs'); + my $cnf = CNFParser -> new ( + $script_path."index.cnf",{ + DO_ENABLED => 1, HAS_EXTENSIONS=>1, + ANONS_ARE_PUBLIC => 1, + PAGE_HEAD => "

Index Page of Docs Directory

", + PAGE_CONTENT => $html, + PAGE_FOOT => "" + } + ); + my $ptr = $cnf->data(); + $ptr = $ptr->{'PAGE'}; + say $$ptr if $ptr; + return 0 +} + +sub obtainDirListingHTML { + my ($dir, $ret) = (shift,""); + my $html = listFiles($dir,$script_path,""); + if($html){ + $ret .="
    $dir →\n"; + $ret .= $html; + opendir (my $handle, $script_path.$dir) or die "Couldn't open directory, $!"; + while (my $node = readdir $handle) { + my $file_full_path = "$script_path$dir/$node"; + if($node !~ /^\./ && -d $file_full_path){ + $html = obtainDirListingHTML($dir.'/'.$node); + $ret .= $html if $html + } + } + closedir $handle; + $ret .= "
"; + } + return $ret; +} + +sub listFiles ($){ + my ($dir, $script_path, $ret) = @_; + my $path = $script_path.$dir; + my $spec = $GLOB_HTML_SERVE; $spec =~ s/{}/$path/gp; + my @files = glob ($spec); + foreach my $file(@files){ + ($file =~ m/(\w+\.\w*)$/g); + my $name = $1; + if($file =~ /\.md$/){ + my @title = getDocTitle($file); + $ret .= qq(\t\t\t
  • $title[1] ‐ $name
  • \n); + }else{ + $ret .= qq(\t\t\t
  • $name
  • \n); + } + } + return $ret; +} + +sub getDocTitle($){ + my ($file,$ret) = shift; + open(my $fh, '<', $file) or LifeLogException->throw("Can't open $file: $!"); + while (my $line = <$fh>) { + if($line =~ /^#+\s*(.*)/){ + $ret = $1; + last; + } + } + close $fh; + ($file =~ m/(\w+\.\w*)$/g); + return ($1,$ret) +} +1; +=begin copyright +Programed by : Will Budic +EContactHash : 990MWWLWM8C2MI8K (https://github.com/wbudic/EContactHash.md) +Source : https://github.com/wbudic/LifeLog +Open Source Code License -> https://github.com/wbudic/PerlCNF/blob/master/ISC_License.md +=cut copyright + diff --git a/htdocs/cgi-bin/index.cnf b/htdocs/cgi-bin/index.cnf new file mode 100644 index 0000000..5abe045 --- /dev/null +++ b/htdocs/cgi-bin/index.cnf @@ -0,0 +1,407 @@ +!CNF3.0 + +<<@<%WEBAPP_SETTINGS> + $LOG_PATH = ../../dbLifeLog/ + //We are reading only the css property, old way is the following hash, preserved as reminder. + $THEME = css => wsrc/main.css, colBG => #c8fff8, colSHDW => #9baec8 +>> + +<<@<%HTTP_HEADER> +-charset = "UTF8" +-expires = "+5s" +>> + +< _HAS_PROCESSING_PRIORITY_ + +[JS[ + [@@[wsrc/main.js]@@] + [@@[wsrc/feeds.js]@@] + [@@[wsrc/jquery.js]@@] + [@@[wsrc/jquery-ui.js]@@] +]JS] +[CSS[ + [@@[wsrc/effects.css]@@] + [@@[wsrc/feeds.css]@@] + [@@[wsrc/jquery-ui.css]@@] + [@@[wsrc/jquery-ui.theme.css]@@] + [@@[wsrc/jquery-ui.theme.css]@@] + [@@[wsrc/main.css]@@] +]CSS] + + :last-child{ + border-bottom: 2px solid #94cde7; + } + + .div_img{ + height:450px; + } + + .md_img{ + height:80%; + } + + code, pre{ + font-family: 'Droid Sans Mono', 'monospace', monospace; + } + + .pre { + border:1px solid black; + background: rgba(255,255,255,0.2); + padding:15px; + text-align: left; + } + .sh { + background: black; + color: lightgreen; + padding: 15px; + width: auto; + border-radius: .32em; + border: 2px solid lightgreen; + margin: inherit; + margin-right: 30px; + } + + div .html { + border:1px solid lightgray; + background: rgba(255,255,255,0.2); + padding:10px; + font-family:monospace; + text-align: left; + } + + div .cnf { + border:1px solid lightgray; + background: rgba(255,255,255,0.2); + padding:10px; + font-family:monospace; + text-align: left; + padding-bottom: 10px; + margin-right: 2px; + margin-top: 15px; + } + + dt{ + margin-right: 2px; + } + + .cnf h1{ + text-align: left; + padding-left: 15px; + margin-top: -20px; + height: 20px; + line-height: 20px; + font-size: 15px; + } + + .cnf h1 span{ + background-color: white; + border:1px solid lightgray; + color:lightgray; + font-size:small; + padding: 3px; + padding-left: 5px; + padding-right: 5px; + } + + + div .perl { + border:1px solid lightgray; + background: rgba(149, 215, 172, 0.2); + padding-left:15px; + font-family:monospace; + text-align: left; + padding-bottom: 20px; + margin-right: 2px; + margin-top: 15px; + } + + .mermaid{ + border:1px solid lightgray; + background: transparent; + padding-left:15px; + text-align: left; + padding-bottom: 20px; + margin-right: 2px; + margin-top: 15px; + } + + .perl h1{ + text-align: left; + padding-left: 15px; + margin-top: -10px; + height: 20px; + line-height: 20px; + font-size: 15px; + } + + .perl h1 span{ + background: rgba(170, 227, 191, 0.75); + border:1px solid lightgray; + color:black; + font-size:small; + padding: 3px; + padding-left: 5px; + padding-right: 5px; + } + + .span_status { + position: absolute; + top: 80px; left:420px; + border: 2px solid #94cde7; + padding: 5px; + text-align: center; + background: #ccffff; + text-decoration-style: wavy; + filter: drop-shadow( 10px 8px 5px #3e6f70); + } + +]#] +>STYLE> + +*> +>STYLE> + +SCRIPT> + +SCRIPT> + + +>>HEADER>TREE> + + + +### +# We in plugin mainly access this PAGE property, <*
    *> is linked in for clarity, +# and/or if want to change from keeping the original \<\...\>\> above. +# +< + + <*
    *> + + Title: Index Page + OnLoad : onIndexBodyLoad() + + + + +   Page   + + + +
    + Index
    + Life Log
    + RSS Feeds + +>#> + >div> +*> + a> + >div> + #> + >span> + *> + >div> + *> + >div> + a> + a> +
    "; +print $cgi->end_html; \ No newline at end of file diff --git a/htdocs/cgi-bin/tz.map b/htdocs/cgi-bin/tz.map new file mode 100644 index 0000000..42b8509 --- /dev/null +++ b/htdocs/cgi-bin/tz.map @@ -0,0 +1,4 @@ +Australia/Marsfield=Australia/Sydney +Australia/Bondi=Australia/Sydney +America/Austin=America/Chicago +America/Texas=America/Chicago diff --git a/htdocs/cgi-bin/wsrc/Miki-Matsubara-WASH-WASH.mp3 b/htdocs/cgi-bin/wsrc/Miki-Matsubara-WASH-WASH.mp3 new file mode 100644 index 0000000..9ce2064 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/Miki-Matsubara-WASH-WASH.mp3 differ diff --git a/htdocs/cgi-bin/wsrc/Store_Door_Chime-Mike_Koenig-570742973.mp3 b/htdocs/cgi-bin/wsrc/Store_Door_Chime-Mike_Koenig-570742973.mp3 new file mode 100644 index 0000000..fedb4d9 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/Store_Door_Chime-Mike_Koenig-570742973.mp3 differ diff --git a/htdocs/cgi-bin/wsrc/bckanim.js b/htdocs/cgi-bin/wsrc/bckanim.js new file mode 100644 index 0000000..aba4d6d --- /dev/null +++ b/htdocs/cgi-bin/wsrc/bckanim.js @@ -0,0 +1,72 @@ + + +var background = {} + +function startBackgroundAnim(){ + + + background.initializr = function (){ + + var $this = this; + + //option + $this.id = "bubbles"; + $this.style = {bubbles_color:"#191970",stroke_width:0, stroke_color :"red"}; + $this.bubbles_number = 128; + $this.speed = [2500,18000]; //milliseconds + $this.max_bubbles_height = $this.height; + $this.shape = false; // 1 : circle | 2 : triangle | 3 : rect | false :random + + if($("#"+$this.id).lenght > 0){ + $("#"+$this.id).remove(); + } + $this.object = $("
    '").appendTo("body"); + + $this.ww = $(window).width(); + $this.wh = $(window).height()+100; + $this.width = $this.object.width($this.ww); + $this.height = $this.object.height($this.wh); + + + $("body").prepend(""); + + + for (i = 0; i < $this.bubbles_number; i++) { + $this.generate_bubbles() + } + + } + + + background.generate_bubbles = function() { + var $this = this; + var base = jQuery("
    "); + var shape_type = $this.shape ? $this.shape : Math.floor($this.rn(1,3)); + var shape; + if(shape_type == 1) { + shape = base.css({borderRadius: "80%"}) + }else if (shape_type == 2){ + shape = base.css({width:0, height:0, "border-style":"solid","border-width":"0 40px 69.3px 40px","border-color":"transparent transparent "+$this.style.bubbles_color+" transparent", background:"transparent"}); + }else{ + shape = base; + } + var rn_size = $this.rn(.8,1.2); + shape.css({"transform":"scale("+rn_size+") rotate("+$this.rn(-360,360)+"deg)", top:$this.wh+100, left:$this.rn(-60, $this.ww+60)}); + shape.appendTo($this.object); + shape.transit({top: $this.rn($this.wh/2,$this.wh/2-60), "transform":"scale("+rn_size+") rotate("+$this.rn(-360,360)+"deg)", opacity: 0},$this.rn($this.speed[0],$this.speed[1]), function(){ + $(this).remove(); + $this.generate_bubbles(); + }) + + } + + + background.rn = function(from, to, arr) { + if(arr){ + return Math.random() * (to - from + 1) + from; + }else{ + return Math.floor(Math.random() * (to - from + 1) + from); + } + } + background.initializr(); + } \ No newline at end of file diff --git a/htdocs/cgi-bin/wsrc/dutchie-close.mp3 b/htdocs/cgi-bin/wsrc/dutchie-close.mp3 new file mode 100644 index 0000000..bed9916 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/dutchie-close.mp3 differ diff --git a/htdocs/cgi-bin/wsrc/dutchie.mp3 b/htdocs/cgi-bin/wsrc/dutchie.mp3 new file mode 100644 index 0000000..6855d0d Binary files /dev/null and b/htdocs/cgi-bin/wsrc/dutchie.mp3 differ diff --git a/htdocs/cgi-bin/wsrc/effects.css b/htdocs/cgi-bin/wsrc/effects.css new file mode 100644 index 0000000..6a6926b --- /dev/null +++ b/htdocs/cgi-bin/wsrc/effects.css @@ -0,0 +1,56 @@ +#index_head { + letter-spacing: .1em; + text-shadow: 3px 5px 2px #474747, 2px 2px 2px rgba(206, 89, 55, 2); + color: #e0dfdc; + background: transparent; +} +#lifelog_head { + letter-spacing: .1em; + text-shadow: 3px 5px 2px #e0dfdc, 2px 2px 2px rgba(206, 89, 55, 2); + font-weight: bolder; + color: #000000; + background: transparent; +} + +#menu { + position: fixed; + float: left; + margin: 0; + border: 2px solid #94cde7; + padding: 5px; + text-align: center; + background: #ccffff; + margin-left: 91%; +} + +#menu_page { + position: fixed; + float: left; + margin: 0; + margin-top:5px; + border: 2px solid #94cde7; + padding: 5px; + font-size:small; + background: #ccffff2e; + color: black; + margin-left: 90.5vw; + filter: drop-shadow( 10px 8px 5px #3e6f70); +} + +#menu_page a:link { + color: #1c3535 + } + a:link { + color: #1c3535 + } +#menu_page a:visited { + color: #6b51a9; + } +#menu_page a:hover { + color: #04eefa; + font-style:bold; + } + +.menu_head { + border: 2px solid #00000017; +} \ No newline at end of file diff --git a/htdocs/cgi-bin/wsrc/feeds.css b/htdocs/cgi-bin/wsrc/feeds.css new file mode 100644 index 0000000..7919645 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/feeds.css @@ -0,0 +1,124 @@ +.feeds_hdr { + text-align: left; + vertical-align: auto; +} + +.feed { + text-align:left; + border: 1px solid black; + margin-bottom: 5px; + padding: 8px; + background-color: transparent; + color: black; +} + + +.feed:hover{ + background-color: transparent; + color: black; +} + +.feed div { + text-align:left; + border:0; +} +.feed li { + margin-top: 5px;; +} + +.feed_lbl { + font-weight: bolder; + font-style: normal; + width: 48px; + display: inline-flex; + +} +.feed_hdr_lbl { + font-weight: bolder; + font-style: oblique; + width: 88px; + display: inline-flex; + +} +.feeds hr{ + color: black; + height: 1px; +} + + + +.feed_hdr_r1 { + background-color: #e6ffff; + border: 1px solid black; + border-right: 1px solid black; + vertical-align: top; +} + +.feed_hdr_r2 { + background-color: #ccffff; + border: 1px solid black; + border-right: 1px solid black; + vertical-align: top; +} + + +.feed_hdr_r3 { + background-color: #ccfff0; + border: 1px solid black; + border-right: 1px solid black; + vertical-align: top; +} + +.feed_desc img{ + width: 20%; +} +.feed_desc span{ +display: flow-root; +} + + +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + @font-face { + font-family: flownews-FontAwesome; + src: url(fonts/fontawesome-webfont.eot?v=4.7.0); + src: url(fonts/fontawesome-webfont.eot?#iefix&v=4.7.0) format('embedded-opentype'),url(fonts/fontawesome-webfont.woff2?v=4.7.0) format('woff2'),url(fonts/fontawesome-webfont.woff?v=4.7.0) format('woff'),url(fonts/fontawesome-webfont.ttf?v=4.7.0) format('truetype'),url(fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format('svg'); + font-weight: 400; + font-style: normal +} + +.flownewsicon { + display: inline-block; + font: normal normal normal 14px/1 flownews-FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +.fa-angle-double-left:before { + content: "\f100" +} + +.fa-angle-double-right:before { + content: "\f101" +} + + +.article-read-more i:before { + margin-left: 10px; + margin-right: 0; + width: 30px; + content: "...more\f101"; +} + +.article-read-more a { + margin-left: 10px; + margin-right: 0; +} + + + + diff --git a/htdocs/cgi-bin/wsrc/feeds.js b/htdocs/cgi-bin/wsrc/feeds.js new file mode 100644 index 0000000..adc795a --- /dev/null +++ b/htdocs/cgi-bin/wsrc/feeds.js @@ -0,0 +1,46 @@ +var ID = "#feeds"; +function fetchFeeds(id){ + ID = id?id:"#feeds"; + var pnl =$(ID); + pnl.html( + '
      P l e a s e    W a i t   !  
    ' + ); + pnl.show(); + pnl.css('visibility','visible'); + $(document).scrollTop( $("#rss_anchor").offset().top ); + $.post('CNFServices.cgi', {service:'feeds',action:'list'}, displayFeeds).fail( + function(response) { + pnl.html(response.responseText); + pnl.fadeOut(10000); + } + ); +} +function fetchFeed(feed) { + ID = '#feeds'; + var pnl = $(ID); + pnl.html( + '
        Please   Wait -> '+feed+' loading...  
    ' + ); + pnl.show(); + pnl.css('visibility','visible'); + $.post('CNFServices.cgi', {service:'feeds', action:'read', feed:feed}, displayFeeds).fail( + function(response) { + pnl.html(response.responseText); + pnl.fadeOut(20000); + } + ); +} +function displayFeeds(content){ + var pnl = $(ID); + pnl.html(content); + $("#index-content").css("height",'100%'); + pnl.show(); + $(document).scrollTop( $("#rss_anchor").offset().top ); +} + +function demoLogin() { + var form = $('#frm_login'); + $('#frm_login input[name=alias]').val("admin"); + $('#frm_login input[name=passw]').val("admin"); + form.submit(); +} diff --git a/htdocs/cgi-bin/wsrc/feeds_viral_now.css b/htdocs/cgi-bin/wsrc/feeds_viral_now.css new file mode 100644 index 0000000..9c064f4 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/feeds_viral_now.css @@ -0,0 +1,13371 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=f6e691ee98704224b321ad5dcb5dac35) + * Config saved to config.json and https://gist.github.com/f6e691ee98704224b321ad5dcb5dac35 + */ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 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 */ +body,figure { + margin: 0 +} + +.flownews-element-posts a,pre { + word-wrap: break-word +} + + + +img { + border: 0; + vertical-align: middle +} + + + +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4 +} + +dt,kbd kbd,label { + font-weight: 700 +} + +address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre { + line-height: 1.42857143 +} + +@media (min-width: 768px) { + .lead { + font-size:21px + } +} + +.small,small { + font-size: 85% +} + +.mark,mark { + background-color: #fcf8e3; + padding: .2em +} + +.list-inline,.list-unstyled { + padding-left: 0; + list-style: none +} + +.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 +} + +pre code,table { + background-color: transparent +} + +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee +} + +dl,ol,ul { + margin-top: 0 +} + +blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,ol ol,ol ul,ul ol,ul ul { + margin-bottom: 0 +} + +address,dl { + margin-bottom: 20px +} + +ol,ul { + margin-bottom: 10px +} + +.list-inline { + margin-left: -5px +} + +.list-inline>li { + display: inline-block; + padding-left: 5px; + padding-right: 5px +} + +legend,pre { + display: block +} + +dd { + margin-left: 0 +} + +@media (min-width: 768px) { + .dl-horizontal dt { + float:left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap + } + + .dl-horizontal dd { + margin-left: 180px + } + + .container { + width: 750px + } +} + +.clear,.clearfix,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.flownews-clear,.form-horizontal .form-group:after,.row:after { + clear: both +} + +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 .small,blockquote footer,blockquote small { + display: block; + font-size: 80%; + color: #777 +} + +blockquote .small:before,blockquote footer:before,blockquote small:before { + content: '\2014 \00A0' +} + +#preloader:after,.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,blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eee; + border-left: 0; + text-align: right +} + +code,kbd { + padding: 2px 4px; + font-size: 90% +} + +caption,th { + text-align: left +} + +.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 { + font-style: normal +} + +code,kbd,pre,samp { + font-family: Menlo,Monaco,Consolas,"Courier New",monospace +} + +code { + border-radius: 4px +} + +kbd { + color: #fff; + 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%; + -webkit-box-shadow: none; + box-shadow: none +} + +pre { + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + word-break: break-all +} + +.container,.container-fluid { + margin-right: auto; + margin-left: auto +} + +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + border-radius: 0 +} + +.container,.container-fluid { + padding-left: 15px; + padding-right: 15px +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll +} + +@media (min-width: 992px) { + .container { + width:970px + } +} + +@media (min-width: 1200px) { + .container { + width:1170px + } +} + +.row { + margin-left: -15px; + margin-right: -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-left: 15px; + padding-right: 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 + } +} + +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777 +} + +.table { + 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,.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,.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 col[class*=col-] { + position: static; + float: none; + display: table-column +} + +table td[class*=col-],table th[class*=col-] { + position: static; + float: none; + display: table-cell +} + +.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 { + overflow-x: auto; + min-height: .01% +} + +@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,legend { + padding: 0; + border: 0 +} + +fieldset { + margin: 0; + min-width: 0 +} + +legend { + width: 100%; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border-bottom: 1px solid #e5e5e5 +} + +label { + display: inline-block; + margin-bottom: 5px +} + +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 +} + +.form-control,output { + font-size: 14px; + line-height: 1.42857143; + color: #555; + display: block +} + +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: dotted thin; + outline: -webkit-focus-ring-color auto 5px; + outline-offset: -2px +} + +output { + padding-top: 7px +} + +.form-control { + width: 100%; + height: 34px; + padding: 6px 12px; + background-color: #fff; + 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 +} + +.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.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 +} + +.form-control::-ms-expand { + border: 0; + background-color: transparent +} + +.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 +} + +@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-left: -20px; + margin-top: 4px\9 +} + +.checkbox+.checkbox,.radio+.radio { + margin-top: -5px +} + +.checkbox-inline,.radio-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: 400; + cursor: pointer +} + +.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline { + margin-top: 0; + margin-left: 10px +} + +.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,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 +} + +.form-control-static { + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; + min-height: 34px +} + +.form-control-static.input-lg,.form-control-static.input-sm { + padding-left: 0; + padding-right: 0 +} + +.form-group-sm .form-control,.input-sm { + padding: 5px 10px; + border-radius: 3px; + font-size: 12px +} + +.input-sm { + height: 30px; + line-height: 1.5 +} + +select.input-sm { + height: 30px; + line-height: 30px +} + +select[multiple].input-sm,textarea.input-sm { + height: auto +} + +.form-group-sm .form-control { + height: 30px; + line-height: 1.5 +} + +.form-group-lg .form-control,.input-lg { + border-radius: 6px; + padding: 10px 16px; + font-size: 18px +} + +.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; + line-height: 1.3333333 +} + +select.input-lg { + height: 46px; + line-height: 46px +} + +select[multiple].input-lg,textarea.input-lg { + height: auto +} + +.form-group-lg .form-control { + height: 46px; + line-height: 1.3333333 +} + +.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 .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; + border-color: #3c763d; + background-color: #dff0d8 +} + +.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.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; + border-color: #8a6d3b; + background-color: #fcf8e3 +} + +.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.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; + border-color: #a94442; + background-color: #f2dede +} + +.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-control-static,.form-inline .form-group { + display:inline-block + } + + .form-inline .control-label,.form-inline .form-group { + margin-bottom: 0; + vertical-align: middle + } + + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle + } + + .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 .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 .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 7px + } +} + +.btn-block,input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block { + width: 100% +} + +.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 7px +} + +.form-horizontal .checkbox,.form-horizontal .radio { + min-height: 27px +} + +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px +} + +#preloader-container .spinner-dots,.aligncenter,.alignright,.btn,.fa-fw,.fa-li,.fa-stack-1x,.fa-stack-2x { + text-align: center +} + +.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 + } + + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px + } +} + +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: 400; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + border: 1px solid transparent; + white-space: nowrap; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none +} + +.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus { + outline: dotted thin; + outline: -webkit-focus-ring-color auto 5px; + outline-offset: -2px +} + +.btn.focus,.btn:focus,.btn:hover { + color: #333; + text-decoration: none +} + +.btn.active,.btn:active { + outline: 0; + background-image: none; + -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; + opacity: .65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none +} + +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.active,.btn-default:active,.btn-default:hover,.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.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.active,.btn-primary:active,.btn-primary:hover,.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.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.active,.btn-success:active,.btn-success:hover,.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.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.active,.btn-info:active,.btn-info:hover,.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.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.active,.btn-warning:active,.btn-warning:hover,.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.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.active,.btn-danger:active,.btn-danger:hover,.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.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 { + color: #337ab7; + font-weight: 400; + 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-lg { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px +} + +.btn-sm,.btn-xs { + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} + +.btn-sm { + padding: 5px 10px +} + +.btn-xs { + padding: 1px 5px +} + +.btn-block { + display: block +} + +.btn-block+.btn-block { + margin-top: 5px +} + +.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,.row:after,.row:before { + content: " "; + display: table +} + +.center-block { + display: block; + margin-left: auto; + margin-right: auto +} + +.fa.fa-pull-left,.fa.pull-left { + margin-right: .3em +} + +.pull-right { + float: right!important +} + +.pull-left { + float: left!important +} + +.hide { + display: none!important +} + +.show { + display: block!important +} + +.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block { + display: none!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 (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 + } + + .visible-xs-block { + display: block!important + } + + .visible-xs-inline { + display: inline!important + } + + .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 + } + + .visible-sm-block { + display: block!important + } + + .visible-sm-inline { + display: inline!important + } + + .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 + } + + .visible-md-block { + display: block!important + } + + .visible-md-inline { + display: inline!important + } + + .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 + } + + .visible-lg-block { + display: block!important + } + + .visible-lg-inline { + display: inline!important + } + + .visible-lg-inline-block { + display: inline-block!important + } + + .hidden-lg { + display: none!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 + } +} + +.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 + } + + .hidden-print { + display: none!important + } +} + +.element-no-padding [class*=col-] { + padding-left: 0!important; + padding-right: 0!important +} + +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +@font-face { + font-family: flownews-FontAwesome; + src: url(fonts/fontawesome-webfont.eot?v=4.7.0); + src: url(fonts/fontawesome-webfont.eot?#iefix&v=4.7.0) format('embedded-opentype'),url(fonts/fontawesome-webfont.woff2?v=4.7.0) format('woff2'),url(fonts/fontawesome-webfont.woff?v=4.7.0) format('woff'),url(fonts/fontawesome-webfont.ttf?v=4.7.0) format('truetype'),url(fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format('svg'); + font-weight: 400; + font-style: normal +} + +.flownewsicon { + display: inline-block; + font: normal normal normal 14px/1 flownews-FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +.flownews-menu>li.menu-item-has-children>a:after,.submenu>li.menu-item-has-children>a:after,.widget ul>li.menu-item-has-children>a:after { + font-family: flownews-FontAwesome!important; + speak: none; + font-variant: normal; + -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 +} + +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none +} + +.fa.fa-pull-right,.fa.pull-right { + margin-left: .3em +} + +.fa-ul>li { + position: relative +} + +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: .14285714em +} + +.fa-li.fa-lg { + left: -1.85714286em +} + +.fa-border { + padding: .2em .25em .15em; + border: .08em solid #eee; + border-radius: .1em +} + +.fa-pull-left { + float: left +} + +.fa-pull-right { + float: right +} + +.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(0); + transform: rotate(0) + } + + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg) + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0) + } + + 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-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90 { + 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% +} + +.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-close:before,.fa-remove: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-cog:before,.fa-gear: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-repeat:before,.fa-rotate-right: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-image:before,.fa-photo: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-exclamation-triangle:before,.fa-warning: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-cogs:before,.fa-gears: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-floppy-o:before,.fa-save:before { + content: "\f0c7" +} + +.fa-square:before { + content: "\f0c8" +} + +.fa-bars:before,.fa-navicon:before,.fa-reorder: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-sort:before,.fa-unsorted:before { + content: "\f0dc" +} + +.fa-sort-desc:before,.fa-sort-down:before { + content: "\f0dd" +} + +.fa-sort-asc:before,.fa-sort-up:before { + content: "\f0de" +} + +.fa-envelope:before { + content: "\f0e0" +} + +.fa-linkedin:before { + content: "\f0e1" +} + +.fa-rotate-left:before,.fa-undo:before { + content: "\f0e2" +} + +.fa-gavel:before,.fa-legal:before { + content: "\f0e3" +} + +.fa-dashboard:before,.fa-tachometer:before { + content: "\f0e4" +} + +.fa-comment-o:before { + content: "\f0e5" +} + +.fa-comments-o:before { + content: "\f0e6" +} + +.fa-bolt:before,.fa-flash:before { + content: "\f0e7" +} + +.fa-sitemap:before { + content: "\f0e8" +} + +.fa-umbrella:before { + content: "\f0e9" +} + +.fa-clipboard:before,.fa-paste: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-chain-broken:before,.fa-unlink: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-caret-square-o-down:before,.fa-toggle-down:before { + content: "\f150" +} + +.fa-caret-square-o-up:before,.fa-toggle-up:before { + content: "\f151" +} + +.fa-caret-square-o-right:before,.fa-toggle-right:before { + content: "\f152" +} + +.fa-eur:before,.fa-euro:before { + content: "\f153" +} + +.fa-gbp:before { + content: "\f154" +} + +.fa-dollar:before,.fa-usd:before { + content: "\f155" +} + +.fa-inr:before,.fa-rupee:before { + content: "\f156" +} + +.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before { + content: "\f157" +} + +.fa-rouble:before,.fa-rub:before,.fa-ruble:before { + content: "\f158" +} + +.fa-krw:before,.fa-won: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-caret-square-o-left:before,.fa-toggle-left:before { + content: "\f191" +} + +.fa-dot-circle-o:before { + content: "\f192" +} + +.fa-wheelchair:before { + content: "\f193" +} + +.fa-vimeo-square:before { + content: "\f194" +} + +.fa-try:before,.fa-turkish-lira: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-bank:before,.fa-institution:before,.fa-university:before { + content: "\f19c" +} + +.fa-graduation-cap:before,.fa-mortar-board: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-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before { + content: "\f1c5" +} + +.fa-file-archive-o:before,.fa-file-zip-o:before { + content: "\f1c6" +} + +.fa-file-audio-o:before,.fa-file-sound-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-ring:before,.fa-life-saver:before,.fa-support:before { + content: "\f1cd" +} + +.fa-circle-o-notch:before { + content: "\f1ce" +} + +.fa-ra:before,.fa-rebel:before,.fa-resistance:before { + content: "\f1d0" +} + +.fa-empire:before,.fa-ge:before { + content: "\f1d1" +} + +.fa-git-square:before { + content: "\f1d2" +} + +.fa-git:before { + content: "\f1d3" +} + +.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before { + content: "\f1d4" +} + +.fa-tencent-weibo:before { + content: "\f1d5" +} + +.fa-qq:before { + content: "\f1d6" +} + +.fa-wechat:before,.fa-weixin:before { + content: "\f1d7" +} + +.fa-paper-plane:before,.fa-send:before { + content: "\f1d8" +} + +.fa-paper-plane-o:before,.fa-send-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-futbol-o:before,.fa-soccer-ball-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-ils:before,.fa-shekel:before,.fa-sheqel: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-bed:before,.fa-hotel:before { + content: "\f236" +} + +.fa-viacoin:before { + content: "\f237" +} + +.fa-train:before { + content: "\f238" +} + +.fa-subway:before { + content: "\f239" +} + +.fa-medium:before { + content: "\f23a" +} + +.fa-y-combinator:before,.fa-yc: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,.fa-battery: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-paper-o:before,.fa-hand-stop-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-television:before,.fa-tv: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-american-sign-language-interpreting:before,.fa-asl-interpreting:before { + content: "\f2a3" +} + +.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before { + content: "\f2a4" +} + +.fa-glide:before { + content: "\f2a5" +} + +.fa-glide-g:before { + content: "\f2a6" +} + +.fa-sign-language:before,.fa-signing: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" +} + +.fa-handshake-o:before { + content: "\f2b5" +} + +.fa-envelope-open:before { + content: "\f2b6" +} + +.fa-envelope-open-o:before { + content: "\f2b7" +} + +.fa-linode:before { + content: "\f2b8" +} + +.fa-address-book:before { + content: "\f2b9" +} + +.fa-address-book-o:before { + content: "\f2ba" +} + +.fa-address-card:before,.fa-vcard:before { + content: "\f2bb" +} + +.fa-address-card-o:before,.fa-vcard-o:before { + content: "\f2bc" +} + +.fa-user-circle:before { + content: "\f2bd" +} + +.fa-user-circle-o:before { + content: "\f2be" +} + +.fa-user-o:before { + content: "\f2c0" +} + +.fa-id-badge:before { + content: "\f2c1" +} + +.fa-drivers-license:before,.fa-id-card:before { + content: "\f2c2" +} + +.fa-drivers-license-o:before,.fa-id-card-o:before { + content: "\f2c3" +} + +.fa-quora:before { + content: "\f2c4" +} + +.fa-free-code-camp:before { + content: "\f2c5" +} + +.fa-telegram:before { + content: "\f2c6" +} + +.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before { + content: "\f2c7" +} + +.fa-thermometer-3:before,.fa-thermometer-three-quarters:before { + content: "\f2c8" +} + +.fa-thermometer-2:before,.fa-thermometer-half:before { + content: "\f2c9" +} + +.fa-thermometer-1:before,.fa-thermometer-quarter:before { + content: "\f2ca" +} + +.fa-thermometer-0:before,.fa-thermometer-empty:before { + content: "\f2cb" +} + +.fa-shower:before { + content: "\f2cc" +} + +.fa-bath:before,.fa-bathtub:before,.fa-s15:before { + content: "\f2cd" +} + +.fa-podcast:before { + content: "\f2ce" +} + +.fa-window-maximize:before { + content: "\f2d0" +} + +.fa-window-minimize:before { + content: "\f2d1" +} + +.fa-window-restore:before { + content: "\f2d2" +} + +.fa-times-rectangle:before,.fa-window-close:before { + content: "\f2d3" +} + +.fa-times-rectangle-o:before,.fa-window-close-o:before { + content: "\f2d4" +} + +.fa-bandcamp:before { + content: "\f2d5" +} + +.fa-grav:before { + content: "\f2d6" +} + +.fa-etsy:before { + content: "\f2d7" +} + +.fa-imdb:before { + content: "\f2d8" +} + +.fa-ravelry:before { + content: "\f2d9" +} + +.fa-eercast:before { + content: "\f2da" +} + +.fa-microchip:before { + content: "\f2db" +} + +.fa-snowflake-o:before { + content: "\f2dc" +} + +.fa-superpowers:before { + content: "\f2dd" +} + +.fa-wpexplorer:before { + content: "\f2de" +} + +.fa-meetup:before { + content: "\f2e0" +} + +.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 +} + +.flownews-wrap-container { + background: #FFF +} + +.flownews-header-top,.flownews-header-top .flownews-wrap-container { + background: #000; + overflow: hidden +} + +.flownews-header-bottom,.flownews-header-bottom .flownews-wrap-container { + background: #282828; + border-bottom: 2px solid #e7685d +} + +body { + background-repeat: no-repeat; + line-height: 1 +} + +p { + color: #747474; + letter-spacing: .5px; + line-height: 24px; + font-weight: 300; + margin: 0 +} + +h1,h2,h3,h4,h5,h6 { + font-weight: 700; + color: #333; + letter-spacing: 1px; + margin: 0 +} + +.comment-description h1,.comment-description h2,.comment-description h3,.comment-description h4,.comment-description h5,.comment-description h6,.post-text .text>h3,.post-text .text>h4,.post-text .text>h5,.post-text .text>h6,.post-text>h3,.post-text>h4,.post-text>h5,.post-text>h6 { + margin: 10px 0 +} + +.comment-description dt,.post-text dt { + margin-bottom: 5px +} + +.comment-description dd,.post-text dd { + margin-bottom: 20px +} + +.flownews-page .flownews-content .post-text .text>ol ol,.flownews-page .flownews-content .post-text .text>ul ul,.flownews-post .flownews-content .comment-description ol ol,.flownews-post .flownews-content .comment-description ul ul,.flownews-post .flownews-content .post-text>ol ol,.flownews-post .flownews-content .post-text>ul ul { + margin-bottom: 0 +} + +.alignleft,.alignnone,.alignright,.comment-description p,.post-text .text>p,.post-text>p { + margin-bottom: 20px +} + +kbd { + background-color: #333 +} + +code { + color: #c7254e; + background-color: #f9f2f4 +} + +h1 a,h2 a,h3 a,h4 a,h5 a,h6 a { + font-weight: 700; + color: #333; + letter-spacing: 1px +} + +a { + color: #c9564c +} + +pre { + border-radius: 0; + color: #333; + background-color: #f5f5f5; + border: 1px solid #ccc +} + +#preloader,#preloader:after { + width: 50px; + height: 50px; + border-radius: 50px +} + +::-webkit-scrollbar { + width: 5px +} + +::-webkit-scrollbar-track { + background-color: #eaeaea; + border-left: 1px solid #ccc +} + +::-webkit-scrollbar-thumb { + background-color: #ccc +} + +::-webkit-scrollbar-thumb:hover { + background-color: #aaa +} + +img { + height: auto +} + +a:focus,a:hover { + text-decoration: none; + color: #e7685d +} + +a:focus,input:focus { + outline: 0 +} + +a,a:hover { + transition: all .3s ease 0s +} + +.aligncenter,.alignleft,.bypostauthor .alignright,.gallery-caption,.screen-reader-text,.wp-caption,.wp-caption-text { + line-height: 1; + max-width: 100% +} + +.alignleft { + float: left; + margin-right: 20px +} + +.alignright { + float: right; + margin-left: 20px; + color: #282828; + display: block; + font-size: 12px; + margin-top: 8px +} + +.aligncenter { + margin: 0 auto 20px +} + +.wp-caption-text { + margin-top: 10px +} + +td,th { + padding: 10px +} + +tr td:first-child,tr th:first-child { + padding-left: 0 +} + +@media screen and (max-width: 800px) { + .aligncenter,.alignleft,.alignright { + max-width:100%; + float: none; + display: block; + text-align: center; + margin: 25px auto + } +} + +#preloader-container { + background: #fff; + position: fixed; + width: 100%; + height: 100%; + top: 0; + z-index: 999999999999999999 +} + +#preloader-wrap { + width: 60px; + height: 60px; + position: absolute; + top: 50%; + left: 50%; + margin-left: -30px; + margin-top: -30px +} + +#preloader { + position: relative; + background: 0 0; + animation: preloader_5 1.5s infinite linear +} + +#preloader:after { + position: absolute; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + border-left: 10px solid transparent; + border-right: 10px solid transparent; + top: 0; + left: 0; + animation: preloader_5_after 1.5s infinite linear +} + +.cssload-thecube .cssload-cube:before,.header-mobile .menu-responsive-container li.menu-item-has-children a:after { + content: "" +} + +@keyframes preloader_5 { + 0% { + transform: rotate(0) + } + + 50% { + transform: rotate(180deg); + background: 0 0 + } + + 100% { + transform: rotate(360deg) + } +} + +.cssload-thecube { + width: 60px; + height: 60px; + margin: 0 auto; + position: relative; + transform: rotateZ(45deg); + -o-transform: rotateZ(45deg); + -ms-transform: rotateZ(45deg); + -webkit-transform: rotateZ(45deg); + -moz-transform: rotateZ(45deg) +} + +.cssload-thecube .cssload-cube { + transform: rotateZ(45deg); + -ms-transform: rotateZ(45deg); + -webkit-transform: rotateZ(45deg); + -moz-transform: rotateZ(45deg); + float: left; + width: 50%; + height: 50%; + position: relative; + transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1) +} + +.cssload-thecube .cssload-cube:before { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #e7695d; + animation: cssload-fold-thecube 4.2s infinite linear both; + -o-animation: cssload-fold-thecube 4.2s infinite linear both; + -ms-animation: cssload-fold-thecube 4.2s infinite linear both; + -webkit-animation: cssload-fold-thecube 4.2s infinite linear both; + -moz-animation: cssload-fold-thecube 4.2s infinite linear both; + transform-origin: 100% 100%; + -o-transform-origin: 100% 100%; + -ms-transform-origin: 100% 100%; + -webkit-transform-origin: 100% 100%; + -moz-transform-origin: 100% 100% +} + +.cssload-thecube .cssload-c2 { + transform: scale(1.1) rotateZ(90deg); + -o-transform: scale(1.1) rotateZ(90deg); + -ms-transform: scale(1.1) rotateZ(90deg); + -webkit-transform: scale(1.1) rotateZ(90deg); + -moz-transform: scale(1.1) rotateZ(90deg) +} + +.cssload-thecube .cssload-c3 { + transform: scale(1.1) rotateZ(180deg); + -o-transform: scale(1.1) rotateZ(180deg); + -ms-transform: scale(1.1) rotateZ(180deg); + -webkit-transform: scale(1.1) rotateZ(180deg); + -moz-transform: scale(1.1) rotateZ(180deg) +} + +.cssload-thecube .cssload-c4 { + transform: scale(1.1) rotateZ(270deg); + -o-transform: scale(1.1) rotateZ(270deg); + -ms-transform: scale(1.1) rotateZ(270deg); + -webkit-transform: scale(1.1) rotateZ(270deg); + -moz-transform: scale(1.1) rotateZ(270deg) +} + +.cssload-thecube .cssload-c2:before { + animation-delay: .53s; + -o-animation-delay: .53s; + -ms-animation-delay: .53s; + -webkit-animation-delay: .53s; + -moz-animation-delay: .53s +} + +.cssload-thecube .cssload-c3:before { + animation-delay: 1.05s; + -o-animation-delay: 1.05s; + -ms-animation-delay: 1.05s; + -webkit-animation-delay: 1.05s; + -moz-animation-delay: 1.05s +} + +.cssload-thecube .cssload-c4:before { + animation-delay: 1.58s; + -o-animation-delay: 1.58s; + -ms-animation-delay: 1.58s; + -webkit-animation-delay: 1.58s; + -moz-animation-delay: 1.58s +} + +@keyframes cssload-fold-thecube { + 0%,10% { + transform: perspective(136px) rotateX(-180deg); + opacity: 0 + } + + 25%,75% { + transform: perspective(136px) rotateX(0); + opacity: 1 + } + + 100%,90% { + transform: perspective(136px) rotateY(180deg); + opacity: 0 + } +} + +@-o-keyframes cssload-fold-thecube { + 0%,10% { + -o-transform: perspective(136px) rotateX(-180deg); + opacity: 0 + } + + 25%,75% { + -o-transform: perspective(136px) rotateX(0); + opacity: 1 + } + + 100%,90% { + -o-transform: perspective(136px) rotateY(180deg); + opacity: 0 + } +} + +@-ms-keyframes cssload-fold-thecube { + 0%,10% { + -ms-transform: perspective(136px) rotateX(-180deg); + opacity: 0 + } + + 25%,75% { + -ms-transform: perspective(136px) rotateX(0); + opacity: 1 + } + + 100%,90% { + -ms-transform: perspective(136px) rotateY(180deg); + opacity: 0 + } +} + +@-webkit-keyframes cssload-fold-thecube { + 0%,10% { + -webkit-transform: perspective(136px) rotateX(-180deg); + opacity: 0 + } + + 25%,75% { + -webkit-transform: perspective(136px) rotateX(0); + opacity: 1 + } + + 100%,90% { + -webkit-transform: perspective(136px) rotateY(180deg); + opacity: 0 + } +} + +@-moz-keyframes cssload-fold-thecube { + 0%,10% { + -moz-transform: perspective(136px) rotateX(-180deg); + opacity: 0 + } + + 25%,75% { + -moz-transform: perspective(136px) rotateX(0); + opacity: 1 + } + + 100%,90% { + -moz-transform: perspective(136px) rotateY(180deg); + opacity: 0 + } +} + +#preloader-container .spinner-pulse { + width: 40px; + height: 40px; + position: absolute; + left: 50%; + top: 50%; + margin-left: -20px; + margin-top: -20px; + border-radius: 100%; + -webkit-animation: scaleout 1s infinite ease-in-out; + animation: scaleout 1s infinite ease-in-out +} + +@-webkit-keyframes scaleout { + 0% { + -webkit-transform: scale(0) + } + + 100% { + -webkit-transform: scale(1); + opacity: 0 + } +} + +@keyframes scaleout { + 0% { + transform: scale(0); + -webkit-transform: scale(0) + } + + 100% { + transform: scale(1); + -webkit-transform: scale(1); + opacity: 0 + } +} + +#preloader-container .spinner-plane { + width: 30px; + height: 30px; + margin: -15px auto 100px -15px; + -webkit-animation: rotateplane 1.2s infinite ease-in-out; + animation: rotateplane 1.2s infinite ease-in-out; + position: absolute; + z-index: 999999999999999999999999999999999999999; + left: 50%; + top: 50%; + background: 0 0 +} + +@-webkit-keyframes rotateplane { + 0% { + -webkit-transform: perspective(120px) + } + + 50% { + -webkit-transform: perspective(120px) rotateY(180deg) + } + + 100% { + -webkit-transform: perspective(120px) rotateY(180deg) rotateX(180deg) + } +} + +@keyframes rotateplane { + 0% { + transform: perspective(120px) rotateX(0) rotateY(0); + -webkit-transform: perspective(120px) rotateX(0) rotateY(0) + } + + 50% { + transform: perspective(120px) rotateX(-180.1deg) rotateY(0); + -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0) + } + + 100% { + transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg) + } +} + +#preloader-container .spinner-three-bounce { + position: absolute; + left: 50%; + top: 50%; + margin-left: -35px; + margin-top: -9px; + width: 70px; + text-align: center +} + +#preloader-container .spinner-three-bounce>div { + width: 18px; + height: 18px; + border-radius: 100%; + display: inline-block; + -webkit-animation: bouncedelay 1.4s infinite ease-in-out; + animation: bouncedelay 1.4s infinite ease-in-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both +} + +#preloader-container .spinner-three-bounce .bounce1 { + -webkit-animation-delay: -.32s; + animation-delay: -.32s +} + +#preloader-container .spinner-three-bounce .bounce2 { + -webkit-animation-delay: -.16s; + animation-delay: -.16s +} + +@-webkit-keyframes bouncedelay { + 0%,100%,80% { + -webkit-transform: scale(0) + } + + 40% { + -webkit-transform: scale(1) + } +} + +@keyframes bouncedelay { + 0%,100%,80% { + transform: scale(0); + -webkit-transform: scale(0) + } + + 40% { + transform: scale(1); + -webkit-transform: scale(1) + } +} + +#preloader-container .spinner-dots { + width: 40px; + height: 40px; + position: absolute; + left: 50%; + top: 50%; + margin-left: -20px; + margin-top: -20px; + -webkit-animation: rotate 2s infinite linear; + animation: rotate 2s infinite linear +} + +#preloader-container .spinner-dots .dot1,#preloader-container .spinner-dots .dot2 { + width: 60%; + height: 60%; + display: inline-block; + position: absolute; + top: 0; + border-radius: 100%; + -webkit-animation: bounce 2s infinite ease-in-out; + animation: bounce 2s infinite ease-in-out +} + +#preloader-container .spinner-dots .dot2 { + top: auto; + bottom: 0; + -webkit-animation-delay: -1s; + animation-delay: -1s +} + +@-webkit-keyframes rotate { + 100% { + -webkit-transform: rotate(360deg) + } +} + +@keyframes rotate { + 100% { + transform: rotate(360deg); + -webkit-transform: rotate(360deg) + } +} + +@-webkit-keyframes bounce { + 0%,100% { + -webkit-transform: scale(0) + } + + 50% { + -webkit-transform: scale(1) + } +} + +@keyframes bounce { + 0%,100% { + transform: scale(0); + -webkit-transform: scale(0) + } + + 50% { + transform: scale(1); + -webkit-transform: scale(1) + } +} + +#flownews-outer-wrap { + overflow: hidden +} + +.flownews-wrap-container { + width: 1180px; + margin: 0 auto +} + +.flownews-boxed #flownews-outer-wrap { + width: 1180px; + margin: 50px auto +} + +.flownews-boxed .header-desktop .flownews-wrap-container { + width: 100%; + background: 0 0 +} + +.flownews-header-middle { + padding: 25px 0 +} + +.flownews-container { + padding: 50px +} + +.flownews-container .col-xs-9 { + max-width: calc(75% - 50px); + max-width: -web-kit(75% - 50px); + width: 75% +} + +.flownews-container.flownews-sidebar-left .col-xs-9 { + margin-left: 50px +} + +.flownews-container.flownews-sidebar-right .col-xs-9 { + margin-right: 50px +} + +.flownews-header-wrap .flownews-header-middle .flownews-banner-top-left { + text-align: left +} + +.flownews-header-middle .flownews-banner-top,.flownews-header-wrap .flownews-header-middle .flownews-logo.flownews-logo-right { + text-align: right +} + +.flownews-boxed .flownews-header-middle { + padding: 25px 50px +} + +.flownews-boxed .flownews-footer-bottom { + padding: 0 +} + +.flownews-boxed .flownews-header-top .flownews-wrap-container .flownews-ticker.col-sm-6 { + padding-left: 0 +} + +.flownews-boxed .flownews-header-top .flownews-wrap-container { + padding: 0 50px +} + +@media screen and (min-width: 1201px) { + .flownews-boxed .flownews-footer-bottom .flownews-wrap-container { + padding:0 50px + } +} + +.flownews-header-middle .flownews-logo.col-sm-3 { + height: 100px; + line-height: 100px; + padding-left: 0 +} + +.flownews-header-middle .flownews-logo.col-sm-3 img { + max-height: 68px +} + +.flownews-logo-center,nav ul { + text-align: center +} + +.flownews-header-middle .flownews-banner-top .container_advertisement { + display: inline-block +} + +.flownews-top-menu { + margin: 0; + padding: 0; + height: 32px; + line-height: 30px; + overflow: hidden +} + +.flownews-top-menu li { + display: inline-block +} + +.flownews-top-menu li a { + color: #fff; + font-size: 12px; + font-weight: 700; + letter-spacing: 1.5px; + padding: 0 0 0 25px; + text-transform: uppercase +} + +.flownews-top-menu li:first-child a { + padding-left: 0 +} + +.flownews-top-menu li ul,.header-mobile { + display: none +} + +.header-mobile .flownews-logo { + padding: 25px; + background: #282828 +} + +.header-mobile .flownews-logo img { + max-height: 50px +} + +.header-mobile .news-ticker-item .news-ticker-item-title a { + color: #fff; + display: inline-block; + font-size: 12px; + font-weight: 400; + letter-spacing: 1.5px; + margin-left: 0; + text-transform: uppercase; + transition: color .3s ease 0s; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; + line-height: 32px +} + +.menu-responsive li a,.menu-responsive li a:hover,nav li ul.submenu li a,nav li ul.submenu li a:hover,nav ul li a,nav ul li a:hover,nav ul>li a { + transition: all .3s ease 0s +} + +.header-mobile .flownews-top-news-ticker .news-ticker-item .news-ticker-item-title { + width: 95% +} + +.header-mobile .flownews-top-news-ticker .news-ticker-item .news-ticker-item-category { + display: none +} + +.header-mobile .flownews-ticker { + background: #282828; + border-top: 1px solid #333; + display: inline-block; + padding: 10px 25px; + width: 100% +} + +.header-mobile .flownews-top-news-ticker.owl-carousel .owl-stage-outer { + float: none; + width: 100% +} + +@media screen and (max-width: 1180px) { + .flownews-boxed #flownews-outer-wrap,.flownews-one-page-wrap-container,.flownews-wrap-container { + width:100% + } + + .flownews-boxed #flownews-outer-wrap { + margin: 0 + } +} + +.flownews-header-sticky { + display: none; + position: fixed; + top: 0; + width: 100%; + background: #282828; + z-index: 99999999; + left: 0; + border-bottom: 2px solid #e7685d +} + +nav ul li,nav>ul { + display: inline-block +} + +.flownews-header-sticky .flownews-wrap-container { + background: #282828 +} + +nav ul li a:hover,nav ul li.current_page_item { + background: #e7685d +} + +.flownews-header-sticky nav>ul { + border-left: 0; + float: right; + margin: 0; + border-right: 0!important +} + +.flownews-header-sticky .flownews-logo.col-sm-2 { + padding-left: 0; + padding-top: 0; + line-height: 50px +} + +.flownews-header-sticky .flownews-header-bottom .flownews-menu { + height: auto +} + +.flownews-header-sticky nav ul>li a { + padding: 20px 25px +} + +nav,nav ul { + padding: 0 +} + +.flownews-logo.flownews-logo-right img { + max-height: 30px +} + +.flownews-header-sticky .flownews-header-bottom { + position: relative +} + +.flownews-header-sticky .flownews-logo,.flownews-header-sticky .flownews-menu { + position: static +} + +nav ul { + margin: 0 +} + +.flownews-header-bottom.flownews-wrap-container { + border: 0!important +} + +nav>ul { + margin: 0 50px; + text-align: left; + border-left: 1px solid #333 +} + +.flownews-header-bottom .flownews-menu { + height: 44px; + padding: 0 +} + +nav ul li { + float: left +} + +nav ul li a,nav ul li a:hover { + color: #fff +} + +nav ul>li a { + font-weight: 700; + padding: 15px 25px; + text-transform: uppercase; + display: block +} + +nav li a { + letter-spacing: 2px +} + +nav li { + position: relative +} + +nav i { + font-size: 11px +} + +.flownews-fullwidth nav>ul { + margin-left: 0 +} + +.flownews-fullwidth .flownews-search-menu-button { + margin-right: 0 +} + +.submenu,ul.submenu { + display: none; + border: 1px solid #f4f4f4; + border-top: 2px solid #e7685d +} + +ul.submenu .submenu { + margin-left: -1px; + margin-top: -1px; + border-top: 1px solid #f4f4f4 +} + +ul.submenu li:first-child .submenu { + border-top: 1px solid #e7685d +} + +nav li:hover>.submenu,nav li:hover>ul.submenu { + display: block; + position: absolute; + text-align: left; + z-index: 99999999 +} + +nav li ul.submenu li a { + font-size: 12px; + color: #333; + font-weight: 700 +} + +nav li ul.submenu li a:hover { + color: #fff +} + +nav li ul.submenu li { + background: #fff; + border-bottom: 1px solid #f4f4f4 +} + +nav li ul.submenu li:last-child { + border-bottom: 0 +} + +nav li:hover ul.submenu li { + width: 230px; + display: block; + margin: 0 +} + +nav li:hover ul.submenu li a { + padding: 15px 10px; + display: block; + text-transform: uppercase +} + +nav li:hover>ul.submenu>li:hover>ul.submenu { + display: block; + left: 231px; + top: 0 +} + +.menu-responsive { + display: none; + position: fixed; + top: 0; + width: 100%; + height: 100%; + z-index: 90; + overflow: auto; + left: 0 +} + +.close-menu-responsive,.open-menu-responsive { + position: fixed; + right: 25px; + top: 25px; + z-index: 9999999; + font-size: 24px; + color: #fff; + cursor: pointer; + background: #e7685d; + height: 35px; + line-height: 35px; + text-align: center; + width: 35px +} + +.close-menu-responsive { + display: none +} + +.menu-responsive ul { + margin: 0; + padding: 0; + text-align: center +} + +.menu-responsive>ul { + padding-top: 100px; + border-bottom: 2px solid #e7685d +} + +.menu-responsive ul>li a { + padding: 12px 25px; + display: block +} + +.menu-responsive li a { + letter-spacing: 1.5px; + color: #333; + text-align: left +} + +.menu-responsive li a:hover { + color: #e7685d +} + +.header-mobile .menu-responsive-container .submenu { + border: 1px solid #f4f4f4; + border-bottom: 0 +} + +.menu-responsive li:hover ul.submenu li li a { + margin-left: 50px +} + +.header-mobile .menu-responsive-container .submenu li .submenu li { + padding-left: 0 +} + +.header-mobile .menu-responsive-container .submenu li:last-child { + border-bottom: 0 +} + +.menu-responsive li { + background: #f4f4f4; + border-bottom: 1px solid #fff; + position: relative +} + +.menu-responsive li:last-child { + border-bottom: 0 +} + +.header-mobile .menu-responsive-container .submenu .submenu { + padding-left: 0; + border-left: 0; + border-right: 0 +} + +.header-mobile .menu-responsive-container .flownewsicon.fa-angle-down,.header-mobile .menu-responsive-container .flownewsicon.fa-angle-up { + float: right; + width: 40px; + height: 20px; + position: absolute; + z-index: 9999; + right: 10px; + top: 10px; + text-align: right +} + +.header-mobile .menu-responsive-container .flownewsicon.fa-angle-up { + display: none +} + +.menu-responsive i { + font-size: 11px +} + +.menu-responsive li ul.submenu li a { + margin-left: 25px +} + +.flownews-menu>li.menu-item-has-children>a:after,.submenu>li.menu-item-has-children>a:after { + font-style: normal; + font-weight: 400; + text-transform: none; + line-height: 1 +} + +.flownews-menu>li.menu-item-has-children>a:after { + content: "\f107"; + float: right; + font-size: 14px; + margin-left: 10px +} + +.submenu>li.menu-item-has-children>a:after { + content: "\f105"; + font-size: 12px; + margin-left: 10px +} + +.flownews-menu .menu-item-object-category { + position: static +} + +.flownews-menu .menu-item-object-category .flownews-mega-menu { + width: 1180px; + left: 0; + background: #FFF; + border-bottom: 1px solid #e7685d +} + +.flownews-mega-menu .article-image a { + padding: 0 +} + +.flownews-mega-menu .flownews-element-posts article { + padding: 0 12.5px +} + +.flownews-mega-menu .flownews-menu-element-posts-container { + margin-left: -12.5px; + padding: 25px; + width: calc(100% + 25px) +} + +.flownews-mega-menu .flownews-menu-element-posts-container .article-title a:hover { + color: #e7685d; + background: 0 0; + transition: all .3s ease 0s +} + +.flownews-mega-menu .flownews-menu-category-all-category-posts a { + padding: 0 +} + +.flownews-mega-menu .flownews-menu-category-all-category-posts i { + margin: 0; + padding: 8px 6px 6px 8px; + font-size: 12px; + line-height: 1; + background: #e7685d; + color: #fff +} + +.flownews-menu-category-all-category-posts { + border-top: 1px solid #f4f4f4 +} + +.flownews-menu-category-all-category-posts .flownews-link-menu-category { + text-align: right; + float: right; + display: block; + padding: 15px 25px +} + +.flownews-menu-category-all-category-posts .flownews-link-menu-category a { + display: inline-block; + color: #333; + transition: all .3s ease 0s +} + +.flownews-mega-menu .flownews-element-posts.owl-carousel.owl-theme article .article-title a:hover,.flownews-menu-category-all-category-posts .flownews-link-menu-category:hover a:first-child { + color: #e7685d; + background: 0 0; + transition: all .3s ease 0s +} + +.flownews-menu-category-all-category-posts .flownews-link-menu-category a:first-child { + font-size: 12px; + margin-right: -4px; + padding: 8px 12px 6px +} + +.flownews-mega-menu .flownews-menu-category.owl-carousel { + padding: 25px +} + +.flownews-mega-menu .flownews-menu-category.owl-carousel.owl-theme .owl-controls .owl-nav { + margin-top: 25px; + text-align: left +} + +.flownews-mega-menu .flownews-menu-category.owl-carousel.owl-theme .owl-controls .owl-nav [class*=owl-] { + border: 1px solid #f4f4f4; + font-size: 14px; + padding: 7px 11px +} + +.flownews-mega-menu .flownews-menu-category.owl-carousel.owl-theme .owl-controls .owl-nav i { + margin: 0 +} + +.flownews-mega-menu .flownews-menu-category.owl-carousel.owl-theme .owl-controls .owl-nav .owl-prev { + margin-right: 4px; + transition: all .3s ease 0s +} + +.flownews-mega-menu .flownews-menu-category.owl-carousel.owl-theme .owl-controls .owl-nav .owl-next { + transition: all .3s ease 0s +} + +.flownews-mega-menu .flownews-element-posts.owl-carousel.owl-theme article { + padding: 0 +} + +.flownews-mega-menu .flownews-menu-category.owl-carousel.owl-theme .owl-controls .owl-nav .owl-next:hover,.flownews-mega-menu .flownews-menu-category.owl-carousel.owl-theme .owl-controls .owl-nav .owl-prev:hover { + background: #e7685d; + border: 1px solid #e7685d; + color: #fff; + transition: all .3s ease 0s +} + +.flownews-menu .menu-item-object-category .flownews-menu-category { + margin: 0; + position: relative; + width: 100% +} + +.flownews-menu .flownews-menu-category.flownews-element-posts.flownews-posts-layout2 .item-posts.first-element-posts.col-xs-3 { + width: 25% +} + +.flownews-menu-category.flownews-element-posts .article-data { + margin-right: 10px +} + +.flownews-menu-category.flownews-element-posts .article-comments { + margin-left: 10px +} + +.flownews-menu .flownews-element-posts .article-title a { + color: #333; + font-size: 18px; + padding: 0 +} + +.flownews-search { + letter-spacing: 2px; + padding: 0; + text-align: center +} + +input[type=search] { + -webkit-appearance: none; + border: 0; + font-size: 14px; + font-weight: 100; + letter-spacing: .5px +} + +.flownews-search button { + background: #e7685d; + border: 0; + float: right; + padding: 0; + transition: all .3s ease 0s +} + +.flownews-search button:hover { + background: #c9564c; + transition: all .3s ease 0s +} + +.flownews-search .form-group-search input { + background: 0 0; + float: left; + height: 35px; + margin-left: 12px +} + +.flownewsicon.fa-close,.flownewsicon.fa-search:focus,.flownewsicon.fa-search:hover { + background: #e7685d; + transition: all .3s ease 0s +} + +.flownewsicon.fa-close,.flownewsicon.fa-search { + color: #fff; + font-size: 14px; + padding: 15px 16px; + cursor: pointer; + transition: all .3s ease 0s +} + +.flownewsicon.fa-close { + padding: 15px 17px +} + +.flownews-search-menu-button { + border-right: 1px solid #333; + margin-right: 50px; + text-align: right +} + +.flownews-search form { + border: 1px solid #f4f4f4; + background: #fff; + margin-right: 50px; + margin-top: 2px; + position: absolute; + right: 0; + width: 300px; + padding: 20px; + top: 45px; + display: none; + z-index: 9999999999 +} + +.form-group-search { + background: #f4f4f4; + height: 35px +} + +.search-btn .flownewsicon.fa-search { + padding: 9.5px 9px 11px 11px +} + +.flownews-header-bottom .flownews-search-container { + padding: 0 +} + +.flownewsicon.search-close-form { + display: none +} + +.post-text { + line-height: 24px +} + +.post-text h2 { + margin: 40px 0 20px +} + +.flownews-title-page-container { + border-bottom: 1px solid #f4f4f4; + border-right: 1px solid #e7685d; + border-top: 1px solid #f4f4f4; + height: 35px; + margin: 0 0 25px; + position: relative; + text-align: left +} + +.flownews-title-page { + background: #e7685d; + color: #fff; + display: inline-block; + font-size: 14px; + font-weight: 600; + height: calc(100% + 2px); + height: -webkit-calc(100% + 2px); + left: 0; + letter-spacing: 1.5px; + padding: 10px; + position: absolute; + text-transform: uppercase; + top: -1px; + max-width: 95%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + transition: color .3s ease 0s +} + +.flownews-category-description { + background: #f4f4f4; + margin-bottom: 50px; + padding: 17px 25px +} + +.author-post-container .author-post { + background: #f4f4f4; + margin-bottom: 50px; + padding: 15px +} + +.author-post-container .author-image .avatar { + float: left; + margin-right: 15px; + width: 20% +} + +.author-post-container .author-name a { + color: #333; + display: block; + font-size: 18px; + font-weight: 700; + letter-spacing: .5px; + margin-bottom: 5px; + text-transform: uppercase +} + +.author-post-container .author-info { + padding: 10px 0 0 +} + +.author-post-container .author-description { + color: #747474; + font-weight: 300; + letter-spacing: .5px; + line-height: 22px; + margin: 0 0 15px; + display: block +} + +.author-post-container .author-social i { + color: #333; + margin-right: 15px +} + +.text.attachment-container { + margin-top: 25px +} + +.text.attachment-container span { + display: block; + margin-bottom: 10px +} + +.not-found h2 { + font-weight: 400; + margin-bottom: 25px +} + +.not-found p { + font-size: 16px +} + +.not-found .search-form { + margin-top: 15px; + width: 100% +} + +.not-found .search-form label { + width: 49% +} + +.not-found .screen-reader-text { + float: left; + padding-right: 15px; + width: 24%; + line-height: 33px; + font-weight: 400 +} + +.not-found input { + border: 1px solid #f4f4f4; + font-weight: 100; + height: 35px; + padding: 5px 7px; + text-align: left; + width: 76% +} + +.not-found input.search-submit { + background: #e7685d; + color: #fff; + font-weight: 700; + height: 35px; + text-align: center; + transition: all .3s ease 0s; + width: 10% +} + +.not-found input.search-submit:hover { + background: #c9564c!important; + transition: all .3s ease 0s +} + +.search-not-found form { + margin-top: 20px +} + +.search-not-found input { + border: inherit +} + +@media screen and (min-width: 500px) and (max-width:700px) { + .flownews-posts-content-wrap.flownews-post-layout1 .article-info-top h2,.flownews-posts-image-wrap .flownews-wrap-container .article-info-top h2 { + margin-bottom:15px + } + + .flownews-wrap-container .flownews-post-title-page .article-info-top h2 { + line-height: 40px + } +} + +@media screen and (max-width: 499px) { + .flownews-post-title-page .article-info-bottom,.flownews-posts-content-wrap.flownews-post-layout1 .article-info-bottom,.flownews-posts-image-wrap .flownews-wrap-container .article-info-bottom { + display:none + } + + .flownews-wrap-container .flownews-post-title-page .article-info-top h2 { + line-height: 40px + } +} + +.flownews-posts-content-wrap:after { + clear: both; + content: ""; + display: block +} + +.flownews-posts-content-wrap { + background-position: center +} + +.flownews-posts-content-wrap article { + line-height: 1; + height: 500px; + overflow: hidden; + position: relative +} + +.flownews-posts-content-wrap article h2 { + line-height: 1 +} + +.flownews-posts-content-wrap .article-info { + position: absolute; + z-index: 2; + margin-left: 0; + transition: all .4s ease 0s; + right: 30px; + max-width: calc(100% - 45px); + max-width: -webkit-calc(100% - 45px); + width: 100% +} + +.flownews-posts-content-wrap .header-pattern { + background: rgba(0,0,0,.5); + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1 +} + +.flownews-posts-content-wrap article img { + opacity: 1; + transition: all .4s ease 0s +} + +.flownews-posts-content-wrap article:hover img { + opacity: .8; + transition: all .4s ease 0s +} + +.flownews-posts-content-wrap .article-info-top { + margin-bottom: 15px +} + +.flownews-posts-content-wrap .article-title { + margin: 0 25px 0 0; + line-height: 30px +} + +.flownews-posts-content-wrap .article-title a,.flownews-posts-image-wrap .article-title a { + color: #fff; + font-weight: 700; + text-transform: uppercase; + font-size: 30px; + display: block +} + +.flownews-posts-content-wrap .article-title a:hover,.flownews-posts-image-wrap .article-title a:hover { + color: #e7685d +} + +.flownews-posts-content-wrap .article-category,.flownews-posts-image-wrap .article-category { + line-height: 30px; + float: left +} + +.flownews-posts-content-wrap .article-category a,.flownews-posts-image-wrap .article-category a { + background: #e7685d; + color: #fff; + font-size: 10px; + font-weight: 700; + letter-spacing: 1px; + padding: 6px 10px; + text-transform: uppercase; + display: block; + line-height: 1; + margin-top: 4px +} + +.flownews-posts-content-wrap .article-category a:hover,.flownews-posts-image-wrap .article-category a:hover { + background: #c9564c +} + +.article-info.flownews-post-title-page .article-comments,.article-info.flownews-post-title-page .article-data,.article-info.flownews-post-title-page .article-features-category,.flownews-posts-image-wrap .article-comments,.flownews-posts-image-wrap .article-data,.flownews-posts-image-wrap .article-features-category { + display: inline-block; + margin: 0 +} + +.article-info.flownews-post-title-page .article-separator,.flownews-posts-image-wrap .article-separator { + display: inline-block; + margin: 0 20px +} + +.flownews-posts-content-wrap .article-data { + margin-right: 20px +} + +.article-info.flownews-post-title-page { + text-align: center; + margin-bottom: 50px +} + +.article-info.flownews-post-title-page .article-info-top h2 { + margin-bottom: 15px; + font-size: 40px; + color: #333 +} + +.flownews-wrap-container .article-info-top h2 { + color: #fff; + margin-bottom: 15px; + margin-right: 0; + font-size: 40px; + line-height: 1.2 +} + +.flownews-element-top-content.flownews-top-content-layout1 .article-info-top h2,.flownews-element-top-content.flownews-top-content-layout2 .article-info-top h2 { + margin-right: 10px; + margin-bottom: 0 +} + +.flownews-posts-content-wrap .article-info-bottom,.flownews-posts-image-wrap .article-info-bottom { + color: #fff; + font-size: 13px; + letter-spacing: .4px +} + +.article-info.flownews-post-title-page .article-info-bottom { + color: #646464; + font-size: 13px; + letter-spacing: .4px +} + +.article-info.flownews-post-title-page .article-info-bottom i,.flownews-posts-content-wrap .article-info-bottom i,.flownews-posts-image-wrap .article-info-bottom i { + margin-right: 10px +} + +.flownews-posts-content-wrap .article-info-bottom a,.flownews-posts-image-wrap .article-info-bottom a { + color: #FFF +} + +.article-info.flownews-post-title-page .article-info-bottom a { + color: #333; + margin-right: 10px +} + +.article-info.flownews-post-title-page .article-info-bottom a:hover,.flownews-posts-content-wrap .article-info-bottom a:hover,.flownews-posts-image-wrap .article-info-bottom a:hover { + color: #e7685d +} + +.flownews-posts-content-wrap { + height: 500px; + overflow: hidden; + position: relative; + background-size: cover; + background-repeat: no-repeat; + margin-bottom: 0 +} + +.flownews-posts-content-wrap .article-info { + top: 50%; + left: 50%; + bottom: inherit; + -webkit-transform: translate(-51%,-51%); + -moz-transform: translate(-50%,-50%); + -ms-transform: translate(-50%,-50%); + -o-transform: translate(-50%,-50%); + transform: translate(-50%,-50%); + text-align: center; + text-transform: uppercase; + zoom:103%} + +.flownews-posts-content-wrap article:hover .article-info { + transition: all .4s ease 0s; + left: 50% +} + +.flownews-posts-content-wrap .article-comments,.flownews-posts-content-wrap .article-data,.flownews-posts-content-wrap .article-features-category,.flownews-posts-content-wrap .article-separator,.flownews-posts-content-wrap .article-title { + float: none; + display: inline-block +} + +.flownews-posts-content-wrap .article-comments { + margin-left: 20px; + margin-right: 20px +} + +.flownews-posts-content-wrap .article-features-category { + margin-left: 20px +} + +.flownews-post-layout2,.flownews-post-layout3 { + position: relative; + margin-bottom: 50px; + max-height: 500px; + overflow: hidden +} + +.flownews-post-layout2 img,.flownews-post-layout3 img { + z-index: 1; + position: relative +} + +.flownews-post-layout2 .flownews-wrap-container,.flownews-post-layout3 .flownews-wrap-container { + top: 50%; + left: 50%; + bottom: inherit; + -webkit-transform: translate(-50%,-50%); + -moz-transform: translate(-50%,-50%); + -ms-transform: translate(-50%,-50%); + -o-transform: translate(-50%,-50%); + transform: translate(-50%,-50%); + text-align: center; + text-transform: uppercase; + position: absolute; + z-index: 999; + width: 100%; + background: 0 0 +} + +.flownews-posts-image-wrap.flownews-post-layout2 .header-pattern,.flownews-posts-image-wrap.flownews-post-layout3 .header-pattern { + background: rgba(0,0,0,.5); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; + z-index: 1 +} + +.tags-links { + letter-spacing: .5px +} + +.tags-links>a { + color: #282828; + font-weight: 700; + margin-left: 3px; + transition: color .3s ease 0s +} + +.tags-links>a:hover { + color: #e7685d; + transition: color .3s ease 0s +} + +.flownews-post .social-post { + line-height: .5; + overflow: hidden +} + +.flownews-post .social-post .container-social { + display: inline-block; + position: relative +} + +.flownews-post .social-post .container-social:after,.flownews-post .social-post .container-social:before { + content: ""; + position: absolute; + height: 5px; + border-bottom: 1px solid #F4F4F4; + top: 12px; + width: 600px +} + +.flownews-post .social-post .container-social:before { + right: 100%; + margin-right: 35px +} + +.flownews-post .social-post .container-social:after { + left: 100%; + margin-left: 35px +} + +.flownews-post .social-post a { + border: 1px solid #f4f4f4; + color: #e7685d; + display: inline-block; + height: 35px; + line-height: 32px; + margin: 0 15px; + width: 35px; + transition: all .3s ease 0s +} + +.flownews-post .social-post a i { + line-height: 32px +} + +.flownews-post .social-post a:hover { + border: 1px solid #e7685d; + background: #e7685d; + color: #fff; + transition: all .3s ease 0s +} + +.flownews-post .social-post a:first-child { + margin-left: 0 +} + +.flownews-post .social-post a:last-child { + margin-right: 0 +} + +.flownews-post .social-post { + margin: 50px 0; + text-align: center +} + +.navigation-post { + margin-bottom: 50px; + height: 60px +} + +.navigation-post .prev-post { + border: 1px solid #f4f4f4; + border-left: 0; + float: left; + height: 60px; + width: 50%; + position: relative +} + +.navigation-post .next-post { + border: 1px solid #f4f4f4; + border-right: 0; + float: left; + height: 60px; + width: 50%; + position: relative; + text-align: right +} + +.navigation-post .prev-post img { + height: calc(100% + 2px); + margin-top: -1px; + display: inline-block +} + +.navigation-post .next-post img { + height: calc(100% + 2px); + margin-top: -1px; + display: inline-block; + float: right +} + +.navigation-post .next,.navigation-post .prev { + display: inline-block; + height: 60px; + width: calc(100% - 60px) +} + +.navigation-post .prev { + padding: 8px 0 8px 25px; + position: absolute +} + +.navigation-post .next { + padding: 8px 25px 8px 0 +} + +.navigation-post .next-post-text,.navigation-post .prev-post-text { + color: #ccc; + display: block; + margin-bottom: 10px; + transition: all .3s ease 0s +} + +.navigation-post .next-post-text:hover,.navigation-post .prev-post-text:hover { + color: #333; + transition: all .3s ease 0s +} + +.navigation-post .prev-post-text i { + color: #333; + font-size: 16px; + margin-right: 10px +} + +.navigation-post .next-post-text i { + color: #333; + font-size: 16px; + margin-left: 10px +} + +.navigation-post .name-post { + color: #333; + font-weight: 700; + letter-spacing: 1px; + text-transform: uppercase; + transition: all .3s ease 0s; + white-space: nowrap; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + display: block +} + +.navigation-post .next-post .name-post { + padding-left: 20px +} + +.navigation-post .prev-post .name-post { + padding-right: 20px +} + +.navigation-post .name-post:hover { + color: #e7685d; + transition: all .3s ease 0s +} + +.related-item-container.flownews-element-posts.flownews-posts-layout2 .item-posts.first-element-posts { + border-top: 0; + padding-top: 0; + margin-top: 0; + margin-bottom: 25px +} + +.related-item-container.flownews-element-posts .owl-controls i { + margin-right: 0 +} + +@media screen and (max-width: 1000px) { + .navigation-post .name-post { + overflow:hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 80%; + display: block + } + + .navigation-post .next-post .name-post { + float: right + } + + .flownews-footer-wrap .flownews-footer-bottom .flownews-wrap-container .col-xs-4 { + padding: 10px; + text-align: center + } + + .flownews-footer-bottom .flownews-wrap-container .col-xs-4 .flownews-top-menu li:first-child a { + padding-left: 0 + } + + .flownews-header-wrap .flownews-top-menu { + display: none + } + + .flownews-header-wrap .flownews-date.col-sm-3 { + border-right: 0 none; + float: right; + width: 30% + } + + .flownews-header-wrap .flownews-header-top .flownews-ticker.col-sm-6 { + width: 70% + } + + .flownews-header-middle { + padding: 25px + } + + .flownews-header-wrap .flownews-header-middle .flownews-banner-top { + float: none; + width: 100%; + text-align: center + } + + .flownews-header-wrap .flownews-header-middle .flownews-wrap-container .flownews-logo { + height: auto; + line-height: 0; + margin-top: 25px; + text-align: center; + width: 100% + } +} + +@media screen and (max-width: 850px) { + .flownews-posts-content-wrap .item-header { + height:300px; + overflow: hidden + } + + .flownews-posts-content-wrap .article-title a { + font-size: 16px + } + + .flownews-posts-content-wrap .article-info-bottom { + font-size: 12px + } + + .flownews_widget.fnwp_mega_posts .container_post .img-post.ad_one_third,.flownews_widget.fnwp_tab .img-post.ad_one_third { + height: auto; + margin: 0 + } + + .flownews_widget.fnwp_mega_posts .box_post .container_post .img-post.ad_one_third { + width: 100%; + max-width: 100%; + float: none + } + + .flownews_widget.fnwp_mega_posts .box_post .container_post.ad_one_one .box-info.ad_two_third { + box-sizing: border-box; + padding-left: 0; + width: 100%; + max-width: 100% + } + + .flownews_widget.fnwp_mega_posts .box_post,.widget.flownews_widget.fnwp_tab .box_post { + margin-bottom: 25px + } + + .flownews_widget.fnwp_social.flownews_widget .box-icon-social.ad_one_third { + width: calc(50% - 6px) + } + + .widget_fnwp_social.flownews_widget.fnwp_social .box-icon-social.ad_one_third:nth-child(4) { + margin-bottom: 6px + } + + .fnwp-widget.flownews_widget.fnwp_tab h3.widget-title { + height: 98px + } + + .fnwp-widget.flownews_widget.fnwp_tab .fnwp-title-widget { + padding: 0 + } + + .fnwp_tab .widget-title .fnwp-title-widget span { + display: block; + margin-bottom: 2px + } + + .flownews-vc-element-posts-carousel .article-info-top .article-comments,.flownews-vc-element-posts-carousel .article-info-top .article-separator,.flownews_widget.fnwp_slider_posts .box-text .data { + display: none + } + + .flownews_widget.fnwp_tab .container_post .img-post.ad_one_third { + float: none; + height: 100%; + width: 100% + } + + .flownews_widget.fnwp_tab .box_post .container_post.ad_one_one .box-info.ad_two_third { + box-sizing: border-box; + padding-left: 0; + width: 100% + } + + .flownews_widget.fnwp_slider_posts .box-text .box-padding { + padding: 10px + } + + .flownews_widget.fnwp_slider_posts .box-text .category a { + margin-bottom: 10px + } + + .flownews_widget.fnwp_slider_posts .box-text .box-padding h3 a { + font-size: 14px + } + + .flownews-sidebar .widget.widget_search .search-form label,.flownews-sidebar .widget_search .search-form .search-submit,.wpb_wrapper .widget.widget_search .search-form label,.wpb_wrapper .widget_search .search-form .search-submit { + width: 100% + } + + .flownews-footer-bottom .flownews-wrap-container .col-xs-4 { + padding: 15px; + text-align: center!important + } + + .navigation-post .next-post,.navigation-post .prev-post { + width: 100% + } + + .navigation-post .next-post { + margin-top: 10px + } + + .navigation-post { + height: auto + } + + .flownews-vc-element-posts-carousel.flownews-element-posts.flownews-posts-layout2 .item-posts.first-element-posts { + border-top: 0; + margin-top: 0; + padding-top: 0; + margin-bottom: 25px + } + + .flownews-vc-element-posts-carousel .article-info-top .article-data { + margin-right: 0 + } + + #commentform.comment-form .form-submit { + width: 50% + } +} + +@media screen and (min-width: 500px) and (max-width:700px) { + .fnwp_tab .widget-title .fnwp-title-widget span { + display:inline-block; + margin-bottom: 0; + margin-right: 2px + } + + .fnwp-widget.flownews_widget.fnwp_tab h3.widget-title { + height: 31px + } + + .flownews_widget.fnwp_mega_posts .mega-posts .box_post,.widget.fnwp-widget.flownews_widget.fnwp_tab .box_post { + display: inline-block; + margin: 0 0 25px 25px; + padding: 0; + width: calc(50% - 25px) + } + + .widget.fnwp-widget.flownews_widget.fnwp_tab .fnwp-tab-container.fnwp-tag.box_tag .box_post { + display: inline-block; + margin: 0 0 0 25px; + padding: 0; + width: 100% + } + + .widget.fnwp-widget.flownews_widget.fnwp_tab .fnwp-tab-container.box_tag { + margin-left: 0 + } + + .fnwp_mega_posts .mega-posts,.fnwp_tab .fnwp-tab-container { + font-size: 0; + margin-left: -25px + } + + .fnwp-widget.flownews_widget.fnwp_mega_posts .box_post:last-child,.widget.fnwp-widget.flownews_widget.fnwp_tab .box_post:last-child { + border-bottom: 1px solid #f4f4f4 + } + + .widget.flownews_widget.fnwp_social .box_social .box-icon-social.ad_one_third { + height: 130px + } + + .widget.flownews_widget.fnwp_social .flownews-widget-social-style1 .box-icon-social a { + font-size: 30px; + margin-left: -15px; + margin-top: -15px + } + + .widget.flownews_widget.fnwp_social .box-icon-social a { + font-size: 30px + } + + .flownews-header-wrap .flownews-top-menu { + display: block + } +} + +@media screen and (min-width: 1024px) and (max-width:1200px) { + .flownews-header-middle { + padding:25px + } + + .flownews-footer-bottom .flownews-wrap-container { + padding: 0 50px + } +} + +@media screen and (max-width: 1024px) { + .no-js .flownews-top-news-ticker.owl-carousel { + margin-bottom:0 + } + + .flownews-top-news-ticker.owl-theme .owl-controls,.header-desktop { + display: none + } + + .header-mobile { + display: block + } + + .flownews-header-sticky { + display: none!important + } + + .flownews-header-wrap-container.header-mobile { + background: #282828 + } + + .flownews-menu>li.menu-item-has-children>a::after { + color: #333 + } + + ul.submenu li:first-child .submenu { + border-top: 1px solid #f4f4f4 + } + + .flownews-header-wrap-container .flownews-header-top .flownews-wrap-container { + height: auto + } + + .flownews-header-top .flownews-wrap-container .flownews-ticker.col-sm-6 { + display: block; + width: 98%; + border: 0 + } + + .flownews-wrap-container .flownews-date.col-sm-3,.flownews-wrap-container .flownews-top-menu.col-sm-3 { + border: 0; + height: auto; + padding: 10px; + width: 100%; + border-top: 1px solid #282828 + } + + .flownews-top-news-ticker .news-ticker-item .news-ticker-item-category { + width: 24% + } + + .flownews-top-news-ticker .news-ticker-item .news-ticker-item-title { + width: 76% + } + + .flownews-top-news-ticker .news-ticker-item-date,.flownews-top-news-ticker .owl-nav i { + display: none + } + + .flownews-header-top .flownews-top-news-ticker.owl-carousel .owl-stage-outer { + width: 100% + } + + .flownews-top-news-ticker .news-ticker-item-title a { + margin-left: 10px; + text-align: left + } + + .flownews-header-middle { + padding: 25px + } + + .flownews-header-wrap-container .flownews-header-middle .flownews-wrap-container .flownews-logo { + text-align: center + } +} + +@media screen and (max-width: 700px) { + .flownews-container>.col-xs-3,.flownews-container>.col-xs-9 { + position:relative!important + } + + .flownews-posts-content-wrap .item-header { + height: 200px; + overflow: hidden + } + + .flownews-posts-content-wrap,.navigation-post { + height: auto + } + + .flownews-posts-content-wrap .article-title a { + font-size: 13px + } + + .flownews-posts-content-wrap .article-info-bottom { + font-size: 10px + } + + .flownews-posts-content-wrap .article-info-bottom .article-comments,.flownews-posts-content-wrap .article-info-bottom div:nth-child(4) { + display: none + } + + .flownews-container.flownews-sidebar-right .col-xs-9 { + margin-right: 0 + } + + .flownews-container .col-xs-9 { + max-width: 100%; + width: 100% + } + + .flownews-wrap-container .article-info-top h2 { + font-size: 26px; + line-height: 30px; + margin-bottom: 0 + } + + .navigation-post .prev-post { + width: 100%; + margin-bottom: 10px + } + + .navigation-post .next-post { + width: 100% + } + + .flownews-container { + padding: 25px + } + + .author-post-container .author-info,.comments .comment-form-comment { + padding: 0 + } + + .navigation-post .next,.navigation-post .prev { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 75% + } + + .related-item-container .owl-item { + margin-bottom: 25px + } + + .comments .comment-form .form-submit { + margin-bottom: 50px; + width: 100% + } + + .flownews-sidebar.col-xs-3 { + width: 100% + } + + #commentform.comment-form .form-submit { + width: 100%; + margin-left: -1px + } + + #commentform .col-xs-4 { + width: 100% + } + + .flownews-sidebar-right .flownews-sidebar { + margin-top: 50px + } + + .flownews-sidebar-left .flownews-sidebar { + margin-bottom: 50px + } + + .flownews_widget.fnwp_mega_posts .container_post.ad_one_one .img-post.ad_one_third,.flownews_widget.fnwp_tab .container_post.ad_one_one .img-post.ad_one_third { + height: auto; + width: 100% + } + + .flownews_widget.fnwp_mega_posts .box_post .container_post.ad_one_one .box-info.ad_two_third { + width: 100%; + padding-left: 0 + } + + .flownews_widget.fnwp_mega_posts .container_post.ad_one_one .box-info.ad_two_third { + box-sizing: border-box; + margin-top: 15px; + width: 100% + } + + .flownews_widget.fnwp_mega_posts .box_post .container_post.ad_one_one { + padding: 0 0 15px + } + + .flownews_widget.fnwp_mega_posts .mega-posts .box_post { + padding: 0 + } + + .flownews_widget.fnwp_social.fnwp-widget.flownews_widget .box_social.flownews-widget-social-style1 { + margin-left: -3px; + padding: 0 + } + + .flownews_widget.fnwp_social .box_social .box-icon-social.ad_one_third { + width: calc(33.3333% - 6px)!important; + height: 90px + } + + .flownews_widget.fnwp_social .box_social .box-icon-social.ad_one_third:nth-child(5),.flownews_widget.fnwp_social .box_social .box-icon-social.ad_one_third:nth-child(6) { + margin-bottom: 6px + } + + .container_advertisement { + text-align: center + } + + .flownews_widget.fnwp_tab .box_post .container_post.ad_one_one .box-info.ad_two_third { + width: 100%; + padding-left: 0 + } + + .flownews_widget.fnwp_tab .container_post.ad_one_one .box-info.ad_two_third { + box-sizing: border-box; + margin-top: 15px; + width: 100% + } + + .flownews_widget.fnwp_tab .box_post .container_post.ad_one_one { + padding: 0 0 15px + } + + .widget.fnwp-widget.flownews_widget.fnwp_tab .box_post { + padding: 0 + } + + .flownews-footer-top .flownews-wrap-container .footer-widget.col-xs-4 { + border-bottom: 1px solid #454545; + margin-bottom: 50px; + margin-left: 0; + margin-right: 0; + max-width: 100%; + padding-bottom: 25px; + width: 100% + } + + .flownews-header-wrap-container .flownews-footer-bottom .flownews-wrap-container .col-xs-4 { + border-bottom: 1px solid #282828; + border-left: 0 none; + border-right: 0 none; + line-height: 22px; + padding: 6px 25px; + text-align: center; + width: 100% + } + + .flownews-footer-wrap .flownews-footer-top .flownews-wrap-container.element-no-padding { + padding: 25px + } + + .flownews-container .flownews-element-posts.flownews-posts-layout2 .item-posts.first-element-posts.col-xs-6 { + width: calc(100% - 25px) + } + + .flownews-container .flownews-element-posts.flownews-posts-layout2.flownews-blog-2-col .item-posts.first-element-posts:nth-child(2) { + border-top: 1px solid #f4f4f4; + margin-top: 25px; + padding-top: 25px + } +} + +#commentform input { + width: 100% +} + +.comment-form { + margin-left: -2.5px; + width: calc(100% + 5px) +} + +#commentform .col-xs-4 { + padding: 0 2.5px 5px!important +} + +.comment-form-comment { + padding: 0 2.5px +} + +.comment-form-author.col-xs-4 input,.comment-form-email.col-xs-4 input,.comment-form-url.col-xs-4 input { + background: #f4f4f4; + border: none; + height: 40px; + padding: 12px +} + +.comment-form-comment textarea { + width: 100%; + background: #f4f4f4; + border: none; + height: 175px; + padding: 12px +} + +.comment-form .form-submit { + margin-top: 25px; + width: 25%; + margin-left: 2.5px +} + +.comment-form .submit { + background: #e7685d; + border: none; + color: #fff; + font-weight: 700; + height: 40px; + text-transform: uppercase +} + +.comment-form .submit:hover { + background: #c9564c +} + +.comment-form-title,.comment-reply-title { + border-bottom: 1px solid #f4f4f4; + border-right: 1px solid #e7685d; + border-top: 1px solid #f4f4f4; + height: 35px; + margin: 0 0 25px; + position: relative; + text-align: left +} + +.comment-form-title { + margin-top: 50px +} + +.comment-form-title h3,.comment-reply-title .title-leave-a-comment { + background: #e7685d; + color: #fff; + display: inline-block; + font-size: 14px; + font-weight: 600; + height: calc(100% + 2px); + height: -webkit-calc(100% + 2px); + left: 0; + letter-spacing: 1.5px; + padding: 10px; + position: absolute; + text-transform: uppercase; + top: -1px; + transition: color .3s ease 0s; + margin: 0 +} + +.comments-list { + padding: 25px; + margin-top: 25px; + border: 1px solid #f4f4f4 +} + +.comments-list:first-child { + border: 0; + padding: 25px 0 +} + +.comments-list ul.children { + padding-left: 90px!important; + margin: inherit!important +} + +.comments-list ul.children ul.children { + border: 0 +} + +.children .comments-list:before { + content: ""; + position: absolute; + border-top: 1px solid #e7685d; + top: 55px; + width: 70px; + left: 0; + margin-right: 20px +} + +.comments-list ul.children { + position: relative +} + +.comment-image-author { + width: 70px; + float: left +} + +.main-comment img { + border-radius: 10px +} + +.comment-info { + width: calc(100% - 90px); + float: left; + margin-left: 20px +} + +.comment-name { + display: block; + float: left; + font-size: 16px; + font-weight: 700; + letter-spacing: .5px; + margin-bottom: 2px; + text-align: left; + text-transform: uppercase +} + +.comment-description p { + font-size: 14px; + margin-top: 10px +} + +.comment-description p:nth-last-of-type(1) { + display: inline +} + +.comment-date { + color: #e7685d; + letter-spacing: .5px; + float: right; + text-align: right; + font-style: italic; + font-size: 12px +} + +.comment-description { + display: block; + font-size: 12px; + letter-spacing: 2px; + text-align: justify; + line-height: 1.5; + margin-bottom: 2px; + font-weight: 100 +} + +.comment-description i { + color: #e7685d; + font-size: 14px; + margin-left: 5px; + transition: color .3s ease 0s +} + +.comment-description i:hover { + color: #c9564c; + transition: color .3s ease 0s +} + +.reply-comment { + padding-top: 50px +} + +.reply-line { + width: 10%; + float: left; + padding-right: 25px +} + +.reply-line:after { + width: 100%; + content: ""; + margin: 31px 25px 0 0; + float: left +} + +.reply-comment .comment-info { + width: 80% +} + +.comment-edit-link { + color: #e7685d; + transition: color .3s ease 0s +} + +.comment-edit-link:hover { + color: #c9564c; + transition: color .3s ease 0s +} + +#commentform .logged-in-as { + margin-bottom: 15px; + margin-left: 2.5px +} + +#commentform .logged-in-as a { + color: #333; + letter-spacing: .5px; + font-weight: 400; + transition: color .3s ease 0s +} + +#commentform .logged-in-as a:hover { + color: #e7685d; + transition: color .3s ease 0s +} + +.comments-template .comment-respond { + margin-top: 50px +} + +.news-ticker-item .news-ticker-item-category,.news-ticker-item .news-ticker-item-date,.news-ticker-item .news-ticker-item-title { + float: left; + text-align: left +} + +.news-ticker-item .news-ticker-item-title { + width: 70% +} + +.news-ticker-item .news-ticker-item-category a { + background: #e7685d; + color: #fff; + font-size: 10px; + font-weight: 700; + letter-spacing: 1px; + padding: 6px 10px; + text-transform: uppercase; + display: block; + line-height: 1; + margin: 5px 5px 0 0 +} + +.news-ticker-item .news-ticker-item-title a { + color: #fff; + font-size: 12px; + font-weight: 700; + letter-spacing: 1.5px; + text-transform: uppercase; + transition: color .3s ease 0s; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 95%; + text-align: left; + line-height: 32px; + display: block +} + +.news-ticker-item .news-ticker-item-title a:hover { + color: #e7685d; + transition: color .3s ease 0s +} + +.news-ticker-item .news-ticker-item-date { + color: #fff; + font-size: 10px; + font-weight: 700; + letter-spacing: 1.5px; + margin-left: 20px; + text-transform: uppercase +} + +.flownews-top-news-ticker.owl-carousel .owl-stage-outer { + float: left; + width: 92% +} + +.col-sm-4 .flownews-top-news-ticker.owl-carousel .owl-stage-outer { + width: 90% +} + +.flownews-top-news-ticker.owl-theme .owl-controls .owl-nav [class*=owl-] { + color: #fff; + background: 0 0; + padding: 0 5px; + line-height: 1; + transition: color .3s ease 0s +} + +.flownews-header-top .flownews-wrap-container { + height: 32px +} + +.flownews-top-news-ticker.owl-theme .owl-controls { + margin-top: 0; + text-align: right +} + +.flownews-header-top .col-sm-1,.flownews-header-top .col-sm-10,.flownews-header-top .col-sm-11,.flownews-header-top .col-sm-12,.flownews-header-top .col-sm-2,.flownews-header-top .col-sm-3,.flownews-header-top .col-sm-4,.flownews-header-top .col-sm-5,.flownews-header-top .col-sm-6,.flownews-header-top .col-sm-7,.flownews-header-top .col-sm-8,.flownews-header-top .col-sm-9 { + line-height: 32px; + border-right: 1px solid #333; + text-align: center +} + +.flownews-header-top .flownews-ticker.col-sm-6 { + border-left: 1px solid #333 +} + +.flownews-date { + color: #fff; + font-size: 12px; + letter-spacing: 1.2px; + line-height: 19px +} + +.flownews-social .flownews-header-top-social a { + color: #fff; + font-size: 12px; + line-height: 32px; + padding: 0 10px; + transition: color .3s ease 0s +} + +.flownews-social .flownews-header-top-social a:hover { + color: #e7685d; + transition: color .3s ease 0s +} + +.follow-container a,.follow-container a:hover { + transition: all .3s ease 0s +} + +.flownews-social .flownews-header-top-social a:first-child { + padding-left: 0 +} + +.flownews-social .flownews-header-top-social a:last-child { + padding-right: 0 +} + +.fnwp-widget .ad_one_one { + width: 100% +} + +.fnwp-widget .ad_one_half { + width: 50% +} + +.fnwp-widget .ad_one_third { + width: 33.33% +} + +.fnwp-widget .ad_two_third { + width: 66.66% +} + +.fnwp-widget .ad_one_fourth { + width: 25% +} + +.fnwp-widget .ad_three_fourth { + width: 75% +} + +.fnwp-widget .ad_one_fifth { + width: 20% +} + +.fnwp-widget .ad_two_fifth { + width: 40% +} + +.fnwp-widget .ad_three_fifth { + width: 60% +} + +.fnwp-widget .ad_four_fifth { + width: 80% +} + +.fnwp-widget .ad_one_sixth { + width: 16.66% +} + +.fnwp-widget .ad_five_sixth { + width: 83.33% +} + +.fnwp-widget .ad_five_sixth,.fnwp-widget .ad_four_fifth,.fnwp-widget .ad_one_fifth,.fnwp-widget .ad_one_fourth,.fnwp-widget .ad_one_half,.fnwp-widget .ad_one_sixth,.fnwp-widget .ad_one_third,.fnwp-widget .ad_three_fifth,.fnwp-widget .ad_three_fourth,.fnwp-widget .ad_two_fifth,.fnwp-widget .ad_two_third { + position: relative; + float: left +} + +.fnwp-widget .ad_last { + margin-right: 0!important; + clear: right +} + +.adclear { + clear: both +} + +.admp_one_half { + width: 48% +} + +.admp_one_third { + width: 30.66% +} + +.admp_two_third { + width: 65.33% +} + +.admp_one_fourth { + width: 22% +} + +.admp_three_fourth { + width: 74% +} + +.admp_one_fifth { + width: 16.8% +} + +.admp_two_fifth { + width: 37.6% +} + +.admp_three_fifth { + width: 58.4% +} + +.admp_four_fifth { + width: 67.2% +} + +.admp_one_sixth { + width: 13.33% +} + +.admp_five_sixth { + width: 82.67% +} + +.admp_five_sixth,.admp_four_fifth,.admp_one_fifth,.admp_one_fourth,.admp_one_half,.admp_one_sixth,.admp_one_third,.admp_three_fifth,.admp_three_fourth,.admp_two_fifth,.admp_two_third { + position: relative; + margin-right: 3.7%; + float: left +} + +.admp_last { + margin-right: 0!important; + clear: right +} + +.flownews-blog-2-col [class*=flownews-placeholder-] article:nth-child(2n+1),.flownews-blog-3-col [class*=flownews-placeholder-] article:nth-child(3n+1),.flownews-blog-4-col [class*=flownews-placeholder-] article:nth-child(4n+1),.flownews-load-more-type2.flownews-vc-posts-2-col .flownews-vc-element-posts-article-container .flownews-load-more-container article:nth-child(2n+1),.flownews-load-more-type2.flownews-vc-posts-3-col .flownews-vc-element-posts-article-container .flownews-load-more-container article:nth-child(3n+1),.flownews-load-more-type3.flownews-vc-posts-2-col .flownews-vc-element-posts-article-container .flownews-load-more-container article:nth-child(2n+1),.flownews-load-more-type3.flownews-vc-posts-3-col .flownews-vc-element-posts-article-container .flownews-load-more-container article:nth-child(3n+1),.flownews-load-more-type4.flownews-vc-posts-2-col .flownews-vc-element-posts-article-container .flownews-load-more-container article:nth-child(2n+1),.flownews-load-more-type4.flownews-vc-posts-3-col .flownews-vc-element-posts-article-container .flownews-load-more-container article:nth-child(3n+1),.flownews-load-more-type5.flownews-vc-posts-2-col .flownews-vc-element-posts-article-container .flownews-load-more-container article:nth-child(2n+1),.flownews-load-more-type5.flownews-vc-posts-3-col .flownews-vc-element-posts-article-container .flownews-load-more-container article:nth-child(3n+1),.flownews-load-more-type6.flownews-vc-posts-2-col .flownews-vc-element-posts-article-container .flownews-load-more-container article:nth-child(2n+1),.flownews-load-more-type6.flownews-vc-posts-3-col .flownews-vc-element-posts-article-container .flownews-load-more-container article:nth-child(3n+1),.fnwp-clear { + clear: both +} + +@media screen and (max-width: 767px) { + .fnwp-widget .ad_five_sixth,.fnwp-widget .ad_four_fifth,.fnwp-widget .ad_one_fifth,.fnwp-widget .ad_one_fourth,.fnwp-widget .ad_one_half,.fnwp-widget .ad_one_sixth,.fnwp-widget .ad_one_third,.fnwp-widget .ad_three_fifth,.fnwp-widget .ad_three_fourth,.fnwp-widget .ad_two_fifth,.fnwp-widget .ad_two_third { + max-width:100%!important; + float: none!important; + width: 100%!important + } +} + +.flownews_widget.fnwp_advertisement .container_advertisement img,.widget select { + max-width: 100% +} + +@media (min-device-width: 768px) and (max-device-width:800px) and (orientation:portrait) { + .fnwp-widget .ad_five_sixth,.fnwp-widget .ad_four_fifth,.fnwp-widget .ad_one_fifth,.fnwp-widget .ad_one_fourth,.fnwp-widget .ad_one_half,.fnwp-widget .ad_one_sixth,.fnwp-widget .ad_one_third,.fnwp-widget .ad_three_fifth,.fnwp-widget .ad_three_fourth,.fnwp-widget .ad_two_fifth,.fnwp-widget .ad_two_third { + margin-right:1% + } +} + +.about-me .ab-image { + position: relative +} + +.about-me .ab-title { + padding: 8px 24px; + position: absolute; + top: 25px; + left: 50%; + transform: translate(-50%,0); + text-transform: uppercase; + border-radius: 5px; + box-shadow: 2px 2px 2px 0 rgba(0,0,0,.4); + font-size: 12px; + line-height: 1 +} + +.about-me .ad-text { + padding: 25px 0 0; + border-radius: 0 0 10px 10px; + text-align: center +} + +.about-me .ad-text p { + font-size: 14px; + padding-bottom: 10px +} + +.about-me .ad-text .signing { + font-size: 36px +} + +.latest-posts .posts-container { + text-transform: uppercase; + padding: 25px; + margin-top: 4px; + border-radius: 0 0 10px 10px +} + +.latest-posts .posts-container .item { + margin-top: 25px +} + +.latest-posts .posts-container .item:first-child { + margin-top: 0 +} + +.latest-posts .post-image { + margin-right: 25px; + float: left; + width: 30% +} + +.latest-posts .info-post { + float: left; + width: calc(70% - 25px) +} + +.info-post h5 { + margin: 0 0 10px +} + +.latest-posts .info-post h5 a { + font-size: 14px; + letter-spacing: 1.5px; + line-height: 1.5 +} + +.latest-posts .info-post .date { + font-size: 12px; + letter-spacing: 1.5px +} + +.follow-container { + text-transform: uppercase; + padding: 25px; + margin-top: 4px; + border-radius: 0 0 10px 10px; + text-align: center +} + +.follow-container a { + border-radius: 50%; + display: inline-block; + font-size: 12px; + height: 42px; + line-height: 44px; + margin: 5px; + width: 42px +} + +.tagcloud a,.tags-container a { + color: #333; + margin-right: 10px; + font-size: 12px; + font-weight: 700; + letter-spacing: 1px; + text-transform: uppercase; + transition: all .4s ease 0s +} + +.tagcloud a:hover,.tags-container a:hover { + color: #e7685d; + transition: all .4s ease 0s +} + +.advertising-container { + text-transform: uppercase; + padding: 25px; + border-radius: 10px; + text-align: center +} + +.advertising-container.advertising-title,.newsletter-container { + margin-top: 4px; + border-radius: 0 0 10px 10px +} + +.newsletter-container { + padding: 25px; + text-align: center +} + +.newsletter h4 { + font-size: 14px; + letter-spacing: 2px +} + +.newsletter form input,.newsletter p { + font-size: 12px; + letter-spacing: 1.5px +} + +.newsletter form { + margin-top: 25px +} + +.newsletter form input { + display: block; + width: 100%; + border: 0; + border-radius: 5px; + font-style: italic; + padding: 12px; + margin-bottom: 10px; + text-align: center +} + +.newsletter form button { + border-radius: 5px; + display: block; + width: 100%; + border: 0; + text-transform: uppercase; + padding: 12px; + letter-spacing: 1.5px; + font-weight: 600 +} + +@media screen and (min-width: 1100px) { + .flownews-sidebar .widget-gallery .instagram-image,.wpb_wrapper .widget-gallery .instagram-image { + height:auto + } + + .flownews-sidebar .instagram-image a img,.wpb_wrapper .instagram-image a img { + width: 50%; + height: 150px + } + + .flownews-sidebar .instagram-image-loaded-1 a img,.wpb_wrapper .instagram-image-loaded-1 a img { + width: 100% + } +} + +.widget_flownews_instagram_inline img { + float: left; + margin: 0; + padding: 0 +} + +.widget_flownews_instagram_inline .instagram_inline_image_loaded_1 a img { + width: 100% +} + +.widget_flownews_instagram_inline .instagram_inline_image_loaded_2 a img { + width: 50% +} + +.widget_flownews_instagram_inline .instagram_inline_image_loaded_3 a img { + width: 33.33333333333333 +} + +.widget_flownews_instagram_inline .instagram_inline_image_loaded_4 a img { + width: 25% +} + +.widget_flownews_instagram_inline .instagram_inline_image_loaded_5 a img { + width: 20% +} + +.widget_flownews_instagram_inline .instagram_inline_image_loaded_6 a img { + width: 16.66666666666667% +} + +.widget_flownews_instagram_inline .instagram_inline_image_loaded_7 a img { + width: 14.28571428571429% +} + +.widget_flownews_instagram_inline .instagram_inline_image_loaded_8 a img { + width: 12.5% +} + +.widget ul { + margin: 0; + padding: 0 +} + +.widget li { + list-style: none; + padding: 10px 25px; + display: block; + margin-bottom: 1px +} + +.flownews-sidebar .widget.widget_archive li,.flownews-sidebar .widget.widget_categories li,.flownews-sidebar .widget.widget_meta li,.flownews-sidebar .widget.widget_nav_menu li,.flownews-sidebar .widget.widget_pages li,.flownews-sidebar .widget.widget_recent_comments li,.flownews-sidebar .widget.widget_recent_entries li,.flownews-sidebar .widget.widget_rss li,.wpb_wrapper .widget.widget_meta li,.wpb_wrapper .widget.widget_nav_menu li,.wpb_wrapper .widget.widget_pages li,.wpb_wrapper .widget.widget_recent_comments li,.wpb_wrapper .widget.widget_recent_entries li,.wpb_wrapper .widget.widget_rss li { + border-bottom: 1px solid #f4f4f4; + box-sizing: border-box; + color: #333; + display: inline-block; + font-size: 14px; + letter-spacing: 1px; + padding: 15px 0; + transition: background .3s ease 0s; + width: 100% +} + +.flownews-sidebar .widget.widget_archive li:first-child,.flownews-sidebar .widget.widget_categories li:first-child,.flownews-sidebar .widget.widget_meta li:first-child,.flownews-sidebar .widget.widget_nav_menu li:first-child,.flownews-sidebar .widget.widget_pages li:first-child,.flownews-sidebar .widget.widget_recent_comments li:first-child,.flownews-sidebar .widget.widget_recent_entries li:first-child,.flownews-sidebar .widget.widget_rss li:first-child,.wpb_wrapper .widget.widget_meta li:first-child,.wpb_wrapper .widget.widget_nav_menu li:first-child,.wpb_wrapper .widget.widget_pages li:first-child,.wpb_wrapper .widget.widget_recent_comments li:first-child,.wpb_wrapper .widget.widget_recent_entries li:first-child,.wpb_wrapper .widget.widget_rss li:first-child { + padding-top: 0 +} + +.flownews-sidebar .widget.widget_archive li:last-child,.flownews-sidebar .widget.widget_categories li:last-child,.flownews-sidebar .widget.widget_meta li:last-child,.flownews-sidebar .widget.widget_nav_menu li:last-child,.flownews-sidebar .widget.widget_pages li:last-child,.flownews-sidebar .widget.widget_recent_comments li:last-child,.flownews-sidebar .widget.widget_recent_entries li:last-child,.flownews-sidebar .widget.widget_rss li:last-child,.wpb_wrapper .widget.widget_meta li:last-child,.wpb_wrapper .widget.widget_nav_menu li:last-child,.wpb_wrapper .widget.widget_pages li:last-child,.wpb_wrapper .widget.widget_recent_comments li:last-child,.wpb_wrapper .widget.widget_recent_entries li:last-child,.wpb_wrapper .widget.widget_rss li:last-child { + border-bottom: 0; + padding-bottom: 0 +} + +.flownews-sidebar .widget.widget_archive li a:hover,.flownews-sidebar .widget.widget_categories li a:hover,.flownews-sidebar .widget.widget_meta li a:hover,.flownews-sidebar .widget.widget_nav_menu li a:hover,.flownews-sidebar .widget.widget_pages li a:hover,.flownews-sidebar .widget.widget_recent_comments li a:hover,.flownews-sidebar .widget.widget_recent_entries li a:hover,.flownews-sidebar .widget.widget_rss li a:hover,.wpb_wrapper .widget.widget_meta li a:hover,.wpb_wrapper .widget.widget_nav_menu li a:hover,.wpb_wrapper .widget.widget_pages li a:hover,.wpb_wrapper .widget.widget_recent_comments li a:hover,.wpb_wrapper .widget.widget_recent_entries li a:hover,.wpb_wrapper .widget.widget_rss li a:hover { + color: #e7685d; + transition: background .3s ease 0s +} + +.flownews-sidebar .widget.widget_archive li a,.flownews-sidebar .widget.widget_categories li a,.flownews-sidebar .widget.widget_meta li a,.flownews-sidebar .widget.widget_nav_menu li a,.flownews-sidebar .widget.widget_pages li a,.flownews-sidebar .widget.widget_recent_comments li a,.flownews-sidebar .widget.widget_recent_entries li a,.flownews-sidebar .widget.widget_rss li a,.wpb_wrapper .widget.widget_meta li a,.wpb_wrapper .widget.widget_nav_menu li a,.wpb_wrapper .widget.widget_pages li a,.wpb_wrapper .widget.widget_recent_comments li a,.wpb_wrapper .widget.widget_recent_entries li a,.wpb_wrapper .widget.widget_rss li a { + transition: background .3s ease 0s +} + +.flownews-sidebar .widget.widget_rss li a,.wpb_wrapper .widget.widget_rss li a { + color: #000 +} + +.flownews-sidebar .widget.widget_nav_menu li .sub-menu,.flownews-sidebar .widget.widget_pages li .children,.wpb_wrapper .widget.widget_nav_menu li .sub-menu,.wpb_wrapper .widget.widget_pages li .children { + margin-top: 20px; + margin-left: 15px +} + +.flownews-sidebar .widget.widget_pages li .children ul.children,.wpb_wrapper .widget.widget_pages li .children ul.children { + margin-left: 30px +} + +.flownews-sidebar .widget.widget_recent_entries li .post-date,.wpb_wrapper .widget.widget_recent_entries li .post-date { + font-size: 11px; + margin-left: 5px; + color: #b7b7b7 +} + +.widget li a,.widget_rss .rsswidget:hover { + color: #000 +} + +.widget li a:hover,.widget_rss .rsswidget { + color: #9c8156 +} + +.widget_rss .widget-title .rsswidget { + color: #fff +} + +.widget.widget_recent_comments .comment-author-link { + color: #b7b7b7; + font-size: 11px +} + +.widget label { + background: #FFF; + display: block +} + +.flownews-sidebar .widget.widget_search label,.wpb_wrapper .widget.widget_search label { + width: 70% +} + +.widget select { + background: #fff; + border: 1px solid #f4f4f4; + letter-spacing: 1px; + padding: 10px; + width: 100% +} + +.post-password-form input,.widget_search input { + padding: 5px 7px; + text-align: left; + font-weight: 300 +} + +.widget_search input { + border-width: 1px; + border-style: solid; + border-color: #f4f4f4; + background: #f4f4f4; + width: 100%; + margin-bottom: 0; + height: 35px +} + +.post-password-form input { + border: 1px solid #f4f4f4; + width: auto +} + +#wp-calendar,#wp-calendar caption,#wp-calendar th { + text-align: center +} + +.flownews-sidebar .search-form .search-submit,.wpb_wrapper .search-form .search-submit { + background: #e7685d; + color: #fff; + text-align: center; + width: 30%; + font-weight: 700; + transition: all .3s ease 0s; + font-size: 12px +} + +.flownews-sidebar .search-form .search-submit:hover,.wpb_wrapper .search-form .search-submit:hover { + background: #c9564c; + transition: all .3s ease 0s +} + +.not-found input[type=submit]:hover,.post-password-form input[type=submit]:hover,.widget_search input.search-submit:hover { + background: #9c8156; + color: #FFF +} + +.flownews-sidebar .search-form .screen-reader-text,.wpb_wrapper .search-form .screen-reader-text { + display: none +} + +.widget_search .search-form { + font-size: 0 +} + +.widget_search .search-form input { + font-size: 14px +} + +.widget_search label { + display: inline-block; + float: left +} + +#wp-calendar caption { + font-size: 14px; + font-weight: 400; + letter-spacing: 1.5px; + margin: 0 0 25px; + padding: 10px 0 0; + text-transform: uppercase +} + +#wp-calendar td { + padding: 10px 0 +} + +#wp-calendar { + width: 100% +} + +#wp-calendar .calendar_wrap tr { + margin-bottom: 5px; + padding-bottom: 5px +} + +.flownews-sidebar .widget.widget_nav_menu li:first-child,.flownews-sidebar .widget.widget_nav_menu li:last-child { + padding: 0 +} + +#wp-calendar #prev a,#wp-calendar tr #today { + color: #e7685d +} + +#wp-calendar #prev a:hover { + color: #000 +} + +.widget ul .sub-menu,label.screen-reader-text { + display: none +} + +.widget ul>li.menu-item-has-children>a:after { + font-style: normal; + font-weight: 400; + text-transform: none; + line-height: 1; + font-size: 11px; + color: #333; + content: "\f107"; + margin-left: 5px +} + +.widget ul>li:hover>.sub-menu { + display: block +} + +.textwidget select { + margin: 20px 0 +} + +.flownews-sidebar .widget,.wpb_wrapper .widget { + margin-bottom: 50px +} + +.widget_nav_menu li>ul { + display: block; + border: 0; + margin-top: 0; + margin-bottom: 0; + margin-left: 10px +} + +.widget_nav_menu ul.submenu li:first-child .submenu { + border: 0; + margin-left: 5px +} + +.widget_nav_menu li ul li { + border-bottom: 1px +} + +.widget_nav_menu li>ul li>ul,.widget_nav_menu li>ul>ul li,.widget_nav_menu li>ul>ul>ul li { + display: block; + border: 0; + margin-left: 5px +} + +.widget_nav_menu ul.submenu .submenu { + margin-left: 5px; + margin-top: 10px +} + +.flownews-sidebar .widget.widget_nav_menu li a { + padding: 10px 0; + display: block; + border-top: 0; + margin: 5px 0 +} + +.flownews-sidebar .widget.widget_nav_menu .menu li { + border-bottom: 0; + border-top: 1px solid +} + +.flownews-sidebar .widget.widget_nav_menu .menu>li { + border: 0; + border-bottom: 1px solid; + border-top: 0 +} + +.flownews-sidebar .widget.widget_nav_menu li,.widget_nav_menu li { + padding: 0 +} + +.flownews_widget { + line-height: 1 +} + +.flownews_widget a { + text-decoration: none; + border-bottom: 0; + box-shadow: 0 0 0 +} + +.fnwp-widget h4 { + margin-top: 0 +} + +.fnwp-widget h3.widget-title,.fnwp-widget h4.widget-title,.widget h3 { + border-bottom: 1px solid #f4f4f4; + border-right: 1px solid #e7685d; + border-top: 1px solid #f4f4f4; + height: 35px; + margin: 0 0 25px; + position: relative; + text-align: left +} + +.fnwp-title-widget { + background: #e7685d; + color: #fff; + display: inline-block; + font-size: 14px; + font-weight: 600; + height: calc(100% + 2px); + height: -webkit-calc(100% + 2px); + left: 0; + letter-spacing: 1.5px; + padding: 10px; + position: absolute; + text-transform: uppercase; + top: -1px; + transition: color .3s ease 0s +} + +.fnwp-widget li { + background: inherit; + font-size: inherit; + font-weight: inherit; + margin-bottom: inherit; + padding: 0; + text-transform: inherit +} + +@media only screen and (max-width : 500px) { + .flownews-sidebar .widget img { + width:100% + } +} + +.flownews_widget.fnwp_advertisement h2 { + font-size: 26px +} + +.flownews_widget.fnwp_advertisement .container_advertisement { + text-align: center +} + +@media only screen and (min-width : 801px) and (max-width :1200px) { + .flownews_widget.fnwp_advertisement .active { + width:100%; + border: 1px solid #2b2b2b + } + + .flownews_widget.fnwp_advertisement .title-info-post.ad_one_half { + padding: 25px + } + + .flownews_widget.fnwp_advertisement .mini-post.small-post.ad_one_third { + border: 1px solid #2b2b2b; + margin: 25px 0 0; + padding: 15px 0 15px 15px; + width: 100% + } + + .flownews_widget.fnwp_advertisement .mini-post.small-post.ad_one_third.fourth { + border-bottom: 1px solid #2b2b2b!important + } +} + +@media only screen and (max-width : 800px) { + .flownews_widget.flownews_widget .fnwp_advertisement .flownews_widget-item.ad_one_third.ad_margin,.flownews_widget.fnwp_advertisement .flownews_widget-item.ad_one_one.ad_last.big-post { + float:none + } + + .flownews_widget.fnwp_advertisement .title-info-post.ad_one_half { + box-sizing: border-box; + display: inline-block; + padding: 25px 0 50px + } + + .flownews_widget.fnwp_advertisement .mini-post.small-post.ad_one_third .img-post { + display: inline-block; + width: 16%!important + } + + .flownews_widget.fnwp_advertisement .mini-post.small-post .ad_three_fourth { + display: inline-block; + position: absolute; + width: 84%!important + } + + .flownews_widget.fnwp_advertisement .mini-post.small-post.ad_one_third { + border: 1px solid #2b2b2b; + border-bottom: 0 + } + + .flownews_widget.fnwp_advertisement .mini-post.small-post.ad_one_third.fourth { + border-bottom: 1px solid #2b2b2b!important + } +} + +.flownews_widget.fnwp_archivies .box_archivies .box_archivies_item { + width: 100%; + transition: all .3s ease 0s; + padding: 15px 0; + box-sizing: border-box; + border-bottom: 1px solid #f9f9f9; + text-align: right; + display: inline-block; + color: #333; + font-size: 12px; + font-weight: 800 +} + +.flownews_widget.fnwp_archivies .box_archivies li:first-child .box_archivies_item { + padding-top: 0 +} + +.flownews_widget.fnwp_archivies .box_archivies a:last-child { + border-bottom: none +} + +.flownews_widget.fnwp_archivies a { + color: #333; + display: inline-block; + font-size: 12px; + font-weight: 800; + letter-spacing: 2px; + text-transform: uppercase; + transition: color .3s ease 0s; + float: left +} + +.flownews_widget.fnwp_archivies .box_archivies_item:hover a { + color: #e7685d +} + +.flownews_widget.fnwp_archivies .number-post { + color: #333; + font-size: 12px; + font-weight: 800; + letter-spacing: 2px; + text-transform: uppercase; + float: right; + transition: color .3s ease 0s +} + +.flownews_widget.fnwp_archivies .box_archivies .box_archivies_item:hover { + color: #e7685d; + transition: color .3s ease 0s +} + +.box_archivies li { + list-style: none +} + +.flownews_widget.fnwp_categories .box_categories .cat-item { + width: 100%; + transition: all .3s ease 0s; + padding: 15px 0; + box-sizing: border-box; + border-bottom: 1px solid #f9f9f9; + text-align: right; + display: inline-block; + color: #333; + font-size: 12px; + font-weight: 800 +} + +.flownews_widget.fnwp_categories .box_categories .cat-item .children { + margin-left: 15px; + border-bottom: 0; + margin-top: 20px +} + +.flownews_widget.fnwp_categories .box_categories .cat-item .children ul.children li { + margin-left: 15px; + border-bottom: 0; + padding-bottom: 0 +} + +.flownews_widget.fnwp_categories .box_categories .cat-item .children li:last-child { + border-bottom: 0; + padding-bottom: 0 +} + +.flownews_widget.fnwp_categories .box_categories li:first-child { + padding-top: 0 +} + +.flownews_widget.fnwp_archivies .box_categories a:last-child { + border-bottom: none +} + +.flownews_widget.fnwp_categories a { + color: #333; + display: inline-block; + font-size: 12px; + font-weight: 800; + letter-spacing: 2px; + text-transform: uppercase; + transition: color .3s ease 0s; + float: left +} + +.flownews_widget.fnwp_categories .box_categories>li.cat-item:hover,.flownews_widget.fnwp_categories .box_categories>li.cat-item:hover>a { + color: #e7685d; + transition: color .3s ease 0s +} + +.flownews_widget.fnwp_categories .number-post { + color: #333; + font-size: 12px; + font-weight: 800; + letter-spacing: 2px; + text-transform: uppercase; + float: right; + transition: color .3s ease 0s +} + +.box_categories li { + list-style: none +} + +.box_categories li .children .cat-item a:hover,.box_categories li .children .cat-item:hover { + color: #e7685d; + transition: color .3s ease 0s +} + +.fnwp_flickr a img { + margin: 6px +} + +.flownews_widget.fnwp_flickr .box_flickr { + background: #fff; + display: inline-block; + box-sizing: border-box; + text-align: center +} + +.flownews_widget.fnwp_mega_posts .box_post { + border-bottom: 1px solid #f4f4f4; + padding: 10px 0 +} + +.flownews_widget.fnwp_mega_posts .box_post:first-child { + padding-top: 0 +} + +.flownews_widget.fnwp_mega_posts .box_post:last-child { + padding-bottom: 0; + border-bottom: 0 +} + +.flownews_widget.fnwp_mega_posts .container_post.ad_one_one { + display: inline-block +} + +.flownews_widget.fnwp_mega_posts .img-post.ad_one_third { + background-position: center center; + background-size: cover; + float: left; + width: 40% +} + +.flownews_widget.fnwp_mega_posts .container_post.ad_one_one .box-info.ad_two_third { + box-sizing: border-box; + padding-left: 20px; + width: 60% +} + +.flownews_widget.fnwp_mega_posts .container_post.ad_one_one .box-info h4 { + margin: 5px 0 0; + padding: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100% +} + +.flownews_widget.fnwp_mega_posts .container_post.ad_one_one .box-info h4 a { + color: #333; + font-size: 14px; + letter-spacing: 1px; + text-transform: uppercase; + transition: color .3s ease 0s +} + +.flownews_widget.fnwp_mega_posts .container_post.ad_one_one .box-info a:hover { + color: #b72a23; + transition: color .3s ease 0s +} + +.flownews_widget.fnwp_mega_posts .container_post.ad_one_one .data { + color: #b7b7b7; + display: inline-block; + font-size: 11px; + font-weight: 300; + letter-spacing: .5px; + margin-top: 15px +} + +.flownews_widget.fnwp_mega_posts .container_post.ad_one_one .data i { + color: #e7685d +} + +.flownews_widget.fnwp_mega_posts .container_post.ad_one_one i { + margin-right: 6px +} + +.flownews_widget.fnwp_mega_posts .container_post.ad_one_one .icon-calendar { + color: #e7685d; + float: left; + font-size: 14px; + margin: 0 10px 0 0; + padding: 0; + width: auto +} + +.flownews_widget.fnwp_slider_posts .ad_one_one.ad_last { + position: relative +} + +.flownews_widget.fnwp_slider_posts .category a { + background: #e7685d; + color: #fff; + display: inline-block; + float: left; + font-size: 10px; + font-weight: 700; + letter-spacing: 1px; + line-height: 1; + margin-right: 10px; + margin-top: 4px; + padding: 6px 10px; + text-transform: uppercase; + transition: background-color .3s ease 0s +} + +.flownews_widget.fnwp_slider_posts .flownews_widget-item .category { + top: 0; + position: absolute +} + +.flownews_widget.fnwp_slider_posts .category a:hover { + background: #c9564c; + color: #fff; + transition: color .3s ease 0s; + transition: background .3s ease 0s +} + +.flownews_widget.fnwp_slider_posts .box-text { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + z-index: 2 +} + +.flownews_widget.fnwp_slider_posts .box-padding { + padding: 20px +} + +.flownews_widget.fnwp_slider_posts .box-text h3 { + border: 0; + height: auto; + margin: 0 0 10px +} + +.flownews_widget.fnwp_slider_posts .box-text h3 a { + color: #fff; + display: block; + font-size: 18px; + font-weight: 700; + line-height: 20px; + text-transform: uppercase +} + +.flownews_widget.fnwp_slider_posts .box-text .data i { + margin-right: 10px +} + +.flownews_widget.fnwp_slider_posts .box-text h3 a:hover { + color: #e7685d; + transition: color .3s ease 0s +} + +.flownews_widget.fnwp_slider_posts .flownews_widget-item.ad_one_one.ad_last.big-post .title-info-post .category a,.flownews_widget.fnwp_slider_posts .flownews_widget-item.ad_one_one.ad_last.big-post .title-info-post .category a:hover { + transition: background .3s ease 0s +} + +.flownews_widget.fnwp_slider_posts .data { + color: #fff; + display: inline-block; + font-size: 12px; + font-weight: 400; + margin-top: 9px; + transition: color .3s ease 0s +} + +.flownews_widget.fnwp_slider_posts .data:hover { + color: #e7685d; + transition: color .3s ease 0s +} + +.flownews_widget.fnwp_slider_posts .icon-calendar { + color: #e7685d; + font-size: 14px; + margin: 0 10px 0 0; + padding: 0; + width: auto; + float: left +} + +.flownews_widget.fnwp_slider_posts .flownews_widget-item.ad_one_one.ad_last.big-post i { + color: #fff; + float: left; + font-size: 18px; + margin: 0 10px 0 0; + transition: color .3s ease 0s +} + +.fnwp_slider_posts .owl-controls { + opacity: 0; + transition: opacity .3s ease 0s; + margin-top: 0!important; + height: 0 +} + +.fnwp_slider_posts:hover .owl-controls { + opacity: 1; + transition: opacity .3s ease 0s +} + +.fnwp_slider_posts .owl-prev { + position: absolute; + right: 44px; + top: 15px +} + +.fnwp_slider_posts .owl-next { + position: absolute; + right: 15px; + top: 15px +} + +.fnwp_slider_posts .owl-theme .owl-controls .owl-nav [class*=owl-] { + font-size: 14px; + padding: 6px 11px +} + +.fnwp_slider_posts .owl-theme .owl-item .slider-pattern { + background: linear-gradient(to bottom,rgba(0,0,0,0) 0,rgba(0,0,0,.4) 100%) rgba(0,0,0,0); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; + z-index: 1 +} + +[class*=flownews-placeholder-] { + margin-top: 50px +} + +.flownews_widget.fnwp_social .box_social { + display: inline-block; + padding: 0; + box-sizing: border-box; + width: calc(100% + 6px) +} + +.flownews_widget.fnwp_social .flownews-widget-social-style1 .box-icon-social.ad_one_third { + height: 80px; + margin: 0 6px 6px 0; + width: calc(33.33% - 6px); + background-position: center center; + background-size: cover +} + +.flownews_widget.fnwp_social .box-icon-social.ad_one_third:nth-child(7),.flownews_widget.fnwp_social .box-icon-social.ad_one_third:nth-child(8),.flownews_widget.fnwp_social .box-icon-social.ad_one_third:nth-child(9) { + margin-bottom: 0 +} + +.flownews-sidebar .widget_fnwp_social .flownews-widget-social-style1 .box_social.ad_one_one,.wpb_wrapper .widget_fnwp_social .flownews-widget-social-style1 .box_social.ad_one_one { + width: calc(100% + 6px) +} + +.flownews_widget.fnwp_social .box-icon-social.ad_one_third.facebook { + background: #3b5998 +} + +.flownews_widget.fnwp_social .box-icon-social.ad_one_third.twitter { + background: #3b89c3 +} + +.flownews_widget.fnwp_social .box-icon-social.ad_one_third.google-plus { + background: #d73d32 +} + +.flownews_widget.fnwp_social .box-icon-social.ad_one_third.pinterest { + background: #cb2027 +} + +.flownews_widget.fnwp_social .box-icon-social.ad_one_third.flickr { + background: #ff0084 +} + +.flownews_widget.fnwp_social .box-icon-social.ad_one_third.instagram { + background: #32506d +} + +.flownews_widget.fnwp_social .box-icon-social.ad_one_third.linkedin { + background: #0077b5 +} + +.flownews_widget.fnwp_social .box-icon-social.ad_one_third.youtube { + background: #cc181e +} + +.flownews_widget.fnwp_social .box-icon-social.ad_one_third.vimeo { + background: #00adee +} + +.fnwp_social .box-icon-social { + position: relative; + overflow: hidden +} + +.flownews_widget.fnwp_social .flownews-widget-social-style1 .box-icon-social a { + color: #fff; + font-size: 18px; + left: 50%; + margin-left: -9px; + margin-top: -9px; + position: absolute; + top: 50%; + z-index: 3; + transition: top .3s ease 0s +} + +.flownews_widget.fnwp_social .flownews-widget-social-style1 .box-icon-social p { + bottom: -20px; + color: #fff; + display: inline-block; + font-size: 10px; + font-weight: 600; + line-height: 1; + margin: 0; + position: absolute; + text-align: center; + width: 100%; + transition: bottom .3s ease 0s +} + +.flownews_widget.fnwp_social .flownews-widget-social-style1 .box-icon-social:hover a { + top: 40%; + transition: top .3s ease 0s +} + +.flownews_widget.fnwp_social .flownews-widget-social-style1 .box-icon-social:hover p { + bottom: 25%; + transition: bottom .3s ease 0s +} + +.flownews_widget.fnwp_social .box_social.flownews-widget-social-style2 { + box-sizing: border-box; + display: inline-block; + margin-left: -8px; + padding: 0; + width: calc(100% + 16px) +} + +.flownews-widget-social-style2 .box-icon-social { + margin: 0 8px 8px; + overflow: hidden; + position: relative; + width: calc(16.6667% - 16px) +} + +.flownews-widget-social-style2 .box-icon-social:nth-child(6) { + margin-right: 0 +} + +.flownews-widget-social-style2 a { + background: #e7685d; + color: #fff; + padding: 9px 0; + text-align: center; + font-size: 14px; + transition: background .3s ease 0s; + width: 100% +} + +.flownews-widget-social-style2 a:hover { + color: #FFF; + background: #c9564c; + transition: background .3s ease 0s +} + +@media only screen and (min-width : 700px) and (max-width :1200px) { + .flownews-widget-social-style2 a { + height:50px; + line-height: 31px + } + + .flownews-widget-social-style2 .box-icon-social { + width: calc(33.3333% - 16px); + margin: 0 8px 15px + } +} + +@media only screen and (min-width : 360px) and (max-width :500px) { + .flownews-widget-social-style2 a { + height:50px; + line-height: 33px + } +} + +@media only screen and (min-width : 501px) and (max-width :700px) { + .flownews-widget-social-style2 a { + height:60px; + line-height: 45px; + font-size: 14px!important + } +} + +.flownews_widget.fnwp_tab .fnwp-title-widget { + cursor: pointer +} + +.flownews_widget.fnwp_tab .widget-title .fnwp-title-widget span:hover { + background: #c9564c; + transition: all .3s ease 0s +} + +.flownews_widget.fnwp_tab .fnwp_tab_active { + background: #c9564c!important +} + +.flownews_widget.fnwp-tab-container,.fnwp-tab-container { + display: none +} + +.fnwp_tab .widget-title .fnwp-title-widget span { + background: #e7685d; + margin-right: 2px; + padding: 8px; + position: relative; + transition: all .3s ease 0s +} + +.fnwp_tab .fnwp-title-widget { + background: 0 0; + padding: 10px 0 +} + +.flownews_widget.fnwp_tab .box_post { + border-bottom: 1px solid #f4f4f4; + padding: 10px 0 +} + +.flownews_widget.fnwp_tab .box_post:first-child { + padding-top: 0 +} + +.flownews_widget.fnwp_tab .box_post:last-child { + border-bottom: 0 none; + padding-bottom: 0 +} + +.flownews_widget.fnwp_tab .container_post.ad_one_one { + display: inline-block +} + +.flownews_widget.fnwp_tab .img-post.ad_one_third { + height: 100%; + background-position: center center; + background-size: cover; + float: left; + width: 40% +} + +.flownews_widget.fnwp_tab .container_post.ad_one_one .box-info.ad_two_third { + box-sizing: border-box; + padding-left: 20px; + width: 60%; + float: left +} + +.flownews_widget.fnwp_tab .container_post.ad_one_one .box-info h4 { + margin: 5px 0 0; + padding: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100% +} + +.flownews_widget.fnwp_tab .container_post.ad_one_one .box-info h4 a { + color: #333; + font-size: 14px; + letter-spacing: 1px; + text-transform: uppercase; + transition: color .3s ease 0s +} + +.flownews_widget.fnwp_tab .container_post.ad_one_one .box-info a:hover { + color: #b72a23; + transition: color .3s ease 0s +} + +.flownews_widget.fnwp_tab .container_post.ad_one_one .data { + color: #b7b7b7; + display: inline-block; + font-size: 12px; + font-weight: 300; + letter-spacing: .5px; + margin-top: 15px +} + +.flownews_widget.fnwp_tab .container_post.ad_one_one .icon-calendar { + color: #e7685d; + float: left; + font-size: 14px; + margin: 0 10px 0 0; + padding: 0; + width: auto +} + +.flownews_widget.fnwp_tab .content_tag { + border: 1px solid #f4f4f4; + color: #333; + display: inline-block; + font-size: 14px; + font-weight: 500; + margin: 0 10px 10px 0; + padding: 10px 25px; + transition: background .3s ease 0s +} + +.flownews_widget.fnwp_tab .content_tag a { + color: #333; + font-size: 12px; + font-weight: 700; + letter-spacing: 1px; + text-transform: uppercase; + transition: all .3s ease 0s +} + +.flownews_widget.fnwp_tab .content_tag:hover { + background: #e7685d; + border: 1px solid #e7685d; + color: #fff; + transition: all .3s ease 0s; + cursor: pointer +} + +.flownews_widget.fnwp_tab .content_tag:hover a { + color: #fff; + transition: all .3s ease 0s +} + +.fnwp_tag .fnwp-title-widget { + cursor: pointer +} + +h4.widget-title .fnwp_tag_active,h4.widget-title span:hover { + color: #b72a23 +} + +.fnwp-tag-container { + display: none +} + +.fnwp-active { + display: block +} + +.fnwp_title_popular,.fnwp_title_recent,.fnwp_title_tag { + margin-right: 2px; + position: relative +} + +.fnwp_tag .widget-title .fnwp-title-widget span { + background: #e7685d; + margin-right: 2px; + padding: 8px; + position: relative +} + +.flownews_widget.fnwp_tag .box_post { + border-bottom: 1px solid #f4f4f4; + padding: 10px 0 +} + +.flownews_widget.fnwp_tag .box_post:first-child { + padding-top: 0 +} + +.flownews_widget.fnwp_tag .box_post:last-child { + border-bottom: 0 none; + padding-bottom: 0 +} + +.flownews_widget.fnwp_tag .container_post.ad_one_one { + display: inline-block +} + +.flownews_widget.fnwp_tag .img-post.ad_one_third { + height: 100%; + background-position: center center; + background-size: cover; + float: left; + width: 40% +} + +.flownews_widget.fnwp_tag .container_post.ad_one_one .box-info.ad_two_third { + box-sizing: border-box; + padding-left: 20px; + width: 60%; + float: left +} + +.flownews_widget.fnwp_tag .container_post.ad_one_one .box-info h4 { + margin: 5px 0 0; + padding: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100% +} + +.flownews_widget.fnwp_tag .container_post.ad_one_one .box-info h4 a { + color: #333; + font-size: 18px; + letter-spacing: 1px; + transition: color .3s ease 0s +} + +.flownews_widget.fnwp_tag .container_post.ad_one_one .box-info a:hover { + color: #b72a23; + transition: color .3s ease 0s +} + +.flownews_widget.fnwp_tag .container_post.ad_one_one .data { + color: #b7b7b7; + display: inline-block; + font-size: 12px; + font-weight: 300; + letter-spacing: .5px; + margin-top: 15px +} + +.flownews_widget.fnwp_tag .container_post.ad_one_one .icon-calendar { + color: #e7685d; + float: left; + font-size: 14px; + margin: 0 10px 0 0; + padding: 0; + width: auto +} + +.flownews_widget.fnwp_tag .content_tag { + border: 1px solid #f4f4f4; + color: #333; + display: inline-block; + font-size: 14px; + font-weight: 500; + margin: 0 10px 10px 0; + padding: 10px 25px; + transition: all .3s ease 0s +} + +.flownews_widget.fnwp_tag .content_tag a { + color: #333; + font-size: 12px; + font-weight: 700; + letter-spacing: 1px; + text-transform: uppercase; + transition: all .3s ease 0s +} + +.flownews_widget.fnwp_tag .content_tag:hover { + background: #e7685d; + color: #fff; + transition: all .3s ease 0s; + cursor: pointer +} + +.flownews_widget.fnwp_tag .content_tag:hover a { + color: #fff; + transition: all .3s ease 0s +} + +.flownews-sidebar .widget_flownews_instagram .instagram-image img,.wpb_wrapper .widget_flownews_instagram .instagram-image img { + height: 80px; + overflow: hidden; + width: 100% +} + +.flownews-sidebar .widget_flownews_instagram .instagram-image a { + width: 33.3333%; + height: auto; + opacity: 1; + transition: all .3s ease 0s; + background: #000; + display: inline-block +} + +.flownews-sidebar .widget_flownews_instagram .instagram-image a:hover { + opacity: .7; + transition: all .3s ease 0s +} + +@media (max-width: 768px) { + .flownews_widget.fnwp_social .box-icon-social.ad_one_third { + width:calc(50% - 6px)!important; + box-sizing: border-box; + margin: 3px; + display: inline-block + } + + .flownews_widget.fnwp_social .box_social { + padding: 3px; + font-size: 0 + } + + .flownews_widget.fnwp_mega_posts .img-post.ad_one_third,.flownews_widget.fnwp_tab .img-post.ad_one_third { + height: 120px + } + + .flownews_widget.fnwp_mega_posts .container_post.ad_one_one .box-info h4 a,.flownews_widget.fnwp_tab .container_post.ad_one_one .box-info h4 a { + line-height: 1.2 + } +} + +.flownews-element-posts { + margin-bottom: 50px +} + +.flownews-element-posts article { + position: relative; + line-height: 1 +} + +.flownews-element-posts article h2 { + line-height: 1 +} + +.flownews-element-posts .article-image { + position: relative; + min-height: 50px +} + +.flownews-element-posts .article-title a { + text-transform: uppercase; + font-size: 28px; + display: block +} + +.flownews-element-posts .article-title a:hover { + color: #e7685d +} + +.flownews-element-posts .article-category { + position: absolute; + left: 0; + bottom: 0; + font-size: 0 +} + +.flownews-element-posts .article-category a { + background: #e7685d; + color: #fff; + font-size: 10px; + font-weight: 700; + letter-spacing: 1px; + padding: 6px 10px; + text-transform: uppercase; + line-height: 1.2; + margin-top: 4px; + display: inline-block; + margin-right: 2px +} + +.flownews-element-posts .article-category a:hover { + background: #c9564c +} + +.flownews-element-posts .article-comments,.flownews-element-posts .article-data,.flownews-element-posts .article-separator { + float: left +} + +.flownews-element-posts .article-data { + color: #646464; + font-size: 12px; + letter-spacing: .5px; + margin-right: 20px +} + +.flownews-element-posts .article-comments { + margin-left: 20px; + color: #646464; + font-size: 12px; + letter-spacing: .5px +} + +.flownews-element-posts .article-comments a { + color: #646464 +} + +.flownews-element-posts .article-comments a:hover { + color: #c9564c +} + +.flownews-element-posts i { + margin-right: 8px +} + +.flownews-element-posts .article-category i { + margin-right: 0 +} + +.flownews-element-posts .article-info-bottom .article-excerpt a { + color: #e7685d +} + +.flownews-element-posts .article-info-bottom .article-excerpt a:hover { + color: #333 +} + +.flownews-element-posts .article-read-more i { + margin-left: 10px; + margin-right: 0 +} + +.flownews-element-posts .article-info-top { + margin-top: 15px +} + +.flownews-element-posts h3 a { + margin: 20px 0 10px +} + +.flownews-element-posts-title-box { + border-bottom: 1px solid #f4f4f4; + border-right: 1px solid #e7685d; + border-top: 1px solid #f4f4f4; + height: 35px; + margin: 0 0 25px; + position: relative; + text-align: left +} + +.flownews-element-posts-title-box h2 { + background: #e7685d; + color: #fff; + display: inline-block; + font-size: 14px; + font-weight: 600; + height: calc(100% + 2px); + height: -webkit-calc(100% + 2px); + left: 0; + letter-spacing: 1.5px; + padding: 10px; + position: absolute; + text-transform: uppercase; + top: -1px; + transition: color .3s ease 0s; + margin: 0 +} + +.flownews-element-posts #flownews-load-posts a,.flownews-pagination a { + color: #333; + display: inline-block; + padding: 10px 20px; + text-transform: uppercase +} + +.flownews-element-posts #flownews-load-posts a,.flownews-pagination a,.flownews-pagination a:hover { + border: 1px solid #f4f4f4; + transition: all .3s ease 0s +} + +.flownews-element-posts #flownews-load-posts { + margin-top: 50px; + text-align: center +} + +.flownews-element-posts #flownews-load-posts a { + letter-spacing: 1px +} + +.flownews-element-posts #flownews-load-posts a:hover { + background: #f4f4f4; + border: 1px solid #f4f4f4; + transition: all .3s ease 0s +} + +.flownews-pagination { + margin-top: 50px +} + +.flownews-pagination a:last-child { + float: right +} + +.flownews-pagination a:hover { + background: #f4f4f4 +} + +.fnwp-numeric-pagination { + text-align: center +} + +.fnwp-numeric-pagination .inactive { + font-size: 12px; + line-height: 1; + margin: 0 2px; + padding: 10px 13px +} + +.fnwp-numeric-pagination .current,.fnwp-numeric-pagination i { + font-size: 12px; + line-height: 1; + padding: 10px 14px; + color: #333; + display: inline-block; + border: 1px solid #f4f4f4; + transition: all .3s ease 0s; + text-transform: uppercase +} + +.fnwp-numeric-pagination .current { + margin: 0 2px; + background: #f4f4f4 +} + +.fnwp-numeric-pagination i { + margin-right: 0 +} + +.fnwp-numeric-pagination .fnwp-icon-left { + margin-right: 34px +} + +.fnwp-numeric-pagination .fnwp-icon-right { + margin-left: 34px +} + +.fnwp-numeric-pagination i:hover { + background: #f4f4f4; + border: 1px solid #f4f4f4; + transition: all .3s ease 0s +} + +a.fnwp-pagination-numeric-arrow { + border: none!important; + padding: 0; + margin: 0 +} + +a.fnwp-pagination-numeric-arrow:hover { + background: 0 0!important +} + +.fnwp-numeric-pagination .flownewsicon.fa-angle-double-left { + margin-right: 4px +} + +.fnwp-numeric-pagination .flownewsicon.fa-angle-double-right { + margin-left: 4px +} + +.flownews-pagination .fnwp-numeric-pagination a:last-child { + float: none!important +} + +@media screen and (max-width: 700px) { + .flownews-container .flownews-pagination { + margin:25px + } + + .flownews-pagination a { + margin-bottom: 10px + } +} + +@media screen and (max-width: 400px) { + .flownews-element-posts .flownews-pagination-normal { + width:100%!important + } +} + +.flownews-element-posts.flownews-posts-layout1.flownews-blog-2-col,.flownews-element-posts.flownews-posts-layout1.flownews-blog-3-col,.flownews-element-posts.flownews-posts-layout1.flownews-blog-4-col { + margin-left: -12.5px; + width: calc(100% + 25px) +} + +.flownews-element-posts.flownews-posts-layout1 .flownews-element-posts-title-box { + margin: 0 0 25px 12.5px; + width: calc(100% - 25px) +} + +.flownews-element-posts.flownews-posts-layout1 .item-posts.first-element-posts.col-xs-6 { + width: calc(50% - 25px) +} + +.flownews-element-posts.flownews-posts-layout1 .item-posts.first-element-posts.col-xs-4 { + width: calc(33.3333% - 25px) +} + +.flownews-element-posts.flownews-posts-layout1 .item-posts.first-element-posts.col-xs-3 { + width: calc(25% - 25px) +} + +.flownews-element-posts.flownews-posts-layout1 .item-posts.first-element-posts { + padding-top: 25px; + margin-top: 25px +} + +.flownews-element-posts.flownews-posts-layout1.flownews-blog-2-col .item-posts.first-element-posts,.flownews-element-posts.flownews-posts-layout1.flownews-blog-3-col .item-posts.first-element-posts,.flownews-element-posts.flownews-posts-layout1.flownews-blog-4-col .item-posts.first-element-posts { + margin: 0 12.5px +} + +.flownews-element-posts.flownews-posts-layout1.flownews-blog-1-col .item-posts.first-element-posts:first-child { + padding-top: 0; + margin-top: 0 +} + +.flownews-element-posts.flownews-posts-layout1.flownews-blog-2-col .item-posts.first-element-posts:nth-child(1),.flownews-element-posts.flownews-posts-layout1.flownews-blog-2-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout1.flownews-blog-3-col .item-posts.first-element-posts:nth-child(1),.flownews-element-posts.flownews-posts-layout1.flownews-blog-3-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout1.flownews-blog-3-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout1.flownews-blog-4-col .item-posts.first-element-posts:nth-child(1),.flownews-element-posts.flownews-posts-layout1.flownews-blog-4-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout1.flownews-blog-4-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout1.flownews-blog-4-col .item-posts.first-element-posts:nth-child(4) { + padding-top: 0 +} + +.flownews-element-posts.flownews-posts-layout1 h3 a { + line-height: 1.2 +} + +.flownews-element-posts.flownews-posts-layout1.flownews-blog-3-col h3 a { + font-size: 22px +} + +.flownews-element-posts.flownews-posts-layout1.flownews-blog-4-col h3 a { + font-size: 20px; + margin: 15px 0 0 +} + +.flownews-element-posts.flownews-posts-layout1 .article-comments,.flownews-element-posts.flownews-posts-layout1 .article-data,.flownews-element-posts.flownews-posts-layout1 .article-separator { + font-size: 11px +} + +.flownews-element-posts.flownews-posts-layout1 .article-comments { + margin-left: 12px +} + +.flownews-element-posts.flownews-posts-layout1 .article-data { + margin-right: 12px +} + +.flownews-element-posts.flownews-posts-layout1 .article-category a.article-icon-link { + padding: 6px 8px +} + +.flownews-element-posts.flownews-posts-layout1 .article-category a.article-icon-link i { + font-size: 9px; + line-height: 12px +} + +.flownews-element-posts.flownews-posts-layout1 .article-category a { + display: block; + float: left +} + +@media screen and (max-width: 700px) { + .flownews-element-posts.flownews-posts-layout1 .flownews-element-posts-title-box.title-box-1,.flownews-element-posts.flownews-posts-layout1 .item-posts.first-element-posts.col-xs-3,.flownews-element-posts.flownews-posts-layout1 .item-posts.first-element-posts.col-xs-4 { + width:100% + } + + .flownews-content .flownews-element-posts.flownews-posts-layout1 .item-posts.first-element-posts.col-xs-3,.flownews-content .flownews-element-posts.flownews-posts-layout1 .item-posts.first-element-posts.col-xs-4 { + width: calc(100% - 25px) + } + + .flownews-element-posts.flownews-posts-layout1.flownews-blog-4-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout1.flownews-blog-4-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout1.flownews-blog-4-col .item-posts.first-element-posts:nth-child(4) { + padding-top: 25px + } +} + +@media screen and (max-width: 500px) { + .flownews-content .flownews-element-posts.flownews-posts-layout1.flownews-blog-2-col .item-posts.first-element-posts.col-xs-6 { + width:calc(100% - 25px) + } + + .flownews-content .flownews-element-posts.flownews-posts-layout1.flownews-blog-2-col .item-posts.first-element-posts.col-xs-6:nth-child(2) { + padding-top: 25px + } +} + +@media screen and (min-width: 701px) and (max-width:800px) { + .flownews-element-posts.flownews-posts-layout1.flownews-blog-2-col .article-comments,.flownews-element-posts.flownews-posts-layout1.flownews-blog-2-col .article-separator,.flownews-element-posts.flownews-posts-layout1.flownews-blog-3-col .article-comments,.flownews-element-posts.flownews-posts-layout1.flownews-blog-3-col .article-separator { + display:none + } +} + +@media screen and (min-width: 951px) and (max-width:1040px) { + .flownews-element-posts.flownews-posts-layout1.flownews-blog-4-col .article-comments,.flownews-element-posts.flownews-posts-layout1.flownews-blog-4-col .article-separator { + display:none + } +} + +@media screen and (min-width: 580px) and (max-width:950px) { + .flownews-element-posts.flownews-posts-layout1 .item-posts.first-element-posts.col-xs-3 { + width:calc(50% - 25px) + } + + .flownews-element-posts.flownews-posts-layout1.flownews-blog-4-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout1.flownews-blog-4-col .item-posts.first-element-posts:nth-child(4) { + padding-top: 25px + } +} + +.flownews-element-posts.flownews-posts-layout2.flownews-blog-2-col,.flownews-element-posts.flownews-posts-layout2.flownews-blog-3-col,.flownews-element-posts.flownews-posts-layout2.flownews-blog-4-col { + margin-left: -12.5px; + width: calc(100% + 25px) +} + +.flownews-element-posts.flownews-posts-layout2 .flownews-element-posts-title-box { + margin: 0 0 25px 12.5px; + width: calc(100% - 25px) +} + +.flownews-element-posts.flownews-posts-layout2 .item-posts.first-element-posts.col-xs-6 { + width: calc(50% - 25px) +} + +.flownews-element-posts.flownews-posts-layout2 .item-posts.first-element-posts.col-xs-4 { + width: calc(33.3333% - 25px) +} + +.flownews-element-posts.flownews-posts-layout2 .item-posts.first-element-posts.col-xs-3 { + width: calc(25% - 25px) +} + +.flownews-element-posts.flownews-posts-layout2 .item-posts.first-element-posts { + border-top: 1px solid #f4f4f4; + padding-top: 25px; + margin-top: 25px +} + +.flownews-element-posts.flownews-posts-layout2.flownews-blog-2-col .item-posts.first-element-posts,.flownews-element-posts.flownews-posts-layout2.flownews-blog-3-col .item-posts.first-element-posts,.flownews-element-posts.flownews-posts-layout2.flownews-blog-4-col .item-posts.first-element-posts { + margin: 25px 12.5px 0 +} + +.flownews-element-posts.flownews-posts-layout2.flownews-blog-1-col .item-posts.first-element-posts:first-child,.flownews-element-posts.flownews-posts-layout2.flownews-blog-2-col .item-posts.first-element-posts:nth-child(1),.flownews-element-posts.flownews-posts-layout2.flownews-blog-2-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout2.flownews-blog-3-col .item-posts.first-element-posts:nth-child(1),.flownews-element-posts.flownews-posts-layout2.flownews-blog-3-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout2.flownews-blog-3-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout2.flownews-blog-4-col .item-posts.first-element-posts:nth-child(1),.flownews-element-posts.flownews-posts-layout2.flownews-blog-4-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout2.flownews-blog-4-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout2.flownews-blog-4-col .item-posts.first-element-posts:nth-child(4) { + border-top: 0; + padding-top: 0; + margin-top: 0 +} + +.flownews-element-posts.flownews-posts-layout2 article h3 a { + margin-bottom: 0; + line-height: 1.2 +} + +.flownews-element-posts.flownews-posts-layout2.flownews-blog-3-col article h3 a { + font-size: 22px; + line-height: 1.2 +} + +.flownews-element-posts.flownews-posts-layout2.flownews-blog-4-col article h3 a { + font-size: 20px; + line-height: 1.2 +} + +.flownews-element-posts.flownews-posts-layout2 .article-category a { + font-size: 13px +} + +.flownews-element-posts.flownews-posts-layout2 .flownews-pagination-normal { + margin-left: 12.5px; + width: calc(100% - 25px) +} + +@media screen and (max-width: 700px) { + .flownews-element-posts.flownews-posts-layout2 .item-posts.first-element-posts:first-child { + border-top:0; + padding-top: 0; + margin-top: 0 + } + + .flownews-element-posts.flownews-posts-layout2 .flownews-element-posts-article-container article:nth-child(2),.flownews-element-posts.flownews-posts-layout2.flownews-blog-3-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout2.flownews-blog-3-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout2.flownews-blog-3-col .item-posts.first-element-posts:nth-child(4),.flownews-element-posts.flownews-posts-layout2.flownews-blog-4-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout2.flownews-blog-4-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout2.flownews-blog-4-col .item-posts.first-element-posts:nth-child(4) { + padding-top: 25px; + margin-top: 25px; + border-top: 1px solid #f4f4f4 + } + + .flownews-element-posts.flownews-posts-layout2,.flownews-element-posts.flownews-posts-layout2 .flownews-element-posts-title-box,.flownews-element-posts.flownews-posts-layout2 .item-posts.first-element-posts.col-xs-3,.flownews-element-posts.flownews-posts-layout2 .item-posts.first-element-posts.col-xs-4,.flownews-element-posts.flownews-posts-layout2 .item-posts.first-element-posts.col-xs-6 { + width: 100% + } + + .flownews-element-posts.flownews-posts-layout2 .item-posts.first-element-posts.col-xs-3,.flownews-element-posts.flownews-posts-layout2 .item-posts.first-element-posts.col-xs-4 { + width: calc(100% - 25px) + } + + .flownews-container .flownews-pagination { + margin-top: 50px + } + + .flownews-container.flownews-sidebar-left .col-xs-9 { + margin-left: 0 + } +} + +@media screen and (min-width: 701px) and (max-width:850px) { + .flownews-element-posts.flownews-posts-layout2.flownews-blog-2-col .article-comments,.flownews-element-posts.flownews-posts-layout2.flownews-blog-2-col .article-separator { + display:none + } +} + +@media screen and (min-width: 580px) and (max-width:950px) { + .flownews-element-posts.flownews-posts-layout2 .item-posts.first-element-posts.col-xs-3 { + width:calc(50% - 25px) + } + + .flownews-element-posts.flownews-posts-layout2.flownews-blog-4-col .item-posts.first-element-posts:nth-child(2) { + padding-top: 0; + margin-top: 0; + border-top: 0 + } + + .flownews-element-posts.flownews-posts-layout2.flownews-blog-4-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout2.flownews-blog-4-col .item-posts.first-element-posts:nth-child(4) { + padding-top: 25px; + margin-top: 25px; + border-top: 1px solid #f4f4f4 + } +} + +.flownews-element-posts.flownews-posts-layout3.flownews-blog-2-col,.flownews-element-posts.flownews-posts-layout3.flownews-blog-3-col,.flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col { + margin-left: -12.5px; + width: calc(100% + 25px) +} + +.flownews-element-posts.flownews-posts-layout3 .flownews-element-posts-title-box { + margin: 0 0 25px 12.5px; + width: calc(100% - 25px) +} + +.flownews-element-posts.flownews-posts-layout3 .item-posts.first-element-posts.col-xs-6 { + width: calc(50% - 25px) +} + +.flownews-element-posts.flownews-posts-layout3 .item-posts.first-element-posts.col-xs-4 { + width: calc(33.3333% - 25px) +} + +.flownews-element-posts.flownews-posts-layout3 .item-posts.first-element-posts.col-xs-3 { + width: calc(25% - 25px) +} + +.flownews-element-posts.flownews-posts-layout3 .item-posts.first-element-posts { + border-top: 1px solid #f4f4f4; + padding-top: 25px; + margin-top: 25px +} + +.flownews-element-posts.flownews-posts-layout3.flownews-blog-2-col .item-posts.first-element-posts,.flownews-element-posts.flownews-posts-layout3.flownews-blog-3-col .item-posts.first-element-posts,.flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col .item-posts.first-element-posts { + margin: 25px 12.5px 0 +} + +.flownews-element-posts.flownews-posts-layout3.flownews-blog-1-col .item-posts.first-element-posts:first-child,.flownews-element-posts.flownews-posts-layout3.flownews-blog-2-col .item-posts.first-element-posts:nth-child(1),.flownews-element-posts.flownews-posts-layout3.flownews-blog-2-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout3.flownews-blog-3-col .item-posts.first-element-posts:nth-child(1),.flownews-element-posts.flownews-posts-layout3.flownews-blog-3-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout3.flownews-blog-3-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col .item-posts.first-element-posts:nth-child(1),.flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col .item-posts.first-element-posts:nth-child(4) { + border-top: 0; + padding-top: 0; + margin-top: 0 +} + +.flownews-element-posts.flownews-posts-layout3 article h3 a { + line-height: 1.2 +} + +.flownews-element-posts.flownews-posts-layout3.flownews-blog-3-col article h3 a { + font-size: 22px; + line-height: 1.2 +} + +.flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col article h3 a { + font-size: 20px; + line-height: 1.2 +} + +.flownews-element-posts.flownews-posts-layout3 .article-category a { + font-size: 13px +} + +.flownews-element-posts.flownews-posts-layout3 .flownews-pagination-normal { + margin-left: 12.5px; + width: calc(100% - 25px) +} + +@media screen and (max-width: 700px) { + .flownews-element-posts.flownews-posts-layout3.item-posts.first-element-posts:first-child { + border-top:0; + padding-top: 0; + margin-top: 0 + } + + .flownews-element-posts.flownews-posts-layout3 .flownews-element-posts-article-container article:nth-child(2),.flownews-element-posts.flownews-posts-layout3.flownews-blog-2-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout3.flownews-blog-3-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout3.flownews-blog-3-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col .item-posts.first-element-posts:nth-child(4) { + padding-top: 25px; + margin-top: 25px; + border-top: 1px solid #f4f4f4 + } + + .flownews-element-posts.flownews-posts-layout3,.flownews-element-posts.flownews-posts-layout3 .flownews-element-posts-title-box,.flownews-element-posts.flownews-posts-layout3 .item-posts.first-element-posts.col-xs-6 { + width: 100% + } + + .flownews-element-posts.flownews-posts-layout3 .item-posts.first-element-posts.col-xs-3,.flownews-element-posts.flownews-posts-layout3 .item-posts.first-element-posts.col-xs-4,.flownews-element-posts.flownews-posts-layout3 .item-posts.first-element-posts.col-xs-6 { + width: calc(100% - 25px) + } +} + +@media screen and (min-width: 701px) and (max-width:900px) { + .flownews-element-posts.flownews-posts-layout2.flownews-blog-3-col .article-comments,.flownews-element-posts.flownews-posts-layout2.flownews-blog-3-col .article-separator,.flownews-element-posts.flownews-posts-layout3.flownews-blog-2-col .article-comments,.flownews-element-posts.flownews-posts-layout3.flownews-blog-2-col .article-separator,.flownews-element-posts.flownews-posts-layout3.flownews-blog-3-col .article-comments,.flownews-element-posts.flownews-posts-layout3.flownews-blog-3-col .article-separator { + display:none + } +} + +@media screen and (min-width: 951px) and (max-width:1150px) { + .flownews-element-posts.flownews-posts-layout2.flownews-blog-4-col .article-comments,.flownews-element-posts.flownews-posts-layout2.flownews-blog-4-col .article-separator,.flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col .article-comments,.flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col .article-separator { + display:none + } +} + +@media screen and (min-width: 580px) and (max-width:950px) { + .flownews-element-posts.flownews-posts-layout3 .item-posts.first-element-posts.col-xs-3 { + width:calc(50% - 25px) + } + + .flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col .item-posts.first-element-posts:nth-child(2) { + padding-top: 0; + margin-top: 0; + border-top: 0 + } + + .flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col .item-posts.first-element-posts:nth-child(4) { + padding-top: 25px; + margin-top: 25px; + border-top: 1px solid #f4f4f4 + } +} + +.flownews-posts-layout4 .article-category { + display: block; + position: relative; + margin-top: 10px +} + +.flownews-element-posts.flownews-posts-layout4.flownews-blog-2-col,.flownews-element-posts.flownews-posts-layout4.flownews-blog-3-col,.flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col { + margin-left: -12.5px; + width: calc(100% + 25px) +} + +.flownews-element-posts.flownews-posts-layout4 .flownews-element-posts-title-box { + margin: 0 0 25px 12.5px; + width: calc(100% - 25px) +} + +.flownews-element-posts.flownews-posts-layout4 .item-posts.first-element-posts.col-xs-6 { + width: calc(50% - 25px) +} + +.flownews-element-posts.flownews-posts-layout4 .item-posts.first-element-posts.col-xs-4 { + width: calc(33.3333% - 25px) +} + +.flownews-element-posts.flownews-posts-layout4 .item-posts.first-element-posts.col-xs-3 { + width: calc(25% - 25px) +} + +.flownews-element-posts.flownews-posts-layout4 .article-title a { + font-size: 18px; + line-height: 1.2 +} + +.flownews-element-posts.flownews-posts-layout4 .item-posts.first-element-posts { + border-top: 1px solid #f4f4f4; + padding-top: 25px; + margin-top: 25px +} + +.flownews-element-posts.flownews-posts-layout4.flownews-blog-2-col .item-posts.first-element-posts,.flownews-element-posts.flownews-posts-layout4.flownews-blog-3-col .item-posts.first-element-posts,.flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .item-posts.first-element-posts { + margin: 0 12.5px +} + +.flownews-element-posts.flownews-posts-layout4.flownews-blog-1-col .item-posts.first-element-posts:first-child,.flownews-element-posts.flownews-posts-layout4.flownews-blog-2-col .item-posts.first-element-posts:nth-child(1),.flownews-element-posts.flownews-posts-layout4.flownews-blog-2-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout4.flownews-blog-3-col .item-posts.first-element-posts:nth-child(1),.flownews-element-posts.flownews-posts-layout4.flownews-blog-3-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout4.flownews-blog-3-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .item-posts.first-element-posts:nth-child(1),.flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .item-posts.first-element-posts:nth-child(4) { + border-top: 0; + padding-top: 0; + margin-top: 0 +} + +.flownews-posts-layout4 article { + padding-bottom: 25px +} + +.flownews-posts-layout4 .article-info.col-xs-8 { + padding: 0 15px!important +} + +.flownews-element-posts.flownews-posts-layout4.flownews-blog-3-col .article-image.col-xs-4,.flownews-element-posts.flownews-posts-layout4.flownews-blog-3-col .article-info.col-xs-8,.flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .article-image.col-xs-4,.flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .article-info.col-xs-8 { + width: 100% +} + +.flownews-element-posts.flownews-posts-layout4.flownews-blog-3-col .article-info.col-xs-8,.flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .article-info.col-xs-8 { + padding: 15px 0!important +} + +.flownews-posts-layout4 .article-info-top,.flownews-posts-layout4 h3 a { + margin-top: 0 +} + +.flownews-element-posts.flownews-posts-layout4 .flownews-pagination-normal { + margin-left: 12.5px; + width: calc(100% - 25px) +} + +@media screen and (max-width: 800px) { + .flownews-element-posts.flownews-posts-layout4 .article-data { + display:inherit + } + + .flownews-element-posts.flownews-posts-layout4.item-posts.first-element-posts:first-child { + border-top: 0; + padding-top: 0; + margin-top: 0 + } + + .flownews-element-posts.flownews-posts-layout4 article.item-posts.first-element-posts:nth-child(2) { + border-top: 1px solid #f4f4f4; + padding-top: 25px; + margin-top: 25px + } + + .flownews-element-posts.flownews-posts-layout4,.flownews-element-posts.flownews-posts-layout4 .flownews-element-posts-title-box { + width: 100% + } + + .flownews-element-posts.flownews-posts-layout4 .item-posts.first-element-posts.col-xs-6 { + width: calc(100% - 25px) + } + + .flownews-element-posts.flownews-posts-layout4.flownews-blog-2-col .item-posts.first-element-posts:nth-child(2) { + border-top: 1px solid #f4f4f4; + padding-top: 25px + } +} + +@media screen and (max-width: 700px) { + .flownews-element-posts.flownews-posts-layout4 .item-posts.first-element-posts.col-xs-4 { + width:calc(100% - 25px) + } + + .flownews-element-posts.flownews-posts-layout4.flownews-blog-3-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout4.flownews-blog-3-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .item-posts.first-element-posts:nth-child(4) { + border-top: 1px solid #f4f4f4; + padding-top: 25px + } +} + +@media screen and (min-width: 701px) and (max-width:950px) { + .flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .item-posts.first-element-posts:nth-child(4) { + border-top:1px solid #f4f4f4; + padding-top: 25px + } +} + +@media screen and (max-width: 640px) { + .flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .item-posts.first-element-posts.col-xs-3 { + width:calc(100% - 25px) + } + + .flownews-container .flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout4.flownews-blog-3-col .item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout4.flownews-blog-3-col .item-posts.first-element-posts:nth-child(3) { + border-top: 1px solid #f4f4f4; + padding-top: 25px + } + + .flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .article-data { + display: block + } +} + +@media screen and (min-width: 580px) and (max-width:950px) { + .flownews-element-posts.flownews-posts-layout4 .item-posts.first-element-posts.col-xs-3 { + width:calc(50% - 25px) + } + + .flownews-element-posts.flownews-posts-layout4.flownews-blog-4-col .item-posts.first-element-posts:nth-child(2) { + padding-top: 0; + margin-top: 0; + border-top: 0 + } + + .flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col .item-posts.first-element-posts:nth-child(3),.flownews-element-posts.flownews-posts-layout3.flownews-blog-4-col .item-posts.first-element-posts:nth-child(4) { + padding-top: 25px; + margin-top: 25px; + border-top: 1px solid #f4f4f4 + } +} + +@media screen and (max-width: 450px) { + .flownews-element-posts.flownews-posts-layout4 .article-data { + display:none + } + + .flownews-element-posts.flownews-posts-layout4.flownews-blog-1-col .article-image.col-xs-4,.flownews-element-posts.flownews-posts-layout4.flownews-blog-2-col .article-image.col-xs-4 { + width: 100% + } + + .flownews-element-posts.flownews-posts-layout4.flownews-blog-1-col .article-info.col-xs-8,.flownews-element-posts.flownews-posts-layout4.flownews-blog-2-col .article-info.col-xs-8 { + padding: 15px 0!important; + width: calc(100% - 25px) + } + + .flownews-element-posts.flownews-posts-layout4.flownews-blog-2-col .article-image.col-xs-4 { + width: 100% + } +} + +.flownews-element-posts.flownews-posts-layout5.flownews-blog-2-col,.flownews-element-posts.flownews-posts-layout5.flownews-blog-3-col,.flownews-element-posts.flownews-posts-layout5.flownews-blog-4-col { + margin-left: -12.5px; + width: calc(100% + 25px) +} + +.flownews-element-posts.flownews-posts-layout5 .flownews-element-posts-title-box { + margin: 0 0 25px 12.5px; + width: calc(100% - 25px) +} + +.flownews-element-posts.flownews-posts-layout5 .item-posts.first-element-posts.col-xs-6 { + width: calc(50% - 25px) +} + +.flownews-element-posts.flownews-posts-layout5 .item-posts.first-element-posts.col-xs-4 { + width: calc(33.3333% - 25px) +} + +.flownews-element-posts.flownews-posts-layout5 .item-posts.first-element-posts.col-xs-3 { + width: calc(25% - 25px) +} + +.flownews-element-posts.flownews-posts-layout5 .article-title a { + font-size: 18px +} + +.flownews-element-posts.flownews-posts-layout5 .item-posts.first-element-posts { + border-top: 1px solid #f4f4f4; + margin: 25px 12.5px 0; + padding-top: 25px +} + +.flownews-element-posts.flownews-posts-layout5.flownews-blog-2-col .item-posts.first-element-posts,.flownews-element-posts.flownews-posts-layout5.flownews-blog-3-col .item-posts.first-element-posts,.flownews-element-posts.flownews-posts-layout5.flownews-blog-4-col .item-posts.first-element-posts { + margin-bottom: 25px!important +} + +.flownews-element-posts.flownews-posts-layout5.flownews-blog-2-col .item-posts.first-element-posts.other-rows,.flownews-element-posts.flownews-posts-layout5.flownews-blog-3-col .item-posts.first-element-posts.other-rows,.flownews-element-posts.flownews-posts-layout5.flownews-blog-4-col .item-posts.first-element-posts.other-rows { + margin-bottom: 0!important; + margin-top: 10px +} + +.flownews-element-posts.flownews-posts-layout5.flownews-blog-1-col .item-posts.first-element-posts { + margin-left: 0 +} + +.flownews-element-posts.flownews-posts-layout5 .flownews-pagination-normal { + margin-left: 12.5px; + width: calc(100% - 25px) +} + +.flownews-element-posts.flownews-posts-layout5 article.item-posts.first-element-posts.first-row { + border-top: 0; + padding-top: 0; + margin-top: 0 +} + +.flownews-element-posts.flownews-posts-layout5.flownews-blog-1-col article.item-posts.first-element-posts.first-row { + margin: 0 0 50px +} + +.flownews-element-posts.flownews-posts-layout5 article.item-posts.first-element-posts.first-row { + margin-bottom: 50px +} + +.flownews-posts-layout5 .article-info.col-xs-8 { + padding: 0 15px!important +} + +.flownews-posts-layout5.flownews-blog-1-col .first-row .article-title a { + font-size: 28px +} + +.flownews-posts-layout5 .item-posts.first-element-posts .article-info.col-xs-8 .article-info-top,.flownews-posts-layout5 .item-posts.first-element-posts .article-info.col-xs-8 h3 a { + margin-top: 0 +} + +.flownews-posts-layout5 .item-posts.first-element-posts .article-info.col-xs-8 .article-category { + position: inherit; + margin-top: 10px +} + +.flownews-element-posts.flownews-posts-layout5 .article-category a { + font-size: 13px +} + +.flownews-posts-layout5 .item-posts.first-element-posts .article-info.col-xs-8 .article-category a { + font-size: 10px +} + +.flownews-element-posts.flownews-posts-layout5.flownews-blog-4-col .article-image.col-xs-4,.flownews-element-posts.flownews-posts-layout5.flownews-blog-4-col .article-info.col-xs-8 { + width: 100% +} + +.flownews-element-posts.flownews-posts-layout5.flownews-blog-4-col .article-info.col-xs-8 { + padding: 15px 0!important +} + +@media screen and (max-width: 1000px) { + .flownews-element-posts.flownews-posts-layout5.flownews-blog-2-col .item-posts.first-element-posts.other-rows.col-xs-6 { + width:calc(100% - 25px) + } + + .flownews-element-posts.flownews-posts-layout5.flownews-blog-2-col article.item-posts.first-element-posts:nth-child(5) { + border-top: 1px solid #f4f4f4; + padding-top: 25px; + margin-top: 25px + } +} + +@media screen and (max-width: 700px) { + .flownews-element-posts.flownews-posts-layout5.flownews-blog-2-col,.flownews-element-posts.flownews-posts-layout5.flownews-blog-3-col,.flownews-element-posts.flownews-posts-layout5.flownews-blog-4-col { + margin-left:0; + width: 100% + } + + .flownews-element-posts.flownews-posts-layout5.flownews-blog-1-col article.item-posts.first-element-posts.first-row { + width: 100% + } + + .flownews-element-posts.flownews-posts-layout5 .item-posts.first-element-posts,.flownews-element-posts.flownews-posts-layout5.flownews-blog-1-col .item-posts.first-element-posts.other-rows.col-xs-12 { + width: 100%; + margin: 0 0 25px + } + + .flownews-element-posts.flownews-posts-layout5.flownews-blog-1-col .article-image.col-xs-4 { + width: 100% + } + + .flownews-element-posts.flownews-posts-layout5.flownews-blog-1-col .article-info.col-xs-8 { + padding: 15px 0 0!important; + width: 100% + } + + .flownews-element-posts.flownews-posts-layout5.item-posts.first-element-posts:first-child { + border-top: 0; + padding-top: 0; + margin-top: 0 + } + + .flownews-element-posts.flownews-posts-layout5.flownews-blog-2-col article.item-posts.first-element-posts:nth-child(2) { + border-top: 0; + margin-top: 0; + padding-top: 0; + margin-bottom: 50px + } + + .flownews-element-posts.flownews-posts-layout5 article.item-posts.first-element-posts:nth-child(2),.flownews-element-posts.flownews-posts-layout5.flownews-blog-2-col article.item-posts.first-element-posts:nth-child(5) { + padding-top: 25px; + margin-top: 25px; + border-top: 1px solid #f4f4f4 + } + + .flownews-element-posts.flownews-posts-layout5,.flownews-element-posts.flownews-posts-layout5 .flownews-element-posts-title-box,.flownews-element-posts.flownews-posts-layout5 .item-posts.first-element-posts.col-xs-6 { + width: 100% + } + + .flownews-element-posts.flownews-posts-layout5.flownews-blog-2-col .item-posts.first-element-posts.col-xs-6,.flownews-element-posts.flownews-posts-layout5.flownews-blog-3-col .item-posts.first-element-posts.col-xs-4,.flownews-element-posts.flownews-posts-layout5.flownews-blog-4-col .item-posts.first-element-posts.col-xs-3 { + width: calc(100%) + } + + .flownews-element-posts.flownews-posts-layout5.flownews-blog-4-col article.item-posts.first-element-posts:nth-child(2) { + border-top: 0; + padding-top: 0; + margin-top: 0 + } + + .flownews-element-posts.flownews-posts-layout5.flownews-blog-4-col .col-xs-3 { + position: relative!important; + top: inherit!important + } + + .flownews-element-posts.flownews-posts-layout5.flownews-blog-4-col .item-posts.first-element-posts.other-rows.col-xs-3.masonry-brick { + margin-bottom: 50px + } +} + +.flownews-element-top-content .header-pattern,.flownews-top-content-layout1 .header-pattern { + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00000000', endColorstr='#cc000000', GradientType=0 ); + top: 0 +} + +@media screen and (max-width: 500px) { + .flownews-element-posts.flownews-posts-layout5 article.item-posts.first-element-posts.first-row { + margin-bottom:0 + } + + .flownews-element-posts.flownews-posts-layout5 article.item-posts.first-element-posts.other-rows { + border-top: 1px solid #f4f4f4; + padding-top: 25px; + margin-top: 25px + } + + .flownews-element-posts.flownews-posts-layout5.flownews-blog-2-col .article-image.col-xs-4 { + width: 100% + } + + .flownews-element-posts.flownews-posts-layout5.flownews-blog-2-col .article-info.col-xs-8 { + padding: 15px 0 0!important; + width: 100% + } +} + +@media screen and (max-width: 900px) { + .flownews-element-posts.flownews-posts-layout5.flownews-blog-3-col .item-posts.first-element-posts.col-xs-4 { + width:calc(100% - 25px) + } + + .flownews-element-posts.flownews-posts-layout5.flownews-blog-3-col article.item-posts.first-element-posts.first-row,.flownews-element-posts.flownews-posts-layout5.flownews-blog-3-col article.item-posts.first-element-posts.other-rows { + border-top: 1px solid #f4f4f4; + margin-top: 25px; + padding-top: 25px + } + + .flownews-element-posts.flownews-posts-layout5.flownews-blog-3-col article.item-posts.first-element-posts.first-row:first-child { + border-top: 0; + padding-top: 0; + margin-top: 0 + } +} + +@media screen and (min-width: 1024px) and (max-width:1150px) { + .flownews-element-posts.flownews-posts-layout5.flownews-blog-4-col .article-comments,.flownews-element-posts.flownews-posts-layout5.flownews-blog-4-col .article-separator { + display:none + } +} + +@media screen and (min-width: 701px) and (max-width:1023px) { + .flownews-element-posts.flownews-posts-layout5.flownews-blog-4-col .item-posts.first-element-posts.col-xs-3 { + width:calc(50% - 25px) + } +} + +.flownews-element-top-content:after { + clear: both; + content: ""; + display: block +} + +.flownews-element-top-content { + margin-bottom: 50px +} + +.flownews-element-top-content article { + position: relative; + line-height: 1; + background: #000 +} + +.flownews-element-top-content article h2 { + line-height: 1 +} + +.flownews-element-top-content .article-info { + position: absolute; + bottom: 30px; + left: 30px; + z-index: 2; + margin-left: 0; + transition: all .4s ease 0s; + right: 30px; + max-width: calc(100% - 45px); + max-width: -webkit-calc(100% - 45px); + width: 100% +} + +.flownews-element-top-content article:hover .article-info { + left: 45px; + transition: all .4s ease 0s +} + +.flownews-element-top-content .header-pattern { + background: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,.4) 100%); + background: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,.4) 100%); + background: linear-gradient(to bottom,rgba(0,0,0,0) 0,rgba(0,0,0,.4) 100%); + position: absolute; + left: 0; + width: 100%; + height: 100%; + z-index: 1 +} + +.flownews-element-top-content article img { + opacity: 1; + transition: all .4s ease 0s +} + +.flownews-element-top-content article:hover img { + opacity: .8; + transition: all .4s ease 0s +} + +.flownews-element-top-content .article-info-top { + margin-bottom: 15px +} + +.flownews-element-top-content .article-title { + float: left; + margin: 0 25px 0 0; + line-height: 30px +} + +.flownews-element-top-content .article-title a { + color: #fff; + font-weight: 700; + text-transform: uppercase; + font-size: 30px; + display: block +} + +.flownews-element-top-content .article-title a:hover { + color: #e7685d +} + +.flownews-element-top-content .article-category { + line-height: 30px; + float: left +} + +.flownews-element-top-content .article-category a { + background: #e7685d; + color: #fff; + font-size: 10px; + font-weight: 700; + letter-spacing: 1px; + padding: 6px 10px; + text-transform: uppercase; + display: block; + line-height: 1; + margin-top: 4px +} + +.flownews-element-top-content .article-category a:hover { + background: #c9564c +} + +.flownews-element-top-content .article-comments,.flownews-element-top-content .article-data,.flownews-element-top-content .article-separator { + float: left +} + +.flownews-element-top-content .article-data { + margin-right: 20px +} + +.flownews-element-top-content .article-comments { + margin-left: 20px +} + +.flownews-element-top-content .article-info-bottom { + color: #fff; + font-size: 13px; + margin-right: 20px; + letter-spacing: .4px +} + +.flownews-element-top-content .article-info-bottom i { + margin-right: 10px +} + +.flownews-element-top-content .article-info-bottom a { + color: #FFF +} + +.flownews-element-top-content .article-info-bottom a:hover { + color: #e7685d +} + +.flownews-top-content-layout1 { + height: 400px; + overflow: hidden +} + +.flownews-top-content-layout1 article { + height: 100%; + overflow: hidden; + background: #000 +} + +.flownews-top-content-layout1 article.col-xs-5 { + height: 248px; + max-width: calc(41.66666667% - 4px); + max-width: -webkit-calc(41.66666667% - 4px); + width: 41.66666667%; + margin-left: 4px; + margin-bottom: 4px +} + +.flownews-top-content-layout1 article.col-xs-2 { + height: 150px; + max-width: calc(20.833333335% - 4px); + max-width: -webkit-calc(20.833333335% - 4px); + width: 20.833333335%; + margin-left: 4px +} + +.flownews-top-content-layout1 .article-info { + position: absolute; + bottom: 30px; + left: 30px; + z-index: 2; + margin-left: 0; + transition: all .4s ease 0s; + right: 30px; + max-width: calc(100% - 45px); + max-width: -webkit-calc(100% - 45px); + width: 100% +} + +.flownews-top-content-layout1 article:hover .article-info { + left: 45px; + transition: all .4s ease 0s +} + +.flownews-top-content-layout1 .header-pattern { + background: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,.4) 100%); + background: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,.4) 100%); + background: linear-gradient(to bottom,rgba(0,0,0,0) 0,rgba(0,0,0,.4) 100%); + position: absolute; + left: 0; + width: 100%; + height: 100%; + z-index: 1 +} + +.flownews-top-content-layout1 article img { + opacity: 1; + transition: all .4s ease 0s; + width: 100% +} + +.flownews-top-content-layout1 article:hover img { + opacity: .8; + transition: all .4s ease 0s +} + +.flownews-top-content-layout1 .article-info-top { + margin-bottom: 15px +} + +.flownews-top-content-layout1 .article-title { + float: left; + margin: 0 25px 0 0; + line-height: 30px +} + +.flownews-top-content-layout1 .article-title a { + color: #fff; + font-weight: 700; + text-transform: uppercase; + font-size: 30px; + display: block +} + +.flownews-top-content-layout1 .article-title a:hover { + color: #e7685d +} + +.flownews-top-content-layout1 .article-category { + line-height: 30px; + float: left +} + +.flownews-top-content-layout1 .article-category a { + background: #e7685d; + color: #fff; + font-size: 10px; + font-weight: 700; + letter-spacing: 1px; + padding: 6px 10px; + text-transform: uppercase; + display: block; + line-height: 1; + margin-top: 5px +} + +.flownews-top-content-layout1 .article-category a:hover { + background: #c9564c +} + +.flownews-top-content-layout1 .article-comments,.flownews-top-content-layout1 .article-data,.flownews-top-content-layout1 .article-separator { + float: left +} + +.flownews-top-content-layout1 .article-data { + margin-right: 20px +} + +.flownews-top-content-layout1 .article-comments { + margin-left: 20px +} + +.flownews-top-content-layout1 .article-info-bottom { + color: #fff; + font-size: 13px; + margin-right: 20px; + letter-spacing: .4px +} + +.flownews-top-content-layout1 .article-info-bottom i { + margin-right: 10px +} + +.flownews-top-content-layout1 .article-info-bottom a { + color: #FFF +} + +.flownews-top-content-layout1 .article-info-bottom a:hover { + color: #e7685d +} + +.flownews-top-content-layout1 .second-element-header .article-title { + line-height: 22px +} + +.flownews-top-content-layout1 .second-element-header .article-title a { + font-size: 22px +} + +.flownews-top-content-layout1 .second-element-header .article-category a { + margin-top: 3px; + padding: 4px 10px +} + +.flownews-top-content-layout1 .others-element-header .article-title { + line-height: 16px +} + +.flownews-top-content-layout1 .others-element-header .article-title a { + font-size: 16px +} + +.flownews-top-content-layout1 .others-element-header .article-category a { + padding: 3px 10px; + margin-top: 7px; + font-size: 8px +} + +@media screen and (max-width: 1200px) { + .flownews-top-content-layout1 { + height:350px + } + + .flownews-top-content-layout1 article.col-xs-5 { + height: 220px + } + + .flownews-top-content-layout1 article.col-xs-2 { + height: 130px + } +} + +@media screen and (max-width: 1150px) { + .flownews-top-content-layout1 { + height:300px + } + + .flownews-top-content-layout1 article.col-xs-5 { + height: 180px + } + + .flownews-top-content-layout1 article.col-xs-2 { + height: 120px + } + + .flownews-top-content-layout1 .others-element-header .article-info-bottom { + display: none + } +} + +@media screen and (min-width: 1000px) and (max-width:1150px) { + .flownews-top-content-layout1 .others-element-header .article-info { + bottom:0 + } +} + +@media screen and (min-width: 810px) and (max-width:1000px) { + .flownews-top-content-layout1 .others-element-header .article-category a,.flownews-top-content-layout1 .others-element-header .article-info-bottom,.flownews-top-content-layout1 .second-element-header .article-comments,.flownews-top-content-layout1 .second-element-header .article-separator { + display:none + } + + .flownews-top-content-layout1 { + height: 250px + } + + .flownews-top-content-layout1 article.col-xs-5 { + height: 150px + } + + .flownews-top-content-layout1 article.col-xs-2 { + height: 100px + } + + .flownews-top-content-layout1 .article-info { + position: absolute; + bottom: 10px; + left: 10px; + z-index: 2; + margin-left: 0; + transition: all .4s ease 0s; + right: 50px + } + + .flownews-top-content-layout1 article:hover .article-info { + left: 10px; + transition: all .4s ease 0s + } +} + +@media screen and (min-width: 650px) and (max-width:810px) { + .flownews-top-content-layout1 { + height:200px + } + + .flownews-top-content-layout1 article.col-xs-5 { + height: 130px + } + + .flownews-top-content-layout1 article.col-xs-2 { + height: 70px + } + + .flownews-top-content-layout1 .article-info { + position: absolute; + bottom: 10px; + left: 10px; + z-index: 2; + margin-left: 0; + right: 50px + } + + .flownews-top-content-layout1 article:hover .article-info { + left: 10px + } + + .flownews-top-content-layout1 .first-element-header .article-info-bottom,.flownews-top-content-layout1 .others-element-header .article-category a,.flownews-top-content-layout1 .others-element-header .article-info-bottom,.flownews-top-content-layout1 .second-element-header .article-category a,.flownews-top-content-layout1 .second-element-header .article-info-bottom { + display: none + } + + .flownews-top-content-layout1 .second-element-header .article-title { + line-height: 14px + } + + .flownews-top-content-layout1 .second-element-header .article-title a { + font-size: 14px + } + + .flownews-top-content-layout1 .others-element-header .article-title { + line-height: 10px + } + + .flownews-top-content-layout1 .others-element-header .article-title a { + font-size: 10px + } +} + +@media screen and (max-width: 650px) { + .flownews-top-content-layout1 .first-element-header .article-info-bottom,.flownews-top-content-layout1 .others-element-header .article-category a,.flownews-top-content-layout1 .others-element-header .article-info-bottom,.flownews-top-content-layout1 .second-element-header .article-category a,.flownews-top-content-layout1 .second-element-header .article-info-bottom { + display:none + } +} + +@media screen and (min-width: 530px) and (max-width:650px) { + .flownews-top-content-layout1 .others-element-header .article-title,.flownews-top-content-layout1 .second-element-header .article-title { + line-height:10px + } + + .flownews-top-content-layout1 .others-element-header .article-title a,.flownews-top-content-layout1 .second-element-header .article-title a { + font-size: 10px + } + + .flownews-top-content-layout1 .article-info { + position: absolute; + bottom: 10px; + left: 10px; + z-index: 2; + margin-left: 0; + right: 50px + } + + .flownews-top-content-layout1 article:hover .article-info { + left: 10px + } + + .flownews-top-content-layout1 { + height: auto + } + + .flownews-top-content-layout1 .col-xs-7 { + width: 100%; + height: 250px; + margin-bottom: 4px + } + + .flownews-top-content-layout1 article.col-xs-5 { + width: 34%; + max-width: 34%; + margin-left: 0; + height: 80px + } + + .flownews-top-content-layout1 article.col-xs-2 { + max-width: calc(33% - 4px); + max-width: -webkit-calc(33% - 4px); + width: 33%; + margin-left: 4px; + height: 80px + } + + .flownews-top-content-layout1 .first-element-header .article-info-bottom,.flownews-top-content-layout1 .others-element-header .article-category a,.flownews-top-content-layout1 .others-element-header .article-info-bottom,.flownews-top-content-layout1 .second-element-header .article-category a,.flownews-top-content-layout1 .second-element-header .article-info-bottom { + display: none + } +} + +@media screen and (min-width: 400px) and (max-width:529px) { + .flownews-top-content-layout1 .article-info { + position:absolute; + bottom: 10px; + left: 10px; + z-index: 2; + margin-left: 0; + right: 50px + } + + .flownews-top-content-layout1 article:hover .article-info { + left: 10px + } + + .flownews-top-content-layout1 { + height: auto + } + + .flownews-top-content-layout1 .col-xs-7 { + width: 100%; + height: 200px; + margin-bottom: 4px + } + + .flownews-top-content-layout1 article.col-xs-5 { + width: 100%; + max-width: 100%; + height: 150px; + margin-bottom: 4px; + margin-left: 0; + margin-right: 0 + } + + .flownews-top-content-layout1 article.col-xs-2 { + max-width: calc(50% - 2px); + max-width: -webkit-calc(50% - 2px); + width: 50%; + height: 100px; + margin-right: 2px; + margin-left: 0 + } + + .flownews-top-content-layout1 article.col-xs-2:last-child { + margin-left: 2px; + margin-right: 0 + } + + .flownews-top-content-layout1 .others-element-header .article-category a,.flownews-top-content-layout1 .others-element-header .article-info-bottom { + display: none + } + + .flownews-top-content-layout1 .second-element-header .article-title { + line-height: 22px + } + + .flownews-top-content-layout1 .second-element-header .article-title a { + font-size: 22px + } + + .flownews-top-content-layout1 .others-element-header .article-title { + line-height: 10px + } + + .flownews-top-content-layout1 .others-element-header .article-title a { + font-size: 10px + } +} + +@media screen and (max-width: 399px) { + .flownews-top-content-layout1 { + height:auto + } + + .flownews-top-content-layout1 .col-xs-7,.flownews-top-content-layout1 article.col-xs-2,.flownews-top-content-layout1 article.col-xs-5 { + width: 100%; + max-width: 100%; + height: auto; + margin: 0 0 4px + } + + .flownews-top-content-layout1 .article-title { + float: none + } + + .flownews-top-content-layout1 .first-element-header .article-title a,.flownews-top-content-layout1 .second-element-header .article-title a { + font-size: 16px; + line-height: 16px + } + + .flownews-top-content-layout1 .article-category a { + padding: 3px 10px; + margin-top: 7px; + font-size: 8px; + display: block + } + + .flownews-top-content-layout1 .article-info-bottom { + display: none + } +} + +.flownews-top-content-layout2 .first-element-header { + height: 400px; + overflow: hidden; + margin-bottom: 6px +} + +.flownews-top-content-layout2 .others-element-header { + width: 33.33333333%; + max-width: calc(33.33333333% - 4px); + max-width: -webkit-calc(33.33333333% - 4px) +} + +.flownews-top-content-layout2 article:nth-child(2) { + margin-right: 4px +} + +.flownews-top-content-layout2 article:nth-child(3) { + margin-right: 2px; + margin-left: 2px +} + +.flownews-top-content-layout2 article:last-child { + margin-left: 4px +} + +.flownews-top-content-layout2 .first-element-header img { + position: relative; + top: 50%; + transform: translateY(-50%) +} + +.flownews-top-content-layout2 .first-element-header .article-title a { + font-size: 42px; + line-height: 42px +} + +.flownews-top-content-layout2 .first-element-header .article-category a { + margin-top: 8px; + padding: 10px 15px +} + +.flownews-top-content-layout2 .others-element-header .article-title { + line-height: 22px +} + +.flownews-top-content-layout2 .others-element-header .article-title a { + font-size: 22px +} + +.flownews-top-content-layout2 .others-element-header .article-category a { + margin-top: 3px; + padding: 4px 10px +} + +@media screen and (max-width: 1100px) { + .flownews-top-content-layout2 .others-element-header .article-separator { + display:none + } + + .flownews-top-content-layout2 .others-element-header .article-comments,.flownews-top-content-layout2 .others-element-header .article-data { + float: none; + display: block; + margin: 0 + } + + .flownews-top-content-layout2 .others-element-header .article-comments { + margin-top: 3px + } +} + +@media screen and (min-width: 550px) and (max-width:900px) { + .flownews-top-content-layout2 .first-element-header { + height:300px + } + + .flownews-top-content-layout2 .others-element-header .article-title { + line-height: 15px + } + + .flownews-top-content-layout2 .others-element-header .article-title a { + font-size: 15px + } + + .flownews-top-content-layout2 .others-element-header .article-category a { + padding: 3px 10px; + margin-top: 8px + } + + .flownews-top-content-layout2 .others-element-header .article-category a,.flownews-top-content-layout2 .others-element-header .article-info-bottom { + display: none + } +} + +@media screen and (max-width: 549px) { + .flownews-top-content-layout2 { + height:auto + } + + .flownews-top-content-layout2 .col-xs-12,.flownews-top-content-layout2 article.col-xs-4 { + width: 100%; + max-width: 100%; + height: auto; + margin: 0 0 4px + } + + .flownews-top-content-layout2 .first-element-header img { + top: 0; + transform: translateY(0) + } + + .flownews-top-content-layout2 .article-title { + float: none + } + + .flownews-top-content-layout2 .first-element-header .article-title a,.flownews-top-content-layout2 .others-element-header .article-title a { + font-size: 16px; + line-height: 16px + } + + .flownews-top-content-layout2 .article-category a,.flownews-top-content-layout2 .first-element-header .article-category a { + padding: 3px 10px; + margin-top: 7px; + font-size: 8px; + display: block + } + + .flownews-top-content-layout2 .article-info-bottom { + display: none + } +} + +.flownews-top-content-layout3 .first-element-header { + height: 500px; + overflow: hidden; + margin-bottom: 6px +} + +.flownews-top-content-layout3 .others-element-header { + width: 33.33333333%; + max-width: calc(33.33333333% - 4px); + max-width: -webkit-calc(33.33333333% - 4px); + height: 100px; + overflow: hidden; + background: #ececec +} + +.flownews-top-content-layout3 article:nth-child(2) { + margin-right: 4px +} + +.flownews-top-content-layout3 article:nth-child(3) { + margin-right: 2px; + margin-left: 2px +} + +.flownews-top-content-layout3 article:last-child { + margin-left: 4px +} + +.flownews-top-content-layout3 .first-element-header img { + position: relative; + top: 50%; + transform: translateY(-50%) +} + +.flownews-top-content-layout3 .first-element-header .article-title a { + font-size: 42px; + line-height: 42px; + margin-right: 10px +} + +.flownews-top-content-layout3 .first-element-header .article-category a { + margin-top: 8px; + padding: 10px +} + +.flownews-top-content-layout3 .others-element-header img { + width: 40%; + float: left; + position: relative; + top: 50%; + transform: translateY(-50%) +} + +.flownews-top-content-layout3 article.others-element-header:hover img { + opacity: 1 +} + +.flownews-top-content-layout3 .others-element-header .article-info-type3 { + width: 60%; + float: left; + padding: 20px; + box-sizing: border-box; + height: 100% +} + +.flownews-top-content-layout3 .others-element-header .article-info-type3 .article-info-top { + height: 100%; + overflow: hidden +} + +.flownews-top-content-layout3 .others-element-header .article-title { + line-height: 18px; + width: 100% +} + +.flownews-top-content-layout3 .others-element-header .article-title a { + font-size: 18px; + color: #333; + white-space: nowrap; + width: 95%; + overflow: hidden; + text-overflow: ellipsis +} + +.flownews-top-content-layout3 .others-element-header .article-title a:hover { + color: #c9564c +} + +.flownews-top-content-layout3 .others-element-header .article-category a { + padding: 3px 10px; + margin-top: 8px +} + +@media screen and (min-width: 800px) and (max-width:900px) { + .flownews-top-content-layout3 .first-element-header { + height:300px + } + + .flownews-top-content-layout3 .others-element-header { + height: 80px + } + + .flownews-top-content-layout3 .others-element-header .article-title { + line-height: 14px + } + + .flownews-top-content-layout3 .others-element-header .article-title a { + font-size: 14px + } +} + +@media screen and (max-width: 900px) { + .flownews-top-content-layout3 .others-element-header .article-title { + margin-bottom:0 + } +} + +@media screen and (max-width: 799px) { + .flownews-top-content-layout3 .first-element-header { + height:auto + } + + .flownews-top-content-layout3 .first-element-header img { + top: 0; + transform: translateY(0) + } + + .flownews-top-content-layout3 article.col-xs-4 { + width: 100%; + max-width: 100%; + height: auto; + margin: 0 0 4px + } + + .flownews-top-content-layout3 .others-element-header img { + float: none; + width: 100%; + top: 0; + transform: translateY(0) + } + + .flownews-top-content-layout3 .others-element-header .article-info-type3 { + float: none; + width: 100% + } + + .flownews-top-content-layout3 .others-element-header .article-title { + float: none; + margin: 0 + } + + .flownews-vc-element-header .article-info-top { + margin: 0 + } + + .flownews-top-content-layout3 .first-element-header .article-info-bottom { + display: none + } +} + +.flownews-top-content-layout4.owl-carousel .owl-controls { + opacity: 0; + transition: opacity .3s ease 0s; + height: 0; + margin: 0 +} + +.flownews-top-content-layout4 .article-info-top h2 { + margin-bottom: 0 +} + +.flownews-top-content-layout4 .article-title a { + margin-right: 10px +} + +.flownews-top-content-layout4.owl-carousel:hover .owl-controls { + opacity: 1; + transition: opacity .3s ease 0s +} + +.flownews-top-content-layout4 .owl-controls i { + background: #fff; + font-size: 20px; + line-height: 20px; + margin-top: -10px; + padding: 10px; + position: absolute; + top: 50%; + width: 40px +} + +.flownews-top-content-layout4 .owl-prev i { + left: 0 +} + +.flownews-top-content-layout4 .owl-next i { + right: 0 +} + +.flownews-top-content-layout4.owl-theme .owl-controls .owl-nav [class*=owl-] { + background: 0 0 +} + +.flownews-top-content-layout4 .owl-controls i,.flownews-top-content-layout4 .owl-controls i:hover { + transition: all .3s ease 0s +} + +@media screen and (max-width: 600px) { + .flownews-top-content-layout4 .article-title { + float:none + } + + .flownews-top-content-layout4 .first-element-header .article-title a { + font-size: 16px; + line-height: 16px + } + + .flownews-top-content-layout4 .article-category a { + padding: 3px 10px; + margin-top: 7px; + font-size: 8px; + display: block + } + + .flownews-top-content-layout4 .article-info-bottom { + display: none + } +} + +@media screen and (max-width: 800px) { + .flownews-top-content-layout4 .first-element-header .article-info-bottom { + display:none + } +} + +.flownews-top-content-layout5 { + height: 400px; + overflow: hidden +} + +.flownews-top-content-layout5 article { + height: 100%; + overflow: hidden; + background: #000 +} + +.flownews-top-content-layout5 article.col-xs-5 { + height: 198px; + max-width: calc(41.66666667% - 4px); + max-width: -webkit-calc(41.66666667% - 4px); + width: 41.66666667%; + margin-left: 4px; + margin-bottom: 4px +} + +.flownews-top-content-layout5 .second-element-header img { + width: 100% +} + +.flownews-element-top-content.flownews-top-content-layout5 .article-category a { + margin-top: 5px; + padding: 6px 10px +} + +.flownews-element-top-content.flownews-top-content-layout5 .article-info-top h2 { + margin-right: 10px; + margin-bottom: 5px +} + +@media screen and (max-width: 1200px) { + .flownews-top-content-layout5 { + height:350px + } + + .flownews-top-content-layout5 article.col-xs-5 { + height: 175px + } +} + +@media screen and (max-width: 1100px) { + .flownews-element-top-content.flownews-top-content-layout5 .article-category a { + display:inherit + } + + .flownews-element-top-content.flownews-top-content-layout5 .article-title { + float: none + } + + .flownews-top-content-layout5 { + height: 300px + } + + .flownews-top-content-layout5 article.col-xs-5 { + height: 150px + } + + .flownews-top-content-layout5 .second-element-header .article-info-bottom { + display: none + } + + .flownews-top-content-layout5 .second-element-header .article-title { + line-height: 20px + } + + .flownews-top-content-layout5 .second-element-header .article-title a { + font-size: 20px + } +} + +@media screen and (min-width: 650px) and (max-width:810px) { + .flownews-top-content-layout5 { + height:200px + } + + .flownews-top-content-layout5 article.col-xs-5 { + height: 100px + } + + .flownews-top-content-layout5 .article-info { + position: absolute; + bottom: 10px; + left: 10px; + z-index: 2; + margin-left: 0; + right: 50px + } + + .flownews-top-content-layout5 article:hover .article-info { + left: 10px + } + + .flownews-top-content-layout5 .second-element-header .article-category a,.flownews-top-content-layout5 .second-element-header .article-info-bottom { + display: none + } + + .flownews-top-content-layout5 .second-element-header .article-title { + line-height: 14px + } + + .flownews-top-content-layout5 .second-element-header .article-title a { + font-size: 14px + } +} + +@media screen and (max-width: 805px) { + .flownews-top-content-layout5 .first-element-header .article-info-bottom { + display:none + } +} + +@media screen and (min-width: 530px) and (max-width:650px) { + .flownews-top-content-layout5 .article-info-bottom,.flownews-top-content-layout5 .second-element-header .article-category a,.flownews-top-content-layout5 .second-element-header .article-info-bottom { + display:none + } + + .flownews-top-content-layout5 .article-info { + position: absolute; + bottom: 10px; + left: 10px; + z-index: 2; + margin-left: 0; + right: 50px + } + + .flownews-top-content-layout5 article:hover .article-info { + left: 10px + } + + .flownews-top-content-layout5 { + height: auto + } + + .flownews-top-content-layout5 .col-xs-7 { + width: 100%; + height: 250px; + margin-bottom: 4px + } + + .flownews-top-content-layout5 article.col-xs-5 { + max-width: calc(50% - 2px); + max-width: -webkit-calc(50% - 2px); + width: 50%; + margin-right: 2px; + margin-left: 0; + height: 80px + } + + .flownews-top-content-layout5 article.col-xs-5:last-child { + margin-left: 2px; + margin-right: 0 + } + + .flownews-top-content-layout5 .second-element-header .article-title { + line-height: 10px + } + + .flownews-top-content-layout5 .second-element-header .article-title a { + font-size: 10px + } +} + +@media screen and (min-width: 400px) and (max-width:529px) { + .flownews-top-content-layout5 .article-info { + position:absolute; + bottom: 10px; + left: 10px; + z-index: 2; + margin-left: 0; + right: 50px + } + + .flownews-top-content-layout5 article:hover .article-info { + left: 10px + } + + .flownews-top-content-layout5 { + height: auto + } + + .flownews-top-content-layout5 .col-xs-7 { + width: 100%; + height: 200px; + margin-bottom: 4px + } + + .flownews-top-content-layout5 article.col-xs-5 { + width: 100%; + max-width: 100%; + height: 150px; + margin-bottom: 4px; + margin-left: 0; + margin-right: 0 + } + + .flownews-top-content-layout5 .second-element-header .article-title { + line-height: 22px + } + + .flownews-top-content-layout5 .second-element-header .article-title a { + font-size: 22px + } + + .flownews-top-content-layout5 .article-info-bottom { + display: none + } +} + +@media screen and (max-width: 399px) { + .flownews-top-content-layout5 { + height:auto + } + + .flownews-top-content-layout5 .col-xs-7,.flownews-top-content-layout5 article.col-xs-2,.flownews-top-content-layout5 article.col-xs-5 { + width: 100%; + max-width: 100%; + height: auto; + margin: 0 0 4px + } + + .flownews-top-content-layout5 .article-title { + float: none + } + + .flownews-top-content-layout5 .first-element-header .article-title a,.flownews-top-content-layout5 .second-element-header .article-title a { + font-size: 16px; + line-height: 16px + } + + .flownews-top-content-layout5 .article-category a { + padding: 3px 10px; + margin-top: 7px; + font-size: 8px; + display: block + } + + .flownews-top-content-layout5 .article-info-bottom { + display: none + } +} + +.flownews-top-content-layout6 .item-header { + height: 500px; + overflow: hidden +} + +.flownews-element-top-content.flownews-top-content-layout6 .article-info { + top: 50%; + left: 50%; + bottom: inherit; + -webkit-transform: translate(-50%,-50%); + -moz-transform: translate(-50%,-50%); + -ms-transform: translate(-50%,-50%); + -o-transform: translate(-50%,-50%); + transform: translate(-50%,-50%); + text-align: center; + text-transform: uppercase +} + +.flownews-element-top-content.flownews-top-content-layout6 article:hover .article-info { + left: 50% +} + +.flownews-element-top-content.flownews-top-content-layout6 .article-comments,.flownews-element-top-content.flownews-top-content-layout6 .article-data,.flownews-element-top-content.flownews-top-content-layout6 .article-features-category,.flownews-element-top-content.flownews-top-content-layout6 .article-separator,.flownews-element-top-content.flownews-top-content-layout6 .article-title { + float: none; + display: inline-block +} + +.flownews-element-top-content.flownews-top-content-layout6 .article-comments { + margin-right: 20px +} + +.flownews-element-top-content.flownews-top-content-layout6 .article-features-category { + margin-left: 20px +} + +@media screen and (max-width: 850px) { + .flownews-top-content-layout6 .item-header { + height:300px; + overflow: hidden + } + + .flownews-element-top-content.flownews-top-content-layout6 .article-title a { + font-size: 16px + } + + .flownews-element-top-content.flownews-top-content-layout6 .article-info-bottom { + font-size: 12px + } +} + +@media screen and (max-width: 550px) { + .flownews-top-content-layout6 .item-header { + height:200px; + overflow: hidden + } + + .flownews-element-top-content.flownews-top-content-layout6 .article-title a { + font-size: 13px + } + + .flownews-element-top-content.flownews-top-content-layout6 .article-info-bottom { + font-size: 10px + } + + .flownews-element-top-content.flownews-top-content-layout6 .article-info-bottom .article-comments,.flownews-element-top-content.flownews-top-content-layout6 .article-info-bottom div:nth-child(4) { + display: none + } +} + +.flownews-footer-wrap .flownews-footer-top,.flownews-footer-wrap .flownews-wrap-container { + background: #282828 +} + +.flownews-footer-top .flownews_widget.fnwp_social .box_social,.flownews-footer-top .flownews_widget.fnwp_tab .box_tag,.flownews-footer-top .flownews_widget.fnwp_tag .box_tag { + background: 0 0 +} + +.flownews-footer-wrap .flownews-footer-top .flownews-wrap-container { + padding: 50px +} + +.flownews-footer-wrap .flownews-footer-top .widget li { + padding: 0 +} + +.flownews-footer-top .col-xs-4:nth-child(1) { + margin-right: 34px; + max-width: calc(33.3333% - 34px); + max-width: -web-kit(33.3333% - 34px) +} + +.flownews-footer-top .col-xs-4:nth-child(3) { + margin-left: 34px; + width: calc(33.3333% - 34px); + max-width: -web-kit(33.3333% - 34px) +} + +.flownews-footer-top .col-xs-4:nth-child(2) { + margin: 0 16px; + width: calc(33.33333333% - 32px); + max-width: -web-kit(33.3333% - 34px) +} + +.flownews-posts-content-embed-wrap-post-layout-1 iframe,.flownews-posts-content-embed-wrap-post-layout-2 iframe,.flownews-posts-content-embed-wrap-post-layout-3 iframe { + max-width: 100% +} + +.flownews-footer-top h3.widget-title,.flownews-footer-top h3.widget-title a { + border-bottom: 0!important; + border-right: 0!important; + border-top: 0!important; + color: #fff; + font-size: 20px; + font-weight: 400; + height: auto; + letter-spacing: 1.5px; + margin: 0 0 25px; + position: relative; + text-align: left; + text-transform: uppercase +} + +.flownews-footer-top .flownews_widget.fnwp_archivies .box_archivies .box_archivies_item,.flownews-footer-top .flownews_widget.fnwp_categories .box_categories .cat-item,.flownews-footer-top .widget.widget_nav_menu .menu-item,.flownews-footer-wrap .flownews-footer-top .widget li { + border-bottom: 1px solid #454545 +} + +.flownews-footer-top .widget.widget_nav_menu .menu-item,.flownews-footer-wrap .flownews-footer-top .widget li { + padding-bottom: 15px; + margin-bottom: 15px +} + +.flownews-footer-top .flownews_widget.fnwp_archivies .box_archivies .box_archivies_item,.flownews-footer-top .flownews_widget.fnwp_archivies a,.flownews-footer-top .flownews_widget.fnwp_categories .box_categories .cat-item,.flownews-footer-top .flownews_widget.fnwp_categories a,.flownews-footer-top .widget.widget_nav_menu .menu-item a,.flownews-footer-wrap .flownews-footer-top .widget li a { + color: #fff; + font-size: 12px; + font-weight: 400; + letter-spacing: 1.5px; + text-transform: uppercase; + transition: color .3s ease 0s +} + +.flownews-footer-top .flownews_widget.fnwp_archivies .box_archivies .box_archivies_item:hover,.flownews-footer-top .flownews_widget.fnwp_archivies a:hover,.flownews-footer-top .widget.widget_nav_menu .menu-item a:hover,.flownews-footer-wrap .flownews-footer-top .widget li a:hover { + color: #e7685d; + transition: color .3s ease 0s +} + +.flownews-footer-top .sub-menu,.flownews-footer-wrap .flownews-footer-top .widget li ul.children { + margin-left: 25px; + margin-top: 25px +} + +.flownews-footer-top #wp-calendar { + text-align: center; + width: 100%; + color: #fff +} + +.flownews-footer-top #wp-calendar caption,.flownews-footer-top #wp-calendar th { + text-align: center +} + +.flownews-footer-top .calendar_wrap tr { + margin-bottom: 5px; + padding-bottom: 5px +} + +.flownews-footer-top caption { + border: 1px solid #454545; + color: #fff; + font-size: 16px; + font-weight: 700; + letter-spacing: 1.5px; + margin: 0 0 25px; + padding: 12px; + text-transform: uppercase +} + +.flownews-footer-top .calendar_wrap td { + padding: 10px 0 +} + +.flownews-footer-top .flownews_widget.fnwp_mega_posts .box_post,.flownews-footer-top .flownews_widget.fnwp_tab .box_post { + border-bottom: 1px solid #454545; + padding: 10px 0 +} + +.flownews-footer-top .flownews_widget.fnwp_mega_posts .box_post:first-child,.flownews-footer-top .flownews_widget.fnwp_tab .box_post:first-child { + padding-top: 0 +} + +.flownews-footer-top .flownews_widget.fnwp_mega_posts .box_post:last-child,.flownews-footer-top .flownews_widget.fnwp_tab .box_post:last-child { + padding-bottom: 0; + border-bottom: 0 +} + +.flownews-footer-top .flownews_widget.fnwp_mega_posts .container_post.ad_one_one .box-info h4 a,.flownews-footer-top .flownews_widget.fnwp_tab .container_post.ad_one_one .box-info h4 a { + color: #fff; + font-weight: 400; + transition: color .3s ease 0s +} + +.flownews-footer-top .flownews_widget.fnwp_mega_posts .container_post.ad_one_one .box-info h4 a:hover,.flownews-footer-top .flownews_widget.fnwp_tab .container_post.ad_one_one .box-info h4 a:hover { + color: #e7685d; + transition: color .3s ease 0s +} + +.flownews-footer-top .widget_author .ab-image img { + float: left; + margin-right: 15px; + width: 40% +} + +.flownews-footer-top .about-me .ad-text { + text-align: left; + padding: 0 +} + +.flownews-footer-top .about-me .ad-text p { + color: #b9b9b9; + font-size: 14px +} + +.flownews_widget_contact .flownews-widget-contact-image img { + height: 40px; + margin-bottom: 16px +} + +.flownews_widget_contact .flownews-widget-contact-text { + border-bottom: 1px solid #333; + margin-bottom: 21px; + padding-bottom: 21px +} + +.flownews_widget_contact .flownews-widget-contact-address-title h4 { + color: #fff; + font-size: 22px; + margin-bottom: 16px +} + +.flownews-widget-contact-address,.flownews-widget-contact-cell-number,.flownews-widget-contact-mail,.flownews-widget-contact-tel-number { + font-weight: 300; + letter-spacing: .5px; + margin-bottom: 10px +} + +.flownews-footer-top .widget_search input,.flownews-widget-contact-cell-number i { + margin-bottom: 0 +} + +.flownews-widget-contact-address i,.flownews-widget-contact-cell-number i,.flownews-widget-contact-mail i,.flownews-widget-contact-tel-number i { + color: #fff; + margin-right: 10px +} + +.flownews-footer-top .flownews_widget.fnwp_mega_posts .img-post.ad_one_third,.flownews-footer-top .flownews_widget.fnwp_tab .img-post.ad_one_third { + width: 30% +} + +.flownews-footer-top .flownews_widget.fnwp_mega_posts .container_post.ad_one_one .box-info.ad_two_third,.flownews-footer-top .flownews_widget.fnwp_tab .container_post.ad_one_one .box-info.ad_two_third { + width: 70% +} + +.flownews-footer-top .flownews_widget.fnwp_tab .content_tag,.flownews-footer-top .flownews_widget.fnwp_tag .content_tag { + border: 1px solid #454545; + transition: all .3s ease 0s +} + +.flownews-footer-top .flownews_widget.fnwp_tab .content_tag a,.flownews-footer-top .flownews_widget.fnwp_tag .content_tag a { + color: #fff; + letter-spacing: 1.5px; + transition: all .3s ease 0s +} + +.flownews-footer-top .flownews_widget.fnwp_tab .content_tag:hover a,.flownews-footer-top .flownews_widget.fnwp_tag .content_tag:hover a { + color: #fff; + transition: all .3s ease 0s +} + +.flownews-footer-top .flownews_widget.fnwp_tab .content_tag:hover,.flownews-footer-top .flownews_widget.fnwp_tag .content_tag:hover { + border: 1px solid #e7685d; + transition: all .3s ease 0s +} + +.flownews-footer-top .flownews_widget.fnwp_social .box-icon-social.flownews-widget-social-style1 a { + color: #fff; + font-size: 26px; + left: 50%; + margin-left: -13px; + margin-top: -13px; + position: absolute; + top: 50%; + z-index: 3; + transition: top .3s ease 0s +} + +.flownews-footer-top .flownews_widget.fnwp_social .box-icon-social.ad_one_third { + height: 100px +} + +.flownews-footer-top .flownews_widget.fnwp_social .box-icon-social:hover a { + top: 40%; + transition: top .3s ease 0s +} + +.flownews-footer-top .widget.widget_meta li a { + color: #fff; + transition: color .3s ease 0s +} + +.flownews-footer-top .widget.widget_meta li a:hover { + color: #e7685d; + transition: color .3s ease 0s +} + +.flownews-footer-top .widget.widget_meta ul li { + border-bottom: 1px solid #454545; + box-sizing: border-box; + color: #333; + display: inline-block; + font-size: 14px; + letter-spacing: 1px; + padding: 15px 0; + transition: background .3s ease 0s; + width: 100% +} + +.flownews-footer-top .widget.widget_meta ul li:first-child { + padding-top: 0 +} + +.flownews-footer-top .widget.widget_meta ul li:last-child { + padding-bottom: 0; + border-bottom: 0 +} + +.flownews-footer-top .fnwp_tab h3.widget-title { + border: 1px solid #454545; + font-size: 14px; + line-height: 1 +} + +.flownews-footer-top .fnwp_tab .fnwp_title_popular,.flownews-footer-top .fnwp_tab .fnwp_title_recent,.flownews-footer-top .fnwp_tab .fnwp_title_tag { + border-right: 1px solid #454545; + cursor: pointer; + display: inline-block; + line-height: 1; + margin-right: 0; + padding: 8px; + position: relative; + transition: all .3s ease 0s +} + +.flownews-footer-top .fnwp_tab span:last-child { + border-right: 0; + margin-right: 0 +} + +.flownews-footer-top .fnwp_tab span:hover { + background: #e7685d; + transition: all .3s ease 0s +} + +.flownews-footer-top .flownews_widget.fnwp_tab .fnwp_tab_active { + background: #e7685d!important; + color: #fff!important +} + +.flownews-footer-top .widget.widget_recent_comments { + color: #fff; + letter-spacing: 1px +} + +.flownews-footer-top .widget label { + background: #FFF; + display: block +} + +.flownews-footer-top .widget.widget_search label { + width: 70% +} + +.flownews-footer-top .widget select { + background: #fff; + border: 1px solid #f4f4f4; + letter-spacing: 1px; + max-width: 100%; + padding: 10px; + width: 100% +} + +.flownews-footer-top .post-password-form input,.flownews-footer-top .widget_search input { + border: 0; + font-weight: 100; + height: 35px; + padding: 5px 7px; + text-align: left; + width: 100% +} + +.flownews-footer-top .search-form .search-submit { + background: #e7685d; + color: #fff; + text-align: center; + width: 28%; + font-weight: 700; + transition: all .3s ease 0s +} + +.flownews-footer-top .search-form .search-submit:hover { + background: #c9564c!important; + transition: all .3s ease 0s +} + +.flownews-footer-top .search-form .screen-reader-text { + display: none +} + +.flownews-footer-top .widget_search input.search-submit:hover { + background: #9c8156; + color: #FFF +} + +.flownews-footer-top .widget_search label { + display: inline-block +} + +.flownews-footer-top .widget_tag_cloud .tagcloud a { + color: #fff; + font-weight: 400 +} + +.flownews-footer-top .widget_text .textwidget { + color: #b9b9b9; + font-weight: 100; + letter-spacing: .5px; + line-height: 24px; + margin: 0 +} + +.flownews-footer-top .widget_flownews_instagram .instagram-image a { + width: 25%; + height: auto; + opacity: 1; + transition: all .3s ease 0s; + background: #000; + display: inline-block +} + +.flownews-footer-top .widget_flownews_instagram .instagram-image a:hover { + opacity: .7; + transition: all .3s ease 0s +} + +.flownews-footer-bottom,.flownews-footer-bottom .flownews-wrap-container { + background: #000 +} + +.flownews-footer-bottom .flownews-footer-social a { + font-size: 12px; + color: #b9b9b9; + line-height: 32px; + padding: 0 10px +} + +.flownews-footer-bottom .flownews-footer-social a:first-child { + padding-left: 0 +} + +.flownews-footer-bottom .flownews-footer-social a:last-child { + padding-right: 0 +} + +.flownews-footer-bottom .col-xs-12,.flownews-footer-bottom .col-xs-4,.flownews-footer-bottom .col-xs-6 { + padding: 5px 0; + font-size: 12px; + letter-spacing: 1px; + line-height: 32px; + text-align: center +} + +.flownews-footer-bottom .col-xs-4:nth-child(1) { + text-align: left +} + +.flownews-footer-bottom .col-xs-4:nth-child(2) { + color: #b9b9b9; + font-size: 12px; + letter-spacing: 1px; + line-height: 32px; + text-align: center; + border-left: 1px solid #282828; + border-right: 1px solid #282828 +} + +.flownews-footer-bottom .col-xs-4:nth-child(3) { + color: #b9b9b9; + font-size: 12px; + letter-spacing: 1px; + line-height: 32px; + text-align: right +} + +.flownews-footer-bottom .flownews-top-menu li a { + color: #b9b9b9; + font-size: 12px; + font-weight: 400; + letter-spacing: 1.5px; + padding: 0 0 0 15px; + text-transform: inherit +} + +.flownews-footer-bottom a:hover { + color: #e7685d!important; + transition: all .3s ease 0s +} + +.flownews-footer-bottom a { + transition: all .3s ease 0s +} + +.backtotop { + bottom: 15px; + color: #d9d9d9; + font-size: 12px; + letter-spacing: 1px; + line-height: 30px; + position: fixed; + right: 15px; + cursor: pointer; + transition: all .3s ease 0s; + z-index: 999 +} + +.backtotop:hover { + color: #e7685d; + transition: all .3s ease 0s +} + +.backtotop .flownewsicon.fa-angle-up { + background: #e7685d; + color: #fff; + font-size: 20px; + line-height: 1; + padding: 12px 15px; + transition: all .3s ease 0s +} + +.backtotop .flownewsicon.fa-angle-up:hover { + background: #c9564c; + transition: all .3s ease 0s +} + +.flownews-fullwidth .flownews-search form { + margin-right: 0 +} + +.flownews-one-page-wrap-container { + width: 1180px; + margin: 0 auto +} + +@media screen and (max-width: 1180px) { + .flownews-one-page-wrap-container { + width:100% + } +} + +.flownews_advertisement_content_banner { + margin: 50px auto; + text-align: center; + display: block +} + +.flownews-content-no-padding .flownews-container { + padding: 50px 0 +} + +.flownews-banner-footer { + text-align: center +} + +.content_top_banner { + margin-top: 0 +} + +.flownews-posts-content-embed-wrap { + position: relative; + padding-bottom: 56.25%; + padding-top: 25px; + height: 0 +} + +.flownews-posts-content-embed-wrap iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100% +} + +.flownews-posts-content-embed-wrap-post-layout-1 { + font-size: 0; + line-height: 1 +} + +.flownews-boxed .flownews-posts-content-embed-wrap-post-layout-1 iframe { + height: 550px +} + +@media (max-width: 1000px) { + .flownews-boxed .flownews-posts-content-embed-wrap-post-layout-1 iframe { + height:auto + } +} + +.flownews-posts-content-embed-wrap-post-layout-2 { + width: 100%; + margin-bottom: 50px +} + +.flownews-posts-content-embed-wrap-post-layout-3 { + width: 100%; + margin: 50px 0 +} + +.flownews-load-more-type6.flownews-vc-posts-2-col .flownews-vc-element-posts-article-container .flownews-load-more-container .item-posts.first-element-posts { + padding-top: 0; + margin-top: 25px; + border-top: 0 +} + +#flownews-user-modal.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0 +} + +#flownews-user-modal.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear +} + +#flownews-user-modal.fade.in { + opacity: 1 +} + +#flownews-user-modal .modal-dialog { + position: relative; + width: auto; + margin: 30px 10px +} + +#flownews-user-modal.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%) +} + +#flownews-user-modal.modal.in .modal-dialog { + -webkit-transform: translate(0,0); + -ms-transform: translate(0,0); + -o-transform: translate(0,0); + transform: translate(0,0) +} + +#flownews-user-modal .modal-content { + background: #fff; + border: 3px solid #e7685d; + outline: 0; + position: relative; + -webkit-box-shadow: 0 3px 9px rgba(0,0,0,.5); + box-shadow: 0 3px 9px rgba(0,0,0,.5) +} + +#flownews-user-modal .modal-body { + position: relative; + padding: 10% 20% +} + +#flownews-user-modal .modal-footer { + padding: 20px 40px; + text-align: center; + border-top: 1px solid #e5e5e5 +} + +#flownews-user-modal .modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000 +} + +#flownews-user-modal .modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0 +} + +#flownews-user-modal .modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5 +} + +.flownews-login,.flownews-login-footer,.flownews-register,.flownews-register-footer,.flownews-reset-password { + display: none +} + +div[data-active-tab="#flownews-reset-password"] .flownews-login-footer,div[data-active-tab="#flownews-reset-password"] .flownews-reset-password,div[data-active-tab="#flownews-login"] .flownews-login,div[data-active-tab="#flownews-login"] .flownews-register-footer,div[data-active-tab="#flownews-register"] .flownews-login-footer,div[data-active-tab="#flownews-register"] .flownews-register { + display: block +} + +.flownews-loading { + display: none +} + +#flownews-user-modal .alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px +} + +#flownews-user-modal .alert>p,#flownews-user-modal .alert>ul { + margin-bottom: 0 +} + +#flownews-user-modal .alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1 +} + +#flownews-user-modal .alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc +} + +#flownews-user-modal .alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6 +} + +#flownews-user-modal .alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1 +} + +#flownews-user-modal .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 +} + +#flownews-user-modal h3 { + clear: none; + font-weight: 400; + line-height: 1.4; + margin-bottom: 20px; + text-align: center +} + +.flonews-login-register .form-field { + margin: 20px 0; + position: relative +} + +.flownews-register-footer { + color: #282828; + font-size: 14px +} + +.flownews-register-footer>a { + color: #282828; + font-weight: 700 +} + +.form-control.input-lg.required { + border: 1px solid #f4f4f4; + border-radius: 0; + box-shadow: none; + margin-bottom: 20px; + margin-top: 5px +} + +#flownews_login_form .alignright { + display: block; + font-size: 12px; + margin-top: 8px; + text-align: center +} + +#flownews_login_form label { + color: #282828; + font-weight: 400; + letter-spacing: 1.5px +} + +#flownews-user-modal .btn.btn-theme.btn-lg { + background: #f4f4f4; + border-radius: 0; + color: #282828; + font-size: 14px; + font-weight: 700; + height: 50px; + margin-top: 10px; + letter-spacing: 1.5px; + line-height: 1; + text-transform: uppercase; + width: 100% +} + +.flownews-login>hr { + border-color: #f4f4f4; + margin-bottom: 15% +} + +#flownews-user-modal button.close { + -webkit-appearance: none; + background: rgba(0,0,0,0); + border: 0; + cursor: pointer; + padding: 0; + position: absolute; + right: 10px; + top: 4px +} + +.flonews-login-register.col-sm-2 .flonews-login-register-logged { + color: #fff; + font-size: 12px; + letter-spacing: 1.2px +} + +.flonews-login-register.col-sm-2 .flonews-login-register-logged a { + margin-left: 5px; + color: #747474; + transition: all .3s ease 0s +} + +.flonews-login-register.col-sm-2 .flonews-login-register-logged a:hover { + color: #e7685d; + transition: all .3s ease 0s +} + +.flonews-login-register.col-sm-2 .flonews-login-register-logout a { + color: #fff; + font-size: 12px; + letter-spacing: 1.5px; + line-height: 19px; + transition: all .3s ease 0s +} + +.flonews-login-register.col-sm-2 .flonews-login-register-logout a:hover { + color: #e7685d; + transition: all .3s ease 0s +} + +@media (min-width: 768px) { + #flownews-user-modal .modal-dialog { + margin:6% auto 0; + width: 520px + } + + #flownews-user-modal .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0,0,0,.5); + box-shadow: 0 5px 15px rgba(0,0,0,.5) + } +} + +.flownews-format-type { + color: #fff; + font-size: 25px!important; + opacity: .8; + padding: 15px; + position: absolute; + right: 0; + top: 0 +} + +.flownews-header-type3 .others-element-header .flownews-format-type,.flownews-top-content-layout3 .others-element-header .flownews-format-type,.slider-posts-item .flownews-format-type { + left: 0; + right: inherit +} + +.flownews-posts-layout4 .flownews-format-type,.flownews-posts-layout5 .other-rows .flownews-format-type,.flownews-posts-type1 .others-element-header .flownews-format-type,.flownews-posts-type5 .flownews-format-type,.flownews-posts-type6 .others-post .flownews-format-type,.fnwp-tab-container .flownews-format-type,.mega-posts .flownews-format-type { + padding: 8px +} + +.flownews-page .flownews-content ol,.flownews-page .flownews-content ul,.flownews-post .flownews-content ol,.flownews-post .flownews-content ul,ul.flownews_arrow { + margin: 0 0 25px 5.5%; + padding: 0; + letter-spacing: .5px +} + +.flownews-page .flownews-content li,.flownews-post .flownews-content li { + line-height: 25px +} + +.flownews-post .flownews-content ol ol,.flownews-post .flownews-content ol ul,.flownews-post .flownews-content ul ol,.flownews-post .flownews-content ul ul { + margin-bottom: 0 +} + +.comment-description li { + letter-spacing: 1px; + font-weight: 400 +} + +ul.flownews_arrow li { + list-style: none; + line-height: 25px +} + +ul.flownews_arrow li:before { + display: inline-block; + font: normal normal normal 14px/1 flownews-FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: "\f105"; + margin-right: 10px +} + +ul.flownews_line { + margin: 0 0 25px 5.5%; + padding: 0 +} + +ul.flownews_line li { + list-style: none; + line-height: 26px; + padding-left: 20px; + position: relative +} + +ul.flownews_line li:before { + content: ""; + margin-right: 10px; + width: 10px; + border-bottom: 1px solid #e7685d; + position: absolute; + top: 13px; + left: 0 +} + +.flownews-blockquotes { + padding: 30px; + margin: 20px 0; + border-left-width: 2px; + border-left-style: solid; + display: block +} + +.flownews-blockquotes-left { + text-align: left +} + +.flownews-blockquotes-right { + text-align: right +} + +.flownews-blockquotes-center { + text-align: center +} + +.flownews-dropcaps.flownews-dropcaps-left span { + font-size: 50px; + line-height: 50px; + margin: 0 13px 0 0; + padding: 20px +} + +.flownews-dropcaps.flownews-dropcaps-right span { + font-size: 50px; + line-height: 50px; + margin: 0 0 0 13px; + padding: 20px +} + +.flownews-dropcaps-left span { + float: left +} + +.flownews-dropcaps-right span { + float: right +} + +.flownews-dropcaps:after { + content: ""; + clear: both; + display: block +} + +.flownews-dropcaps.flownews-dropcaps-right { + text-align: right +} + +.flownews-columns-row [class*=col-] { + padding-left: 15px!important; + padding-right: 15px!important +} + +@media screen and (max-width: 1024px) { + .flownews-content-no-padding .flownews-container { + padding:25px + } +} + +@media (max-width: 750px) { + .vc_column_container>.vc_column-inner { + padding-left:15px!important; + padding-right: 15px!important + } + + .vc_row[class*=vc_custom_] { + padding-left: 10px!important; + padding-right: 10px!important; + margin-left: 0!important; + margin-right: 0!important + } +} + +@media (max-width: 1000px) { + .children .comments-list:before { + width:0 + } + + .comments-list ul.children { + padding-left: 20px!important + } + + .comment-date,.comment-name { + clear: both; + text-align: left; + float: none; + display: block + } + + .comment-date { + margin: 5px 0 + } + + .comments-list ul.children ul.children .comments-list { + padding-bottom: 25px + } +} + +.flownews-menu-center .flownews-menu,.page-links { + text-align: center +} + +@media (max-width: 400px) { + .comment-description td { + display:block + } +} + +@media (max-width: 450px) { + .comment-image-author { + display:block; + float: none + } + + .comment-info { + display: block; + width: 100%; + margin-left: 0; + margin-top: 10px + } + + .comments-list ul.children { + padding-left: 10px!important + } +} + +.flownews-footer-top .widget label.screen-reader-text,.page-links .page-links-title,.page-links .screen-reader-text { + display: none +} + +.comment-closed { + margin-top: 20px +} + +.related-item-container.owl-carousel .owl-item img { + max-height: 300px; + margin: 0 auto; + width: auto +} + +.related-item-container .article-image { + max-height: 300px +} + +.flownews-footer-top #wp-calendar caption { + padding: 10px 0 +} + +.flownews-footer-top .widget { + margin-bottom: 25px +} + +.flownews-footer-top .children li:last-child { + border: 0!important; + margin: 0 +} + +.flownews-footer-top .rssSummary { + line-height: 20px; + margin-top: 10px +} + +.page-links { + margin-top: 50px +} + +.page-links a span { + background: rgba(0,0,0,0); + color: #333 +} + +.page-links span,.page-links span:hover { + background: #f4f4f4; + transition: all .3s ease 0s +} + +.page-links span { + border: 1px solid #f4f4f4; + font-size: 12px; + line-height: 1; + margin: 0 2px; + padding: 10px 14px +} + +.wpcf7 label { + font-weight: inherit +} + +.wpcf7-submit { + background: #e7685d; + border: none; + color: #fff; + font-weight: 700; + height: 40px; + text-transform: uppercase +} + +#review.review-wrapper { + margin-top: 50px +} + +#review.review-wrapper ul { + margin: 0 +} + +.mc4wp-form-fields input[type=submit] { + background: #e7685d; + border: 0; + color: #fff; + font-weight: 700; + padding: 5px; + transition: all .3s ease 0s; + width: 100% +} + +.mc4wp-form-fields input[type=email] { + border: 1px solid #f4f4f4; + margin-bottom: 5px; + padding: 5px; + text-align: center; + width: 100% +} + +.mc4wp-form-fields input[type=submit]:hover { + background: #c9564c; + transition: all .3s ease 0s +} + +.flownews-post-sticky .article-info { + background: #f4f4f4; + padding: 25px +} + +.flownews-post-sticky .flownews-element-posts .article-info-top { + margin-top: 0 +} + +.theiaStickySidebar .flownews-element-posts:last-child,.theiaStickySidebar .widget:last-child { + margin-bottom: 0 +} + +.post-password-form input,.post-password-form label { + margin-top: 20px +} + +.gallery.gallery-size-thumbnail .gallery-item img { + border: 0!important +} + +.gallery.gallery-size-thumbnail .gallery-item .gallery-caption { + line-height: 22px; + margin-bottom: 20px; + margin-top: 10px +} + +.flownews-no-comment-data .article-info .article-comments,.flownews-no-comment-data .article-info .article-data,.flownews-no-comment-data .article-info .article-separator,.flownews-no-comment-data .fnwp-widget .data { + display: none!important +} + +@media screen and (min-width: 1400px) { + .flownews-layout-1400 .flownews-wrap-container,.flownews-layout-1600 .flownews-wrap-container { + width:1400px + } +} + +@media screen and (min-width: 1600px) { + .flownews-layout-1600 .flownews-wrap-container { + width:1600px + } +} + +.menu-item>a i.flownewsicon { + padding: 0; + font-size: 13px +} + +.menu-item>a i.flownewsicon:hover { + background: 0 0!important +} + +.flownews-menu-lefet .flownews-menu { + text-align: left +} + +.flownews-menu-right .flownews-menu { + text-align: right +} + +.flownews-menu-style2 nav ul li a:hover { + color: #FFF; + background: 0 0; + border-bottom: 0 +} + +.flownews-menu-style2 ul.submenu li:first-child .submenu { + border-top: 1px solid transparent +} + +.flownews-menu-style2 nav li ul.submenu li.current-menu-ancestor>a:hover,.flownews-menu-style2 nav li ul.submenu li.current-menu-item>a:hover,.flownews-menu-style2 nav ul.submenu li a:hover { + color: #e7685d +} + +.flownews-menu-style2 nav li ul.submenu li.current-menu-ancestor>a,.flownews-menu-style2 nav li ul.submenu li.current-menu-item>a { + color: #333; + background: #FFF +} + +.flownews-menu-style2 nav>ul>li.current-menu-ancestor:before,.flownews-menu-style2 nav>ul>li.current-menu-item:before,.flownews-menu-style2 nav>ul>li.current_page_item:before,.flownews-menu-style2 nav>ul>li:hover:before { + background-color: #e7685d; + width: 100%; + content: ''; + height: 3px; + position: absolute; + bottom: 0; + left: 0; + right: 0; + margin: 0 auto; + -webkit-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + -webkit-transition: width .2s ease; + -moz-transition: width .2s ease; + -o-transition: width .2s ease; + transition: width .2s ease +} + +.flownews-menu-style2 nav li ul.submenu li.current-menu-ancestor,.flownews-menu-style2 nav li ul.submenu li.current-menu-item,.flownews-menu-style2 nav ul li.current-menu-ancestor,.flownews-menu-style2 nav ul li.current-menu-item,.flownews-menu-style2 nav ul li.current_page_item,.flownews-menu-style3 nav li ul.submenu li.current-menu-ancestor,.flownews-menu-style3 nav li ul.submenu li.current-menu-item,.flownews-menu-style3 nav ul li.current-menu-ancestor,.flownews-menu-style3 nav ul li.current-menu-item,.flownews-menu-style3 nav ul li.current_page_item { + background: 0 0 +} + +.flownews-menu-style2 .flownews-header-bottom,.flownews-menu-style2 .flownews-header-bottom .flownews-wrap-container,.flownews-menu-style2 .flownews-header-sticky { + border: 0 +} + +.flownews-menu-style2 .flownews-menu .menu-item-object-category .flownews-mega-menu,.flownews-menu-style2 .submenu,.flownews-menu-style2 ul.submenu { + border: 0; + border-top: 0 +} + +.flownews-menu-style3 nav ul li a:hover { + color: #e7685d; + background: 0 0; + border-bottom: 0 +} + +.flownews-menu-style3 .flownews-element-posts .article-category a:hover { + color: #FFF +} + +.flownews-menu-style3 nav li ul.submenu li.current-menu-ancestor>a,.flownews-menu-style3 nav li ul.submenu li.current-menu-ancestor>a:hover,.flownews-menu-style3 nav li ul.submenu li.current-menu-item>a,.flownews-menu-style3 nav li ul.submenu li.current-menu-item>a:hover,.flownews-menu-style3 nav li.current-menu-ancestor>a,.flownews-menu-style3 nav ul.submenu li a:hover { + color: #e7685d +} + +.flownews-menu-style3 nav li ul.submenu li.current-menu-ancestor>a,.flownews-menu-style3 nav li ul.submenu li.current-menu-item>a { + background: #FFF +} + +.flownews-top-news-ticker .ticker-wrapper.has-js { + margin: 0; + padding: 0; + width: 100%; + height: 32px; + display: block; + font-size: .75em +} + +.flownews-top-news-ticker .ticker { + width: 90%; + display: block; + position: relative; + overflow: hidden; + background-color: #000 +} + +.flownews-top-news-ticker .ticker-title { + color: #900; + font-weight: 700; + background-color: #000; + text-transform: uppercase; + position: relative; + z-index: 10; + padding: 5px 10px 0 0 +} + +.flownews-top-news-ticker .ticker-content { + font-weight: 700; + line-height: 15px; + margin-left: -8px; + overflow: hidden; + padding-top: 9px; + position: absolute; + white-space: nowrap +} + +.flownews-top-news-ticker .ticker-content:focus { + text-decoration: none +} + +.flownews-top-news-ticker .ticker-content a { + text-decoration: none; + overflow: hidden; + color: #fff; + transition: all .3s ease 0s +} + +.flownews-top-news-ticker .ticker-content a:hover { + color: #e7685d; + transition: all .3s ease 0s; + text-decoration: none +} + +.flownews-top-news-ticker .ticker-swipe { + padding-top: 9px; + position: absolute; + top: 0; + background-color: #000; + display: block; + width: 500px; + height: 23px +} + +.flownews-top-news-ticker .ticker-swipe span { + margin-left: 1px; + background-color: #FFF; + height: 12px; + width: 1px; + display: block +} + +.flownews-top-news-ticker .ticker-controls { + padding: 0; + list-style-type: none; + float: left; + text-align: right +} + +.flownews-top-news-ticker .ticker-controls li { + cursor: pointer; + display: inline-block; + margin-left: 10px; + padding: 0 +} + +.flownews-top-news-ticker .js-hidden,.flownews-top-news-ticker .ticker-controls li.jnt-play-pause,.flownews-top-news-ticker .ticker-controls li.jnt-play-pause.paused { + display: none +} + +.flownews-top-news-ticker .ticker-controls li.jnt-prev:before { + font: normal normal normal 14px/1 flownews-FontAwesome; + content: "\f104"; + color: #FFF +} + +.flownews-top-news-ticker .ticker-controls li.jnt-prev.over:before { + color: #e7685d +} + +.flownews-top-news-ticker .ticker-controls li.jnt-next:before { + font: normal normal normal 14px/1 flownews-FontAwesome; + content: "\f105"; + color: #FFF +} + +.flownews-top-news-ticker .ticker-controls li.jnt-next.over:before { + color: #e7685d +} + +.flownews-top-news-ticker .no-js-news { + padding: 10px 0 0 45px; + color: #F8F0DB +} + +.flownews-top-news-ticker .left .ticker-content,.flownews-top-news-ticker .left .ticker-controls,.flownews-top-news-ticker .left .ticker-title,.left .ticker { + float: left +} + +.flownews-top-news-ticker .left .ticker-controls { + line-height: 16px; + margin: 8px 0 0; + width: 10% +} + +.flownews-top-news-ticker .right .ticker-content,.flownews-top-news-ticker .right .ticker-controls,.flownews-top-news-ticker .right .ticker-title,.right .ticker { + float: right +} + +.flownews-top-news-ticker .right .ticker-controls { + padding-right: 6px +} + +.flownews-top-news-ticker .right .ticker-title { + padding: 0 0 0 20px +} + +.flownews-top-news-ticker .ticker-title span { + background: #e7685d; + color: #fff; + display: block; + font-size: 10px; + font-weight: 700; + letter-spacing: 1px; + line-height: 1; + text-transform: uppercase; + padding: 6px 10px +} diff --git a/htdocs/cgi-bin/wsrc/fonts/fontawesome-webfont.woff2 b/htdocs/cgi-bin/wsrc/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/fonts/fontawesome-webfont.woff2 differ diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-af.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-af.js new file mode 100644 index 0000000..8dbec3e --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-af.js @@ -0,0 +1,22 @@ +/* Afrikaans translation for the jQuery Timepicker Addon */ +/* Written by Deon Heyns */ +(function($) { + $.timepicker.regional['af'] = { + timeOnlyTitle: 'Kies Tyd', + timeText: 'Tyd ', + hourText: 'Ure ', + minuteText: 'Minute', + secondText: 'Sekondes', + millisecText: 'Millisekondes', + microsecText: 'Mikrosekondes', + timezoneText: 'Tydsone', + currentText: 'Huidige Tyd', + closeText: 'Klaar', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['af']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-am.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-am.js new file mode 100644 index 0000000..676c8b9 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-am.js @@ -0,0 +1,22 @@ +/* Armenian translation for the jQuery Timepicker Addon */ +/* Written by Artavazd Avetisyan artavazda@hotmail.com */ +(function($) { + $.timepicker.regional['am'] = { + timeOnlyTitle: 'Ընտրեք ժամանակը', + timeText: 'Ժամանակը', + hourText: 'Ժամ', + minuteText: 'Րոպե', + secondText: 'Վարկյան', + millisecText: 'Միլիվարկյան', + microsecText: 'Միկրովարկյան', + timezoneText: 'Ժամային գոտին', + currentText: 'Այժմ', + closeText: 'Փակել', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['am']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-bg.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-bg.js new file mode 100644 index 0000000..58f076e --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-bg.js @@ -0,0 +1,22 @@ +/* Bulgarian translation for the jQuery Timepicker Addon */ +/* Written by Plamen Kovandjiev */ +(function($) { + $.timepicker.regional['bg'] = { + timeOnlyTitle: 'Изберете време', + timeText: 'Време', + hourText: 'Час', + minuteText: 'Минути', + secondText: 'Секунди', + millisecText: 'Милисекунди', + microsecText: 'Микросекунди', + timezoneText: 'Часови пояс', + currentText: 'Сега', + closeText: 'Затвори', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['bg']); +})(jQuery); \ No newline at end of file diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-ca.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-ca.js new file mode 100644 index 0000000..84fa00e --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-ca.js @@ -0,0 +1,22 @@ +/* Catalan translation for the jQuery Timepicker Addon */ +/* Written by Sergi Faber */ +(function($) { + $.timepicker.regional['ca'] = { + timeOnlyTitle: 'Escollir una hora', + timeText: 'Hora', + hourText: 'Hores', + minuteText: 'Minuts', + secondText: 'Segons', + millisecText: 'Milisegons', + microsecText: 'Microsegons', + timezoneText: 'Fus horari', + currentText: 'Ara', + closeText: 'Tancar', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['ca']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-cs.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-cs.js new file mode 100644 index 0000000..26d6ec7 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-cs.js @@ -0,0 +1,22 @@ +/* Czech translation for the jQuery Timepicker Addon */ +/* Written by Ondřej Vodáček */ +(function($) { + $.timepicker.regional['cs'] = { + timeOnlyTitle: 'Vyberte čas', + timeText: 'Čas', + hourText: 'Hodiny', + minuteText: 'Minuty', + secondText: 'Vteřiny', + millisecText: 'Milisekundy', + microsecText: 'Mikrosekundy', + timezoneText: 'Časové pásmo', + currentText: 'Nyní', + closeText: 'Zavřít', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['dop.', 'AM', 'A'], + pmNames: ['odp.', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['cs']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-da.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-da.js new file mode 100644 index 0000000..5d8072b --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-da.js @@ -0,0 +1,22 @@ +/* Danish translation for the jQuery Timepicker Addon */ +/* Written by Lars H. Jensen (http://www.larshj.dk) */ +(function ($) { + $.timepicker.regional['da'] = { + timeOnlyTitle: 'Vælg tid', + timeText: 'Tid', + hourText: 'Time', + minuteText: 'Minut', + secondText: 'Sekund', + millisecText: 'Millisekund', + microsecText: 'Mikrosekund', + timezoneText: 'Tidszone', + currentText: 'Nu', + closeText: 'Luk', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['am', 'AM', 'A'], + pmNames: ['pm', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['da']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-de.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-de.js new file mode 100644 index 0000000..90c33af --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-de.js @@ -0,0 +1,22 @@ +/* German translation for the jQuery Timepicker Addon */ +/* Written by Marvin */ +(function($) { + $.timepicker.regional['de'] = { + timeOnlyTitle: 'Zeit wählen', + timeText: 'Zeit', + hourText: 'Stunde', + minuteText: 'Minute', + secondText: 'Sekunde', + millisecText: 'Millisekunde', + microsecText: 'Mikrosekunde', + timezoneText: 'Zeitzone', + currentText: 'Jetzt', + closeText: 'Fertig', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['vorm.', 'AM', 'A'], + pmNames: ['nachm.', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['de']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-el.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-el.js new file mode 100644 index 0000000..72aec6d --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-el.js @@ -0,0 +1,22 @@ +/* Hellenic translation for the jQuery Timepicker Addon */ +/* Written by Christos Pontikis */ +(function($) { + $.timepicker.regional['el'] = { + timeOnlyTitle: 'Επιλογή ώρας', + timeText: 'Ώρα', + hourText: 'Ώρες', + minuteText: 'Λεπτά', + secondText: 'Δευτερόλεπτα', + millisecText: 'Χιλιοστοδευτερόλεπτα', + microsecText: 'Μικροδευτερόλεπτα', + timezoneText: 'Ζώνη ώρας', + currentText: 'Τώρα', + closeText: 'Κλείσιμο', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['π.μ.', 'AM', 'A'], + pmNames: ['μ.μ.', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['el']); +})(jQuery); \ No newline at end of file diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-es.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-es.js new file mode 100644 index 0000000..b19ba11 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-es.js @@ -0,0 +1,23 @@ +/* Spanish translation for the jQuery Timepicker Addon */ +/* Written by Ianaré Sévi */ +/* Modified by Carlos Martínez */ +(function($) { + $.timepicker.regional['es'] = { + timeOnlyTitle: 'Elegir una hora', + timeText: 'Hora', + hourText: 'Horas', + minuteText: 'Minutos', + secondText: 'Segundos', + millisecText: 'Milisegundos', + microsecText: 'Microsegundos', + timezoneText: 'Uso horario', + currentText: 'Hoy', + closeText: 'Cerrar', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['a.m.', 'AM', 'A'], + pmNames: ['p.m.', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['es']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-et.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-et.js new file mode 100644 index 0000000..b2bb766 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-et.js @@ -0,0 +1,22 @@ +/* Estonian translation for the jQuery Timepicker Addon */ +/* Written by Karl Sutt (karl@sutt.ee) */ +(function($) { + $.timepicker.regional['et'] = { + timeOnlyTitle: 'Vali aeg', + timeText: 'Aeg', + hourText: 'Tund', + minuteText: 'Minut', + secondText: 'Sekund', + millisecText: 'Millisekundis', + microsecText: 'Mikrosekundis', + timezoneText: 'Ajavöönd', + currentText: 'Praegu', + closeText: 'Valmis', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['et']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-eu.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-eu.js new file mode 100644 index 0000000..7e0c0f3 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-eu.js @@ -0,0 +1,23 @@ +/* Basque trannslation for JQuery Timepicker Addon */ +/* Translated by Xabi Fer */ +/* Fixed by Asier Iturralde Sarasola - iametza interaktiboa */ +(function($) { + $.timepicker.regional['eu'] = { + timeOnlyTitle: 'Aukeratu ordua', + timeText: 'Ordua', + hourText: 'Orduak', + minuteText: 'Minutuak', + secondText: 'Segundoak', + millisecText: 'Milisegundoak', + microsecText: 'Mikrosegundoak', + timezoneText: 'Ordu-eremua', + currentText: 'Orain', + closeText: 'Itxi', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['a.m.', 'AM', 'A'], + pmNames: ['p.m.', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['eu']); +})(jQuery); \ No newline at end of file diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-fa.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-fa.js new file mode 100644 index 0000000..25e2403 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-fa.js @@ -0,0 +1,22 @@ +/* Persian translation for the jQuery Timepicker Addon */ +/* Written by Meysam Pour Ganji */ +(function($) { + $.timepicker.regional['fa'] = { + timeOnlyTitle: 'انتخاب زمان', + timeText: 'زمان', + hourText: 'ساعت', + minuteText: 'دقیقه', + secondText: 'ثانیه', + millisecText: 'میلی ثانیه', + microsecText: 'میکرو ثانیه', + timezoneText: 'منطقه زمانی', + currentText: 'الان', + closeText: 'انتخاب', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['قبل ظهر', 'AM', 'A'], + pmNames: ['بعد ظهر', 'PM', 'P'], + isRTL: true + }; + $.timepicker.setDefaults($.timepicker.regional['fa']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-fi.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-fi.js new file mode 100644 index 0000000..4493d4c --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-fi.js @@ -0,0 +1,22 @@ +/* Finnish translation for the jQuery Timepicker Addon */ +/* Written by Juga Paazmaya (http://github.com/paazmaya) */ +(function($) { + $.timepicker.regional['fi'] = { + timeOnlyTitle: 'Valitse aika', + timeText: 'Aika', + hourText: 'Tunti', + minuteText: 'Minuutti', + secondText: 'Sekunti', + millisecText: 'Millisekunnin', + microsecText: 'Mikrosekuntia', + timezoneText: 'Aikavyöhyke', + currentText: 'Nyt', + closeText: 'Sulje', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['ap.', 'AM', 'A'], + pmNames: ['ip.', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['fi']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-fr.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-fr.js new file mode 100644 index 0000000..0002517 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-fr.js @@ -0,0 +1,22 @@ +/* French translation for the jQuery Timepicker Addon */ +/* Written by Thomas Lété */ +(function($) { + $.timepicker.regional['fr'] = { + timeOnlyTitle: 'Choisir une heure', + timeText: 'Heure', + hourText: 'Heures', + minuteText: 'Minutes', + secondText: 'Secondes', + millisecText: 'Millisecondes', + microsecText: 'Microsecondes', + timezoneText: 'Fuseau horaire', + currentText: 'Maintenant', + closeText: 'Terminé', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['fr']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-gl.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-gl.js new file mode 100644 index 0000000..4b9501f --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-gl.js @@ -0,0 +1,22 @@ +/* Galician translation for the jQuery Timepicker Addon */ +/* Written by David Barral */ +(function($) { + $.timepicker.regional['gl'] = { + timeOnlyTitle: 'Elixir unha hora', + timeText: 'Hora', + hourText: 'Horas', + minuteText: 'Minutos', + secondText: 'Segundos', + millisecText: 'Milisegundos', + microsecText: 'Microssegundos', + timezoneText: 'Fuso horario', + currentText: 'Agora', + closeText: 'Pechar', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['a.m.', 'AM', 'A'], + pmNames: ['p.m.', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['gl']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-he.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-he.js new file mode 100644 index 0000000..9b78cbd --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-he.js @@ -0,0 +1,22 @@ +/* Hebrew translation for the jQuery Timepicker Addon */ +/* Written by Lior Lapid */ +(function($) { + $.timepicker.regional["he"] = { + timeOnlyTitle: "בחירת זמן", + timeText: "שעה", + hourText: "שעות", + minuteText: "דקות", + secondText: "שניות", + millisecText: "אלפית השנייה", + microsecText: "מיקרו", + timezoneText: "אזור זמן", + currentText: "עכשיו", + closeText:"סגור", + timeFormat: "HH:mm", + timeSuffix: '', + amNames: ['לפנה"צ', 'AM', 'A'], + pmNames: ['אחה"צ', 'PM', 'P'], + isRTL: true + }; + $.timepicker.setDefaults($.timepicker.regional["he"]); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-hr.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-hr.js new file mode 100644 index 0000000..b60f89a --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-hr.js @@ -0,0 +1,22 @@ +/* Croatian translation for the jQuery Timepicker Addon */ +/* Written by Mladen */ +(function($) { + $.timepicker.regional['hr'] = { + timeOnlyTitle: 'Odaberi vrijeme', + timeText: 'Vrijeme', + hourText: 'Sati', + minuteText: 'Minute', + secondText: 'Sekunde', + millisecText: 'Milisekunde', + microsecText: 'Mikrosekunde', + timezoneText: 'Vremenska zona', + currentText: 'Sada', + closeText: 'Gotovo', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['a.m.', 'AM', 'A'], + pmNames: ['p.m.', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['hr']); +})(jQuery); \ No newline at end of file diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-hu.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-hu.js new file mode 100644 index 0000000..6bdb0f4 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-hu.js @@ -0,0 +1,22 @@ +/* Hungarian translation for the jQuery Timepicker Addon */ +/* Written by Vas Gábor */ +(function($) { + $.timepicker.regional['hu'] = { + timeOnlyTitle: 'Válasszon időpontot', + timeText: 'Idő', + hourText: 'Óra', + minuteText: 'Perc', + secondText: 'Másodperc', + millisecText: 'Milliszekundumos', + microsecText: 'Ezredmásodperc', + timezoneText: 'Időzóna', + currentText: 'Most', + closeText: 'Kész', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['de.', 'AM', 'A'], + pmNames: ['du.', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['hu']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-id.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-id.js new file mode 100644 index 0000000..9f21f50 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-id.js @@ -0,0 +1,22 @@ +/* Indonesian translation for the jQuery Timepicker Addon */ +/* Written by Nia */ +(function($) { + $.timepicker.regional['id'] = { + timeOnlyTitle: 'Pilih Waktu', + timeText: 'Waktu', + hourText: 'Pukul', + minuteText: 'Menit', + secondText: 'Detik', + millisecText: 'Milidetik', + microsecText: 'Mikrodetik', + timezoneText: 'Zona Waktu', + currentText: 'Sekarang', + closeText: 'OK', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['id']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-it.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-it.js new file mode 100644 index 0000000..540f41a --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-it.js @@ -0,0 +1,22 @@ +/* Italian translation for the jQuery Timepicker Addon */ +/* Written by Marco "logicoder" Del Tongo */ +(function($) { + $.timepicker.regional['it'] = { + timeOnlyTitle: 'Scegli orario', + timeText: 'Orario', + hourText: 'Ora', + minuteText: 'Minuti', + secondText: 'Secondi', + millisecText: 'Millisecondi', + microsecText: 'Microsecondi', + timezoneText: 'Fuso orario', + currentText: 'Adesso', + closeText: 'Chiudi', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['m.', 'AM', 'A'], + pmNames: ['p.', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['it']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-ja.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-ja.js new file mode 100644 index 0000000..cd3f020 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-ja.js @@ -0,0 +1,22 @@ +/* Japanese translation for the jQuery Timepicker Addon */ +/* Written by Jun Omae */ +(function($) { + $.timepicker.regional['ja'] = { + timeOnlyTitle: '時間を選択', + timeText: '時間', + hourText: '時', + minuteText: '分', + secondText: '秒', + millisecText: 'ミリ秒', + microsecText: 'マイクロ秒', + timezoneText: 'タイムゾーン', + currentText: '現時刻', + closeText: '閉じる', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['午前', 'AM', 'A'], + pmNames: ['午後', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['ja']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-ko.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-ko.js new file mode 100644 index 0000000..ca85b88 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-ko.js @@ -0,0 +1,22 @@ +/* Korean translation for the jQuery Timepicker Addon */ +/* Written by Genie */ +(function($) { + $.timepicker.regional['ko'] = { + timeOnlyTitle: '시간 선택', + timeText: '시간', + hourText: '시', + minuteText: '분', + secondText: '초', + millisecText: '밀리초', + microsecText: '마이크로', + timezoneText: '표준 시간대', + currentText: '현재 시각', + closeText: '닫기', + timeFormat: 'tt h:mm', + timeSuffix: '', + amNames: ['오전', 'AM', 'A'], + pmNames: ['오후', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['ko']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-lt.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-lt.js new file mode 100644 index 0000000..97d2b8b --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-lt.js @@ -0,0 +1,22 @@ +/* Lithuanian translation for the jQuery Timepicker Addon */ +/* Written by Irmantas Šiupšinskas */ +(function($) { + $.timepicker.regional['lt'] = { + timeOnlyTitle: 'Pasirinkite laiką', + timeText: 'Laikas', + hourText: 'Valandos', + minuteText: 'Minutės', + secondText: 'Sekundės', + millisecText: 'Milisekundės', + microsecText: 'Mikrosekundės', + timezoneText: 'Laiko zona', + currentText: 'Dabar', + closeText: 'Uždaryti', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['priešpiet', 'AM', 'A'], + pmNames: ['popiet', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['lt']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-lv.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-lv.js new file mode 100644 index 0000000..0cbd6e6 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-lv.js @@ -0,0 +1,22 @@ +/* Latvian translation for the jQuery Timepicker Addon */ +/* Written by Dmitry Bogatykh */ +(function($) { + $.timepicker.regional['lv'] = { + timeOnlyTitle: 'Ievadiet laiku', + timeText: 'Laiks', + hourText: 'Stundas', + minuteText: 'Minūtes', + secondText: 'Sekundes', + millisecText: 'Milisekundes', + microsecText: 'Mikrosekundes', + timezoneText: 'Laika josla', + currentText: 'Tagad', + closeText: 'Aizvērt', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'AM', 'A'], + pmNames: ['PM', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['lv']); +})(jQuery); \ No newline at end of file diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-mk.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-mk.js new file mode 100644 index 0000000..9857e01 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-mk.js @@ -0,0 +1,22 @@ +/* Macedonian cyrilic translation for the jQuery Timepicker Addon */ +/* Written by Vlatko Ristovski */ +(function($) { + $.timepicker.regional['mk'] = { + timeOnlyTitle: 'Одберете време', + timeText: 'Време', + hourText: 'Час', + minuteText: 'Минути', + secondText: 'Секунди', + millisecText: 'Милисекунди', + microsecText: 'Микросекунди', + timezoneText: 'Временска зона', + currentText: 'Сега', + closeText: 'Затвори', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['mk']); +})(jQuery); \ No newline at end of file diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-nl.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-nl.js new file mode 100644 index 0000000..bc71fc1 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-nl.js @@ -0,0 +1,22 @@ +/* Dutch translation for the jQuery Timepicker Addon */ +/* Written by Martijn van der Lee */ +(function($) { + $.timepicker.regional['nl'] = { + timeOnlyTitle: 'Tijdstip', + timeText: 'Tijd', + hourText: 'Uur', + minuteText: 'Minuut', + secondText: 'Seconde', + millisecText: 'Milliseconde', + microsecText: 'Microseconde', + timezoneText: 'Tijdzone', + currentText: 'Vandaag', + closeText: 'Sluiten', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['nl']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-no.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-no.js new file mode 100644 index 0000000..39f32fd --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-no.js @@ -0,0 +1,22 @@ +/* Norwegian translation for the jQuery Timepicker Addon */ +/* Written by Morten Hauan (http://hauan.me) */ +(function($) { + $.timepicker.regional['no'] = { + timeOnlyTitle: 'Velg tid', + timeText: 'Tid', + hourText: 'Time', + minuteText: 'Minutt', + secondText: 'Sekund', + millisecText: 'Millisekund', + microsecText: 'mikrosekund', + timezoneText: 'Tidssone', + currentText: 'Nå', + closeText: 'Lukk', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['am', 'AM', 'A'], + pmNames: ['pm', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['no']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-pl.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-pl.js new file mode 100644 index 0000000..0a67a79 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-pl.js @@ -0,0 +1,22 @@ +/* Polish translation for the jQuery Timepicker Addon */ +/* Written by Michał Pena */ +(function($) { + $.timepicker.regional['pl'] = { + timeOnlyTitle: 'Wybierz godzinę', + timeText: 'Czas', + hourText: 'Godzina', + minuteText: 'Minuta', + secondText: 'Sekunda', + millisecText: 'Milisekunda', + microsecText: 'Mikrosekunda', + timezoneText: 'Strefa czasowa', + currentText: 'Teraz', + closeText: 'Gotowe', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['pl']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-pt-BR.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-pt-BR.js new file mode 100644 index 0000000..0ad06a3 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-pt-BR.js @@ -0,0 +1,22 @@ +/* Brazilian Portuguese translation for the jQuery Timepicker Addon */ +/* Written by Diogo Damiani (diogodamiani@gmail.com) */ +(function ($) { + $.timepicker.regional['pt-BR'] = { + timeOnlyTitle: 'Escolha o horário', + timeText: 'Horário', + hourText: 'Hora', + minuteText: 'Minutos', + secondText: 'Segundos', + millisecText: 'Milissegundos', + microsecText: 'Microssegundos', + timezoneText: 'Fuso horário', + currentText: 'Agora', + closeText: 'Fechar', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['a.m.', 'AM', 'A'], + pmNames: ['p.m.', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['pt-BR']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-pt.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-pt.js new file mode 100644 index 0000000..0aa792e --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-pt.js @@ -0,0 +1,22 @@ +/* Portuguese translation for the jQuery Timepicker Addon */ +/* Written by Luan Almeida */ +(function($) { + $.timepicker.regional['pt'] = { + timeOnlyTitle: 'Escolha uma hora', + timeText: 'Hora', + hourText: 'Horas', + minuteText: 'Minutos', + secondText: 'Segundos', + millisecText: 'Milissegundos', + microsecText: 'Microssegundos', + timezoneText: 'Fuso horário', + currentText: 'Agora', + closeText: 'Fechar', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['a.m.', 'AM', 'A'], + pmNames: ['p.m.', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['pt']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-ro.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-ro.js new file mode 100644 index 0000000..4f5f386 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-ro.js @@ -0,0 +1,22 @@ +/* Romanian translation for the jQuery Timepicker Addon */ +/* Written by Romeo Adrian Cioaba */ +(function($) { + $.timepicker.regional['ro'] = { + timeOnlyTitle: 'Alegeţi o oră', + timeText: 'Timp', + hourText: 'Ore', + minuteText: 'Minute', + secondText: 'Secunde', + millisecText: 'Milisecunde', + microsecText: 'Microsecunde', + timezoneText: 'Fus orar', + currentText: 'Acum', + closeText: 'Închide', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['ro']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-ru.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-ru.js new file mode 100644 index 0000000..b539a73 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-ru.js @@ -0,0 +1,22 @@ +/* Russian translation for the jQuery Timepicker Addon */ +/* Written by Trent Richardson */ +(function($) { + $.timepicker.regional['ru'] = { + timeOnlyTitle: 'Выберите время', + timeText: 'Время', + hourText: 'Часы', + minuteText: 'Минуты', + secondText: 'Секунды', + millisecText: 'Миллисекунды', + microsecText: 'Микросекунды', + timezoneText: 'Часовой пояс', + currentText: 'Сейчас', + closeText: 'Закрыть', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['ru']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sk.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sk.js new file mode 100644 index 0000000..eee0d0b --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sk.js @@ -0,0 +1,22 @@ +/* Slovak translation for the jQuery Timepicker Addon */ +/* Written by David Vallner */ +(function($) { + $.timepicker.regional['sk'] = { + timeOnlyTitle: 'Zvoľte čas', + timeText: 'Čas', + hourText: 'Hodiny', + minuteText: 'Minúty', + secondText: 'Sekundy', + millisecText: 'Milisekundy', + microsecText: 'Mikrosekundy', + timezoneText: 'Časové pásmo', + currentText: 'Teraz', + closeText: 'Zavrieť', + timeFormat: 'H:m', + timeSuffix: '', + amNames: ['dop.', 'AM', 'A'], + pmNames: ['pop.', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['sk']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sl.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sl.js new file mode 100644 index 0000000..0906b10 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sl.js @@ -0,0 +1,22 @@ +/* Slovenian translation for the jQuery Timepicker Addon */ +/* Written by Hadalin (https://github.com/hadalin) */ +(function($) { + $.timepicker.regional['sl'] = { + timeOnlyTitle: 'Izberite čas', + timeText: 'Čas', + hourText: 'Ura', + minuteText: 'Minute', + secondText: 'Sekunde', + millisecText: 'Milisekunde', + microsecText: 'Mikrosekunde', + timezoneText: 'Časovni pas', + currentText: 'Sedaj', + closeText: 'Zapri', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['dop.', 'AM', 'A'], + pmNames: ['pop.', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['sl']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sq.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sq.js new file mode 100644 index 0000000..d93d88c --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sq.js @@ -0,0 +1,22 @@ +/* Albanian translation for the jQuery Timepicker Addon */ +/* Written by Olti Buzi */ +(function($) { + $.timepicker.regional['sq'] = { + timeOnlyTitle: 'Zgjidh orarin', + timeText: 'Orari', + hourText: 'Ora', + minuteText: 'Minuta', + secondText: 'Sekonda', + millisecText: 'Minisekonda', + microsecText: 'Mikrosekonda', + timezoneText: 'Zona kohore', + currentText: 'Tani', + closeText: 'Mbyll', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['m.', 'AM', 'A'], + pmNames: ['p.', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['sq']); +})(jQuery); \ No newline at end of file diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sr-RS.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sr-RS.js new file mode 100644 index 0000000..79a9803 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sr-RS.js @@ -0,0 +1,22 @@ +/* Serbian cyrilic translation for the jQuery Timepicker Addon */ +/* Written by Vladimir Jelovac */ +(function($) { + $.timepicker.regional['sr-RS'] = { + timeOnlyTitle: 'Одаберите време', + timeText: 'Време', + hourText: 'Сати', + minuteText: 'Минути', + secondText: 'Секунде', + millisecText: 'Милисекунде', + microsecText: 'Микросекунде', + timezoneText: 'Временска зона', + currentText: 'Сада', + closeText: 'Затвори', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['sr-RS']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sr-YU.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sr-YU.js new file mode 100644 index 0000000..260881a --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sr-YU.js @@ -0,0 +1,22 @@ +/* Serbian latin translation for the jQuery Timepicker Addon */ +/* Written by Vladimir Jelovac */ +(function($) { + $.timepicker.regional['sr-YU'] = { + timeOnlyTitle: 'Odaberite vreme', + timeText: 'Vreme', + hourText: 'Sati', + minuteText: 'Minuti', + secondText: 'Sekunde', + millisecText: 'Milisekunde', + microsecText: 'Mikrosekunde', + timezoneText: 'Vremenska zona', + currentText: 'Sada', + closeText: 'Zatvori', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['sr-YU']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sv.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sv.js new file mode 100644 index 0000000..7bb0e7e --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-sv.js @@ -0,0 +1,22 @@ +/* Swedish translation for the jQuery Timepicker Addon */ +/* Written by Nevon */ +(function($) { + $.timepicker.regional['sv'] = { + timeOnlyTitle: 'Välj en tid', + timeText: 'Tid', + hourText: 'Timme', + minuteText: 'Minut', + secondText: 'Sekund', + millisecText: 'Millisekund', + microsecText: 'Mikrosekund', + timezoneText: 'Tidszon', + currentText: 'Nu', + closeText: 'Stäng', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['sv']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-th.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-th.js new file mode 100644 index 0000000..4eb93a5 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-th.js @@ -0,0 +1,19 @@ +/* Thai translation for the jQuery Timepicker Addon */ +/* Written by Yote Wachirapornpongsa */ +(function($) { + $.timepicker.regional['th'] = { + timeOnlyTitle: 'เลือกเวลา', + timeText: 'เวลา ', + hourText: 'ชั่วโมง ', + minuteText: 'นาที', + secondText: 'วินาที', + millisecText: 'มิลลิวินาที', + microsecText: 'ไมโคริวินาที', + timezoneText: 'เขตเวลา', + currentText: 'เวลาปัจจุบัน', + closeText: 'ปิด', + timeFormat: 'hh:mm tt', + timeSuffix: '' + }; + $.timepicker.setDefaults($.timepicker.regional['th']); +})(jQuery); \ No newline at end of file diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-tr.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-tr.js new file mode 100644 index 0000000..f426e70 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-tr.js @@ -0,0 +1,22 @@ +/* Turkish translation for the jQuery Timepicker Addon */ +/* Written by Fehmi Can Saglam, Edited by Goktug Ozturk */ +(function($) { + $.timepicker.regional['tr'] = { + timeOnlyTitle: 'Zaman Seçiniz', + timeText: 'Zaman', + hourText: 'Saat', + minuteText: 'Dakika', + secondText: 'Saniye', + millisecText: 'Milisaniye', + microsecText: 'Mikrosaniye', + timezoneText: 'Zaman Dilimi', + currentText: 'Şu an', + closeText: 'Tamam', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['ÖÖ', 'Ö'], + pmNames: ['ÖS', 'S'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['tr']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-uk.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-uk.js new file mode 100644 index 0000000..285c8ba --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-uk.js @@ -0,0 +1,22 @@ +/* Ukrainian translation for the jQuery Timepicker Addon */ +/* Written by Sergey Noskov */ +(function($) { + $.timepicker.regional['uk'] = { + timeOnlyTitle: 'Виберіть час', + timeText: 'Час', + hourText: 'Години', + minuteText: 'Хвилини', + secondText: 'Секунди', + millisecText: 'Мілісекунди', + microsecText: 'Мікросекунди', + timezoneText: 'Часовий пояс', + currentText: 'Зараз', + closeText: 'Закрити', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['uk']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-vi.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-vi.js new file mode 100644 index 0000000..59fddae --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-vi.js @@ -0,0 +1,22 @@ +/* Vietnamese translation for the jQuery Timepicker Addon */ +/* Written by Nguyen Dinh Trung */ +(function($) { + $.timepicker.regional['vi'] = { + timeOnlyTitle: 'Chọn giờ', + timeText: 'Thời gian', + hourText: 'Giờ', + minuteText: 'Phút', + secondText: 'Giây', + millisecText: 'Mili giây', + microsecText: 'Micrô giây', + timezoneText: 'Múi giờ', + currentText: 'Hiện thời', + closeText: 'Đóng', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['SA', 'S'], + pmNames: ['CH', 'C'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['vi']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-zh-CN.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-zh-CN.js new file mode 100644 index 0000000..a5ca804 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-zh-CN.js @@ -0,0 +1,22 @@ +/* Simplified Chinese translation for the jQuery Timepicker Addon / +/ Written by Will Lu */ +(function($) { + $.timepicker.regional['zh-CN'] = { + timeOnlyTitle: '选择时间', + timeText: '时间', + hourText: '小时', + minuteText: '分钟', + secondText: '秒钟', + millisecText: '毫秒', + microsecText: '微秒', + timezoneText: '时区', + currentText: '现在时间', + closeText: '关闭', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['zh-CN']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-zh-TW.js b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-zh-TW.js new file mode 100644 index 0000000..762797b --- /dev/null +++ b/htdocs/cgi-bin/wsrc/i18n/jquery-ui-timepicker-zh-TW.js @@ -0,0 +1,22 @@ +/* Chinese translation for the jQuery Timepicker Addon */ +/* Written by Alang.lin */ +(function($) { + $.timepicker.regional['zh-TW'] = { + timeOnlyTitle: '選擇時分秒', + timeText: '時間', + hourText: '時', + minuteText: '分', + secondText: '秒', + millisecText: '毫秒', + microsecText: '微秒', + timezoneText: '時區', + currentText: '現在時間', + closeText: '確定', + timeFormat: 'HH:mm', + timeSuffix: '', + amNames: ['上午', 'AM', 'A'], + pmNames: ['下午', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['zh-TW']); +})(jQuery); diff --git a/htdocs/cgi-bin/wsrc/images/Sun-Rotating.gif b/htdocs/cgi-bin/wsrc/images/Sun-Rotating.gif new file mode 100644 index 0000000..202c7c8 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/Sun-Rotating.gif differ diff --git a/htdocs/cgi-bin/wsrc/images/page-bck-earth.png b/htdocs/cgi-bin/wsrc/images/page-bck-earth.png new file mode 100644 index 0000000..62998c6 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/page-bck-earth.png differ diff --git a/htdocs/cgi-bin/wsrc/images/page-bck-moon.png b/htdocs/cgi-bin/wsrc/images/page-bck-moon.png new file mode 100644 index 0000000..dd460ea Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/page-bck-moon.png differ diff --git a/htdocs/cgi-bin/wsrc/images/page-bck-std.png b/htdocs/cgi-bin/wsrc/images/page-bck-std.png new file mode 100644 index 0000000..649c175 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/page-bck-std.png differ diff --git a/htdocs/cgi-bin/wsrc/images/page-bck-sun.png b/htdocs/cgi-bin/wsrc/images/page-bck-sun.png new file mode 100644 index 0000000..cff8cae Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/page-bck-sun.png differ diff --git a/htdocs/cgi-bin/wsrc/images/pingy.svg b/htdocs/cgi-bin/wsrc/images/pingy.svg new file mode 100644 index 0000000..fe34d91 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/images/pingy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/htdocs/cgi-bin/wsrc/images/std--login-bck.png b/htdocs/cgi-bin/wsrc/images/std--login-bck.png new file mode 100644 index 0000000..624b591 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/std--login-bck.png differ diff --git a/htdocs/cgi-bin/wsrc/images/std-log-lbl-bck.png b/htdocs/cgi-bin/wsrc/images/std-log-lbl-bck.png new file mode 100644 index 0000000..2d5ebe3 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/std-log-lbl-bck.png differ diff --git a/htdocs/cgi-bin/wsrc/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png b/htdocs/cgi-bin/wsrc/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png new file mode 100644 index 0000000..ba0f85c Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png differ diff --git a/htdocs/cgi-bin/wsrc/images/ui-bg_glass_100_e4f1fb_1x400.png b/htdocs/cgi-bin/wsrc/images/ui-bg_glass_100_e4f1fb_1x400.png new file mode 100644 index 0000000..1de00f8 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/ui-bg_glass_100_e4f1fb_1x400.png differ diff --git a/htdocs/cgi-bin/wsrc/images/ui-bg_glass_50_3baae3_1x400.png b/htdocs/cgi-bin/wsrc/images/ui-bg_glass_50_3baae3_1x400.png new file mode 100644 index 0000000..de01b43 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/ui-bg_glass_50_3baae3_1x400.png differ diff --git a/htdocs/cgi-bin/wsrc/images/ui-bg_glass_80_d7ebf9_1x400.png b/htdocs/cgi-bin/wsrc/images/ui-bg_glass_80_d7ebf9_1x400.png new file mode 100644 index 0000000..cf5d835 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/ui-bg_glass_80_d7ebf9_1x400.png differ diff --git a/htdocs/cgi-bin/wsrc/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png b/htdocs/cgi-bin/wsrc/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png new file mode 100644 index 0000000..3deba69 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png differ diff --git a/htdocs/cgi-bin/wsrc/images/ui-bg_highlight-hard_70_000000_1x100.png b/htdocs/cgi-bin/wsrc/images/ui-bg_highlight-hard_70_000000_1x100.png new file mode 100644 index 0000000..cf47bf9 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/ui-bg_highlight-hard_70_000000_1x100.png differ diff --git a/htdocs/cgi-bin/wsrc/images/ui-bg_highlight-soft_100_deedf7_1x100 (copy).png b/htdocs/cgi-bin/wsrc/images/ui-bg_highlight-soft_100_deedf7_1x100 (copy).png new file mode 100644 index 0000000..5a36337 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/ui-bg_highlight-soft_100_deedf7_1x100 (copy).png differ diff --git a/htdocs/cgi-bin/wsrc/images/ui-bg_highlight-soft_100_deedf7_1x100.png b/htdocs/cgi-bin/wsrc/images/ui-bg_highlight-soft_100_deedf7_1x100.png new file mode 100644 index 0000000..925a568 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/ui-bg_highlight-soft_100_deedf7_1x100.png differ diff --git a/htdocs/cgi-bin/wsrc/images/ui-bg_highlight-soft_25_ffef8f_1x100.png b/htdocs/cgi-bin/wsrc/images/ui-bg_highlight-soft_25_ffef8f_1x100.png new file mode 100644 index 0000000..6c48948 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/ui-bg_highlight-soft_25_ffef8f_1x100.png differ diff --git a/htdocs/cgi-bin/wsrc/images/ui-icons_2694e8_256x240.png b/htdocs/cgi-bin/wsrc/images/ui-icons_2694e8_256x240.png new file mode 100644 index 0000000..a3f4509 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/ui-icons_2694e8_256x240.png differ diff --git a/htdocs/cgi-bin/wsrc/images/ui-icons_2e83ff_256x240.png b/htdocs/cgi-bin/wsrc/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000..1f5f497 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/ui-icons_2e83ff_256x240.png differ diff --git a/htdocs/cgi-bin/wsrc/images/ui-icons_3d80b3_256x240.png b/htdocs/cgi-bin/wsrc/images/ui-icons_3d80b3_256x240.png new file mode 100644 index 0000000..6ed9d63 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/ui-icons_3d80b3_256x240.png differ diff --git a/htdocs/cgi-bin/wsrc/images/ui-icons_72a7cf_256x240.png b/htdocs/cgi-bin/wsrc/images/ui-icons_72a7cf_256x240.png new file mode 100644 index 0000000..b7c5812 Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/ui-icons_72a7cf_256x240.png differ diff --git a/htdocs/cgi-bin/wsrc/images/ui-icons_ffffff_256x240.png b/htdocs/cgi-bin/wsrc/images/ui-icons_ffffff_256x240.png new file mode 100644 index 0000000..fe41d2d Binary files /dev/null and b/htdocs/cgi-bin/wsrc/images/ui-icons_ffffff_256x240.png differ diff --git a/htdocs/cgi-bin/wsrc/jquery-ui-sliderAccess.js b/htdocs/cgi-bin/wsrc/jquery-ui-sliderAccess.js new file mode 100644 index 0000000..b075c66 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/jquery-ui-sliderAccess.js @@ -0,0 +1,91 @@ +/* + * jQuery UI Slider Access + * By: Trent Richardson [http://trentrichardson.com] + * Version 0.3 + * Last Modified: 10/20/2012 + * + * Copyright 2011 Trent Richardson + * Dual licensed under the MIT and GPL licenses. + * http://trentrichardson.com/Impromptu/GPL-LICENSE.txt + * http://trentrichardson.com/Impromptu/MIT-LICENSE.txt + * + */ + (function($){ + + $.fn.extend({ + sliderAccess: function(options){ + options = options || {}; + options.touchonly = options.touchonly !== undefined? options.touchonly : true; // by default only show it if touch device + + if(options.touchonly === true && !("ontouchend" in document)){ + return $(this); + } + + return $(this).each(function(i,obj){ + var $t = $(this), + o = $.extend({},{ + where: 'after', + step: $t.slider('option','step'), + upIcon: 'ui-icon-plus', + downIcon: 'ui-icon-minus', + text: false, + upText: '+', + downText: '-', + buttonset: true, + buttonsetTag: 'span', + isRTL: false + }, options), + $buttons = $('<'+ o.buttonsetTag +' class="ui-slider-access">'+ + ''+ + ''+ + ''); + + $buttons.children('button').each(function(j, jobj){ + var $jt = $(this); + $jt.button({ + text: o.text, + icons: { primary: $jt.data('icon') } + }) + .click(function(e){ + var step = $jt.data('step'), + curr = $t.slider('value'), + newval = curr += step*1, + minval = $t.slider('option','min'), + maxval = $t.slider('option','max'), + slidee = $t.slider("option", "slide") || function(){}, + stope = $t.slider("option", "stop") || function(){}; + + e.preventDefault(); + + if(newval < minval || newval > maxval){ + return; + } + + $t.slider('value', newval); + + slidee.call($t, null, { value: newval }); + stope.call($t, null, { value: newval }); + }); + }); + + // before or after + $t[o.where]($buttons); + + if(o.buttonset){ + $buttons.removeClass('ui-corner-right').removeClass('ui-corner-left').buttonset(); + $buttons.eq(0).addClass('ui-corner-left'); + $buttons.eq(1).addClass('ui-corner-right'); + } + + // adjust the width so we don't break the original layout + var bOuterWidth = $buttons.css({ + marginLeft: ((o.where === 'after' && !o.isRTL) || (o.where === 'before' && o.isRTL)? 10:0), + marginRight: ((o.where === 'before' && !o.isRTL) || (o.where === 'after' && o.isRTL)? 10:0) + }).outerWidth(true) + 5; + var tOuterWidth = $t.outerWidth(true); + $t.css('display','inline-block').width(tOuterWidth-bOuterWidth); + }); + } + }); + +})(jQuery); \ No newline at end of file diff --git a/htdocs/cgi-bin/wsrc/jquery-ui-timepicker-addon.css b/htdocs/cgi-bin/wsrc/jquery-ui-timepicker-addon.css new file mode 100644 index 0000000..586a7f0 --- /dev/null +++ b/htdocs/cgi-bin/wsrc/jquery-ui-timepicker-addon.css @@ -0,0 +1,30 @@ +.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; } +.ui-timepicker-div dl { text-align: left; } +.ui-timepicker-div dl dt { float: left; clear:left; padding: 0 0 0 5px; } +.ui-timepicker-div dl dd { margin: 0 10px 10px 40%; } +.ui-timepicker-div td { font-size: 90%; } +.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; } +.ui-timepicker-div .ui_tpicker_unit_hide{ display: none; } + +.ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input { background: none; color: inherit; border: none; outline: none; border-bottom: solid 1px #555; width: 95%; } +.ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input:focus { border-bottom-color: #aaa; } + +.ui-timepicker-rtl{ direction: rtl; } +.ui-timepicker-rtl dl { text-align: right; padding: 0 5px 0 0; } +.ui-timepicker-rtl dl dt{ float: right; clear: right; } +.ui-timepicker-rtl dl dd { margin: 0 40% 10px 10px; } + +/* Shortened version style */ +.ui-timepicker-div.ui-timepicker-oneLine { padding-right: 2px; } +.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time, +.ui-timepicker-div.ui-timepicker-oneLine dt { display: none; } +.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time_label { display: block; padding-top: 2px; } +.ui-timepicker-div.ui-timepicker-oneLine dl { text-align: right; } +.ui-timepicker-div.ui-timepicker-oneLine dl dd, +.ui-timepicker-div.ui-timepicker-oneLine dl dd > div { display:inline-block; margin:0; } +.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_minute:before, +.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_second:before { content:':'; display:inline-block; } +.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_millisec:before, +.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_microsec:before { content:'.'; display:inline-block; } +.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide, +.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide:before{ display: none; } \ No newline at end of file diff --git a/htdocs/cgi-bin/wsrc/jquery-ui-timepicker-addon.js b/htdocs/cgi-bin/wsrc/jquery-ui-timepicker-addon.js new file mode 100644 index 0000000..9bbb21f --- /dev/null +++ b/htdocs/cgi-bin/wsrc/jquery-ui-timepicker-addon.js @@ -0,0 +1,2297 @@ +/* + * jQuery Timepicker Addon + * By: Trent Richardson [http://trentrichardson.com] + * + * Copyright 2013 Trent Richardson + * You may use this project under MIT license. + * http://trentrichardson.com/Impromptu/MIT-LICENSE.txt + */ + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['jquery', 'jquery-ui'], factory); + } else { + factory(jQuery); + } +}(function ($) { + + /* + * Lets not redefine timepicker, Prevent "Uncaught RangeError: Maximum call stack size exceeded" + */ + $.ui.timepicker = $.ui.timepicker || {}; + if ($.ui.timepicker.version) { + return; + } + + /* + * Extend jQueryUI, get it started with our version number + */ + $.extend($.ui, { + timepicker: { + version: "@@version" + } + }); + + /* + * Timepicker manager. + * Use the singleton instance of this class, $.timepicker, to interact with the time picker. + * Settings for (groups of) time pickers are maintained in an instance object, + * allowing multiple different settings on the same page. + */ + var Timepicker = function () { + this.regional = []; // Available regional settings, indexed by language code + this.regional[''] = { // Default regional settings + currentText: 'Now', + closeText: 'Done', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + timeFormat: 'HH:mm', + timeSuffix: '', + timeOnlyTitle: 'Choose Time', + timeText: 'Time', + hourText: 'Hour', + minuteText: 'Minute', + secondText: 'Second', + millisecText: 'Millisecond', + microsecText: 'Microsecond', + timezoneText: 'Time Zone', + isRTL: false + }; + this._defaults = { // Global defaults for all the datetime picker instances + showButtonPanel: true, + timeOnly: false, + timeOnlyShowDate: false, + showHour: null, + showMinute: null, + showSecond: null, + showMillisec: null, + showMicrosec: null, + showTimezone: null, + showTime: true, + stepHour: 1, + stepMinute: 1, + stepSecond: 1, + stepMillisec: 1, + stepMicrosec: 1, + hour: 0, + minute: 0, + second: 0, + millisec: 0, + microsec: 0, + timezone: null, + hourMin: 0, + minuteMin: 0, + secondMin: 0, + millisecMin: 0, + microsecMin: 0, + hourMax: 23, + minuteMax: 59, + secondMax: 59, + millisecMax: 999, + microsecMax: 999, + minDateTime: null, + maxDateTime: null, + maxTime: null, + minTime: null, + onSelect: null, + hourGrid: 0, + minuteGrid: 0, + secondGrid: 0, + millisecGrid: 0, + microsecGrid: 0, + alwaysSetTime: true, + separator: ' ', + altFieldTimeOnly: true, + altTimeFormat: null, + altSeparator: null, + altTimeSuffix: null, + altRedirectFocus: true, + pickerTimeFormat: null, + pickerTimeSuffix: null, + showTimepicker: true, + timezoneList: null, + addSliderAccess: false, + sliderAccessArgs: null, + controlType: 'slider', + oneLine: false, + defaultValue: null, + parse: 'strict', + afterInject: null + }; + $.extend(this._defaults, this.regional['']); + }; + + $.extend(Timepicker.prototype, { + $input: null, + $altInput: null, + $timeObj: null, + inst: null, + hour_slider: null, + minute_slider: null, + second_slider: null, + millisec_slider: null, + microsec_slider: null, + timezone_select: null, + maxTime: null, + minTime: null, + hour: 0, + minute: 0, + second: 0, + millisec: 0, + microsec: 0, + timezone: null, + hourMinOriginal: null, + minuteMinOriginal: null, + secondMinOriginal: null, + millisecMinOriginal: null, + microsecMinOriginal: null, + hourMaxOriginal: null, + minuteMaxOriginal: null, + secondMaxOriginal: null, + millisecMaxOriginal: null, + microsecMaxOriginal: null, + ampm: '', + formattedDate: '', + formattedTime: '', + formattedDateTime: '', + timezoneList: null, + units: ['hour', 'minute', 'second', 'millisec', 'microsec'], + support: {}, + control: null, + + /* + * Override the default settings for all instances of the time picker. + * @param {Object} settings object - the new settings to use as defaults (anonymous object) + * @return {Object} the manager object + */ + setDefaults: function (settings) { + extendRemove(this._defaults, settings || {}); + return this; + }, + + /* + * Create a new Timepicker instance + */ + _newInst: function ($input, opts) { + var tp_inst = new Timepicker(), + inlineSettings = {}, + fns = {}, + overrides, i; + + for (var attrName in this._defaults) { + if (this._defaults.hasOwnProperty(attrName)) { + var attrValue = $input.attr('time:' + attrName); + if (attrValue) { + try { + inlineSettings[attrName] = eval(attrValue); + } catch (err) { + inlineSettings[attrName] = attrValue; + } + } + } + } + + overrides = { + beforeShow: function (input, dp_inst) { + if ($.isFunction(tp_inst._defaults.evnts.beforeShow)) { + return tp_inst._defaults.evnts.beforeShow.call($input[0], input, dp_inst, tp_inst); + } + }, + onChangeMonthYear: function (year, month, dp_inst) { + // Update the time as well : this prevents the time from disappearing from the $input field. + // tp_inst._updateDateTime(dp_inst); + if ($.isFunction(tp_inst._defaults.evnts.onChangeMonthYear)) { + tp_inst._defaults.evnts.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst); + } + }, + onClose: function (dateText, dp_inst) { + if (tp_inst.timeDefined === true && $input.val() !== '') { + tp_inst._updateDateTime(dp_inst); + } + if ($.isFunction(tp_inst._defaults.evnts.onClose)) { + tp_inst._defaults.evnts.onClose.call($input[0], dateText, dp_inst, tp_inst); + } + } + }; + for (i in overrides) { + if (overrides.hasOwnProperty(i)) { + fns[i] = opts[i] || this._defaults[i] || null; + } + } + + tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, opts, overrides, { + evnts: fns, + timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker'); + }); + tp_inst.amNames = $.map(tp_inst._defaults.amNames, function (val) { + return val.toUpperCase(); + }); + tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function (val) { + return val.toUpperCase(); + }); + + // detect which units are supported + tp_inst.support = detectSupport( + tp_inst._defaults.timeFormat + + (tp_inst._defaults.pickerTimeFormat ? tp_inst._defaults.pickerTimeFormat : '') + + (tp_inst._defaults.altTimeFormat ? tp_inst._defaults.altTimeFormat : '')); + + // controlType is string - key to our this._controls + if (typeof(tp_inst._defaults.controlType) === 'string') { + if (tp_inst._defaults.controlType === 'slider' && typeof($.ui.slider) === 'undefined') { + tp_inst._defaults.controlType = 'select'; + } + tp_inst.control = tp_inst._controls[tp_inst._defaults.controlType]; + } + // controlType is an object and must implement create, options, value methods + else { + tp_inst.control = tp_inst._defaults.controlType; + } + + // prep the timezone options + var timezoneList = [-720, -660, -600, -570, -540, -480, -420, -360, -300, -270, -240, -210, -180, -120, -60, + 0, 60, 120, 180, 210, 240, 270, 300, 330, 345, 360, 390, 420, 480, 525, 540, 570, 600, 630, 660, 690, 720, 765, 780, 840]; + if (tp_inst._defaults.timezoneList !== null) { + timezoneList = tp_inst._defaults.timezoneList; + } + var tzl = timezoneList.length, tzi = 0, tzv = null; + if (tzl > 0 && typeof timezoneList[0] !== 'object') { + for (; tzi < tzl; tzi++) { + tzv = timezoneList[tzi]; + timezoneList[tzi] = { value: tzv, label: $.timepicker.timezoneOffsetString(tzv, tp_inst.support.iso8601) }; + } + } + tp_inst._defaults.timezoneList = timezoneList; + + // set the default units + tp_inst.timezone = tp_inst._defaults.timezone !== null ? $.timepicker.timezoneOffsetNumber(tp_inst._defaults.timezone) : + ((new Date()).getTimezoneOffset() * -1); + tp_inst.hour = tp_inst._defaults.hour < tp_inst._defaults.hourMin ? tp_inst._defaults.hourMin : + tp_inst._defaults.hour > tp_inst._defaults.hourMax ? tp_inst._defaults.hourMax : tp_inst._defaults.hour; + tp_inst.minute = tp_inst._defaults.minute < tp_inst._defaults.minuteMin ? tp_inst._defaults.minuteMin : + tp_inst._defaults.minute > tp_inst._defaults.minuteMax ? tp_inst._defaults.minuteMax : tp_inst._defaults.minute; + tp_inst.second = tp_inst._defaults.second < tp_inst._defaults.secondMin ? tp_inst._defaults.secondMin : + tp_inst._defaults.second > tp_inst._defaults.secondMax ? tp_inst._defaults.secondMax : tp_inst._defaults.second; + tp_inst.millisec = tp_inst._defaults.millisec < tp_inst._defaults.millisecMin ? tp_inst._defaults.millisecMin : + tp_inst._defaults.millisec > tp_inst._defaults.millisecMax ? tp_inst._defaults.millisecMax : tp_inst._defaults.millisec; + tp_inst.microsec = tp_inst._defaults.microsec < tp_inst._defaults.microsecMin ? tp_inst._defaults.microsecMin : + tp_inst._defaults.microsec > tp_inst._defaults.microsecMax ? tp_inst._defaults.microsecMax : tp_inst._defaults.microsec; + tp_inst.ampm = ''; + tp_inst.$input = $input; + + if (tp_inst._defaults.altField) { + tp_inst.$altInput = $(tp_inst._defaults.altField); + if (tp_inst._defaults.altRedirectFocus === true) { + tp_inst.$altInput.css({ + cursor: 'pointer' + }).focus(function () { + $input.trigger("focus"); + }); + } + } + + if (tp_inst._defaults.minDate === 0 || tp_inst._defaults.minDateTime === 0) { + tp_inst._defaults.minDate = new Date(); + } + if (tp_inst._defaults.maxDate === 0 || tp_inst._defaults.maxDateTime === 0) { + tp_inst._defaults.maxDate = new Date(); + } + + // datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime.. + if (tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) { + tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime()); + } + if (tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) { + tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime()); + } + if (tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) { + tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime()); + } + if (tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) { + tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime()); + } + tp_inst.$input.bind('focus', function () { + tp_inst._onFocus(); + }); + + return tp_inst; + }, + + /* + * add our sliders to the calendar + */ + _addTimePicker: function (dp_inst) { + var currDT = $.trim((this.$altInput && this._defaults.altFieldTimeOnly) ? this.$input.val() + ' ' + this.$altInput.val() : this.$input.val()); + + this.timeDefined = this._parseTime(currDT); + this._limitMinMaxDateTime(dp_inst, false); + this._injectTimePicker(); + this._afterInject(); + }, + + /* + * parse the time string from input value or _setTime + */ + _parseTime: function (timeString, withDate) { + if (!this.inst) { + this.inst = $.datepicker._getInst(this.$input[0]); + } + + if (withDate || !this._defaults.timeOnly) { + var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat'); + try { + var parseRes = parseDateTimeInternal(dp_dateFormat, this._defaults.timeFormat, timeString, $.datepicker._getFormatConfig(this.inst), this._defaults); + if (!parseRes.timeObj) { + return false; + } + $.extend(this, parseRes.timeObj); + } catch (err) { + $.timepicker.log("Error parsing the date/time string: " + err + + "\ndate/time string = " + timeString + + "\ntimeFormat = " + this._defaults.timeFormat + + "\ndateFormat = " + dp_dateFormat); + return false; + } + return true; + } else { + var timeObj = $.datepicker.parseTime(this._defaults.timeFormat, timeString, this._defaults); + if (!timeObj) { + return false; + } + $.extend(this, timeObj); + return true; + } + }, + + /* + * Handle callback option after injecting timepicker + */ + _afterInject: function() { + var o = this.inst.settings; + if ($.isFunction(o.afterInject)) { + o.afterInject.call(this); + } + }, + + /* + * generate and inject html for timepicker into ui datepicker + */ + _injectTimePicker: function () { + var $dp = this.inst.dpDiv, + o = this.inst.settings, + tp_inst = this, + litem = '', + uitem = '', + show = null, + max = {}, + gridSize = {}, + size = null, + i = 0, + l = 0; + + // Prevent displaying twice + if ($dp.find("div.ui-timepicker-div").length === 0 && o.showTimepicker) { + var noDisplay = ' ui_tpicker_unit_hide', + html = '
    ' + '
    ' + o.timeText + '
    ' + + '
    '; + + // Create the markup + for (i = 0, l = this.units.length; i < l; i++) { + litem = this.units[i]; + uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1); + show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem]; + + // Added by Peter Medeiros: + // - Figure out what the hour/minute/second max should be based on the step values. + // - Example: if stepMinute is 15, then minMax is 45. + max[litem] = parseInt((o[litem + 'Max'] - ((o[litem + 'Max'] - o[litem + 'Min']) % o['step' + uitem])), 10); + gridSize[litem] = 0; + + html += '
    ' + o[litem + 'Text'] + '
    ' + + '
    '; + + if (show && o[litem + 'Grid'] > 0) { + html += '
    '; + + if (litem === 'hour') { + for (var h = o[litem + 'Min']; h <= max[litem]; h += parseInt(o[litem + 'Grid'], 10)) { + gridSize[litem]++; + var tmph = $.datepicker.formatTime(this.support.ampm ? 'hht' : 'HH', {hour: h}, o); + html += ''; + } + } + else { + for (var m = o[litem + 'Min']; m <= max[litem]; m += parseInt(o[litem + 'Grid'], 10)) { + gridSize[litem]++; + html += ''; + } + } + + html += '
    ' + tmph + '' + ((m < 10) ? '0' : '') + m + '
    '; + } + html += '
    '; + } + + // Timezone + var showTz = o.showTimezone !== null ? o.showTimezone : this.support.timezone; + html += '
    ' + o.timezoneText + '
    '; + html += '
    '; + + // Create the elements from string + html += '
    '; + var $tp = $(html); + + // if we only want time picker... + if (o.timeOnly === true) { + $tp.prepend('
    ' + '
    ' + o.timeOnlyTitle + '
    ' + '
    '); + $dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide(); + } + + // add sliders, adjust grids, add events + for (i = 0, l = tp_inst.units.length; i < l; i++) { + litem = tp_inst.units[i]; + uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1); + show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem]; + + // add the slider + tp_inst[litem + '_slider'] = tp_inst.control.create(tp_inst, $tp.find('.ui_tpicker_' + litem + '_slider'), litem, tp_inst[litem], o[litem + 'Min'], max[litem], o['step' + uitem]); + + // adjust the grid and add click event + if (show && o[litem + 'Grid'] > 0) { + size = 100 * gridSize[litem] * o[litem + 'Grid'] / (max[litem] - o[litem + 'Min']); + $tp.find('.ui_tpicker_' + litem + ' table').css({ + width: size + "%", + marginLeft: o.isRTL ? '0' : ((size / (-2 * gridSize[litem])) + "%"), + marginRight: o.isRTL ? ((size / (-2 * gridSize[litem])) + "%") : '0', + borderCollapse: 'collapse' + }).find("td").click(function (e) { + var $t = $(this), + h = $t.html(), + n = parseInt(h.replace(/[^0-9]/g), 10), + ap = h.replace(/[^apm]/ig), + f = $t.data('for'); // loses scope, so we use data-for + + if (f === 'hour') { + if (ap.indexOf('p') !== -1 && n < 12) { + n += 12; + } + else { + if (ap.indexOf('a') !== -1 && n === 12) { + n = 0; + } + } + } + + tp_inst.control.value(tp_inst, tp_inst[f + '_slider'], litem, n); + + tp_inst._onTimeChange(); + tp_inst._onSelectHandler(); + }).css({ + cursor: 'pointer', + width: (100 / gridSize[litem]) + '%', + textAlign: 'center', + overflow: 'hidden' + }); + } // end if grid > 0 + } // end for loop + + // Add timezone options + this.timezone_select = $tp.find('.ui_tpicker_timezone').append('').find("select"); + $.fn.append.apply(this.timezone_select, + $.map(o.timezoneList, function (val, idx) { + return $("